// ==UserScript== // @name Aviary for X // @namespace https://github.com/SysAdminDoc // @version 1.54.0 // @description Local-first X/Twitter enhancer with reversible controls and privacy-first defaults. // @author SysAdminDoc // @homepage https://github.com/SysAdminDoc/Aviary // @match https://x.com/* // @match https://twitter.com/* // @match https://pro.x.com/* // @run-at document-start // @inject-into content // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_listValues // @grant GM_download // @grant unsafeWindow // @connect pbs.twimg.com // @connect video.twimg.com // @updateURL https://raw.githubusercontent.com/SysAdminDoc/Aviary/main/dist/aviary.meta.js // @downloadURL https://raw.githubusercontent.com/SysAdminDoc/Aviary/main/dist/aviary.user.js // ==/UserScript== "use strict"; var Aviary = (() => { // src/platform/settings.ts var SETTINGS_KEY = "aviary.settings.v1"; var SETTINGS_SCHEMA_VERSION = 3; var INTEGRATION_BUDGET_CEILINGS = { ai: { maxRequestBytes: 5e6, dailyRequestBytes: 1e8 }, semanticSearch: { maxRecordBytes: 5e6, dailyRecordBytes: 1e8 } }; var SETTINGS_MIGRATIONS = { /** * v1 read a provider budget of `0` as "no bound" — the panel said so — which made the one value * a worried user is most likely to type on a spending control the one value that removed the * bound. v2 reads `0` as zero and blocks, so the meaning of an existing stored `0` inverted and * normalization alone cannot carry it: it would silently turn "unlimited" into "blocked". * * Anyone holding `0` chose no ceiling, so map it to the ceiling the schema already enforces. * That keeps their intent, costs them nothing they could reach before, and leaves `0` free to * mean what it says. */ 1: (record) => { const next = { ...record }; const integrations = asRecord(next.integrations); if (Object.keys(integrations).length === 0) { return next; } const migrated = { ...integrations }; for (const [group, fields] of Object.entries(INTEGRATION_BUDGET_CEILINGS)) { const block = asRecord(migrated[group]); if (Object.keys(block).length === 0) { continue; } const updated = { ...block }; for (const [field2, ceiling] of Object.entries(fields)) { if (updated[field2] === 0) { updated[field2] = ceiling; } } migrated[group] = updated; } next.integrations = migrated; return next; }, /** * v3 makes Aviary's authored desktop experience the install default. * * Older builds stored the previous defaults (`off` and `default`) in every profile, so changing * DEFAULT_SETTINGS alone would affect only brand-new storage. Carry those two legacy defaults to * Noir and Wide once. Any other chosen theme or width is preserved, and both controls remain * available after the migration. */ 2: (record) => { const next = { ...record }; const appearance = asRecord(next.appearance); const migrated = { ...appearance }; if (migrated.theme === void 0 || migrated.theme === "off") migrated.theme = "noir"; if (migrated.timelineWidth === void 0 || migrated.timelineWidth === "default") { migrated.timelineWidth = "wide"; } next.appearance = migrated; return next; } }; var CUSTOM_CSS_SCOPE_IDS = [ "posts", "media", "navigation", "sidebar", "composer" ]; var CUSTOM_CSS_MAX_LENGTH = 12e3; var EMPTY_CUSTOM_CSS = { posts: "", media: "", navigation: "", sidebar: "", composer: "" }; var THEME_IDS = ["off", "dim", "lightsOut", "graphite", "plum", "midnight", "noir"]; var RATE_LIMIT_MODES = ["conservative", "balanced"]; var REDUCE_MOTION_MODES = ["system", "always", "never"]; var FILTER_ACTIONS = ["off", "hide", "dim"]; var FILTER_SURFACES = [ "home", "status", "profile", "search", "notifications", "messages" ]; var MEDIA_LAYOUTS = ["default", "stacked", "grid"]; var MEDIA_SIDECAR_FORMATS = ["off", "text", "json"]; var COUNT_METRICS = ["replies", "reposts", "likes", "views"]; var FILTER_MEDIA_KEYS = ["photo", "video", "gif"]; var FILTER_REASON_MODES = ["off", "dimmed", "all"]; var ENGAGEMENT_METRICS = ["replies", "reposts", "likes"]; function isFilterReasonMode(value) { return typeof value === "string" && FILTER_REASON_MODES.includes(value); } function isEngagementMetric(value) { return typeof value === "string" && ENGAGEMENT_METRICS.includes(value); } var EXPORT_FORMATS = ["json", "csv", "html", "markdown", "xlsx"]; var BLOCKED_OBJECT_KEYS = /* @__PURE__ */ new Set(["__proto__", "prototype", "constructor"]); var AI_PROVIDERS = [ "anthropic", "openai", "openai-compatible" ]; var MASTODON_VISIBILITIES = [ "public", "unlisted", "private", "direct" ]; var COPY_LINK_HOSTS = [ "", "fxtwitter.com", "vxtwitter.com", "fixupx.com", "xcancel.com" ]; function isCopyLinkHost(value) { return typeof value === "string" && COPY_LINK_HOSTS.includes(value); } var DEFAULT_SETTINGS = { schemaVersion: SETTINGS_SCHEMA_VERSION, appearance: { theme: "noir", denseMode: false, timelineWidth: "wide", hideBorders: false, hideCounts: false, countMetrics: { replies: true, reposts: true, likes: true, views: true }, hideTitleBadge: false, absoluteTimestamps: false, replaceFavicon: false, restoreChirp: false, customCss: { ...EMPTY_CUSTOM_CSS } }, layout: { hideNavItems: [], hideRightSidebar: false, hideTrends: false, hideFollowSuggestions: false, hideHomeComposer: false, hideThreadRecommendations: false, hideGrok: false, suppressHoverPreviews: false, writerMode: false, forceFollowing: false, hideForYouTab: false, openFromReplyOnly: false, focusMode: false, focusStart: "09:00", focusEnd: "18:00", timelineStopAfter: 0, autoExpandPostText: false, restoreTimelinePosition: false, readMarker: true, readMarkerSurfaces: ["home", "status", "profile", "search", "notifications", "messages"] }, filter: { enabled: false, rules: [], keywordRules: [], regexRules: [], premiumRule: "off", // "off" until something reads it. F032 needs an authenticated capture containing X's // blocked-account markup before a predicate can be written; until then a default of "hide" // is a filter the settings claim to apply and the engine never applies. blockedAccounts: "off", // Same shape, different capture. F033 needs one containing a self-repost before a predicate // can tell one apart from an ordinary repost. "off" until then, so nothing is claimed. selfRepost: "off", quotePosts: "off", hideMediaReplies: false, showReason: "dimmed", engagementRule: "off", engagementMetric: "likes", engagementMin: 0, whitelist: [], mediaTypes: { photo: false, video: false, gif: false }, dimSeenPosts: false, dimSeenSurfaces: ["home", "status", "profile", "search", "notifications", "messages"], surfaces: ["home", "status", "profile", "search"] }, hidden: { enabled: false, // True, but gated by `enabled` above: turning the feature on should give you the button that // operates it, not leave you hunting for a second switch. buttons: true, surfaces: ["home", "profile", "search", "notifications"], maxEntries: 5e3 }, media: { buttons: true, copyMediaLinks: false, preferOriginalImages: true, inlineOriginalImages: false, filenameTemplate: "{handle}_{tweetId}_{index}", downloadHistory: true, perceptualDedup: false, sidecarFormat: "off", zipChunkSize: 250, layout: "default", lastSaveFolder: "" }, jobs: { concurrentDownloads: 3, rateLimitMode: "conservative" }, export: { enabled: false, formats: ["json", "csv", "html"], preserveRawPayloads: false, autoDiscoverQueryIds: true, captureMediaBytes: false, includeProtected: false, includeUnknown: false, storageCapBytes: 0, captureImageScale: 1, capturePosterFramesOnly: false }, links: { cleanShareButtons: false, expandTco: false, // X's own URL: the control is off until a host is chosen, and nothing is rewritten by default. copyLinkHost: "" }, performance: { pauseOffscreenVideo: false, keepVideoPlaying: false, loopVideos: false, // Off by default: it rewrites the playlist X's player fetches, so it changes how video is // delivered rather than how it is displayed. New network-affecting capabilities opt in. forceVideoQuality: false }, composer: { snippets: [] }, ai: { commandMenu: false }, privacy: { localOnly: true, telemetry: false, // Ads are the one visible exception to Aviary's otherwise opt-in defaults. Native sponsored // records share X's timeline response, so the safe default is to collapse those placements // before paint and refuse only the separable promoted-content logging endpoint. blockAds: true, // On by default: it is the stronger protection, and it is what shipped. X began testing an // ad-blocker warning in July 2026 that appears to key on refused requests, so this exists to // be turned off without giving up ad hiding. networkShield: true, // Off by default. Aviary sends no telemetry of its own either way; this refuses X's, which // is a change to how the site behaves and is the user's call to make, not a default. blockAnalyticsBeacons: false, auditLog: true }, accessibility: { reduceMotion: "system", highContrast: false }, i18n: { locale: "en" }, diagnostics: { selectorHealth: true }, integrations: { aria2: { enabled: false, endpoint: "", secret: "", minBytes: 5e7 }, ytDlp: { enabled: false, endpoint: "http://127.0.0.1:8787", secret: "" }, bluesky: { enabled: false, service: "https://bsky.social", handle: "", appPassword: "" }, mastodon: { enabled: false, instance: "", token: "", visibility: "public" }, ai: { enabled: false, provider: "anthropic", endpoint: "", apiKey: "", model: "", maxRequestBytes: 32e3, dailyRequestBytes: 1e6 }, semanticSearch: { enabled: false, endpoint: "", apiKey: "", model: "", autoIndex: false, maxRecordBytes: 2e4, dailyRecordBytes: 2e6 }, crosspost: { attachLastDownload: false } } }; function diffKnownSettings(before, after) { const patch = diffSettingValue( before, after ); if (!patch || typeof patch !== "object" || Array.isArray(patch)) return {}; delete patch.schemaVersion; return patch; } function applyKnownSettingsPatch(target, patch) { const base = isPlainSettingsRecord(target) ? cloneSettingsRecord(target) : {}; mergeSettingsPatch(base, patch); return base; } function diffSettingValue(before, after) { if (Object.is(before, after)) return void 0; if (Array.isArray(before) && Array.isArray(after)) { if (before.length === after.length && before.every( (entry, index) => diffSettingValue(entry, after[index]) === void 0 )) { return void 0; } return cloneSettingsValue(after); } if (isPlainSettingsRecord(before) && isPlainSettingsRecord(after)) { const result = {}; for (const [key, value] of Object.entries(after)) { const changed = diffSettingValue(before[key], value); if (changed !== void 0) result[key] = changed; } return Object.keys(result).length > 0 ? result : void 0; } return cloneSettingsValue(after); } function mergeSettingsPatch(target, patch) { for (const [key, value] of Object.entries(patch)) { if (BLOCKED_OBJECT_KEYS.has(key)) continue; if (isPlainSettingsRecord(value) && isPlainSettingsRecord(target[key])) { const child = cloneSettingsRecord(target[key]); mergeSettingsPatch(child, value); target[key] = child; } else { target[key] = cloneSettingsValue(value); } } } function isPlainSettingsRecord(value) { return Boolean(value) && typeof value === "object" && !Array.isArray(value); } function cloneSettingsRecord(value) { const result = {}; for (const [key, entry] of Object.entries(value)) { if (!BLOCKED_OBJECT_KEYS.has(key)) result[key] = cloneSettingsValue(entry); } return result; } function cloneSettingsValue(value) { if (Array.isArray(value)) return value.map(cloneSettingsValue); if (isPlainSettingsRecord(value)) return cloneSettingsRecord(value); return value; } function readSettingsEnvelope(input) { const raw = asRecord(input); const declared = typeof raw.schemaVersion === "number" && Number.isFinite(raw.schemaVersion) ? Math.floor(raw.schemaVersion) : null; if (declared !== null && declared > SETTINGS_SCHEMA_VERSION) { return { settings: normalizeSettings(raw), fromVersion: declared, fromFuture: true, applied: [], future: { ...raw } }; } let working = { ...raw }; let version = declared ?? 1; const applied = []; while (version < SETTINGS_SCHEMA_VERSION) { const step = SETTINGS_MIGRATIONS[version]; if (!step) { break; } working = step(working); applied.push(version); version += 1; } return { settings: normalizeSettings(working), fromVersion: declared, fromFuture: false, applied }; } function normalizeCountMetrics(input) { const record = asRecord(input); const result = {}; for (const metric of COUNT_METRICS) { result[metric] = booleanValue(record[metric], DEFAULT_SETTINGS.appearance.countMetrics[metric]); } return result; } function timeValue(input, fallback) { return typeof input === "string" && /^([01]\d|2[0-3]):[0-5]\d$/.test(input.trim()) ? input.trim() : fallback; } function normalizeSettings(input) { const record = asRecord(input); const appearance = asRecord(record.appearance); const layout = asRecord(record.layout); const filter = asRecord(record.filter); const hidden = asRecord(record.hidden); const media = asRecord(record.media); const jobs = asRecord(record.jobs); const exportSettings = asRecord(record.export); const links = asRecord(record.links); const performance = asRecord(record.performance); const composer = asRecord(record.composer); const ai = asRecord(record.ai); const privacy = asRecord(record.privacy); const accessibility = asRecord(record.accessibility); const i18n = asRecord(record.i18n); const diagnostics = asRecord(record.diagnostics); const integrations = asRecord(record.integrations); const integrationsAria = asRecord(integrations.aria2); const integrationsYtDlp = asRecord(integrations.ytDlp); const integrationsBluesky = asRecord(integrations.bluesky); const integrationsMastodon = asRecord(integrations.mastodon); const integrationsAi = asRecord(integrations.ai); const integrationsSemantic = asRecord(integrations.semanticSearch); const integrationsCrosspost = asRecord(integrations.crosspost); const anyIntegrationEnabled = [ integrationsAria, integrationsYtDlp, integrationsBluesky, integrationsMastodon, integrationsAi, integrationsSemantic ].some((entry) => entry.enabled === true); return { // Always stamped with this build's version, so the next read knows what it is looking at. schemaVersion: SETTINGS_SCHEMA_VERSION, appearance: { theme: enumValue(appearance.theme, THEME_IDS, DEFAULT_SETTINGS.appearance.theme), denseMode: booleanValue(appearance.denseMode, DEFAULT_SETTINGS.appearance.denseMode), timelineWidth: enumValue( appearance.timelineWidth, ["default", "comfortable", "wide"], DEFAULT_SETTINGS.appearance.timelineWidth ), hideBorders: booleanValue(appearance.hideBorders, DEFAULT_SETTINGS.appearance.hideBorders), hideCounts: booleanValue(appearance.hideCounts, DEFAULT_SETTINGS.appearance.hideCounts), countMetrics: normalizeCountMetrics(appearance.countMetrics), hideTitleBadge: booleanValue( appearance.hideTitleBadge, DEFAULT_SETTINGS.appearance.hideTitleBadge ), absoluteTimestamps: booleanValue( appearance.absoluteTimestamps, DEFAULT_SETTINGS.appearance.absoluteTimestamps ), replaceFavicon: booleanValue( appearance.replaceFavicon, DEFAULT_SETTINGS.appearance.replaceFavicon ), restoreChirp: booleanValue(appearance.restoreChirp, DEFAULT_SETTINGS.appearance.restoreChirp), customCss: normalizeCustomCss(appearance.customCss) }, layout: { hideNavItems: stringArray(layout.hideNavItems, { maxItems: 24, maxLength: 48 }), hideRightSidebar: booleanValue(layout.hideRightSidebar, DEFAULT_SETTINGS.layout.hideRightSidebar), hideTrends: booleanValue(layout.hideTrends, DEFAULT_SETTINGS.layout.hideTrends), hideFollowSuggestions: booleanValue( layout.hideFollowSuggestions, DEFAULT_SETTINGS.layout.hideFollowSuggestions ), hideHomeComposer: booleanValue(layout.hideHomeComposer, DEFAULT_SETTINGS.layout.hideHomeComposer), hideThreadRecommendations: booleanValue( layout.hideThreadRecommendations, DEFAULT_SETTINGS.layout.hideThreadRecommendations ), hideGrok: booleanValue(layout.hideGrok, DEFAULT_SETTINGS.layout.hideGrok), suppressHoverPreviews: booleanValue( layout.suppressHoverPreviews, DEFAULT_SETTINGS.layout.suppressHoverPreviews ), writerMode: booleanValue(layout.writerMode, DEFAULT_SETTINGS.layout.writerMode), forceFollowing: booleanValue(layout.forceFollowing, DEFAULT_SETTINGS.layout.forceFollowing), hideForYouTab: booleanValue(layout.hideForYouTab, DEFAULT_SETTINGS.layout.hideForYouTab), openFromReplyOnly: booleanValue( layout.openFromReplyOnly, DEFAULT_SETTINGS.layout.openFromReplyOnly ), focusMode: booleanValue(layout.focusMode, DEFAULT_SETTINGS.layout.focusMode), focusStart: timeValue(layout.focusStart, DEFAULT_SETTINGS.layout.focusStart), focusEnd: timeValue(layout.focusEnd, DEFAULT_SETTINGS.layout.focusEnd), timelineStopAfter: integerValue( layout.timelineStopAfter, DEFAULT_SETTINGS.layout.timelineStopAfter, 0, 1e3 ), autoExpandPostText: booleanValue( layout.autoExpandPostText, DEFAULT_SETTINGS.layout.autoExpandPostText ), restoreTimelinePosition: booleanValue( layout.restoreTimelinePosition, DEFAULT_SETTINGS.layout.restoreTimelinePosition ), readMarker: booleanValue(layout.readMarker, DEFAULT_SETTINGS.layout.readMarker), readMarkerSurfaces: surfaceArray( layout.readMarkerSurfaces, DEFAULT_SETTINGS.layout.readMarkerSurfaces, true ) }, filter: { enabled: booleanValue(filter.enabled, DEFAULT_SETTINGS.filter.enabled), rules: stringArray(filter.rules, { maxItems: 100, maxLength: 400 }), dimSeenPosts: booleanValue(filter.dimSeenPosts, DEFAULT_SETTINGS.filter.dimSeenPosts), dimSeenSurfaces: surfaceArray( filter.dimSeenSurfaces, DEFAULT_SETTINGS.filter.dimSeenSurfaces, true ), keywordRules: stringArray(filter.keywordRules, { maxItems: 200, maxLength: 180 }), regexRules: stringArray(filter.regexRules, { maxItems: 100, maxLength: 240 }), premiumRule: enumValue(filter.premiumRule, FILTER_ACTIONS, DEFAULT_SETTINGS.filter.premiumRule), blockedAccounts: enumValue( filter.blockedAccounts, FILTER_ACTIONS, DEFAULT_SETTINGS.filter.blockedAccounts ), selfRepost: enumValue(filter.selfRepost, FILTER_ACTIONS, DEFAULT_SETTINGS.filter.selfRepost), quotePosts: enumValue(filter.quotePosts, FILTER_ACTIONS, DEFAULT_SETTINGS.filter.quotePosts), hideMediaReplies: booleanValue( filter.hideMediaReplies, DEFAULT_SETTINGS.filter.hideMediaReplies ), showReason: enumValue( filter.showReason, [...FILTER_REASON_MODES], DEFAULT_SETTINGS.filter.showReason ), engagementRule: enumValue( filter.engagementRule, FILTER_ACTIONS, DEFAULT_SETTINGS.filter.engagementRule ), engagementMetric: isEngagementMetric(filter.engagementMetric) ? filter.engagementMetric : DEFAULT_SETTINGS.filter.engagementMetric, engagementMin: integerValue(filter.engagementMin, DEFAULT_SETTINGS.filter.engagementMin, 0, 1e6), whitelist: stringArray(filter.whitelist, { maxItems: 200, maxLength: 80 }), mediaTypes: mediaTypeRecord(filter.mediaTypes), surfaces: surfaceArray(filter.surfaces) }, hidden: { enabled: booleanValue(hidden.enabled, DEFAULT_SETTINGS.hidden.enabled), buttons: booleanValue(hidden.buttons, DEFAULT_SETTINGS.hidden.buttons), surfaces: surfaceArray(hidden.surfaces, DEFAULT_SETTINGS.hidden.surfaces), maxEntries: integerValue(hidden.maxEntries, DEFAULT_SETTINGS.hidden.maxEntries, 100, 5e4) }, media: { buttons: booleanValue(media.buttons, DEFAULT_SETTINGS.media.buttons), copyMediaLinks: booleanValue(media.copyMediaLinks, DEFAULT_SETTINGS.media.copyMediaLinks), preferOriginalImages: booleanValue(media.preferOriginalImages, DEFAULT_SETTINGS.media.preferOriginalImages), inlineOriginalImages: booleanValue(media.inlineOriginalImages, DEFAULT_SETTINGS.media.inlineOriginalImages), filenameTemplate: stringValue(media.filenameTemplate, DEFAULT_SETTINGS.media.filenameTemplate, 160), downloadHistory: booleanValue(media.downloadHistory, DEFAULT_SETTINGS.media.downloadHistory), perceptualDedup: booleanValue(media.perceptualDedup, DEFAULT_SETTINGS.media.perceptualDedup), sidecarFormat: enumValue( media.sidecarFormat, MEDIA_SIDECAR_FORMATS, DEFAULT_SETTINGS.media.sidecarFormat ), zipChunkSize: integerValue(media.zipChunkSize, DEFAULT_SETTINGS.media.zipChunkSize, 25, 1e3), layout: enumValue(media.layout, MEDIA_LAYOUTS, DEFAULT_SETTINGS.media.layout), lastSaveFolder: folderHintValue(media.lastSaveFolder, DEFAULT_SETTINGS.media.lastSaveFolder) }, jobs: { concurrentDownloads: integerValue( jobs.concurrentDownloads, DEFAULT_SETTINGS.jobs.concurrentDownloads, 1, 6 ), rateLimitMode: enumValue(jobs.rateLimitMode, RATE_LIMIT_MODES, DEFAULT_SETTINGS.jobs.rateLimitMode) }, export: { enabled: booleanValue(exportSettings.enabled, DEFAULT_SETTINGS.export.enabled), formats: exportFormatArray(exportSettings.formats), preserveRawPayloads: booleanValue( exportSettings.preserveRawPayloads, DEFAULT_SETTINGS.export.preserveRawPayloads ), autoDiscoverQueryIds: booleanValue( exportSettings.autoDiscoverQueryIds, DEFAULT_SETTINGS.export.autoDiscoverQueryIds ), captureMediaBytes: booleanValue( exportSettings.captureMediaBytes, DEFAULT_SETTINGS.export.captureMediaBytes ), includeProtected: booleanValue( exportSettings.includeProtected, DEFAULT_SETTINGS.export.includeProtected ), includeUnknown: booleanValue( exportSettings.includeUnknown, DEFAULT_SETTINGS.export.includeUnknown ), // A cap below a megabyte would warn on the first capture of anything, which trains a reader // to ignore it. Zero stays zero, and means off. storageCapBytes: capBytesValue(exportSettings.storageCapBytes), captureImageScale: imageScaleValue(exportSettings.captureImageScale), capturePosterFramesOnly: booleanValue( exportSettings.capturePosterFramesOnly, DEFAULT_SETTINGS.export.capturePosterFramesOnly ) }, links: { cleanShareButtons: booleanValue(links.cleanShareButtons, DEFAULT_SETTINGS.links.cleanShareButtons), expandTco: booleanValue(links.expandTco, DEFAULT_SETTINGS.links.expandTco), copyLinkHost: copyLinkHostValue(links.copyLinkHost) }, performance: { pauseOffscreenVideo: booleanValue( performance.pauseOffscreenVideo, DEFAULT_SETTINGS.performance.pauseOffscreenVideo ), keepVideoPlaying: booleanValue( performance.keepVideoPlaying, DEFAULT_SETTINGS.performance.keepVideoPlaying ), loopVideos: booleanValue(performance.loopVideos, DEFAULT_SETTINGS.performance.loopVideos), forceVideoQuality: booleanValue( performance.forceVideoQuality, DEFAULT_SETTINGS.performance.forceVideoQuality ) }, composer: { snippets: stringArray(composer.snippets, { maxItems: 100, maxLength: 500 }) }, ai: { commandMenu: booleanValue(ai.commandMenu, DEFAULT_SETTINGS.ai.commandMenu) }, privacy: { localOnly: anyIntegrationEnabled ? false : booleanValue(privacy.localOnly, DEFAULT_SETTINGS.privacy.localOnly), telemetry: false, blockAds: booleanValue(privacy.blockAds, DEFAULT_SETTINGS.privacy.blockAds), networkShield: booleanValue(privacy.networkShield, DEFAULT_SETTINGS.privacy.networkShield), blockAnalyticsBeacons: booleanValue( privacy.blockAnalyticsBeacons, DEFAULT_SETTINGS.privacy.blockAnalyticsBeacons ), auditLog: booleanValue(privacy.auditLog, DEFAULT_SETTINGS.privacy.auditLog) }, accessibility: { reduceMotion: enumValue( accessibility.reduceMotion, REDUCE_MOTION_MODES, DEFAULT_SETTINGS.accessibility.reduceMotion ), highContrast: booleanValue(accessibility.highContrast, DEFAULT_SETTINGS.accessibility.highContrast) }, i18n: { locale: localeValue(i18n.locale, DEFAULT_SETTINGS.i18n.locale) }, diagnostics: { selectorHealth: booleanValue(diagnostics.selectorHealth, DEFAULT_SETTINGS.diagnostics.selectorHealth) }, integrations: { aria2: { enabled: booleanValue(integrationsAria.enabled, DEFAULT_SETTINGS.integrations.aria2.enabled), endpoint: urlValue(integrationsAria.endpoint, DEFAULT_SETTINGS.integrations.aria2.endpoint), secret: secretValue(integrationsAria.secret, DEFAULT_SETTINGS.integrations.aria2.secret), minBytes: integerValue( integrationsAria.minBytes, DEFAULT_SETTINGS.integrations.aria2.minBytes, 1e6, 5e9 ) }, ytDlp: { enabled: booleanValue(integrationsYtDlp.enabled, DEFAULT_SETTINGS.integrations.ytDlp.enabled), endpoint: credentialedUrlValue( integrationsYtDlp.endpoint, DEFAULT_SETTINGS.integrations.ytDlp.endpoint ), secret: secretValue(integrationsYtDlp.secret, DEFAULT_SETTINGS.integrations.ytDlp.secret) }, bluesky: { enabled: booleanValue(integrationsBluesky.enabled, DEFAULT_SETTINGS.integrations.bluesky.enabled), service: urlValue(integrationsBluesky.service, DEFAULT_SETTINGS.integrations.bluesky.service), handle: handleOrEmpty(integrationsBluesky.handle), appPassword: secretValue( integrationsBluesky.appPassword, DEFAULT_SETTINGS.integrations.bluesky.appPassword ) }, mastodon: { enabled: booleanValue( integrationsMastodon.enabled, DEFAULT_SETTINGS.integrations.mastodon.enabled ), instance: urlValue( integrationsMastodon.instance, DEFAULT_SETTINGS.integrations.mastodon.instance ), token: secretValue(integrationsMastodon.token, DEFAULT_SETTINGS.integrations.mastodon.token), visibility: enumValue( integrationsMastodon.visibility, MASTODON_VISIBILITIES, DEFAULT_SETTINGS.integrations.mastodon.visibility ) }, ai: { enabled: booleanValue(integrationsAi.enabled, DEFAULT_SETTINGS.integrations.ai.enabled), provider: enumValue(integrationsAi.provider, AI_PROVIDERS, DEFAULT_SETTINGS.integrations.ai.provider), endpoint: credentialedUrlValue( integrationsAi.endpoint, DEFAULT_SETTINGS.integrations.ai.endpoint ), apiKey: secretValue(integrationsAi.apiKey, DEFAULT_SETTINGS.integrations.ai.apiKey), model: stringValue(integrationsAi.model, DEFAULT_SETTINGS.integrations.ai.model, 120), maxRequestBytes: integerValue( integrationsAi.maxRequestBytes, DEFAULT_SETTINGS.integrations.ai.maxRequestBytes, 0, INTEGRATION_BUDGET_CEILINGS.ai.maxRequestBytes ), dailyRequestBytes: integerValue( integrationsAi.dailyRequestBytes, DEFAULT_SETTINGS.integrations.ai.dailyRequestBytes, 0, INTEGRATION_BUDGET_CEILINGS.ai.dailyRequestBytes ) }, semanticSearch: { enabled: booleanValue( integrationsSemantic.enabled, DEFAULT_SETTINGS.integrations.semanticSearch.enabled ), endpoint: credentialedUrlValue( integrationsSemantic.endpoint, DEFAULT_SETTINGS.integrations.semanticSearch.endpoint ), apiKey: secretValue( integrationsSemantic.apiKey, DEFAULT_SETTINGS.integrations.semanticSearch.apiKey ), model: stringValue(integrationsSemantic.model, DEFAULT_SETTINGS.integrations.semanticSearch.model, 120), autoIndex: booleanValue( integrationsSemantic.autoIndex, DEFAULT_SETTINGS.integrations.semanticSearch.autoIndex ), maxRecordBytes: integerValue( integrationsSemantic.maxRecordBytes, DEFAULT_SETTINGS.integrations.semanticSearch.maxRecordBytes, 0, INTEGRATION_BUDGET_CEILINGS.semanticSearch.maxRecordBytes ), dailyRecordBytes: integerValue( integrationsSemantic.dailyRecordBytes, DEFAULT_SETTINGS.integrations.semanticSearch.dailyRecordBytes, 0, INTEGRATION_BUDGET_CEILINGS.semanticSearch.dailyRecordBytes ) }, crosspost: { attachLastDownload: booleanValue( integrationsCrosspost.attachLastDownload, DEFAULT_SETTINGS.integrations.crosspost.attachLastDownload ) } } }; } function cloneSettings(settings) { return JSON.parse(JSON.stringify(settings)); } function isThemeId(value) { return THEME_IDS.includes(value); } function sanitizeCustomCss(value) { const normalized = value.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, "").slice(0, CUSTOM_CSS_MAX_LENGTH); if (hasEscapeOutsideString(normalized)) { return { value: "", changed: normalized.length > 0 }; } const forbidden = /@(?:charset|font-face|import|namespace|scope|keyframes?|property|page)\b|(?:url|expression|image-set|cross-fade|paint)\s*\(|(?:^|[;{\s])(?:behavior|-moz-binding|src)\s*:/i; if (forbidden.test(normalized) || !balancedCss(normalized)) { return { value: "", changed: normalized.length > 0 }; } return { value: normalized, changed: normalized !== value }; } function hasEscapeOutsideString(value) { let quote = null; let comment = false; for (let index = 0; index < value.length; index += 1) { const current = value[index]; const next = value[index + 1]; if (comment) { if (current === "*" && next === "/") { comment = false; index += 1; } continue; } if (quote !== null) { if (current === "\n" || current === "\r") { quote = null; continue; } if (current === "\\") { index += 1; continue; } if (current === quote) quote = null; continue; } if (current === "/" && next === "*") { comment = true; index += 1; } else if (current === '"' || current === "'") { quote = current; } else if (current === "\\") { return true; } } return false; } function normalizeCustomCss(value) { const raw = asRecord(value); const result = { ...EMPTY_CUSTOM_CSS }; for (const scope of CUSTOM_CSS_SCOPE_IDS) { const candidate = raw[scope]; if (typeof candidate === "string") { result[scope] = sanitizeCustomCss(candidate).value; } } return result; } function balancedCss(value) { let depth = 0; let quote = null; let escaped = false; let comment = false; for (let index = 0; index < value.length; index += 1) { const current = value[index]; const next = value[index + 1]; if (comment) { if (current === "*" && next === "/") { comment = false; index += 1; } continue; } if (quote !== null) { if (current === "\n" || current === "\r") { return false; } if (escaped) { escaped = false; } else if (current === "\\") { escaped = true; } else if (current === quote) { quote = null; } continue; } if (current === "/" && next === "*") { comment = true; index += 1; } else if (current === '"' || current === "'") { quote = current; } else if (current === "{") { depth += 1; } else if (current === "}") { depth -= 1; if (depth < 0) return false; } } return depth === 0 && quote === null && !comment; } function asRecord(value) { return isRecord(value) ? value : {}; } function isRecord(value) { return typeof value === "object" && value !== null && !Array.isArray(value); } function copyLinkHostValue(value) { return isCopyLinkHost(value) ? value : DEFAULT_SETTINGS.links.copyLinkHost; } function booleanValue(value, fallback) { return typeof value === "boolean" ? value : fallback; } function stringValue(value, fallback, maxLength = 500) { if (typeof value !== "string") { return fallback; } const normalized = value.replace(/[\u0000-\u001f\u007f]/g, "").trim(); return normalized.length > 0 ? normalized.slice(0, maxLength) : fallback; } function enumValue(value, allowed, fallback) { return typeof value === "string" && allowed.includes(value) ? value : fallback; } function stringArray(value, options = {}) { if (!Array.isArray(value)) { return []; } const maxItems = options.maxItems ?? 100; const maxLength = options.maxLength ?? 180; const seen = /* @__PURE__ */ new Set(); const result = []; for (const item of value) { if (typeof item !== "string") { continue; } const normalized = item.replace(/[\u0000-\u001f\u007f]/g, "").trim().slice(0, maxLength); if (normalized.length === 0 || seen.has(normalized)) { continue; } seen.add(normalized); result.push(normalized); if (result.length >= maxItems) { break; } } return result; } function booleanRecord(value) { if (!isRecord(value)) { return {}; } const result = {}; for (const [key, enabled3] of Object.entries(value)) { if (!BLOCKED_OBJECT_KEYS.has(key) && /^[a-z0-9_-]{1,40}$/i.test(key) && typeof enabled3 === "boolean") { result[key] = enabled3; } } return result; } function mediaTypeRecord(value) { const record = booleanRecord(value); const result = {}; for (const key of FILTER_MEDIA_KEYS) { result[key] = record[key] ?? DEFAULT_SETTINGS.filter.mediaTypes[key] ?? false; } return result; } function surfaceArray(value, fallback = DEFAULT_SETTINGS.filter.surfaces, allowEmpty = false) { if (!Array.isArray(value)) { return [...fallback]; } const seen = /* @__PURE__ */ new Set(); for (const item of value) { if (typeof item === "string" && FILTER_SURFACES.includes(item)) { seen.add(item); } } return seen.size > 0 || allowEmpty ? [...seen] : [...fallback]; } function capBytesValue(value) { if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) { return DEFAULT_SETTINGS.export.storageCapBytes; } const rounded = Math.round(value); return rounded < 1e6 || rounded > 1e12 ? DEFAULT_SETTINGS.export.storageCapBytes : rounded; } function imageScaleValue(value) { if (typeof value !== "number" || !Number.isFinite(value)) { return DEFAULT_SETTINGS.export.captureImageScale; } const allowed = [1, 0.75, 0.5, 0.25]; return allowed.includes(value) ? value : DEFAULT_SETTINGS.export.captureImageScale; } function integerValue(value, fallback, min, max) { if (typeof value !== "number" || !Number.isFinite(value)) { return fallback; } return Math.max(min, Math.min(max, Math.trunc(value))); } function exportFormatArray(value) { if (!Array.isArray(value)) { return [...DEFAULT_SETTINGS.export.formats]; } const formats = value.filter((item) => { return typeof item === "string" && EXPORT_FORMATS.includes(item); }); return formats.length > 0 ? [...new Set(formats)] : [...DEFAULT_SETTINGS.export.formats]; } var MAX_URL_LENGTH = 2048; function urlValue(value, fallback) { if (typeof value !== "string" || value.length > MAX_URL_LENGTH) return fallback; const trimmed = value.trim(); if (trimmed.length === 0) return fallback === "" ? "" : fallback; try { const parsed = new URL(trimmed); if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return fallback; return parsed.toString().replace(/\/$/, ""); } catch { return fallback; } } function isLoopbackHost(hostname) { const host = hostname.replace(/^\[|\]$/g, "").toLowerCase(); return host === "localhost" || host === "::1" || host.endsWith(".localhost") || /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(host); } function credentialedUrlValue(value, fallback) { const resolved = urlValue(value, fallback); if (resolved.length === 0) return resolved; try { const parsed = new URL(resolved); if (parsed.protocol === "https:" || isLoopbackHost(parsed.hostname)) { return resolved; } } catch { return fallback; } return fallback; } function secretValue(value, fallback) { if (typeof value !== "string") return fallback; const cleaned = value.replace(/[\u0000-\u001f\u007f]/g, "").trim(); return cleaned.length === 0 ? fallback : cleaned.slice(0, 4096); } function handleOrEmpty(value) { if (typeof value !== "string") return ""; const cleaned = value.replace(/^@/, "").trim(); if (cleaned.length === 0) return ""; return /^[A-Za-z0-9._-]{1,253}$/.test(cleaned) ? cleaned : ""; } var RESERVED_PATH_SEGMENTS = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9]|conin\$|conout\$|clock\$)(?:\.|$)/i; function sanitizeFolderHint(value, maxLength = 120) { const keepSafeSegments = (path) => path.split("/").map((segment) => segment.trim().replace(/[. ]+$/, "")).filter( (segment) => segment.length > 0 && segment !== "." && segment !== ".." && !RESERVED_PATH_SEGMENTS.test(segment) ).join("/"); const cleaned = keepSafeSegments( value.replace(/[<>:"|?*\u0000-\u001f]/g, "").replace(/\\/g, "/") ); return keepSafeSegments(cleaned.slice(0, maxLength)); } function folderHintValue(value, fallback) { if (typeof value !== "string") { return fallback; } return sanitizeFolderHint(value); } function localeValue(value, fallback) { if (typeof value !== "string") { return fallback; } const normalized = value.trim(); return /^[a-z]{2,3}(-[A-Za-z0-9]{2,8}){0,2}$/.test(normalized) ? normalized : fallback; } // src/platform/conversation.ts var PRIMARY_COLUMN = '[data-testid="primaryColumn"]'; var CELL_SELECTOR = '[data-testid="cellInnerDiv"]'; var ARTICLE_SELECTOR = 'article[data-testid="tweet"]'; var QUOTE_BOUNDARY = '[data-testid="quoteTweet"], [aria-labelledby="quoted"], div[role="link"][tabindex="0"]'; function conversationPosts(root = document) { const primary = root.querySelector(PRIMARY_COLUMN) ?? null; if (!primary) { return []; } const posts = []; for (const cell of Array.from(primary.querySelectorAll(CELL_SELECTOR))) { const article = cell.querySelector(ARTICLE_SELECTOR); if (!article || article.closest(CELL_SELECTOR) !== cell) continue; posts.push({ cell, article }); } return posts; } function routeStatusId(pathname = globalThis.location?.pathname ?? "") { return /(?:^|\/)status\/(\d{1,25})(?:\/|$)/.exec(pathname)?.[1] ?? null; } function focalPostIndex(posts, pathname = globalThis.location?.pathname ?? "") { const statusId = routeStatusId(pathname); if (!statusId) return 0; const permalink2 = new RegExp(`/status/${statusId}(?:[/?#]|$)`); const found = posts.findIndex( ({ article }) => Array.from(article.querySelectorAll("a[href]")).some( (link) => link.closest(QUOTE_BOUNDARY) === null && permalink2.test(link.getAttribute("href") ?? "") ) ); return found === -1 ? 0 : found; } // src/features/appearance/theme.ts var STYLE_ID = "av-theme-foundation"; var ACTIVE_NAV_ATTRIBUTE = "data-av-active-route"; var NAV_ITEM_ATTRIBUTE = "data-av-nav-item"; var CONVERSATION_ROLE_ATTRIBUTE = "data-av-conversation-role"; var CONVERSATION_LINE_ATTRIBUTE = "data-av-conversation-line"; var WIDE_STREAM_ATTRIBUTE = "data-av-wide-stream"; var PROFILE_HEADER_ATTRIBUTE = "data-av-profile-header"; var MEDIA_FRAME_ATTRIBUTE = "data-av-media-frame"; var MEDIA_CONTEXT_ATTRIBUTE = "data-av-media-context"; var MEDIA_ASPECT_PROPERTY = "--av-media-aspect"; var MEDIA_HOST_MAX_PROPERTY = "--av-media-host-max"; var MEDIA_VIEWPORT_MAX_PROPERTY = "--av-media-viewport-max"; var MEDIA_SELECTOR = '[data-testid="tweetPhoto"], [data-testid="videoPlayer"], [data-testid="videoComponent"]'; var CARD_BOUNDARY_SELECTOR = '[data-testid="card.wrapper"]'; var CONVERSATION_LINE_MAX_WIDTH = 3; var CONVERSATION_LINE_MIN_HEIGHT = 12; var CONVERSATION_LINE_CENTER_TOLERANCE = 4; var CONTEXT_MEDIA_MAX_WIDTH_PX = 720; var MEDIA_MAX_VIEWPORT_HEIGHT_PERCENT = 72; var PROFILE_HEADER_MAX_WIDTH_PX = 960; var WIDE_COLUMN_MAX_WIDTH_PX = 1180; var PRIMARY_MEDIA_MAX_WIDTH_PX = 1040; var POST_ACTION_MAX_WIDTH_PX = 760; var listeningForMediaResize = false; var themeFeature = { id: "appearance.theme", title: "Theme foundation", category: "appearance", init(ctx) { ensureThemeStyle(); applyTheme(ctx.settings); ctx.diagnostics.info("Theme foundation applied", { theme: ctx.settings.appearance.theme }); }, apply(ctx) { ensureThemeStyle(); applyTheme(ctx.settings); }, destroy(ctx) { document.getElementById(STYLE_ID)?.remove(); for (const theme of ["dim", "lightsOut", "graphite", "plum", "midnight", "noir"]) { document.documentElement.classList.remove(`av-theme-${theme}`); } document.documentElement.classList.remove( "av-dense", "av-hide-counts", ...COUNT_METRICS.map((metric) => `av-hide-count-${metric}`), "av-hide-borders", "av-high-contrast", "av-reduce-motion", "av-chirp" ); delete document.documentElement.dataset.avTheme; delete document.documentElement.dataset.avWidth; delete document.documentElement.dataset.avSurface; syncActiveNavigation(false); syncConversationStructure(false); syncWideStructure(false); syncMediaStructure(false); syncMediaResizeListener(false); setColorScheme(document.documentElement, void 0); ctx.diagnostics.info("Theme foundation destroyed"); } }; function applyTheme(settings) { const root = document.documentElement; const theme = settings.appearance.theme; for (const value of ["dim", "lightsOut", "graphite", "plum", "midnight", "noir"]) { root.classList.toggle(`av-theme-${value}`, value === theme); } if (theme === "off") { delete root.dataset.avTheme; delete root.dataset.avSurface; } else { setDatasetValue(root, "avTheme", theme); setDatasetValue(root, "avSurface", currentSurface()); } syncActiveNavigation(theme === "noir"); syncConversationStructure(theme !== "off" && root.dataset.avSurface === "conversation"); setDatasetValue(root, "avWidth", settings.appearance.timelineWidth); syncWideStructure(settings.appearance.timelineWidth === "wide"); syncMediaStructure(theme !== "off"); syncMediaResizeListener(theme !== "off"); root.classList.toggle("av-chirp", settings.appearance.restoreChirp); root.classList.toggle("av-dense", settings.appearance.denseMode); root.classList.toggle("av-hide-counts", settings.appearance.hideCounts); const metrics = settings.appearance.countMetrics; for (const metric of COUNT_METRICS) { root.classList.toggle( `av-hide-count-${metric}`, settings.appearance.hideCounts && (metrics ? metrics[metric] === true : true) ); } root.classList.toggle("av-hide-borders", settings.appearance.hideBorders); root.classList.toggle("av-high-contrast", settings.accessibility.highContrast); root.classList.toggle("av-reduce-motion", shouldReduceMotion(settings)); setColorScheme(root, theme === "off" ? void 0 : "dark"); } function setColorScheme(root, value) { if (value === void 0) { if (root.dataset.avColorScheme === "1") { root.style.colorScheme = ""; delete root.dataset.avColorScheme; } return; } if (root.style.colorScheme !== value) root.style.colorScheme = value; setDatasetValue(root, "avColorScheme", "1"); } function setDatasetValue(root, key, value) { if (root.dataset[key] !== value) root.dataset[key] = value; } function shouldReduceMotion(settings) { if (settings.accessibility.reduceMotion === "always") return true; if (settings.accessibility.reduceMotion === "never") return false; return globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false; } function syncActiveNavigation(enabled3) { const currentPath = normalizePath(globalThis.location?.pathname ?? "/"); const marked = Array.from( document.querySelectorAll(`[${NAV_ITEM_ATTRIBUTE}], [${ACTIVE_NAV_ATTRIBUTE}]`) ); if (!enabled3) { for (const candidate of marked) { candidate.removeAttribute(NAV_ITEM_ATTRIBUTE); candidate.removeAttribute(ACTIVE_NAV_ATTRIBUTE); } return; } const nav = document.querySelector( 'nav:has([data-testid="AppTabBar_Home_Link"])' ); const candidates2 = nav ? Array.from(nav.querySelectorAll("a[href]")) : Array.from(document.querySelectorAll('a[data-testid^="AppTabBar_"]')); const desired = /* @__PURE__ */ new Set(); for (const anchor of candidates2) { let active2 = false; try { const target = new URL(anchor.href, globalThis.location?.href); if (target.origin !== globalThis.location?.origin) continue; const targetPath = normalizePath(target.pathname); if (targetPath === "/compose/post") continue; active2 = navRouteMatches(currentPath, targetPath); } catch { continue; } desired.add(anchor); if (anchor.getAttribute(NAV_ITEM_ATTRIBUTE) !== "1") { anchor.setAttribute(NAV_ITEM_ATTRIBUTE, "1"); } if (active2) { if (anchor.getAttribute(ACTIVE_NAV_ATTRIBUTE) !== "1") { anchor.setAttribute(ACTIVE_NAV_ATTRIBUTE, "1"); } } else if (anchor.hasAttribute(ACTIVE_NAV_ATTRIBUTE)) { anchor.removeAttribute(ACTIVE_NAV_ATTRIBUTE); } } for (const candidate of marked) { if (desired.has(candidate)) continue; candidate.removeAttribute(NAV_ITEM_ATTRIBUTE); candidate.removeAttribute(ACTIVE_NAV_ATTRIBUTE); } } function navRouteMatches(currentPath, targetPath) { if (currentPath === targetPath || targetPath !== "/" && currentPath.startsWith(`${targetPath}/`)) { return true; } return targetPath === "/explore" && currentPath === "/search"; } function normalizePath(pathname) { return pathname.replace(/\/+$/, "") || "/"; } function reconcileAttribute(attribute, desired, value = "1") { for (const node of Array.from(document.querySelectorAll(`[${attribute}]`))) { if (!desired.has(node)) node.removeAttribute(attribute); } for (const node of desired) { if (node.getAttribute(attribute) !== value) node.setAttribute(attribute, value); } } function setStyleProperty(element2, property, value) { if (element2.style.getPropertyValue(property) !== value) { element2.style.setProperty(property, value); } } function clearStyleProperty(element2, property) { if (element2.style.getPropertyValue(property)) element2.style.removeProperty(property); } function clearMediaFrame(frame) { frame.removeAttribute(MEDIA_FRAME_ATTRIBUTE); clearStyleProperty(frame, MEDIA_ASPECT_PROPERTY); clearStyleProperty(frame, MEDIA_HOST_MAX_PROPERTY); clearStyleProperty(frame, MEDIA_VIEWPORT_MAX_PROPERTY); } function normalizeMediaAspect(aspect) { return Number(aspect.toFixed(4)); } function setMarkerValue(element2, attribute, value) { if (element2.getAttribute(attribute) !== value) element2.setAttribute(attribute, value); } function currentSurface() { return /(?:^|\/)status\/\d+(?:\/|$)/.test(globalThis.location?.pathname ?? "") ? "conversation" : "timeline"; } function syncConversationStructure(enabled3) { if (!enabled3) { for (const node of Array.from( document.querySelectorAll(`[${CONVERSATION_ROLE_ATTRIBUTE}]`) )) { node.removeAttribute(CONVERSATION_ROLE_ATTRIBUTE); } for (const node of Array.from( document.querySelectorAll(`[${CONVERSATION_LINE_ATTRIBUTE}]`) )) { node.removeAttribute(CONVERSATION_LINE_ATTRIBUTE); } return; } const primary = document.querySelector('[data-testid="primaryColumn"]'); if (!primary) return; const posts = conversationPosts(); const focalIndex = focalPostIndex(posts); const roles = /* @__PURE__ */ new Map(); posts.forEach(({ cell, article }, index) => { const role = index === focalIndex ? "focal" : "reply"; roles.set(cell, role); roles.set(article, role); }); for (const node of Array.from( document.querySelectorAll(`[${CONVERSATION_ROLE_ATTRIBUTE}]`) )) { const role = roles.get(node); if (!role) node.removeAttribute(CONVERSATION_ROLE_ATTRIBUTE); else setMarkerValue(node, CONVERSATION_ROLE_ATTRIBUTE, role); } for (const [node, role] of roles) { setMarkerValue(node, CONVERSATION_ROLE_ATTRIBUTE, role); } posts.forEach(({ article }, index) => { if (index === focalIndex) { for (const line of Array.from( article.querySelectorAll(`[${CONVERSATION_LINE_ATTRIBUTE}]`) )) { line.removeAttribute(CONVERSATION_LINE_ATTRIBUTE); } return; } if (!article.querySelector(`[${CONVERSATION_LINE_ATTRIBUTE}]`)) stampConversationLines(article); }); } function syncWideStructure(enabled3) { const streams = /* @__PURE__ */ new Set(); const profileHeaders = /* @__PURE__ */ new Set(); if (enabled3) { for (const primary of Array.from( document.querySelectorAll('[data-testid="primaryColumn"]') )) { for (const region of Array.from(primary.querySelectorAll('section[role="region"]'))) { if (!region.querySelector('[data-testid="cellInnerDiv"]')) continue; const lane = region.parentElement; if (lane && lane !== primary && lane.closest('[data-testid="primaryColumn"]') === primary) { streams.add(lane); for (const child of Array.from(lane.children)) { if (child instanceof HTMLElement && child.querySelector('[data-testid="UserProfileHeader_Items"]')) { profileHeaders.add(child); } } } } } } reconcileAttribute(WIDE_STREAM_ATTRIBUTE, streams); reconcileAttribute(PROFILE_HEADER_ATTRIBUTE, profileHeaders); } function syncMediaStructure(enabled3) { if (!enabled3) { clearMediaStructure(); return; } const frames = /* @__PURE__ */ new Map(); const embeddedContexts = /* @__PURE__ */ new Set(); for (const article of Array.from( document.querySelectorAll('article[data-testid="tweet"]') )) { const roots = Array.from(article.querySelectorAll(MEDIA_SELECTOR)).filter( (node) => node.closest('article[data-testid="tweet"]') === article && node.parentElement?.closest(MEDIA_SELECTOR) === null ); if (roots.length === 0) continue; const own = []; const embedded = /* @__PURE__ */ new Set(); for (const media of roots) { const boundary = mediaBoundary(article, media); if (boundary) embedded.add(boundary); else own.push(media); } for (const boundary of embedded) embeddedContexts.add(boundary); if (own.length === 0) continue; const kind = article.dataset.avConversationRole === "reply" ? "reply" : "primary"; const first = own[0]; if (!first) continue; const shared2 = own.length > 1 ? commonAncestor(own, article) : null; if (shared2) { frames.set(shared2, { media: own, kind }); } else { for (const media of own) { frames.set(findMediaFrame(media, article), { media: [media], kind }); } } } for (const node of Array.from( document.querySelectorAll(`[${MEDIA_CONTEXT_ATTRIBUTE}]`) )) { if (!embeddedContexts.has(node)) node.removeAttribute(MEDIA_CONTEXT_ATTRIBUTE); } for (const boundary of embeddedContexts) { setMarkerValue(boundary, MEDIA_CONTEXT_ATTRIBUTE, "embedded"); } for (const frame of Array.from( document.querySelectorAll(`[${MEDIA_FRAME_ATTRIBUTE}]`) )) { if (!frames.has(frame)) clearMediaFrame(frame); } for (const [frame, entry] of frames) stampMediaFrame(frame, entry.media, entry.kind); } function stampMediaFrame(frame, media, kind) { const storedAspect = Number.parseFloat(frame.style.getPropertyValue(MEDIA_ASPECT_PROPERTY)); const intrinsic = intrinsicMediaAspect(media); const intrinsicAspect = intrinsic ? normalizeMediaAspect(Math.max(0.35, Math.min(3, intrinsic))) : 0; if (frame.getAttribute(MEDIA_FRAME_ATTRIBUTE) === kind && Number.isFinite(storedAspect) && storedAspect > 0 && (intrinsicAspect === 0 || Math.abs(storedAspect - intrinsicAspect) < 1e-4)) { return; } const hostMax = kind === "reply" ? finiteComputedMax(frame) : null; const aspect = intrinsicAspect || normalizeMediaAspect(mediaAspect(frame)); setMarkerValue(frame, MEDIA_FRAME_ATTRIBUTE, kind); setStyleProperty(frame, MEDIA_ASPECT_PROPERTY, String(aspect)); setMediaViewportMax(frame, aspect); if (hostMax) { setStyleProperty(frame, MEDIA_HOST_MAX_PROPERTY, hostMax); } else { clearStyleProperty(frame, MEDIA_HOST_MAX_PROPERTY); } } function setMediaViewportMax(frame, aspect) { const max = Math.max(1, Math.round(window.innerHeight * (MEDIA_MAX_VIEWPORT_HEIGHT_PERCENT / 100) * aspect)); setStyleProperty(frame, MEDIA_VIEWPORT_MAX_PROPERTY, `${max}px`); } function refreshMediaViewportMax() { for (const frame of Array.from(document.querySelectorAll(`[${MEDIA_FRAME_ATTRIBUTE}]`))) { const aspect = Number.parseFloat(frame.style.getPropertyValue(MEDIA_ASPECT_PROPERTY)); if (Number.isFinite(aspect) && aspect > 0) setMediaViewportMax(frame, aspect); } } function syncMediaResizeListener(enabled3) { if (enabled3 === listeningForMediaResize) return; listeningForMediaResize = enabled3; window[enabled3 ? "addEventListener" : "removeEventListener"]("resize", refreshMediaViewportMax); } function clearMediaStructure() { for (const node of Array.from( document.querySelectorAll(`[${MEDIA_FRAME_ATTRIBUTE}], [${MEDIA_CONTEXT_ATTRIBUTE}]`) )) { node.removeAttribute(MEDIA_CONTEXT_ATTRIBUTE); clearMediaFrame(node); } } function mediaBoundary(article, media) { let card = null; for (let node = media.parentElement; node && node !== article; node = node.parentElement) { if (isQuoteBoundary(node)) return node; if (!card && node.matches(CARD_BOUNDARY_SELECTOR)) card = node; } return card; } function isQuoteBoundary(node) { if (node.matches('[data-testid="quoteTweet"], [aria-labelledby="quoted"]')) return true; return node.matches('div[role="link"][tabindex="0"]') && node.querySelector('[data-testid="User-Name"]') !== null; } function commonAncestor(nodes, limit) { const first = nodes[0]; if (!first) return null; for (let candidate = first; candidate && candidate !== limit; candidate = candidate.parentElement) { if (nodes.every((node) => candidate?.contains(node))) return candidate; } return null; } function findMediaFrame(media, article) { for (let node = media.parentElement; node && node !== article; node = node.parentElement) { const style = getComputedStyle(node); if (style.overflow === "hidden" && Number.parseFloat(style.borderTopWidth) > 0 && Number.parseFloat(style.borderRadius) > 0) { return node; } } return media; } function intrinsicMediaAspect(media) { const first = media[0]; if (media.length === 1 && first) { const video = first.querySelector("video"); const image = first.querySelector("img"); if (video && video.videoWidth > 0 && video.videoHeight > 0) { return video.videoWidth / video.videoHeight; } else if (image && image.naturalWidth > 0 && image.naturalHeight > 0) { return image.naturalWidth / image.naturalHeight; } } return 0; } function mediaAspect(frame) { const box = frame.getBoundingClientRect(); const ratio = box.width > 0 && box.height > 0 ? box.width / box.height : 16 / 9; return Math.max(0.35, Math.min(3, ratio)); } function finiteComputedMax(element2) { const value = getComputedStyle(element2).maxWidth; return /^\d+(?:\.\d+)?px$/.test(value) ? value : "100%"; } function stampConversationLines(article) { const avatar = article.querySelector('[data-testid="Tweet-User-Avatar"]'); if (!avatar) return; const avatarBox = avatar.getBoundingClientRect(); const articleBox = article.getBoundingClientRect(); if (avatarBox.width === 0) return; const avatarCenter = avatarBox.left + avatarBox.width / 2; for (const candidate of Array.from(article.querySelectorAll("div"))) { if (candidate.closest('article[data-testid="tweet"]') !== article) continue; if (candidate.childElementCount > 0) continue; if ((candidate.textContent ?? "").trim().length > 0) continue; const style = getComputedStyle(candidate); if (style.position !== "absolute" && style.position !== "relative") continue; const box = candidate.getBoundingClientRect(); if (box.width === 0 || box.width > CONVERSATION_LINE_MAX_WIDTH) continue; if (box.height < CONVERSATION_LINE_MIN_HEIGHT) continue; if (box.top < avatarBox.bottom - CONVERSATION_LINE_CENTER_TOLERANCE) continue; if (box.bottom > articleBox.bottom + CONVERSATION_LINE_CENTER_TOLERANCE) continue; if (style.backgroundColor === "rgba(0, 0, 0, 0)") continue; const center = box.left + box.width / 2; if (Math.abs(center - avatarCenter) > CONVERSATION_LINE_CENTER_TOLERANCE) continue; candidate.setAttribute(CONVERSATION_LINE_ATTRIBUTE, "1"); } } function ensureThemeStyle() { if (document.getElementById(STYLE_ID)) { return; } const style = document.createElement("style"); style.id = STYLE_ID; style.textContent = THEME_CSS; (document.head ?? document.documentElement).append(style); } var themeVars = { dim: ` --av-bg: rgb(0, 0, 0); --av-surface: rgb(15, 20, 25); --av-surface-raised: rgb(22, 24, 28); --av-border: rgb(47, 51, 54); --av-text: rgb(239, 243, 244); /* X's own secondary grey measures 3.96:1 on the panel row, below AA for the 12px descriptions and status line it carries. Lifted to the nearest value that clears 4.5. */ --av-muted: rgb(132, 139, 145); --av-accent: rgb(29, 155, 240); --av-danger: rgb(255, 120, 128); --av-warn: rgb(247, 183, 73); --av-ok: rgb(72, 211, 147); --av-on-accent: rgb(5, 10, 15); --av-on-danger: rgb(28, 8, 8); --av-media-success: rgb(120, 200, 130); --av-media-error: rgb(220, 110, 110); --av-media-success-text: rgb(206, 240, 210); --av-media-error-text: rgb(248, 200, 200); --av-accent-secondary: rgb(29, 155, 240); `, lightsOut: ` --av-bg: rgb(0, 0, 0); --av-surface: rgb(5, 6, 7); --av-surface-raised: rgb(14, 15, 17); --av-border: rgb(36, 39, 43); --av-text: rgb(245, 247, 248); --av-muted: rgb(132, 139, 145); --av-accent: rgb(29, 155, 240); --av-danger: rgb(255, 120, 128); --av-warn: rgb(247, 183, 73); --av-ok: rgb(72, 211, 147); --av-on-accent: rgb(5, 10, 15); --av-on-danger: rgb(28, 8, 8); --av-media-success: rgb(120, 200, 130); --av-media-error: rgb(220, 110, 110); --av-media-success-text: rgb(206, 240, 210); --av-media-error-text: rgb(248, 200, 200); --av-accent-secondary: rgb(29, 155, 240); `, graphite: ` --av-bg: rgb(8, 9, 11); --av-surface: rgb(18, 20, 23); --av-surface-raised: rgb(27, 30, 34); --av-border: rgb(55, 60, 66); --av-text: rgb(241, 244, 246); --av-muted: rgb(150, 157, 164); --av-accent: rgb(91, 176, 255); --av-danger: rgb(255, 128, 136); --av-warn: rgb(247, 189, 90); --av-ok: rgb(88, 214, 155); --av-on-accent: rgb(6, 10, 14); --av-on-danger: rgb(28, 8, 8); --av-media-success: rgb(126, 204, 137); --av-media-error: rgb(222, 116, 116); --av-media-success-text: rgb(208, 241, 212); --av-media-error-text: rgb(248, 203, 203); --av-accent-secondary: rgb(91, 176, 255); `, plum: ` --av-bg: rgb(9, 5, 12); --av-surface: rgb(21, 14, 27); --av-surface-raised: rgb(32, 22, 41); --av-border: rgb(62, 45, 73); --av-text: rgb(246, 241, 249); --av-muted: rgb(164, 148, 174); --av-accent: rgb(205, 142, 255); --av-danger: rgb(255, 133, 150); --av-warn: rgb(246, 191, 108); --av-ok: rgb(112, 216, 168); --av-on-accent: rgb(14, 6, 18); --av-on-danger: rgb(30, 8, 12); --av-media-success: rgb(140, 206, 160); --av-media-error: rgb(224, 124, 132); --av-media-success-text: rgb(215, 242, 224); --av-media-error-text: rgb(249, 208, 212); --av-accent-secondary: rgb(205, 142, 255); `, midnight: ` --av-bg: rgb(2, 8, 16); --av-surface: rgb(9, 18, 30); --av-surface-raised: rgb(16, 31, 49); --av-border: rgb(38, 60, 82); --av-text: rgb(239, 246, 252); --av-muted: rgb(139, 160, 178); --av-accent: rgb(68, 171, 255); --av-danger: rgb(255, 126, 138); --av-warn: rgb(247, 187, 96); --av-ok: rgb(88, 216, 164); --av-on-accent: rgb(3, 12, 22); --av-on-danger: rgb(26, 8, 12); --av-media-success: rgb(126, 205, 150); --av-media-error: rgb(222, 118, 124); --av-media-success-text: rgb(210, 242, 220); --av-media-error-text: rgb(248, 205, 208); --av-accent-secondary: rgb(68, 171, 255); `, noir: ` --av-bg: rgb(5, 8, 12); --av-surface: rgb(11, 16, 22); --av-surface-raised: rgb(18, 25, 33); --av-border: rgb(46, 58, 69); --av-text: rgb(238, 242, 245); --av-muted: rgb(151, 164, 175); --av-accent: rgb(110, 194, 226); --av-accent-secondary: rgb(164, 148, 224); --av-danger: rgb(255, 130, 140); --av-warn: rgb(248, 190, 100); --av-ok: rgb(92, 219, 168); --av-on-accent: rgb(4, 16, 22); --av-on-danger: rgb(26, 8, 10); --av-media-success: rgb(128, 208, 152); --av-media-error: rgb(224, 120, 126); --av-media-success-text: rgb(212, 243, 222); --av-media-error-text: rgb(249, 206, 210); ` }; var THEME_CSS = ` html.av-theme-dim { ${themeVars.dim} } html.av-theme-lightsOut { ${themeVars.lightsOut} } html.av-theme-graphite { ${themeVars.graphite} } html.av-theme-plum { ${themeVars.plum} } html.av-theme-midnight { ${themeVars.midnight} } html.av-theme-noir { ${themeVars.noir} } html[data-av-theme] { color-scheme: dark; } html[data-av-theme] body { background: var(--av-bg, rgb(0, 0, 0)); color: var(--av-text, rgb(239, 243, 244)); } /* Every authored palette must survive X's own light or dark selection. These semantic anchors repaint the shell and readable content without depending on generated atomic classes. Noir layers its richer gradients and depth over the same foundation below. */ html[data-av-theme] [data-testid="app-shell"], html[data-av-theme] nav:has([data-testid="AppTabBar_Home_Link"]), html[data-av-theme] [data-testid="sidebarColumn"] { background-color: var(--av-bg, rgb(0, 0, 0)); color: var(--av-text, rgb(239, 243, 244)); } html[data-av-theme] nav:has([data-testid="AppTabBar_Home_Link"]) a, html[data-av-theme] article[data-testid="tweet"], html[data-av-theme] article[data-testid="tweet"] [data-testid="User-Name"] a, html[data-av-theme] article[data-testid="tweet"] [data-testid="tweetText"], html[data-av-theme] [data-testid="primaryColumn"] [role="tab"], html[data-av-theme] [data-testid^="tweetTextarea_"], html[data-av-theme] [data-testid="SearchBox_Search_Input"] { color: var(--av-text, rgb(239, 243, 244)); } html[data-av-theme] article[data-testid="tweet"] [role="group"] button:not([data-av-media-action]), html[data-av-theme] article[data-testid="tweet"] [role="group"] a { color: var(--av-muted, rgb(132, 139, 145)); } html[data-av-theme] [data-testid="primaryColumn"] { background: var(--av-bg, rgb(0, 0, 0)); border-color: var(--av-border, rgb(47, 51, 54)); color: var(--av-text, rgb(239, 243, 244)); } html[data-av-theme] [data-testid="toolBar"], html[data-av-theme] form[role="search"]:has([data-testid="SearchBox_Search_Input"]), html[data-av-theme] [data-testid="GrokDrawer"], html[data-av-theme] [data-testid="chat-drawer-root"] { border-color: var(--av-border, rgb(47, 51, 54)); background-color: var(--av-surface, rgb(15, 20, 25)); color: var(--av-text, rgb(239, 243, 244)); } html[data-av-theme] [data-testid="sidebarColumn"] section, html[data-av-theme] [data-testid="sidebarColumn"] div:has(> [data-testid="news_sidebar"]), html[data-av-theme] [data-testid="sidebarColumn"] aside[role="complementary"], html[data-av-theme] [aria-label="Timeline: Trending now"] { background-color: color-mix(in srgb, var(--av-surface) 92%, transparent); border-color: var(--av-border); color: var(--av-text, rgb(239, 243, 244)); } /* Quiet Stream foundation: authored themes read as one continuous timeline. Row separators carry the hierarchy, while posts stay flat and media gets the available width. */ html[data-av-theme] [data-testid="cellInnerDiv"] > div { border-bottom-color: color-mix(in srgb, var(--av-border) 64%, transparent); } @media (hover: hover) and (pointer: fine) { html[data-av-theme]:not(.av-reduce-motion) [data-testid="cellInnerDiv"] > div { transition: background-color 110ms ease-out; } html[data-av-theme] [data-testid="cellInnerDiv"] > div:hover { background-color: color-mix(in srgb, var(--av-surface-raised) 24%, transparent); } } html[data-av-theme] article[data-testid="tweet"] { border-radius: 0; background: transparent; box-shadow: none; } html[data-av-theme] article[data-testid="tweet"] [data-testid="tweetText"] { max-inline-size: min(72ch, 100%); font-size: 16px; line-height: 1.5; } html[data-av-theme] article[data-testid="tweet"] [role="group"] { column-gap: clamp(12px, 2.2vw, 32px); } html[data-av-theme] article[data-testid="tweet"] [role="group"] > :not([data-av-media-action-slot]) { min-height: 36px; } html[data-av-width="wide"] article[data-testid="tweet"] [role="group"] { justify-content: space-between; width: min(100%, ${POST_ACTION_MAX_WIDTH_PX}px) !important; max-width: ${POST_ACTION_MAX_WIDTH_PX}px !important; margin-inline: auto; } /* Bound the frame that owns media geometry, not the absolutely positioned media child. Primary media can use the full post width but its intrinsic aspect ratio prevents it from growing taller than 72% of the viewport. Context media stays smaller and a reply also honors any tighter cap X already supplied. */ html[data-av-theme] [${MEDIA_FRAME_ATTRIBUTE}="primary"] { --av-media-max-inline: ${PRIMARY_MEDIA_MAX_WIDTH_PX}px; } html[data-av-theme] [${MEDIA_FRAME_ATTRIBUTE}="reply"] { --av-media-max-inline: ${CONTEXT_MEDIA_MAX_WIDTH_PX}px; } html[data-av-theme] [${MEDIA_FRAME_ATTRIBUTE}] { max-inline-size: min( 100%, var(${MEDIA_HOST_MAX_PROPERTY}, 100%), var(--av-media-max-inline), var(${MEDIA_VIEWPORT_MAX_PROPERTY}) ) !important; max-block-size: ${MEDIA_MAX_VIEWPORT_HEIGHT_PERCENT}vh !important; margin-inline: auto !important; } html[data-av-theme] [${MEDIA_FRAME_ATTRIBUTE}] [data-testid="tweetPhoto"], html[data-av-theme] [${MEDIA_FRAME_ATTRIBUTE}] [data-testid="videoPlayer"], html[data-av-theme] [${MEDIA_FRAME_ATTRIBUTE}] [data-testid="videoComponent"] { inline-size: 100% !important; max-inline-size: 100% !important; } html[data-av-theme] [${MEDIA_CONTEXT_ATTRIBUTE}="embedded"] { max-inline-size: min(100%, ${CONTEXT_MEDIA_MAX_WIDTH_PX}px) !important; } html[data-av-theme] [data-testid="tweetPhoto"], html[data-av-theme] [data-testid="videoPlayer"], html[data-av-theme] [data-testid="videoComponent"] { border-radius: 10px; } /* The resting button only. This rule and the feature's own state rules were both (0,2,1), so which one painted a finished or failed download came down to which stylesheet was appended last -- and under every Aviary theme the answer was this one, which made success, failure, opened and duplicate all render as an untouched button. Excluding the states here is what leaves the feature that raises them in charge of what they look like. */ html[data-av-theme] [data-av-media-action]:not(.is-success):not(.is-error):not(.is-opened):not(.is-duplicate) { min-width: 108px; min-height: 40px; padding: 7px 12px; border: 1px solid transparent; border-radius: 8px; background: var(--av-accent); color: var(--av-on-accent, rgb(3, 20, 24)); box-shadow: none; } html[data-av-theme] [data-av-media-action]:hover:not(:disabled) { border-color: transparent; background: color-mix(in srgb, var(--av-accent) 86%, white); color: var(--av-on-accent, rgb(3, 20, 24)); } /* X's own reply connector, hidden by the stamp syncConversationStructure puts on it after checking its geometry. The stamp is what keeps this independent of X's generated class names, and it is removed on teardown, so turning the theme off restores X's element rather than leaving it hidden by a selector nothing owns any more. */ html[data-av-theme][data-av-surface="conversation"] [data-av-conversation-line] { display: none !important; } /* A post detail route has one focal post, then a compact reply stream. The role markers are applied by syncConversationStructure so this stays independent of X's generated classes. */ html[data-av-theme][data-av-surface="conversation"] [data-av-conversation-role="focal"] [data-testid="tweetText"] { max-inline-size: min(52ch, 100%); font-size: clamp(20px, 1.5vw, 23px); line-height: 1.36; } html[data-av-theme][data-av-surface="conversation"] [data-av-conversation-role="focal"] [data-testid="tweetPhoto"], html[data-av-theme][data-av-surface="conversation"] [data-av-conversation-role="focal"] [data-testid="videoPlayer"], html[data-av-theme][data-av-surface="conversation"] [data-av-conversation-role="focal"] [data-testid="videoComponent"] { margin-block-start: 16px; } html[data-av-theme][data-av-surface="conversation"] [data-testid="cellInnerDiv"][data-av-conversation-role="reply"] > div { padding-block: 14px !important; } html[data-av-theme][data-av-surface="conversation"] [data-av-conversation-role="reply"] [data-testid="tweetText"] { max-inline-size: min(68ch, 100%); font-size: 15.5px; line-height: 1.52; } /* Wide means the post content is wide too. The earlier character caps left a narrow text island and short action row inside an otherwise full-width post on ultrawide displays. */ html[data-av-width="wide"] article[data-testid="tweet"] [data-testid="tweetText"] { inline-size: 100%; max-inline-size: none !important; } html[data-av-theme][data-av-surface="conversation"] [data-testid^="tweetTextarea_"] { min-height: 40px !important; border-radius: 8px; } /* Noir is Aviary's authored premium desktop skin. The root owns the canvas so it covers every route and scroll depth without exposing a second base colour. */ html.av-theme-noir { background-color: var(--av-bg); scrollbar-color: color-mix(in srgb, var(--av-muted) 46%, transparent) var(--av-bg); } html.av-theme-noir body { background-color: transparent !important; background-image: none; color: var(--av-text); } html.av-theme-noir [data-testid="app-shell"] { color: var(--av-text); } html.av-theme-noir header[role="banner"] > div > div:has([data-testid="AppTabBar_Home_Link"]) { border-right: 1px solid color-mix(in srgb, var(--av-border) 66%, transparent); background: rgb(8, 11, 16); } html.av-theme-noir nav:has([data-testid="AppTabBar_Home_Link"]) { border-color: color-mix(in srgb, var(--av-border) 72%, transparent); background: rgb(8, 11, 16); box-shadow: none; } html.av-theme-noir nav:has([data-testid="AppTabBar_Home_Link"]) [data-av-nav-item] { box-sizing: border-box; border-radius: 8px; color: var(--av-text); } @media (hover: hover) and (pointer: fine) { html.av-theme-noir:not(.av-reduce-motion) nav:has([data-testid="AppTabBar_Home_Link"]) [data-av-nav-item] { transition: color 110ms ease-out, background-color 110ms ease-out; } html.av-theme-noir nav:has([data-testid="AppTabBar_Home_Link"]) [data-av-nav-item]:hover { background-color: color-mix(in srgb, var(--av-accent) 6%, var(--av-surface)); color: var(--av-text); } } html.av-theme-noir nav:has([data-testid="AppTabBar_Home_Link"]) [data-av-nav-item][aria-current="page"], html.av-theme-noir nav:has([data-testid="AppTabBar_Home_Link"]) [data-av-nav-item][data-av-active-route="1"] { background: color-mix(in srgb, var(--av-accent) 9%, var(--av-surface-raised)); box-shadow: inset 3px 0 0 color-mix(in srgb, var(--av-accent) 82%, white); color: var(--av-text); } html.av-theme-noir nav:has([data-testid="AppTabBar_Home_Link"]) [data-av-nav-item]:focus-visible { outline: 2px solid color-mix(in srgb, var(--av-accent) 80%, white); outline-offset: -2px; } html.av-theme-noir [data-testid="SideNav_NewTweet_Button"], html.av-theme-noir [data-testid="tweetButtonInline"] { border-color: transparent; border-radius: 8px; background-color: var(--av-accent) !important; background-image: none !important; color: var(--av-on-accent); box-shadow: none; font-weight: 750; } html.av-theme-noir [data-testid="SideNav_NewTweet_Button"]:hover, html.av-theme-noir [data-testid="tweetButtonInline"]:hover { background-color: color-mix(in srgb, var(--av-accent) 88%, white) !important; box-shadow: none; } html.av-theme-noir [data-testid="SideNav_AccountSwitcher_Button"] { border: 1px solid color-mix(in srgb, var(--av-border) 80%, transparent); border-radius: 9px; background: var(--av-surface); } html.av-theme-noir [data-testid="primaryColumn"] { border-color: color-mix(in srgb, var(--av-border) 74%, transparent); background: rgb(8, 12, 17); box-shadow: none; } html.av-theme-noir [data-testid="primaryColumn"] [role="tablist"] { border-bottom: 1px solid color-mix(in srgb, var(--av-border) 66%, transparent); background: rgb(8, 12, 17); } html.av-theme-noir [data-testid="primaryColumn"] [role="tab"] { color: var(--av-muted); transition: color 100ms ease-out, background-color 100ms ease-out; } html.av-theme-noir [data-testid="primaryColumn"] [role="tab"] * { color: inherit !important; } html.av-theme-noir [data-testid="primaryColumn"] [role="tab"]:hover { background-color: color-mix(in srgb, var(--av-surface-raised) 38%, transparent); } html.av-theme-noir [data-testid="primaryColumn"] [role="tab"]:focus-visible { outline: 2px solid color-mix(in srgb, var(--av-accent) 82%, white); outline-offset: -2px; } html.av-theme-noir [data-testid="primaryColumn"] [role="tab"][aria-selected="true"] { color: var(--av-text); text-shadow: none; } html.av-theme-noir [data-testid="primaryColumn"] [role="tab"][aria-selected="true"] > div > div > div:last-child:empty { background-color: var(--av-accent) !important; } html.av-theme-noir [data-testid="cellInnerDiv"] > div { border-bottom-color: color-mix(in srgb, var(--av-border) 48%, transparent); } html.av-theme-noir article[data-testid="tweet"] { border-radius: 0; background: transparent; box-shadow: none; } html.av-theme-noir article[data-testid="tweet"] [data-testid="User-Name"], html.av-theme-noir article[data-testid="tweet"] [data-testid="User-Name"] a, html.av-theme-noir article[data-testid="tweet"] [data-testid="tweetText"] { color: var(--av-text); } html.av-theme-noir article[data-testid="tweet"] [role="group"] :is(button, a):not([data-av-media-action]) { color: var(--av-muted); min-inline-size: 36px; min-block-size: 36px; border-radius: 6px; transition: color 100ms ease-out, background-color 100ms ease-out; } html.av-theme-noir article[data-testid="tweet"] [role="group"] :is(button, a):not([data-av-media-action]) * { color: inherit !important; } html.av-theme-noir article[data-testid="tweet"] [role="group"] :is(button, a):not([data-av-media-action]) svg, html.av-theme-noir article[data-testid="tweet"] [role="group"] :is(button, a):not([data-av-media-action]) svg path { fill: currentColor !important; } html.av-theme-noir article[data-testid="tweet"] [role="group"] :is(button, a):not([data-av-media-action]):hover { background-color: color-mix(in srgb, var(--av-accent) 10%, transparent); color: var(--av-accent); } html.av-theme-noir article[data-testid="tweet"] [role="group"] :is(button, a):not([data-av-media-action]):focus-visible { outline: 2px solid color-mix(in srgb, var(--av-accent) 82%, white); outline-offset: 1px; } html.av-theme-noir article[data-testid="tweet"] [role="group"] button[data-testid="unlike"] { color: var(--av-danger); } html.av-theme-noir article[data-testid="tweet"] [role="group"] button[data-testid="unretweet"] { color: var(--av-ok); } html.av-theme-noir article[data-testid="tweet"] [role="group"] button[data-testid="removeBookmark"] { color: var(--av-accent); } html.av-theme-noir [data-testid="tweetPhoto"], html.av-theme-noir [data-testid="videoPlayer"], html.av-theme-noir [data-testid="videoComponent"] { border: 1px solid color-mix(in srgb, var(--av-border) 68%, transparent); border-radius: 10px; background-color: var(--av-surface-raised); box-shadow: 0 4px 18px rgba(0, 0, 0, 0.18); } html.av-theme-noir [data-testid="toolBar"] { border-color: color-mix(in srgb, var(--av-border) 74%, transparent); background: var(--av-surface); } html.av-theme-noir [data-testid="toolBar"] button:not([data-testid="tweetButtonInline"]) { color: var(--av-accent); } html.av-theme-noir [data-testid="toolBar"] button:not([data-testid="tweetButtonInline"]) * { color: inherit !important; } html.av-theme-noir [data-testid="toolBar"] button:not([data-testid="tweetButtonInline"]) svg, html.av-theme-noir [data-testid="toolBar"] button:not([data-testid="tweetButtonInline"]) svg path { fill: currentColor !important; } html.av-theme-noir [data-testid="toolBar"] button:disabled:not([data-testid="tweetButtonInline"]) { color: var(--av-muted); opacity: 0.52; } html.av-theme-noir [data-testid="toolBar"] button:focus-visible { outline: 2px solid color-mix(in srgb, var(--av-accent) 82%, white); outline-offset: 1px; } html.av-theme-noir [data-testid="tweetTextarea_0RichTextInputContainer"], html.av-theme-noir [data-testid="tweetTextarea_0"] { border-color: color-mix(in srgb, var(--av-border) 82%, transparent); border-radius: 10px; background-color: color-mix(in srgb, var(--av-surface-raised) 76%, transparent); color: var(--av-text); } html.av-theme-noir [data-testid="sidebarColumn"] { color: var(--av-text); } html.av-theme-noir [data-testid="sidebarColumn"] div:has(> [data-testid="news_sidebar"]), html.av-theme-noir [data-testid="sidebarColumn"] section[data-testid="news_sidebar"], html.av-theme-noir [data-testid="sidebarColumn"] aside[role="complementary"], html.av-theme-noir [aria-label="Timeline: Trending now"] { border: 1px solid color-mix(in srgb, var(--av-border) 78%, transparent); border-radius: 10px; background: rgba(11, 18, 27, 0.9); box-shadow: none; } html.av-theme-noir [aria-label="Timeline: Trending now"] > section { border-color: transparent; background: transparent; } html.av-theme-noir [data-testid="sidebarColumn"] [data-testid="UserCell"] { background-color: transparent; transition: background-color 140ms ease; } html.av-theme-noir [data-testid="sidebarColumn"] [data-testid="UserCell"]:hover { background-color: color-mix(in srgb, var(--av-accent) 7%, transparent); } html.av-theme-noir form[role="search"]:has([data-testid="SearchBox_Search_Input"]) { border: 1px solid color-mix(in srgb, var(--av-border) 82%, transparent); border-radius: 10px; background-color: rgba(14, 22, 32, 0.94); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.025); } html.av-theme-noir [data-testid="SearchBox_Search_Input"] { border: 0; background-color: transparent; color: var(--av-text); box-shadow: none; } html.av-theme-noir [data-testid="editProfileButton"], html.av-theme-noir button[data-testid$="-unfollow"] { min-height: 36px; padding-inline: 14px; border: 1px solid color-mix(in srgb, var(--av-border) 92%, transparent) !important; border-radius: 8px !important; background: var(--av-surface-raised) !important; color: var(--av-text) !important; box-shadow: none !important; } html.av-theme-noir [data-av-profile-header] div:has(> button[role="button"] + div a[href="/i/premium_sign_up"]) { border: 1px solid color-mix(in srgb, var(--av-border) 88%, transparent) !important; border-radius: 10px !important; background: color-mix(in srgb, var(--av-surface-raised) 92%, black) !important; box-shadow: none !important; } html.av-theme-noir button[data-testid$="-follow"], html.av-theme-noir [data-av-profile-header] a[href="/i/premium_sign_up"] { min-height: 36px; padding-inline: 14px; border: 1px solid transparent !important; border-radius: 8px !important; background: var(--av-accent) !important; color: var(--av-on-accent) !important; box-shadow: none !important; } html.av-theme-noir [data-testid="editProfileButton"] *, html.av-theme-noir button[data-testid$="-follow"] *, html.av-theme-noir button[data-testid$="-unfollow"] *, html.av-theme-noir [data-av-profile-header] a[href="/i/premium_sign_up"] * { color: inherit !important; } html.av-theme-noir [data-testid="editProfileButton"]:focus-visible, html.av-theme-noir button[data-testid$="-follow"]:focus-visible, html.av-theme-noir button[data-testid$="-unfollow"]:focus-visible, html.av-theme-noir [data-av-profile-header] a[href="/i/premium_sign_up"]:focus-visible { outline: 2px solid color-mix(in srgb, var(--av-accent) 82%, white); outline-offset: 2px; } @media (hover: hover) and (pointer: fine) { html.av-theme-noir [data-testid="editProfileButton"]:hover, html.av-theme-noir button[data-testid$="-unfollow"]:hover { border-color: color-mix(in srgb, var(--av-accent) 58%, var(--av-border)) !important; background: color-mix(in srgb, var(--av-accent) 8%, var(--av-surface-raised)) !important; } html.av-theme-noir button[data-testid$="-follow"]:hover, html.av-theme-noir [data-av-profile-header] a[href="/i/premium_sign_up"]:hover { background: color-mix(in srgb, var(--av-accent) 88%, white) !important; } } html.av-theme-noir form[role="search"]:has([data-testid="SearchBox_Search_Input"]):focus-within { border-color: color-mix(in srgb, var(--av-accent) 72%, transparent); box-shadow: 0 0 0 3px rgba(92, 211, 255, 0.12); outline: none; } html.av-theme-noir [data-testid="GrokDrawer"], html.av-theme-noir [data-testid="grokImgGen"] { border-color: color-mix(in srgb, var(--av-accent-secondary) 48%, var(--av-border)); background: var(--av-surface); box-shadow: none; } /* Wide already exposes Grok and Chat in primary navigation. Their redundant one-button drawers float over the rightmost post controls, so remove only that collapsed state. An opened drawer gains content and stops matching this rule. */ html.av-theme-noir[data-av-width="wide"] [data-testid="GrokDrawer"]:has(> button:only-child), html.av-theme-noir[data-av-width="wide"] [data-testid="chat-drawer-root"]:has(> button:only-child) { display: none !important; } /* The primary column takes its width from its own box, not from a max-width. Current X also keeps several flex wrappers around it at the old two-column width after the discovery rail is hidden. Comfortable stays capped. Wide expands that wrapper chain, fills ordinary desktop space, and stops at a centered reading width on ultrawide displays. */ html[data-av-width="comfortable"] [data-testid="primaryColumn"] { flex: 0 1 min(1000px, calc(100vw - 16px)) !important; flex-basis: min(1000px, calc(100vw - 16px)) !important; width: min(1000px, calc(100vw - 16px)) !important; max-width: min(1000px, calc(100vw - 16px)) !important; min-width: 0 !important; } html[data-av-width="wide"] [data-testid="primaryColumn"] { flex: 1 1 min(100vw, ${WIDE_COLUMN_MAX_WIDTH_PX}px) !important; flex-basis: min(100vw, ${WIDE_COLUMN_MAX_WIDTH_PX}px) !important; width: min(100vw, ${WIDE_COLUMN_MAX_WIDTH_PX}px) !important; max-width: ${WIDE_COLUMN_MAX_WIDTH_PX}px !important; min-width: 0 !important; margin-inline: auto !important; } /* Wide is the media-first desktop canvas. It removes the discovery rail, releases every retained two-column wrapper, and uses the whole reading area. Comfortable retains the rail for people who still want trends and follow suggestions beside the feed. */ html[data-av-width="wide"] [data-testid="sidebarColumn"] { display: none !important; } html[data-av-width="wide"] [data-testid="timeline-shell"], html[data-av-width="wide"] main[role="main"] div:has([data-testid="primaryColumn"]) { flex: 1 1 0% !important; width: 100% !important; max-width: none !important; min-width: 0 !important; } html[data-av-width="wide"] [data-testid="timeline-shell"], html[data-av-width="wide"] main[role="main"] div:has(> [data-testid="primaryColumn"]) { justify-content: center !important; } /* X now nests the actual stream in its own 600px lane. The outer primary column can be wide while every post remains narrow unless this independently capped inner lane is released too. */ html[data-av-width="wide"] [${WIDE_STREAM_ATTRIBUTE}] { flex: 1 1 auto !important; align-self: stretch !important; width: 100% !important; max-width: none !important; min-width: 0 !important; } /* A profile banner scales from its container width, so making the stream truly wide used to turn a 150px avatar into a 384px portrait and a modest banner into half a screen. Keep the profile identity block on the same reading lane as post content while the timeline below stays wide. */ html[data-av-width="wide"] [${PROFILE_HEADER_ATTRIBUTE}] { --av-profile-gutter: clamp(16px, 4.1vw, 64px); width: min( ${PROFILE_HEADER_MAX_WIDTH_PX}px, calc(100% - var(--av-profile-gutter) - var(--av-profile-gutter)) ) !important; max-width: ${PROFILE_HEADER_MAX_WIDTH_PX}px !important; margin-inline: auto !important; } html[data-av-width="wide"] [${PROFILE_HEADER_ATTRIBUTE}] a[href$="/photo"]:has([data-testid^="UserAvatar-Container-"]), html[data-av-width="wide"] [${PROFILE_HEADER_ATTRIBUTE}] [data-testid^="UserAvatar-Container-"] { width: 160px !important; height: 160px !important; max-width: 160px !important; max-height: 160px !important; } @media (max-width: 760px) { html[data-av-width="wide"] [${PROFILE_HEADER_ATTRIBUTE}] { --av-profile-gutter: 0px; width: 100% !important; } html[data-av-width="wide"] [${PROFILE_HEADER_ATTRIBUTE}] a[href$="/photo"]:has([data-testid^="UserAvatar-Container-"]), html[data-av-width="wide"] [${PROFILE_HEADER_ATTRIBUTE}] [data-testid^="UserAvatar-Container-"] { width: 112px !important; height: 112px !important; max-width: 112px !important; max-height: 112px !important; } } /* TwitterChirp is the family X registers the font under -- confirmed in the captured stylesheets, which preload Chirp-Regular/Bold/Medium woff2 and declare the stack twice. The rule reaches into descendants because X sets font-family per element through generated atomic classes, so inheriting from body alone would not reach them. Aviary's own panel is inside a shadow root, which document CSS cannot cross, so it keeps its own type. */ html.av-chirp body, html.av-chirp body * { font-family: TwitterChirp, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif !important; } html.av-dense article[data-testid="tweet"] { padding-top: 8px; padding-bottom: 8px; } /* Engagement counts inside the action bar only. The buttons themselves stay operable and keep their aria-labels, which carry the number for screen readers. Split per metric so each can be hidden on its own. The view total is the odd one out: it lives in an analytics link rather than an action button, so it is matched by href. Bookmarks are absent because no capture shows a bookmark count element to scope a rule to. */ html.av-hide-count-replies article[data-testid="tweet"] [data-testid="reply"] [data-testid="app-text-transition-container"], html.av-hide-count-reposts article[data-testid="tweet"] [data-testid="retweet"] [data-testid="app-text-transition-container"], html.av-hide-count-reposts article[data-testid="tweet"] [data-testid="unretweet"] [data-testid="app-text-transition-container"], html.av-hide-count-likes article[data-testid="tweet"] [data-testid="like"] [data-testid="app-text-transition-container"], html.av-hide-count-likes article[data-testid="tweet"] [data-testid="unlike"] [data-testid="app-text-transition-container"], html.av-hide-count-views article[data-testid="tweet"] a[href$="/analytics"] [data-testid="app-text-transition-container"] { display: none !important; } /* Row dividers live on the first child of the virtualizer cell, styled by a generated atomic class (r-qklmqi in the captured CSS). Anchor on the structure, not the generated name. The column's own left/right rules are the other half of the "borderless" look. Verified against the 2026-05-19 home capture with its stylesheets: 10/10 cells carry a 1px bottom border. */ html.av-hide-borders [data-testid="cellInnerDiv"] > div { border-bottom-width: 0 !important; } html.av-hide-borders [data-testid="primaryColumn"] { border-left-width: 0 !important; border-right-width: 0 !important; } html.av-high-contrast { --av-border: color-mix(in srgb, var(--av-text, rgb(239, 243, 244)) 42%, transparent); --av-muted: color-mix(in srgb, var(--av-text, rgb(239, 243, 244)) 76%, transparent); } html.av-reduce-motion *, html.av-reduce-motion *::before, html.av-reduce-motion *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; transition-duration: 0.001ms !important; } /* Windows High Contrast, and every other forced-colors mode. The user agent replaces every colour these palettes paint with, and drops box-shadow, text-shadow and non-url() background-image to none outright. Six authored themes expressed the states below through exactly those properties: the hovered row was a tint, the selected tab was a colour and, under noir, a glow; the active navigation item was a tint plus an inset shadow rail; the search field's focus was a border tint plus a shadow ring; the media action was a filled accent button with a transparent border. All of that renders as nothing here, so a forced-colors user could not tell any of them from the resting state. Borders and outlines survive, and a system colour keyword is honoured rather than overridden. Every rule below restores one lost state with one of those. opacity and filter are not overridden, which is why the dimmed-by-filter state needs nothing here. */ @media (forced-colors: active) { html[data-av-theme] [data-testid="cellInnerDiv"] > div:hover { outline: 1px solid Highlight; outline-offset: -1px; } html[data-av-theme] [data-testid="primaryColumn"] [role="tab"][aria-selected="true"] { border-bottom: 3px solid Highlight; text-shadow: none; } html[data-av-theme] [data-av-nav-item][aria-current="page"], html[data-av-theme] [data-av-nav-item][data-av-active-route="1"], html[data-av-theme] [data-testid^="AppTabBar_"][aria-current="page"], html[data-av-theme] [data-testid^="AppTabBar_"][data-av-active-route="1"] { outline: 2px solid Highlight; outline-offset: -2px; } html[data-av-theme] [data-av-media-action] { border-color: ButtonText; } html[data-av-theme] [data-av-media-action]:hover:not(:disabled) { border-color: Highlight; outline: 2px solid Highlight; outline-offset: -3px; } html[data-av-theme] form[role="search"]:has([data-testid="SearchBox_Search_Input"]):focus-within { outline: 2px solid Highlight; outline-offset: 1px; } html[data-av-theme] [data-testid="primaryColumn"], html[data-av-theme] [data-testid="sidebarColumn"] aside[role="complementary"], html[data-av-theme] [aria-label="Timeline: Trending now"], html[data-av-theme] [data-testid="GrokDrawer"], html[data-av-theme] [data-testid="grokImgGen"] { border: 1px solid CanvasText; } html[data-av-theme] [data-testid="sidebarColumn"] [data-testid="UserCell"]:hover { outline: 1px solid Highlight; outline-offset: -1px; } /* The conversation gutter Aviary redraws: a coloured line is a line the UA repaints, so the focal post keeps an explicit edge of its own. */ html[data-av-theme] article[data-av-conversation-role="focal"] { outline: 1px solid CanvasText; outline-offset: -1px; } } `; // src/features/appearance/title-badge.ts var BADGE = /^\(\d+\+?\)\s*/; var observer; var lastWritten; var titleBadgeFeature = { id: "appearance.titleBadge", title: "Hide tab title badge", category: "appearance", init(ctx) { applyTitleBadge(ctx); }, apply(ctx) { applyTitleBadge(ctx); }, destroy() { stop(); } }; function applyTitleBadge(ctx) { if (!ctx.settings.appearance.hideTitleBadge) { stop(); return; } strip(); if (observer || typeof MutationObserver === "undefined") { return; } const titleElement = document.querySelector("title"); if (!titleElement) { return; } observer = new MutationObserver(() => strip()); observer.observe(titleElement, { childList: true, characterData: true, subtree: true }); } function strip() { const current = document.title; if (current === lastWritten) { return; } const stripped = current.replace(BADGE, ""); if (stripped === current) { return; } lastWritten = stripped; document.title = stripped; } function stop() { observer?.disconnect(); observer = void 0; lastWritten = void 0; } // src/features/appearance/absolute-time.ts var MARKER = "data-av-abs-time"; var ORIGINAL = "data-av-abs-original"; var absoluteTimeFeature = { id: "appearance.absoluteTime", title: "Absolute timestamps", category: "appearance", init(ctx) { applyAbsoluteTime(ctx, document); }, apply(ctx, root) { applyAbsoluteTime(ctx, root); }, destroy(ctx) { restoreTimestamps(); ctx.diagnostics.info("Absolute timestamps restored"); } }; function applyAbsoluteTime(ctx, root) { if (!ctx.settings.appearance.absoluteTimestamps) { restoreTimestamps(); return; } const formatter = buildFormatter(ctx.settings.i18n.locale); if (!formatter) { return; } for (const node of collectTimes(root)) { const iso = node.getAttribute("datetime"); if (!iso) { continue; } const parsed = new Date(iso); if (Number.isNaN(parsed.getTime())) { continue; } const text = formatter.format(parsed); if (node.textContent === text) { continue; } if (!node.hasAttribute(ORIGINAL)) { node.setAttribute(ORIGINAL, node.textContent ?? ""); } node.textContent = text; node.setAttribute(MARKER, "1"); } } function collectTimes(root) { const found = []; if (root instanceof Element && root.matches("time[datetime]")) { found.push(root); } if ("querySelectorAll" in root) { for (const node of Array.from(root.querySelectorAll("time[datetime]"))) { found.push(node); } } return found; } function buildFormatter(locale) { try { return new Intl.DateTimeFormat(locale || void 0, { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" }); } catch { return void 0; } } function restoreTimestamps() { for (const node of Array.from(document.querySelectorAll(`time[${MARKER}]`))) { const original = node.getAttribute(ORIGINAL); if (original !== null) { node.textContent = original; } node.removeAttribute(MARKER); node.removeAttribute(ORIGINAL); } } // src/features/appearance/favicon.ts var MARKER2 = "data-av-favicon"; var ORIGINAL2 = "data-av-favicon-original"; var ICON_REL = /(^|\s)(shortcut\s+)?icon(\s|$)/i; var AVIARY_MARK = ` `; function markUrl() { return `data:image/svg+xml,${encodeURIComponent(AVIARY_MARK.replace(/\n/g, ""))}`; } var observer2; var faviconFeature = { id: "appearance.favicon", title: "Replace the X favicon", category: "appearance", init(ctx) { applyFavicon(ctx); }, apply(ctx) { applyFavicon(ctx); }, destroy(ctx) { stop2(); restoreFavicons(); ctx.diagnostics.info("Favicon restored"); } }; function applyFavicon(ctx) { if (!ctx.settings.appearance.replaceFavicon) { stop2(); restoreFavicons(); return; } swap(); if (observer2 || typeof MutationObserver === "undefined") { return; } const head2 = document.head; if (!head2) { return; } observer2 = new MutationObserver(() => swap()); observer2.observe(head2, { childList: true, subtree: true, attributes: true, attributeFilter: ["href"] }); } function iconLinks() { return Array.from(document.querySelectorAll("link[rel]")).filter( (link) => ICON_REL.test(link.getAttribute("rel") ?? "") ); } function swap() { const url = markUrl(); for (const link of iconLinks()) { if (link.getAttribute("href") === url) { continue; } if (!link.hasAttribute(ORIGINAL2)) { link.setAttribute(ORIGINAL2, link.getAttribute("href") ?? ""); } link.setAttribute("href", url); link.setAttribute(MARKER2, "1"); } } function restoreFavicons() { for (const link of Array.from(document.querySelectorAll(`link[${MARKER2}]`))) { const original = link.getAttribute(ORIGINAL2); if (original) { link.setAttribute("href", original); } link.removeAttribute(MARKER2); link.removeAttribute(ORIGINAL2); } } function stop2() { observer2?.disconnect(); observer2 = void 0; } // src/features/appearance/custom-css.ts var STYLE_ID2 = "av-custom-css"; var SCOPE_ATTRIBUTE = "data-av-custom-css-scope"; var ROOT_SELECTORS = { posts: 'article[data-testid="tweet"]', media: "[data-av-media-button]", navigation: 'nav[role="navigation"], nav[aria-label]', sidebar: '[data-testid="sidebarColumn"]', composer: '[data-testid="toolBar"], [data-testid^="tweetTextarea_"]' }; var originalScopeAttributes = /* @__PURE__ */ new Map(); var currentRules = null; var scopeObserver = null; var nativeScopeSupport; var scopeMode = null; var customCssFeature = { id: "appearance.customCss", title: "Custom CSS", category: "appearance", init(ctx) { applyCustomCss(ctx.settings.appearance.customCss); }, apply(ctx) { applyCustomCss(ctx.settings.appearance.customCss); }, destroy() { scopeObserver?.disconnect(); scopeObserver = null; currentRules = null; scopeMode = null; document.getElementById(STYLE_ID2)?.remove(); restoreScopeAttributes(); }, getStatus() { return { ok: true, message: scopeMode === "fallback" ? "Custom CSS scopes ready (compatibility mode)" : "Custom CSS scopes ready" }; } }; function buildScopedCustomCss(rules, useNativeScope = detectNativeScope()) { const blocks = []; for (const scope of CUSTOM_CSS_SCOPE_IDS) { const candidate = rules[scope]; if (typeof candidate !== "string") continue; const css = sanitizeCustomCss(candidate).value.trim(); if (css.length === 0) continue; const selector = `[${SCOPE_ATTRIBUTE}~="${scope}"]`; const scoped = useNativeScope ? `@scope (${selector}) { ${css} }` : scopeCssFallback(css, selector); if (scoped.length > 0) blocks.push(scoped); } return blocks.join("\n\n"); } function applyCustomCss(rules) { if (typeof document === "undefined") return; currentRules = { ...rules }; const useNativeScope = detectNativeScope(); scopeMode = useNativeScope ? "native" : "fallback"; const css = buildScopedCustomCss(rules, useNativeScope); const existing = document.getElementById(STYLE_ID2); if (css.length === 0) { existing?.remove(); scopeObserver?.disconnect(); scopeObserver = null; } else { const style = existing?.tagName === "STYLE" ? existing : document.createElement("style"); if (existing && style !== existing) existing.remove(); style.id = STYLE_ID2; style.dataset.avOwned = "true"; style.textContent = css; if (!style.isConnected) { (document.head ?? document.documentElement).append(style); } ensureScopeObserver(); } syncScopeAttributes(rules); } function ensureScopeObserver() { if (scopeObserver || typeof MutationObserver === "undefined") return; const root = document.body ?? document.documentElement; if (!root) return; scopeObserver = new MutationObserver(() => { if (currentRules) syncScopeAttributes(currentRules); }); scopeObserver.observe(root, { childList: true, subtree: true }); } function detectNativeScope() { if (nativeScopeSupport !== void 0) return nativeScopeSupport; if (typeof document === "undefined") return false; const style = document.createElement("style"); style.textContent = `@scope ([${SCOPE_ATTRIBUTE}]) {}`; const parent = document.head ?? document.documentElement; if (!parent) return false; parent.append(style); try { nativeScopeSupport = Array.from(style.sheet?.cssRules ?? []).some( (rule) => rule.cssText.trimStart().startsWith("@scope") ); } catch { nativeScopeSupport = false; } style.remove(); return nativeScopeSupport; } function scopeCssFallback(css, scopeSelector) { const output = []; let cursor = 0; while (cursor < css.length) { const open = findNextBrace(css, cursor); if (open === -1) { if (!onlyCssComments(css.slice(cursor))) return ""; break; } const prelude = css.slice(cursor, open).trim(); const close = findMatchingBrace(css, open); if (!prelude || close === -1) return ""; const body = css.slice(open + 1, close); if (prelude.startsWith("@")) { const atRule = /^@([\w-]+)/.exec(prelude)?.[1]?.toLowerCase(); if (!atRule || !["media", "supports", "container", "layer"].includes(atRule)) return ""; const nested = scopeCssFallback(body, scopeSelector); if (body.trim().length > 0 && nested.length === 0) return ""; output.push(`${prelude} { ${nested} }`); } else { const selectors = splitSelectorList(prelude).map( (selector) => prefixSelector(selector, scopeSelector) ); if (selectors.some((selector) => selector.length === 0)) return ""; output.push(`${selectors.join(", ")} { ${body} }`); } cursor = close + 1; } return output.join("\n"); } function onlyCssComments(value) { let cursor = 0; while (cursor < value.length) { while (/\s/.test(value[cursor] ?? "")) cursor += 1; if (cursor >= value.length) return true; if (!value.startsWith("/*", cursor)) return false; const close = value.indexOf("*/", cursor + 2); if (close === -1) return false; cursor = close + 2; } return true; } function findNextBrace(source, start) { let quote = null; let comment = false; let escaped = false; let brackets = 0; let parentheses = 0; for (let index = start; index < source.length; index += 1) { const current = source[index]; const next = source[index + 1]; if (comment) { if (current === "*" && next === "/") { comment = false; index += 1; } continue; } if (quote) { if (current !== "\n" && current !== "\r") { if (escaped) escaped = false; else if (current === "\\") escaped = true; else if (current === quote) quote = null; continue; } quote = null; escaped = false; } if (current === "/" && next === "*") { comment = true; index += 1; } else if (current === '"' || current === "'") quote = current; else if (current === "[") brackets += 1; else if (current === "]") brackets = Math.max(0, brackets - 1); else if (current === "(") parentheses += 1; else if (current === ")") parentheses = Math.max(0, parentheses - 1); else if (current === "{" && brackets === 0 && parentheses === 0) return index; } return -1; } function findMatchingBrace(source, open) { let depth = 0; let quote = null; let comment = false; let escaped = false; for (let index = open; index < source.length; index += 1) { const current = source[index]; const next = source[index + 1]; if (comment) { if (current === "*" && next === "/") { comment = false; index += 1; } continue; } if (quote) { if (current !== "\n" && current !== "\r") { if (escaped) escaped = false; else if (current === "\\") escaped = true; else if (current === quote) quote = null; continue; } quote = null; escaped = false; } if (current === "/" && next === "*") { comment = true; index += 1; } else if (current === '"' || current === "'") quote = current; else if (current === "{") depth += 1; else if (current === "}" && --depth === 0) return index; } return -1; } function splitSelectorList(value) { const selectors = []; let start = 0; let quote = null; let escaped = false; let brackets = 0; let parentheses = 0; for (let index = 0; index < value.length; index += 1) { const current = value[index]; if (quote) { if (current !== "\n" && current !== "\r") { if (escaped) escaped = false; else if (current === "\\") escaped = true; else if (current === quote) quote = null; continue; } quote = null; escaped = false; } if (current === '"' || current === "'") quote = current; else if (current === "[") brackets += 1; else if (current === "]") brackets = Math.max(0, brackets - 1); else if (current === "(") parentheses += 1; else if (current === ")") parentheses = Math.max(0, parentheses - 1); else if (current === "," && brackets === 0 && parentheses === 0) { selectors.push(value.slice(start, index).trim()); start = index + 1; } } selectors.push(value.slice(start).trim()); return selectors.filter(Boolean); } function prefixSelector(selector, scopeSelector) { const trimmed = selector.trim(); if (trimmed.startsWith(":scope")) return `${scopeSelector}${trimmed.slice(6)}`; if (trimmed === ":root" || trimmed.startsWith(":root ")) { return `${scopeSelector}${trimmed.slice(5)}`; } if (/^[>+~]/.test(trimmed)) return `${scopeSelector} ${trimmed}`; const firstEnd = firstCombinatorIndex(trimmed); const first = trimmed.slice(0, firstEnd).trim(); const rest = trimmed.slice(firstEnd).trim(); if (!first) return `${scopeSelector} ${trimmed}`; const rootCompound = first === "*" ? scopeSelector : `${first}${scopeSelector}`; const scoped = `:is(${rootCompound}, ${scopeSelector} ${first})`; return rest ? `${scoped} ${rest}` : scoped; } function firstCombinatorIndex(value) { let quote = null; let escaped = false; let brackets = 0; let parentheses = 0; for (let index = 0; index < value.length; index += 1) { const current = value[index]; if (quote) { if (current !== "\n" && current !== "\r") { if (escaped) escaped = false; else if (current === "\\") escaped = true; else if (current === quote) quote = null; continue; } quote = null; escaped = false; } if (current === '"' || current === "'") quote = current; else if (current === "[") brackets += 1; else if (current === "]") brackets = Math.max(0, brackets - 1); else if (current === "(") parentheses += 1; else if (current === ")") parentheses = Math.max(0, parentheses - 1); else if (brackets === 0 && parentheses === 0 && (current === ">" || current === "+" || current === "~" || /\s/.test(current))) { return index; } } return value.length; } function syncScopeAttributes(rules) { const active2 = /* @__PURE__ */ new Map(); for (const scope of CUSTOM_CSS_SCOPE_IDS) { if (sanitizeCustomCss(rules[scope]).value.trim().length === 0) continue; for (const element2 of document.querySelectorAll(ROOT_SELECTORS[scope])) { const scopes = active2.get(element2) ?? /* @__PURE__ */ new Set(); scopes.add(scope); active2.set(element2, scopes); } } for (const [element2, scopes] of active2) { if (!originalScopeAttributes.has(element2)) { originalScopeAttributes.set(element2, element2.getAttribute(SCOPE_ATTRIBUTE)); } element2.setAttribute(SCOPE_ATTRIBUTE, [...scopes].sort().join(" ")); } for (const [element2, original] of originalScopeAttributes) { if (active2.has(element2)) continue; if (original === null) { element2.removeAttribute(SCOPE_ATTRIBUTE); } else { element2.setAttribute(SCOPE_ATTRIBUTE, original); } originalScopeAttributes.delete(element2); } } function restoreScopeAttributes() { for (const [element2, original] of originalScopeAttributes) { if (original === null) { element2.removeAttribute(SCOPE_ATTRIBUTE); } else { element2.setAttribute(SCOPE_ATTRIBUTE, original); } } originalScopeAttributes.clear(); } // src/platform/i18n-catalog.ts var PANEL_STRINGS = [ "Aviary settings", "Quieter X. Local data.", "Close", "Aviary", "Search ads, downloads, filters, and more", "Search settings", "Revert", "Save", "Switches and fields wait for Save. Buttons run right away.", "Saved locally", "Settings sections", "Start here", "Quick setup", "Everyday", "Look & feel", "Page cleanup", "Content filters", "Downloads", "Your data", "Saved posts", "Import & export", "Delete X activity", "More tools", "Catch up", "Hidden posts", "Video playback", "X archive", "Connections", "Backup & reset", "Privacy & diagnostics", "How saving works", "Switches and fields wait for Save. Buttons such as Apply, Export, Preview, and Delete run right away.", "Open settings", "Make X quieter", "Hide ads, trends, suggestions, and navigation you do not use.", "Hide unwanted posts", "Filter by words, media, badges, or page.", "Save photos and videos", "Choose quality, filenames, duplicate checks, and queue behavior.", "Delete account activity", "Remove posts, replies, reposts, likes, or bookmarks.", "Quiet Reader", "Hide trends, row borders and engagement counts, dim premium posts, strip t.co, dense + dim theme.", "Hide right sidebar", "Enabled", "Suppress hover previews", "Hide engagement counts", "Theme", "Dim", "Apply", "Media Archivist", "Original-quality downloads, deterministic filenames, dedup history, stacked media.", "Prefer original quality", "Media layout", "Stacked", "Show download buttons", "Creator", "Writer mode, composer snippets, share-button cleanup, sidebar and trends hidden.", "Writer mode", "Hide trends", "Strict grid", "Researcher", "Export capture on, JSON+CSV+HTML+MD formats, auto-discover query IDs, raw payloads.", "Capture visible posts", "Preserve raw payloads", "Export formats", "JSON, CSV, HTML, Markdown", "Classic", "Restore dim, keep sidebar, hide Grok only, no premium filtering.", "Dense mode", "Disabled", "Hide Grok surfaces", "Minimal", "Maximum declutter: no counts, no borders, no trends, big text safe zones.", "Noir", "Locale", "Translates the panel and sets reading direction, right-to-left for Arabic and Hebrew. Trust shows how much of the chosen locale is filled in; anything missing stays English.", "Choose a ready-made setup or jump to a common task.", "Common tasks", "Ready-made setups", "Language", "Noir is applied automatically. Choose Off to use X's own styling.", "Off (X's own theme)", "Lights out", "Graphite", "Plum", "Midnight", "Noir (default)", "Tighten timeline spacing for scanning.", "Timeline width", "Wide uses a centered reading lane and hides the discovery rail. Comfortable keeps that rail.", "Default", "Comfortable", "Wide (default)", "Restore the Chirp font", "Force X's own Chirp typeface where the site has fallen back to a system font.", "Master switch for the four numbers below. The controls still work and screen readers still announce the totals.", "Hide reply counts", "Applies while Hide engagement counts is on.", "Hide repost counts", "Hide like counts", "Hide view counts", "Applies while Hide engagement counts is on. The view total lives in an analytics link, not an action button.", "Hide the tab title badge", "Remove X's unread count from the browser tab title, so a hidden notification badge is not restored by the tab.", "Absolute timestamps", "Show the exact date and time on every post instead of X's relative text.", "Use Aviary's tab icon", "Replace X's favicon with Aviary's mark so its tabs are easy to pick out. Restores X's own icon when off.", "Hide row borders", "Remove the 1px divider under each timeline post and the primary column's side rules.", "High contrast", "Use stronger borders and text contrast.", "Reduced motion", "Follow system setting", "Always reduce", "Never reduce", "Custom CSS", "Optional local overrides for the scoped surfaces below. CSS never leaves this profile and is not covered by bug-report expectations.", "Posts CSS", "Scoped to rendered posts. Example: article { border-radius: 18px; }", "Media actions CSS", "Scoped to Aviary media buttons and their contents.", "Navigation CSS", "Scoped to X's navigation rail.", "Sidebar CSS", "Scoped to X's discovery sidebar.", "Composer CSS", "Scoped to the composer toolbar and text area.", "Change colors, spacing, text, and the numbers shown on posts.", "Look & layout", "Post details", "Accessibility", "Advanced styling", "Protection starts at document load.", "Ad-free mode", "Collapse sponsored posts, paid partnerships, promoted trends, house promos, and visible pre-rolls. Aviary also refuses X's separate promoted-content logging call without blocking timeline delivery.", "Refuse X's ad logging call", "Only applies while Ad-free mode is on. Aviary refuses exactly one request (X's separate promoted-content logging call) and nothing else, including the checks X uses to notice an ad blocker. Turn this off if X complains anyway: sponsored posts stay hidden and Aviary stops refusing any request at all.", "Ad protection status", "Reduce trends, recommendations, and footer noise.", "Remove trending topics and news modules.", "Hide follow suggestions", "Remove Who to follow cards without hiding the rest of the sidebar.", "Hide home composer", "Remove the quick-post composer from Home. The Post button still opens it when needed.", "Hide thread recommendations", "Stop a conversation at its last real reply by collapsing the Discover more block and the suggested posts below it.", "Remove the Grok drawer, navigation link, image-generation entries, and per-post actions where detected.", "Stop X opening a profile card or tooltip when the pointer rests on a name, avatar or control, and remove native tooltip bubbles. Menus you click, labels, and screen-reader names are left alone.", "Focus mode", "Outside the hours below, cover the reading column with a calm local panel. Navigation stays usable and a five-minute override is one click away. Nothing is blocked and nothing leaves this device.", "Reading hours start", "24-hour time, for example 09:00.", "Reading hours end", "24-hour time. An end before the start wraps past midnight.", "Stop the timeline after", "Posts to show before the feed stops extending, with a control to continue. Zero leaves X's endless scroll alone. Nothing already on screen moves, and the control appears below the last post rather than above it.", "Expand long posts automatically", "Click only the post's own Show more control after scrolling stops. Replies, sidebars, quoted posts, and other Show more links are left alone.", "Restore position after Back", "Return to the same visible post after opening a post or another X page and using the browser Back button. Any wheel, touch, pointer, or keyboard scroll cancels the restore immediately.", "Show read marker", "Keep a local position for each feed and show a new since you last looked line. It never adds an unread badge.", "Read marker surfaces", "Choose where the local position marker and new-post separator appear.", "Home", "Status", "Profile", "Search", "Notifications", "Messages", "While focus is in the composer, fade the sidebar and the timeline behind it. Everything returns the moment you click away.", "Open Following instead of For you", "Selects the second home tab each time you arrive at the timeline. Switch back to For you and it stays there until you navigate away.", "Hide For You tab", "Selects Following, then collapses the first Home tab. It only affects Home and restores immediately when turned off.", "Open posts from the reply icon only", "X makes the whole row a link, so a press on the text or beside a control opens a post you did not choose. This takes the click target off the row and gives it to the reply icon, which opens the post rather than the inline composer. Links, buttons, media and quoted posts keep working.", "Hide navigation items", "One stable X navigation id per line: home, explore, notifications, follow, chat, messages, grok, history, studio, premium, profile, or more.", "Hide ads and parts of X you do not use.", "Ad protection", "Page chrome", "Reading flow", "Navigation", "Rules are active on the selected routes.", "Enable filters", "Master switch for keyword, regex, premium, and media filters.", "Rule status", "Inactive until filters are enabled. You can edit rules before turning them on.", "Dim posts you have already seen", "Fade a post the second time it scrolls past, and keep a local catch-up copy of posts Aviary has rendered. Hovering a faded post brings it back.", "Hide seen posts on", "Choose the feed surfaces where posts you have already seen are dimmed.", "Filter rules", "One rule per line: field, optional not, operator, value. Fields are text, handle, media, verified, link; operators are contains, is, starts, ends, matches. Join with and / or, and prefix dim: to fade instead of hide. Name a rule by starting the line with [a title], and give it a limited life with for 7d from . Example: [Weekend sales] dim for 7d from 2026-08-19T10:00:00.000Z: text contains sale and media is photo", "Portable rule set", "Export plain text, or paste a set to preview before adding or replacing rules.", "Paste rules here", "Export .txt", "Preview", "Add rules", "Replace rules", "Paste rules to see both import choices.", "Keyword rules", "One keyword or phrase per line. Case-insensitive substring match.", "Regex rules", "One pattern per line. Use /pattern/flags or a bare pattern (case-insensitive).", "Whitelist handles", "Handles (one per line, no @) that are never filtered.", "Premium / verified posts", "Off", "Hide", "Quote posts", "Posts that quote another post.", "Hide replies with images, GIFs or video", "Under a post you opened, drop every reply that carries a photo, a GIF or a video. Text alongside it makes no difference, since most memes come captioned. The post itself and the thread above it are untouched, and a reply that only quotes a post with a picture stays. This works on its own, without the filters above, because pointing those at a conversation would hide the post you came to read.", "Say why a post was filtered", "A filter that hides silently is hard to tell from a bug. Dimmed posts can name what caught them at no cost to the layout; the third setting also turns a hidden post into a one-line strip that says why and opens when you hover or tab into it.", "Say nothing", "On dimmed posts", "On dimmed and hidden posts", "Low-engagement posts", "Posts under the minimum below. A post whose count Aviary cannot read is never filtered on it.", "Engagement measured in", "Which of the counts under a post the minimum applies to.", "Replies", "Reposts", "Likes", "Minimum engagement", "Posts below this count are filtered. Zero leaves every post alone.", "Hide posts with photos", "Filter posts containing photos.", "Hide posts with videos", "Filter posts containing videos.", "Hide posts with gifs", "Filter posts containing gifs.", "Active on", "Routes where filters run.", "Blocked accounts / self-reposts", "Pending an authenticated fixture; controls stay disabled.", "Hide or dim posts by words, media, account badges, or page.", "Filter status", "Rules", "Content types", "Routes", "The download preference applies to every media control.", "Add one Download action to each media post, plus per-asset controls. Turning this off also hides Copy media links.", "Show Copy media links", "Add a post action that copies the best direct image, GIF, video, audio, and caption URLs, one per line. It copies only that post's own media and requires the media controls above.", "Try source-format name=orig first, then 4096x4096 if it fails.", "Original quality status", "Show images at original quality", "Loads timeline photos at full size instead of the version X picks for the slot. Sharper, and several times the bytes.", "Default grid", "Filename template", "Fields: {handle}, {account}, {tweetId}, {mediaId}, {index}, {total}, {date}, {text}, {ext}. {account} is an alias for the publishing handle and can create per-account folders.", "Metadata sidecar", "Save a local text or JSON companion after each completed media download.", "Text", "JSON", "Match visually similar images", "Compare a 256-bit visual signature too. Similar flat compositions can be mistaken for a match, so this stays off by default.", "Duplicate history", "Skip the same X asset or exact image bytes without storing its source URL.", "Concurrent downloads", "Maximum media downloads in flight during a batch (1-6).", "Download pacing", "Controls the opening burst and sustained pace of batch media requests.", "Conservative", "Balanced", "Download all visible media", "Queue every photo, video, GIF, thumbnail, audio track, and caption track currently visible on this page.", "Download status", "History entries", "The rest of the panel still works. Reported to diagnostics.", "This section could not be drawn", "Set up download buttons, quality, filenames, and queues.", "{bytes} across {count} collections", "Library storage", "Largest collections", "Browser storage report", "Storage cap warning", "Warn before a capture takes the local library past this many megabytes. 0 turns the warning off. Aviary never deletes anything to stay under it; removal is chosen in the cleanup preview.", "Downscale captured images", "Applies to captures from here on. Nothing already stored changes, and each reduced record says it was reduced.", "Keep the original", "Three quarters", "Half", "Quarter", "Video poster frames only", "Store the still X serves for a video instead of the video itself. The record says the video was left out, so a later export cannot present the still as the whole post.", "Search all local collections", "Search posts, likes, bookmarks, notes, and captures.", "Search local library", "Semantic ranking", "Download media", "{count} media", "Try source:bookmarks, tag:reading, or has:media.", "Show the AI button on posts", "Adds a button to every post that builds a Translate, Summarize, Explain or Fact-check prompt. Without an AI provider configured it copies the prompt to your clipboard; nothing is sent anywhere.", "Unshorten t.co links", "Replace short `t.co` redirects with the destination from aria-labels and titles.", "Clean tracking from links", "Strips share tokens and campaign parameters (utm_*, fbclid, and X's own t/s) from links in the timeline, so what you copy is the plain address.", "Copy post links as", "Adds a Copy link control to each post that writes that post's address on the chosen host. Nothing X rendered is rewritten and no navigation is redirected. Only what you copy changes. Leave it on X to remove the control.", "Account colours", "Format: handle: colour. One per line. Colours are amber, rose, violet, sky, green, or slate. An empty line removes the tag.", "Account notes", "Format: handle: note. One per line. Empty notes remove the entry.", "Clear all account notes", "Drop every persisted note.", "Composer snippets", "One snippet per line. Reusable replies / templates insert from the composer toolbar.", "Search and manage posts stored in this browser.", "Post tools", "Writing tools", "Storage & reports", "Accumulate posts visible on the active page for the next export run.", "Comma-separated list. Supported: json, csv, html, markdown, xlsx.", "Also store the raw GraphQL responses X sends this tab, so records can be re-parsed later. Session tokens are stripped before anything is written.", "Capture media bytes in export", "Fetch media during the export action and include successful bytes with length and checksum; failed items remain retryable references.", "Auto-discover query IDs", "Scan loaded scripts for X GraphQL operation IDs and cache them locally.", "Include protected posts in share exports", "Protected posts stay out of HTML, Markdown, WARC, WACZ, and static viewer output until you enable this explicitly. JSON and CSV remain archival and keep the audience field.", "Include unknown-audience posts in share exports", "DOM-only, imported, and older records stay out of share-oriented exports until you enable this explicitly. JSON and CSV remain archival.", "Save folder hint", "Folder name (or path) used as the export ZIP root and download prefix.", "{jobs} jobs tracked \xB7 {queries} GraphQL IDs cached", "Export status", "Export visible posts", "Collect the currently rendered posts and download a ZIP.", "Copy diagnostics", "Copy support diagnostics (version, route, recent log).", "Download a raw WARC or a replay-ready WACZ. WACZ keeps archive and index members uncompressed.", "Estimated WACZ: {size} for {records} records.", "Preservation archive", "Preservation archive actions", "WARC", "WACZ", "Cancel", "Open replayweb.page", "Aviary-only WACZ proof", "Aviary-only WACZ proof actions", "Export keypair", "Copy as Markdown", "Push a plain Markdown export onto the clipboard.", "Save Obsidian Markdown", "Markdown with YAML frontmatter and Aviary tags.", "Save Notion Markdown", "Heading-first Markdown that Notion imports cleanly.", "Save records JSON", "Raw ExportRecord[] JSON without ZIP wrapping.", "Records per ZIP", "Split a long export across several archives instead of one huge file (25-1000).", "Maximum export jobs", "Keep the newest jobs. Use 0 for unlimited.", "Maximum records per job", "Keep the newest records in each job. Use 0 for unlimited.", "Maximum export age (days)", "Remove older jobs at boot. Use 0 to disable age-based cleanup.", "Capture posts on the page and download portable copies.", "Capture", "Package", "Destination", "Jobs", "Preservation", "What to delete", "Selected activity is removed in this order: bookmarks, likes, reposts, replies, posts.", "Bookmarks", "Remove saved posts from X History.", "Remove likes from X History.", "Undo reposts from your Reposts tab.", "Delete replies written by you without touching parent posts.", "Posts", "Delete posts and quote posts written by you.", "Preview complete. No X account data was changed.", "Deleted posts and replies can't be restored. Aviary can't bring back removed likes, reposts or bookmarks.", "Run", "Advanced options", "Change deletion speed or pause after a set number of actions.", "Speed", "Adds a randomized delay between account actions and longer rests after each batch.", "Careful", "Brisk", "Actions per batch", "Pause after this many matches. Use 0 for no limit. Resume starts a fresh batch.", "Select activity and press Run. Deletion starts immediately.", "Catch-up is waiting", "Turn on Dim posts you have already seen in Filtering. Catch-up uses only rows Aviary has already rendered.", "What it includes", "Everything Aviary saw in the active browser profile. Filtered posts keep the reason written by the active filter rule.", "Review posts Aviary already saw without asking X for more.", "Hide buttons follow the setting above.", "Hide dismissed posts", "Keep posts you hid collapsed so the next post rises to the top.", "Show hide buttons", "Adds a Hide control to every post next to the More menu.", "Hide button status", "Activates when Hide dismissed posts is on.", "Routes where hiding and the Hide button apply.", "Maximum remembered posts", "Oldest entries are dropped once the store passes this size (100-50000).", "Hidden posts stored", "Undo last hide", "Restores the most recently hidden post.", "Restore", "Clear hidden posts", "Forgets every hidden post and brings them all back.", "Choose where hidden posts stay hidden, or bring them back.", "Coverage", "Retention", "Recovery", "Pause video that scrolls out of view", "Stops decoding timeline video once it leaves the screen, and resumes it when it comes back. A video you paused yourself stays paused.", "Keep video playing when the tab loses focus", "X stops a playing video when you switch tabs. This resumes it when you come back. A video you paused yourself stays paused.", "Loop videos", "Restart a video when it reaches the end instead of stopping.", "Pin video playlists to their best rendition", "When X hands Aviary a playlist listing several qualities, keep only the highest. X often settles below the best available on a fast connection. This uses more data, and it can only act on playlists Aviary sees.", "Pause videos after they leave the screen.", "Playback", "{count} entries \xB7 latest {kind} of {latestCount} @ {at}", "Snapshots stored", "Capture followers from this view", "Walks UserCell rows on the current page. Open a /handle/followers view first.", "Capture following from this view", "Walks UserCell rows on the current page. Open a /handle/following view first.", "Clear all snapshots", "Drop every stored follower/following snapshot.", "Import official X archive", "Pick a ZIP exported from x.com. STORE and DEFLATE entries are supported; the source stays local while it is resumable.", "Search captured records", "Full-text search across the latest export collector run.", "@handle, keyword, phrase\u2026", "Type to search the records captured by export runs.", "Download Markdown report", "Audit log + snapshot diff + cleanup preview.", "{total} items \xB7 queued {queued} \xB7 approved {approved} \xB7 skipped {skipped}", "Cleanup review queue", "Destructive actions", "Aviary never deletes posts, likes, or follows. The queue is a review list; approving or skipping only writes to the audit log.", "Enqueue cleanup preview for review", "Append every non-protected candidate from the latest cleanup preview to the queue (no destructive action).", "Clear cleanup queue", "Drop every queued item without touching account data.", "Import an official X archive or compare follower snapshots.", "Live snapshots", "Aria2 handoff", "Send large media downloads to a self-hosted Aria2 JSON-RPC endpoint.", "Aria2 endpoint", "http://localhost:6800 (no trailing slash needed)", "Aria2 RPC secret", "Optional shared secret for token: auth.", "Show", "Hand off files larger than (MB)", "Smaller files save through the browser. Aviary checks the size first; when the server will not report one, the file is handed off anyway.", "Test Aria2 connection", "Sends a trivial JSON-RPC call.", "Aria2 active downloads", "Refresh to list in-flight transfers; tap Cancel to abort one.", "Refresh", "Local yt-dlp handoff", "Offer a higher-quality adaptive save when a local authenticated helper is running.", "yt-dlp helper endpoint", "http://127.0.0.1:8787 (loopback only)", "yt-dlp helper secret", "The AVIARY_YTDLP_TOKEN shared with the local process.", "Bluesky crosspost", "Post composer text to your Bluesky account on demand.", "Bluesky service URL", "Default: https://bsky.social", "Bluesky handle", "Your handle (no @, e.g. you.bsky.social)", "Bluesky app password", "App password from your account settings. Never your main password.", "Mastodon crosspost", "Post composer text to your Mastodon account on demand.", "Mastodon instance", "https://mastodon.social", "Mastodon access token", "Bearer token with write:statuses scope.", "Attach last download", "Upload the last successful Aviary media download with the first post in an explicit crosspost.", "Crosspost as thread", "Split on blank lines and reply each segment to the previous one.", "Crosspost composer \u2192 Bluesky", "Uses the current composer text.", "Crosspost composer \u2192 Mastodon", "AI provider runs", "Let the AI command menu POST prompts to your configured provider.", "AI provider", "Anthropic Messages API", "OpenAI Chat Completions", "OpenAI-compatible (LocalAI, Ollama proxy, \u2026)", "AI endpoint (optional)", "Override the default endpoint for the chosen provider.", "AI model", "e.g. claude-sonnet-4-6, gpt-4o, llama3.1:8b", "AI API key", "Stored locally only. Aviary never sends this except as the auth header to your provider.", "Allowed", "Network status", "AI destination", "AI data disclosure", "Before sending, Aviary shows the provider, endpoint, fields, character/token estimate, retention, and budget status.", "AI usage today", "AI max request bytes", "Stop before sending one AI request larger than this UTF-8 body. Set 0 to block every AI request.", "AI daily request bytes", "Stop AI provider calls after this many UTF-8 request bytes in the local day. Set 0 to block every AI request.", "Semantic search", "Send captured record text to the configured embedding endpoint for similarity search. The destination, fields, retention, and byte budget are shown here.", "Embedding endpoint", "POST endpoint that returns {data: [{embedding: number[]}]}", "Embedding model", "e.g. text-embedding-3-small", "Embedding API key", "Stored locally; used only as the Authorization header.", "Not configured", "Embedding destination", "Embedding data disclosure", "A request contains the model and captured record text. Vectors and bounded text stay in Aviary's local index; provider retention follows its policy.", "Embedding usage today", "Embedding max record bytes", "Stop before sending one record larger than this UTF-8 body. Set 0 to block every embedding call.", "Embedding daily record bytes", "Stop embedding calls after this many UTF-8 record bytes in the local day. Set 0 to block every embedding call.", "Auto-embed every export", "Before enabling, review the endpoint, captured-record fields, local retention, and daily byte budget above. After each export, embed in the background. Off by default.", "Rebuild semantic index", "Embed every captured record. Re-running is cheap because cached entries are skipped.", "Vector similarity over captured records. Embeddings run on demand.", "Describe what you're looking for\u2026", "Clear semantic index", "Forget every embedded record.", "Clear AI and embedding usage", "Forget local request counters only. This does not remove the semantic index or provider credentials.", "on", "off", "configured", "missing endpoint", "missing credentials", "missing key/model", "indexed", "{name}: {state} \xB7 {config}", "{name}: {state} \xB7 {count} {indexed}", "Integration status", "Recent integration errors", "Drawn from the audit log; only failed integration calls show up.", "Set up optional local services and AI providers.", "Intelligence", "Redacted. Saved credentials will be kept.", "Stop after the current collection and roll back anything already written.", "Validate the backup and show the same conflicts without writing or removing any local data.", "Apply the selected profile collections. A failed write rolls back the collections already changed.", "Credentials are redacted; the values already saved in this profile will be kept.", "Reset all preferences", "Restores Aviary's defaults: ad-free mode stays on and every other visual or behavior control returns to off. Saved posts, notes, bookmarks, and download history are kept.", "Export settings", "Downloads your preferences as JSON. API keys and passwords are replaced with a placeholder, so the file is safe to share; importing it here keeps the credentials already saved on this machine.", "Import settings (JSON)", "Paste a settings file exported from Aviary, then choose Import. Redacted credentials keep the values already saved here.", "Import", "Export full library backup", "Downloads one versioned JSON backup covering every profile on this machine, not only the one you have open. Credentials are excluded by default; restoring keeps the credentials already saved here.", "Export backup including credentials", "The same backup, plus the API keys and the WACZ signing identity saved in this browser. Anyone who opens the file can use them, so keep it somewhere you would keep a password.", "Choose a library backup", "Select a JSON backup to inspect its versions, counts, conflicts, and checksum before changing local data.", "Keep a local action log", "Records downloads, exports and settings changes on this device so you can review what Aviary did. Nothing is sent anywhere. Turning this off stops new entries immediately; existing ones stay until you clear them.", "Audit entries", "Clear audit log", "Drop the local action log.", "Back up local data, restore it, or reset Aviary.", "Preferences", "Library backup", "Audit history", "Storage", "Settings stay in this browser.", "Custom CSS safety", "Custom CSS is local, scoped to the named surface, and never sent with diagnostics. It is a power-user override, so support cannot reproduce its visual effects.", "Local-only mode", "Blocks every request to an integration you configured: Aria2, crossposting, AI prompts and embeddings. Saving media still fetches from X's own servers, which is where the page loaded it from. On by default; turning an integration on is what turns this off.", "Refuse X's analytics beacons", "Stops the tracking pings X sends as you scroll, click and pause. Only the analytics endpoints are refused. Timeline, media and login traffic is untouched.", "Monitor selector health", "Check the current X surface for required and fallback anchors. Turn this off when you do not want selector diagnostics.", "Connected to the page", "Page access", "Beacons refused", "Some changes could not be saved. The browser store may be full.", "Saving", "Telemetry", "Panel language", "Monitoring active", "Selector health", "See what stays local and check whether Aviary still works with X.", "Privacy boundary", "Page hooks", "Local data", "Compatibility", "Unsaved changes", "Could not save settings. Try again.", "Save or revert your changes before leaving this section.", "Saving...", "That change could not be saved. Make it again and save.", "Fix invalid values before saving.", "Diagnostics copied to clipboard.", "Deletion updated.", "Deletion command failed.", "Local-only mode on.", "Local-only mode off.", "Analytics beacons refused.", "Analytics beacons allowed.", "Selector health monitoring on.", "Selector health monitoring off.", "Structural observation copied to clipboard.", "Could not copy the structural observation.", "Performance metrics reset.", "Could not reset performance metrics.", "Saved warnings cleared.", "Could not clear saved warnings.", "Ad observations reset.", "Could not reset ad observations.", "Profile switched. Reloading\u2026", "Profile switch failed.", "Assigned {moved} stores; {completedAfterRetry} completed after retry; {skipped} already existed; {conflicted} conflicted; {failed} failed.", "Profile created. Reloading\u2026", "Profile creation failed.", "Answer recorded.", "Every feature is off. Is the page still wrong?", "Feature search cleared.", "Feature search stopped; every feature is back on.", "Aria2 handoff on.", "Aria2 handoff off.", "Aria2 endpoint saved.", "Aria2 secret saved.", "Aria2 threshold saved.", "Aria2 reachable.", "Aria2 unreachable: {error}", "Aria2 connection test failed.", "Cancelled {gid}.", "Aria2 cancel failed: {error}", "Aria2 cancel failed.", "Aria2 sweep failed.", "yt-dlp handoff on.", "yt-dlp handoff off.", "yt-dlp helper endpoint saved.", "yt-dlp helper secret saved.", "Bluesky on.", "Bluesky off.", "Bluesky service saved.", "Bluesky handle saved.", "Bluesky app password saved.", "Mastodon on.", "Mastodon off.", "Mastodon instance saved.", "Mastodon token saved.", "Crosspost attachment on.", "Crosspost attachment off.", "Posted {posts} to Bluesky.{url}", "Bluesky failed: {error}", "Bluesky crosspost failed.", "Posted {posts} to Mastodon.{url}", "Mastodon failed: {error}", "Mastodon crosspost failed.", "AI runs on.", "AI runs off.", "AI endpoint saved.", "AI model saved.", "AI API key saved.", "AI request budget saved.", "AI daily budget saved.", "Semantic search on.", "Semantic search off.", "Embedding endpoint saved.", "Embedding model saved.", "Embedding API key saved.", "Embedding request budget saved.", "Embedding daily budget saved.", "Auto-embed on.", "Auto-embed off.", "Rebuilding semantic index\u2026", "Embedding stopped at the budget ({blocked} records were not sent).", "Indexed: +{added} new \xB7 skipped {skipped} \xB7 errors {errors} \xB7 total {total}{trimmed}.", "Embedding failed.", "Semantic index cleared.", "Could not clear semantic index.", "AI and embedding usage cleared.", "Could not clear AI and embedding usage.", "Preferences reset. Ad-free mode is on.", "Could not reset settings.", "Settings exported.", "Could not export settings.", "Settings imported. {warning}", "Import failed: {errors}", "Could not import settings.", "Library backup downloaded: {filename} ({collections} collections, {bytes}).", "Could not export full library backup.", "Backup with credentials downloaded: {filename} ({collections} collections, {bytes}).", "Reading library backup\u2026", "Backup loaded: {collections} collections, {conflicts} changes.", "Could not read library backup.", "Cancelling restore\u2026", "Dry-run complete. No local data changed.", "Dry-run failed: {errors}", "Could not dry-run library restore.", "Library backup restored ({collections} collections). Reloading\u2026", "Restore cancelled; local data was rolled back.", "Restore cancelled.", "Restore failed: {errors}", "Could not restore library backup.", "Action log on.", "Action log off.", "Audit log cleared.", "Could not clear audit log.", "Captured {count} followers for @{handle}. The list had finished loading, so this is all of them.", "Captured {count} followers for @{handle}. The list was still loading, so this is only what was on screen. Scroll to the end and capture again for the whole list.", "No UserCell rows found.", "Snapshot failed.", "Captured {count} following for @{handle}. The list had finished loading, so this is all of them.", "Captured {count} following for @{handle}. The list was still loading, so this is only what was on screen. Scroll to the end and capture again for the whole list.", "Snapshots cleared.", "Could not clear snapshots.", "Archive import paused.", "Archive import resumed.", "Archive import cancelled.", "Archive import retry started.", "Reading archive, large files take a moment\u2026", "Read a {layout} archive. Imported {records} records. Repairs: {archiveLinks} archive links, {corpusLinks} captured links, {participants} participant IDs resolved, {unresolved} kept unresolved. Warnings: {warnings}; errors: {errors}. Files: {recognized} recognized, {skipped} skipped, {malformed} malformed.{absent}", "Archive import failed.", "Building report\u2026", "Report downloaded.", "Could not build report.", "Building cleanup preview\u2026", "Enqueued {added} items ({protected} protected skipped).", "Could not enqueue cleanup.", "Cleanup queue cleared.", "Could not clear queue.", "Storage cap warning off.", "Storage cap warning saved.", "Captured images keep their original size.", "Captured images will be downscaled.", "Videos will be captured as poster frames.", "Videos will be captured in full.", "Reading Under the Hood report\u2026", "Under the Hood report could not be read.", "Could not export Under the Hood reports.", "Downloading {count} selected files.", "Captured media download failed.", "Library search failed. Check the embedding endpoint and key in Integrations.", "Bookmark updated.", "Could not update bookmark.", "Bookmark removed.", "Bookmark was already removed.", "Could not remove bookmark.", "Bookmarks exported: {records} records in {files} files.", "Could not export bookmarks.", "Bookmarks cleared.", "Could not clear bookmarks.", "AI button on.", "AI button off.", "Unshorten on.", "Unshorten off.", "Link cleaning on.", "Link cleaning off.", "Copy link control off.", "Copy link control on.", "Account colours saved.", "Account notes cleared.", "Could not clear notes.", "Export capture on.", "Export capture off.", "Raw payload preference saved.", "Media byte capture on.", "Media byte capture off.", "Query discovery preference saved.", "Protected post sharing enabled.", "Protected posts excluded from share exports.", "Unknown-audience sharing enabled.", "Unknown-audience posts excluded from share exports.", "Save folder hint saved.", "Export job paused.", "Export job resumed.", "Export job cancelled.", "Collecting visible posts\u2026", "No posts found on this view. Scroll the timeline to load some, then export again.", "Exported {records} records across {files} ZIPs \u2192 {filename}", "Exported {records} record \u2192 {filename}", "Exported {records} records \u2192 {filename}", "Export failed. See diagnostics.", "No captured posts have thread metadata yet.", "Captured thread reader exported.", "Thread rebuild failed. See diagnostics.", "Could not copy diagnostics.", "Copied {records} records to clipboard.", "Exported {records} records to {target}.", "External export failed.", "Records per ZIP saved.", "Export job retention saved.", "Record retention saved.", "Age-based retention saved.", "WARC downloaded ({records} records).", "WARC export failed.", "WACZ downloaded ({records} records, {size}).", "WACZ export failed. Free some disk space or export fewer records, then try again.", "Signing identity replaced.", "Could not replace the signing identity.", "Aviary-only WACZ proof downloaded ({records} records, {size}).", "Aviary-only WACZ proof export failed.", "Signing keypair downloaded: {filename}.", "Signing keypair export failed.", "Media buttons on.", "Media buttons off.", "Copy media links on.", "Copy media links off.", "Original quality preference saved.", "Full-size images on.", "Full-size images off.", "Media layout saved.", "Filename template saved.", "Media sidecar preference saved.", "Visual duplicate matching on.", "Visual duplicate matching off.", "Duplicate history on.", "Duplicate history off.", "Concurrent download limit saved.", "Download pacing saved.", "Downloading media from this view\u2026", "Batch download failed.", "History cleared.", "Could not clear history.", "History exported: {records} records in {files} files.", "Could not export download history.", "Captured media finished: {downloaded} saved / {duplicate} dup / {failed} failed.", "No failed media jobs to retry.", "Preset applied: {preset} ({changes})", "Preset already applied: {preset}", "Could not apply preset.", "Theme value is not supported.", "Theme updated.", "Density updated.", "Timeline width updated.", "Chirp font on.", "Chirp font off.", "Engagement counts hidden.", "Engagement counts shown.", "Count preference saved.", "Tab title badge hidden.", "Tab title badge shown.", "Absolute timestamps on.", "Absolute timestamps off.", "Aviary tab icon on.", "X tab icon restored.", "Row borders hidden.", "Row borders restored.", "Contrast preference saved.", "Motion preference saved.", "Ad-free mode on.", "Ad-free mode off.", "Ad logging refused.", "Ad logging allowed.", "Sidebar preference saved.", "Trend preference saved.", "Layout preference saved.", "Grok preference saved.", "Hover preference saved.", "Focus mode on.", "Focus mode off.", "Reading hours saved.", "Timeline scrolls without stopping.", "Long posts expand automatically.", "Long posts stay collapsed.", "Back navigation restores your place.", "Back navigation uses X's position.", "Read marker on.", "Read marker off.", "Read marker surfaces saved.", "Writer mode on.", "Writer mode off.", "Following timeline on.", "Following timeline off.", "For You tab hidden.", "For You tab restored.", "Posts open from the reply icon.", "Posts open from the row again.", "Navigation visibility saved.", "Offscreen video paused.", "Offscreen video left playing.", "Video keeps playing.", "Video pauses with the tab.", "Video looping on.", "Video looping off.", "Playlist pinning on.", "Playlist pinning off.", "Filters enabled.", "Filters disabled.", "Seen-post dimming on.", "Seen-post dimming off.", "Seen-post surfaces saved.", "Seen posts forgotten.", "Could not clear seen posts.", "Filter rules saved.", "Renewed {count} rule.", "Renewed {count} rules.", "Could not renew the expired rules.", "Premium filter saved.", "Quote post filter saved.", "Media replies hidden.", "Media replies shown again.", "Filter reason setting saved.", "Engagement filter saved.", "Engagement metric saved.", "Filters off on every route.", "Rule set exported: {filename} ({count} lines).", "Could not export the rule set.", "Rule set needs attention.", "Rule-set preview ready.", "Could not preview the rule set.", "Added {count} rules.", "Replaced the rule set with {count} rules.", "Could not import the rule set.", "Hidden posts applied.", "Hidden posts revealed.", "Hide buttons on.", "Hide buttons off.", "Hiding off on every route.", "Nothing left to restore.", "Could not undo the last hide.", "Post restored.", "That post was already restored.", "Could not restore the post.", "Cleared {removed} hidden post.", "Cleared {removed} hidden posts.", "Could not clear hidden posts.", "The legacy data could not be assigned. Nothing was moved, so it is still where it was. Reopen this page to try again.", "The feature search could not start.", "The feature search could not be cleared.", "The search could not record that answer. It is still where it was, so press the same button again.", "The feature search could not be stopped.", "The restore could not be cancelled. It will stop at the end of the current collection on its own.", "The import could not be paused. It may have already finished. Reopen this section to see where it got to.", "The import could not be resumed. Its saved source may have been cleared. Retry it to start again from the file.", "The import could not be cancelled. It may have already finished. Reopen this section to see where it got to.", "The import could not be retried. Pick the archive file again to start a fresh import.", "The export job could not be paused. It may have already finished. Reopen this section to see its current state.", "The export job could not be resumed. Its checkpoint may have been cleared. Start a new export instead.", "The export job could not be cancelled. It may have already finished. Reopen this section to see its current state.", "That batch could not run. Grant download access on the Aviary permissions page, then try again.", "The batch did not take that instruction. It may have already finished. Reopen this section to see its current state.", "The queued downloads could not be resumed. Grant download access on the Aviary permissions page, then try again.", "The failed downloads could not be retried. Grant download access on the Aviary permissions page, then try again.", "The catch-up digest could not be opened. Nothing was lost, so reload the page and try again.", "Nothing matches that search.", "Try a shorter word, or pick a section on the left.", "Kept: the browser will not clear this library to reclaim space.", "Best effort: the browser may clear this library when disk space runs low. Keep a backup.", "The browser did not say whether it will keep this library. Keep a backup.", "This userscript manager does not give Aviary access to the page itself.", "This browser did not load Aviary's page script.", "Aviary's page script is loaded, but something else answered it first, most likely another extension. Network-level ad protection is not under Aviary's control on this page.", "Unavailable in this browser.", "Selector matches", "Missing required surfaces", "Optional surfaces missing", "Fallback selectors in use", "Affected features", "Last selector transition", "Ad observations", "Ad marker counts", "Ad contract drift", "Retained ad observations", "Native", "Trend", "House promo", "Video", "Sign in to X before running.", "Select at least one kind of activity to enable Run.", "Starting deletion\u2026", "Long Animation Frame unavailable", "No apply samples yet", "error", "errors", "The page was still wrong with every Aviary feature off, so nothing Aviary does is causing it. Another extension, a userscript, or X itself is the place to look next.", "No Aviary features were running, so there was nothing to search.", "No active downloads.", "Blocked by local-only mode", "blocked (budget is 0)", "No matches (or integration disabled).", "Open a profile's followers or following list, then use Capture snapshot to record it.", "Not in this layout:", "No captured records match \u201C{query}\u201D.", "X Under the Hood", "Read X's own monthly visibility summary locally. It reports aggregate labels, not production ranking weights or a complete post audit.", "Import X Under the Hood JSON", "Under the Hood report saved locally.", "No visibility labels were reported for this month.", "No X report imported yet.", "Import another month to compare reports.", "Download selected", "{selected} of {total} files selected. {unavailable} cannot be downloaded.", "Media kind", "Every kind", "Select all", "Not available.", "This search holds more than {limit} downloadable files. Narrow it first.", "No local collections match this search.", "Text + semantic match", "Semantic match", "Text match", "(no text)", "Find local bookmarks", "Search saved posts by text, handle, tags, folder, or ID. Captured bookmarks only include posts X sent while you scrolled past them.", "Search local bookmarks", "Nothing saved yet. Use Save locally on any post to keep a copy here.", "No local bookmarks match this search.", "Notes", "Bookmark notes", "Remove", "Add one below as handle: note. Notes appear beside that account's posts.", "Turn Capture on, scroll a timeline, then export. Jobs and their records appear here.", "Building WARC archive\u2026", "Building WACZ archive\u2026", "The stored keypair is invalid. Replace it before signing another archive.", "First use creates a local P-384 identity. Signing stays off for ordinary WACZ downloads.", "Creating a new signing identity\u2026", "Creating Aviary-only WACZ proof\u2026", "Preparing signing keypair\u2026", "Export download history", "Export the local dedup records as JSON and CSV for a chosen date range. Source media URLs are never included.", "History start date", "History end date", "Export range", "Download captured audio", "Download audio tracks already present in local captures. No metadata discovery request is made.", "Download captured captions", "Download caption tracks already present in local captures. No metadata discovery request is made.", "line", "Formerly observed markers are no longer detected: {markers}.", "Ready to run on @{handle}.", "{feature}: {count} runs \xB7 {total} ms total \xB7 {max} ms max \xB7 {full} full / {incremental} incremental", "{observed} long frames \xB7 {correlated} correlated", "{count} features", "X is in {language}, which Aviary has no ad labels for. Sponsored posts are not suppressed by label here.", "{feature} is what changed this page. It took {rounds} rounds to find. Every feature is running again, so turn that one off with its own setting if you want it to stay off.", "Round {round} of {total}. All {off} features are off.", "Round {round} of {total}. {off} of the {suspect} features still suspected are off.", "gid {gid} \xB7 {status}", "{count} entries", "{posts} posts \xB7 {likes} likes \xB7 {messages} direct messages (kept out of public search) \xB7 {media} media refs \xB7 {followers} followers \xB7 {following} following \xB7 {lists} lists", "{archiveLinks} archive links + {corpusLinks} captured links expanded \xB7 {participants} participant IDs resolved \xB7 {unresolved} kept as unresolved IDs \xB7 no requests made", "{status} \xB7 {filename} \xB7 {records} records \xB7 {files} files \xB7 {warnings} warnings", "{saved} saved \xB7 {mirrored} mirrored \xB7 {due} due \xB7 {tags} tags \xB7 {folders} folders", "{public} public \xB7 {protected} protected \xB7 {unknown} unknown \xB7 {excluded} excluded from share exports", "{status} \xB7 {records} records \xB7 {surface}", "Local identity {fingerprint}. It proves continuity of this key, not what X served.", "{count} this session", "{imported} rules found. Replace is ready. Add is blocked at line {line}: {error}", "{imported} rules found. Add {added}; {duplicates} already present. Replace {replaced} with {total}.", "Forget the stored warnings and errors. Only Aviary's own message text, the time, and the names of its detail fields are ever written here.", "Clear the bounded local marker history and its drift warning. No post text, handles, URLs, or response bodies are stored here.", "Turns every Aviary feature off, then back on in halves, asking after each round whether the page is still wrong. It names the one responsible in about five rounds. Nothing is written to your settings, so reloading restores everything whatever you do, including stopping halfway. The Control Center and its language stay on throughout, so neither can be named.", "Start over from every feature off.", "Put the search away. Nothing changes; every feature is already back on.", "The problem survives with these features off, so it is one of the others.", "The problem went away with these features off, so it is one of them.", "Turn every feature back on and forget the search. No answer is recorded.", "Pause {filename}.", "Resume {filename}.", "Cancel {filename}.", "Retry {filename}.", "Pause {jobId}.", "Resume {jobId}.", "Cancel {jobId}.", "Copy structural observation", "Mutation performance", "Reset performance metrics", "Ad labels for this language", "Saved warnings", "Clear saved warnings", "Reset ad observations", "Active profile", "Switch profile", "Assign legacy data here", "New profile", "Find the feature breaking this page", "Feature search", "Search again", "Clear the result", "Still suspected", "The page is still wrong", "The page looks right now", "Stop the search", "Backup version", "Backup collections", "Collection changes", "Credentials", "Backup warnings", "Cancel restore", "Dry-run restore", "Restore this library backup", "No snapshots yet", "Imported collections", "Offline archive repairs", "Archive import", "Pause archive import", "Resume archive import", "Cancel archive import", "Retry archive import", "Latest Under the Hood report", "Labels in latest report", "Under the Hood reports", "Month-over-month", "Export saved Under the Hood reports", "Local bookmarks", "Export local bookmarks", "Export for bookmark managers", "Clear local bookmarks", "No account notes yet", "Audience coverage", "No export jobs yet", "Export job", "Pause export job", "Resume export job", "Cancel export job", "Rebuild captured threads", "Active media batch", "Duplicate matches", "Quality receipts", "Last duplicate match", "Clear download history", "Resume queued media", "Retry failed media", "Playlists rewritten", "Forget seen posts", "Rules that could not be read", "Expired rules", "Renew expired rules", "Posts available", "Open catch-up digest", "Pause", "Resume", "Stop", "Replace keypair", "Working. Every change has been written.", "Copies how X builds this page (element counts, nesting and layout) for refreshing Aviary's test fixtures. No post text, names, handles, links or ids.", "Mutation timing stays local and stores only feature ids and bounded durations.", "Move unassigned pre-profile settings and library stores into the active profile. Nothing is guessed from the current X route.", "Create an empty offline profile before switching accounts or importing another archive.", "None recorded.", "Measuring\u2026", "This browser store cannot be weighed from here, so Aviary does not report a size for it.", "This browser does not break its storage report down by type, so only Aviary's own measurement is shown.", "Downloads the normalized reports as local JSON. This is user data from X; Aviary does not add ranking weights or infer a score.", "Download JSON and CSV for every bookmark in this profile. The mirror only holds what X has sent to the page while you scrolled past it.", "Download a browser bookmark file that Karakeep, Linkwarden, linkding and every browser import, plus the CSV Raindrop.io imports.", "Remove every saved local bookmark.", "Read captured replies in parent-first order. Missing parents stay visible as local gaps.", "Reset the local dedup index.", "Recover paused or queued downloads from an earlier session.", "Retry every failed or cancelled media job in the durable queue.", "Preset packs unavailable in this build.", "Clear the stored post IDs so everything reads as unseen again.", "Restart each expired rule's own window from now. Nothing is deleted when a rule expires, so a rule can always be brought back.", "Review a time window, filter by post type, group by author, and open the original post. No requests are made.", "Hidden post store unavailable in this build.", "Ready.", "Deletion complete.", "The action limit was reached. Resume to run another batch.", "Deletion paused.", "Deletion stopped.", "Preview is running.", "Deletion is running.", "The signed-in account changed. No further actions were taken.", "Another X tab is already running this deletion.", "This tab is already running a deletion.", "X displayed a login or anti-abuse challenge. Complete it, then resume.", "Select at least one account category.", "There is no running deletion to pause.", "There is no paused deletion to resume.", "There is no deletion to stop.", "Delete X activity is still loading.", "Resume this deletion from the X tab that started it.", "X did not apply the action after five automatic page reloads. Resume to try again.", "An unexpected error stopped the deletion.", "The deletion command could not be completed.", "Account cleanup paused.", "Account cleanup stopped.", "Account cleanup record cleared.", "This cleanup moved to another X tab.", "Opening {category}.", "Previewing {category}.", "Cleaning {category}.", "Selected account cleanup passes are complete.", "Loading more {categoryLower}.", "{count} more {categoryLower} loaded.", "X is still loading older {categoryLower}.", "Checking for more {categoryLower} ({checks}/{limit}).", "{category}: {count} found.", "{category}: {count} removed.", "Resting for {seconds} seconds after {count} actions. Deletion continues automatically.", "Continuing {category}.", "One item was skipped because its expected control was missing.", "An account action didn't take effect. Aviary will try it again.", "Reloading {category} from the top to verify that nothing was missed.", "Fresh verification found no more {categoryLower}.", "No more {categoryLower} found.", "Reloading Likes for the next X rate window.", "X did not apply the action twice. Waiting {seconds} seconds before reloading {category} ({attempt}/{max}).", "Reloading {category} now. Deletion continues automatically.", "The account cleanup lock could not be renewed.", "Sign in to X, then resume.", "An unexpected error stopped the account cleanup.", "The account cleanup is blocked and needs attention.", "X's 500-action Like limit was reached. Waiting {seconds} seconds for the next window. Deletion continues automatically.", "X's 500-action Like limit was reached. Waiting 1 minute for the next window. Deletion continues automatically.", "X's 500-action Like limit was reached. Waiting {minutes} minutes for the next window. Deletion continues automatically.", "Open Aviary AI command menu", "Run with provider", "running\u2026", "result copied to the clipboard.", "The result could not be copied. Your browser blocked clipboard access.", "the provider did not respond", "Check the key and model in Integrations.", "Prompt copied to the clipboard. Paste it into your assistant.", "The prompt could not be copied. Your browser blocked clipboard access.", "Review external AI request", "Nothing is sent until you choose Send request.", "unlimited", "Aviary stores usage counters only; the provider's retention follows its policy.", "Budget blocked this request.", "Send request", "Translate", "Translate the selected post to your active locale.", "Summarize", "Summarize a thread or long post in 3 bullet points.", "Explain", "Explain context, jargon, and references in the post.", "Fact-check prompt", "Generate a fact-check prompt for the post (no network call without your key).", "Snippets", "Open Aviary composer snippets", "No snippets yet. Add some in the Control Center \u2192 Library.", "Click into the composer first, then pick a snippet.", "Aviary is on", "Two things are enabled from the start. Everything else stays off until you turn it on.", "Sponsored posts, promoted trends and pre-rolls are hidden.", "Photos and videos get a download control that only acts when you click it.", "Open Aviary from the last row of X's left navigation to change any of it.", "Got it", "Your local library is already past the storage cap you set. Nothing was deleted.", "This capture takes your local library past the storage cap you set. Nothing was deleted.", "Original", "Quotes", "Filtered", "All", "Catch-up categories", "Catch-up", "Close catch-up", "Window", "Sort", "Newest first", "Oldest first", "Least dense first", "Group by author", "A quiet window. Nothing new to review.", "Nothing in this window.", "Catch-up only includes posts Aviary has already rendered. It does not request more from X.", "That's all.", "Unknown account", "Photo", "Audio", "Captions", "Thumb", "Load preview", "Open captions", "Open post", "Top links", "post Aviary saw in this window", "posts Aviary saw in this window", "share", "shares", "Under your engagement floor", "Hidden: this post has a photo", "Hidden: this post has a video", "Hidden: this post has a GIF", "Hidden: this post is from a verified account", "Hidden: this post quotes another", "Dimmed by your rule", "Hidden by your rule", "Dimmed by your keyword", "Hidden by your keyword", "Dimmed by your pattern", "Hidden by your pattern", "Hide this post", "Post hidden", "Could not save the hidden post. Storage rejected the write.", "Undo", "Could not restore that post.", "Outside your reading hours", "Aviary is covering the timeline until your next window. Nothing is blocked and nothing left this device.", "Let me through for five minutes", "Row presses are off. The reply icon opens the post.", "Show more posts", "Bookmark failed", "Save locally", "Remove local bookmark", "Copy link", "Copy this post's link", "This post has no link Aviary can copy.", "Copied", "Failed", "The clipboard refused this copy.", "Note", "Tag", "best-direct", "Download access was not granted. Open Aviary Options to enable browser downloads.", "Media download failed. Try the on-post button again.", "Right-click an image or video first, then choose Aviary download.", "Download \xB7 Best direct MP4", "Download", "Download this post's own media. Quoted and card media has its own Download button.", "Download all media in this post", "The direct video is still loading. Try again in a moment.", "Copy links", "Copy this post's best direct media links", "adaptive", "Send to yt-dlp", "Send the observed adaptive video to local yt-dlp", "Copy yt-dlp command", "Copy the yt-dlp command for the observed adaptive video", "Higher quality adaptive video", "Sending\u2026", "Refused", "The local yt-dlp helper refused this job.", "The local yt-dlp helper failed.", "Saved", "Adaptive video saved by yt-dlp.", "Missing", "The yt-dlp job is no longer available. Copy the command to retry.", "The local yt-dlp helper could not be reached.", "yt-dlp command copied.", "The yt-dlp command could not be copied.", "Downloading\u2026", "Retry", "Unavailable", "Started", "The browser is still transferring this file. Check your downloads for the result.", "Your browser opened this file instead of saving it. Grant Aviary the download permission for a real save.", "Skipped because the downloaded bytes match an item in history.", "Skipped because the image looks like an item in history.", "Skipped because this is the same X media asset at another size.", "Aviary needs the browser download permission. Opening its options page.", "Retry original image", "Previously downloaded", "Original quality", "Fallback quality. Click to retry original", "Best direct quality", "Quality unknown", "This image is not available to download.", "Allow", "Permissions", "Download access", "Enable the permissions Aviary needs for best-quality video and image downloads. Nothing leaves your browser.", "Download readiness", "granted", "optional", "All optional. You're in control.", "Save videos and images", "checking\u2026", "Saves the best available video or image through your browser with your filename and duplicate settings.", "Grant download access", "Revoke", "Read original media directly", "Lets Aviary fetch full-size media directly. Download buttons still work without it.", "Grant media hosts", "Reach the local yt-dlp helper", "Only for the optional yt-dlp helper. Aviary talks to it from the extension, so Chrome doesn't ask x.com for local network access.", "Grant helper access", "Start downloading", "Enable one-click saves through your browser.", "Open X", "Aviary adds Download to media posts automatically.", "Choose Download", "Aviary selects the best available quality.", "Open X to download", "Private by default", "Nothing leaves your browser.", "Settings, filters, notes and archives live in the Control Center on x.com. This page only manages browser permissions.", "This browser did not expose the permissions API.", "Request dismissed. Nothing changed.", "Revoked.", "Nothing to revoke.", "not granted", "Granted. Media saves through the browser now.", "Granted. Aviary can read full-size media directly for exports now.", "Granted. Aviary reaches the local helper without a browser prompt.", "Aviary for X", "Local-first X/Twitter enhancer with reversible controls and privacy-first defaults.", "Download media with Aviary", "Aviary archive", "Local archive viewer. Remote references are never fetched automatically.", "Search records", "Media status", "All media", "Captured bytes", "Remote reference", "Handle", "Thread view", "Media", "records", "shown", "No matching records.", "source", "bytes", "SHA-256", "Open source URL", "posts", "offline-ready", "network may be required", "Missing captured post", "This parent was not captured locally.", "Conversation", "{count} posts by {author}", "Start", "Account Cleanup", "record", "Optional permissions", "Action failed.", "On-post controls", "File naming", "Batch behavior", "Queue status", "Queued", "Original quality is applied when download controls are enabled.", "Save list" ]; var PANEL_CATALOG_JSON = `{"es":["Ajustes de Aviary","Un X m\xE1s tranquilo. Datos locales.","Cerrar","Aviary","Buscar anuncios, descargas, filtros y m\xE1s","Buscar ajustes","Revertir","Guardar","Los interruptores y campos esperan a Guardar. Los botones act\xFAan de inmediato.","Guardado localmente","Secciones de ajustes","Empieza aqu\xED","Configuraci\xF3n r\xE1pida","Uso diario","Aspecto","Limpieza de la p\xE1gina","Filtros de contenido","Descargas","Tus datos","Publicaciones guardadas","Importar y exportar","Eliminar actividad de X","M\xE1s herramientas","Ponerse al d\xEDa","Publicaciones ocultas","Reproducci\xF3n de v\xEDdeo","Archivo de X","Conexiones","Copia de seguridad y restablecimiento","Privacidad y diagn\xF3sticos","C\xF3mo funciona el guardado","Los interruptores y campos esperan a Guardar. Los botones como Aplicar, Exportar, Vista previa y Eliminar act\xFAan de inmediato.","Abrir ajustes","Hacer X m\xE1s tranquilo","Oculta anuncios, tendencias, sugerencias y la navegaci\xF3n que no utilizas.","Ocultar publicaciones no deseadas","Filtra por palabras, contenido multimedia, insignias o p\xE1gina.","Guardar fotos y v\xEDdeos","Elige la calidad, los nombres de archivo, la detecci\xF3n de duplicados y el comportamiento de la cola.","Eliminar actividad de la cuenta","Elimina publicaciones, respuestas, republicaciones, Me gusta o marcadores.","Lectura tranquila","Oculta tendencias, bordes de fila y contadores de interacci\xF3n, aten\xFAa las publicaciones premium, limpia t.co, tema denso y tenue.","Ocultar barra lateral derecha","Activado","Suprimir vistas previas al pasar el cursor","Ocultar contadores de interacci\xF3n","Tema","Atenuado","Aplicar","Archivo de medios","Descargas con calidad original, nombres de archivo deterministas, historial sin duplicados, medios apilados.","Preferir calidad original","Disposici\xF3n multimedia","Apilado","Mostrar botones de descarga","Creador","Modo escritura, fragmentos en el redactor, limpieza del bot\xF3n de compartir, barra lateral y tendencias ocultas.","Modo escritura","Ocultar tendencias","Cuadr\xEDcula estricta","Investigaci\xF3n","Captura para exportaci\xF3n activada, formatos JSON+CSV+HTML+MD, detecci\xF3n de IDs de consulta, cargas sin procesar.","Capturar publicaciones visibles","Conservar cargas \xFAtiles sin procesar","Formatos de exportaci\xF3n","JSON, CSV, HTML, Markdown","Cl\xE1sico","Restaura el tema atenuado, mantiene la barra lateral, oculta solo Grok, sin filtro premium.","Modo denso","Desactivada","Ocultar superficies de Grok","M\xEDnimo","M\xE1xima limpieza: sin contadores, sin bordes, sin tendencias, zonas seguras para texto grande.","Noir","Idioma","Traduce el panel y define la direcci\xF3n de lectura: de derecha a izquierda para \xE1rabe y hebreo. Privacidad indica qu\xE9 parte del idioma elegido est\xE1 completa; lo que falte permanece en ingl\xE9s.","Elige una configuraci\xF3n preparada o ve directamente a una tarea com\xFAn.","Tareas comunes","Configuraciones preparadas","Idioma","Noir se aplica autom\xE1ticamente. Elige Desactivado para usar el estilo propio de X.","Desactivado (el tema propio de X)","Luces apagadas","Grafito","Ciruela","Medianoche","Noir (predeterminado)","Comprime el espaciado de la cronolog\xEDa para leer m\xE1s r\xE1pido.","Ancho de la cronolog\xEDa","Ancho usa todo el espacio junto a la navegaci\xF3n y oculta el panel de descubrimiento. C\xF3modo mantiene ese panel.","Predeterminado","C\xF3modo","Ancho (predeterminado)","Restaurar la fuente Chirp","Fuerza la tipograf\xEDa Chirp de X donde el sitio ha vuelto a una fuente del sistema.","Interruptor principal de los cuatro n\xFAmeros siguientes. Los controles siguen funcionando y los lectores de pantalla siguen anunciando los totales.","Ocultar el n\xFAmero de respuestas","Se aplica mientras \xABOcultar recuentos de interacci\xF3n\xBB est\xE1 activo.","Ocultar el n\xFAmero de republicaciones","Ocultar el n\xFAmero de me gusta","Ocultar el n\xFAmero de visualizaciones","Se aplica mientras \xABOcultar recuentos de interacci\xF3n\xBB est\xE1 activo. El total de visualizaciones est\xE1 en un enlace de anal\xEDticas, no en un bot\xF3n de acci\xF3n.","Ocultar el contador en el t\xEDtulo de la pesta\xF1a","Elimina el contador de no le\xEDdos de X del t\xEDtulo de la pesta\xF1a, para que la pesta\xF1a no devuelva un aviso que ya hab\xEDas ocultado.","Marcas de tiempo absolutas","Muestra la fecha y la hora exactas en cada publicaci\xF3n en lugar del texto relativo de X.","Usar el icono de pesta\xF1a de Aviary","Sustituye el favicon de X por la marca de Aviary para distinguir sus pesta\xF1as de un vistazo. Al desactivarlo se restaura el icono propio de X.","Ocultar bordes de fila","Elimina el divisor de 1 px bajo cada publicaci\xF3n y las l\xEDneas laterales de la columna principal.","Alto contraste","Usa bordes y contraste de texto m\xE1s marcados.","Movimiento reducido","Seguir la configuraci\xF3n del sistema","Reducir siempre","No reducir nunca","CSS personalizado","Sobrescrituras locales opcionales para las superficies delimitadas. El CSS nunca sale de este perfil y no se incluye en los informes de errores.","CSS de publicaciones","Limitado a las publicaciones mostradas. Ejemplo: article { border-radius: 18px; }","CSS de acciones multimedia","Limitado a los botones multimedia de Aviary y su contenido.","CSS de navegaci\xF3n","Limitado a la barra de navegaci\xF3n de X.","CSS de barra lateral","Limitado a la barra lateral de descubrimiento de X.","CSS del editor","Limitado a la barra de herramientas y al \xE1rea de texto del editor.","Cambia los colores, el espaciado, el texto y las cifras que se muestran en las publicaciones.","Aspecto y dise\xF1o","Detalles de las publicaciones","Accesibilidad","Estilos avanzados","La protecci\xF3n comienza al cargar el documento.","Modo sin anuncios","Oculta publicaciones patrocinadas, colaboraciones pagadas, tendencias promocionadas, anuncios propios y pre-rolls visibles. Aviary tambi\xE9n rechaza la llamada separada de registro de contenido promocionado de X sin bloquear la entrega del timeline.","Rechazar la llamada de registro de anuncios de X","Solo se aplica mientras el modo sin anuncios est\xE1 activado. Aviary rechaza exactamente una petici\xF3n (la llamada de registro de contenido promocionado de X) y ninguna otra, incluidas las comprobaciones que X usa para detectar un bloqueador de anuncios. Desact\xEDvalo si X se queja de todos modos: las publicaciones patrocinadas siguen ocultas y Aviary deja de rechazar cualquier petici\xF3n.","Estado de la protecci\xF3n contra anuncios","Reduce el ruido de tendencias, recomendaciones y pie de p\xE1gina.","Elimina los temas del momento y los m\xF3dulos de noticias.","Ocultar sugerencias de cuentas","Elimina las tarjetas \xABA qui\xE9n seguir\xBB sin ocultar el resto de la barra lateral.","Ocultar el editor de Inicio","Elimina el editor de publicaci\xF3n r\xE1pida de Inicio. El bot\xF3n Publicar sigue abri\xE9ndolo cuando lo necesites.","Ocultar recomendaciones del hilo","Termina la conversaci\xF3n en su \xFAltima respuesta real contrayendo el bloque Descubre m\xE1s y las publicaciones sugeridas debajo.","Elimina el panel y el enlace de navegaci\xF3n de Grok, sus entradas de generaci\xF3n de im\xE1genes y las acciones por publicaci\xF3n.","Evita que X abra una tarjeta de perfil o una burbuja al pasar el cursor sobre un nombre, avatar o control. Los men\xFAs, las etiquetas y los nombres para lectores de pantalla no cambian.","Modo concentraci\xF3n","Fuera del horario indicado abajo, cubre la columna de lectura con un panel local discreto. La navegaci\xF3n sigue disponible y una excepci\xF3n de cinco minutos est\xE1 a un clic. No se bloquea nada y nada sale de este dispositivo.","Inicio del horario de lectura","Hora en formato de 24 horas, por ejemplo 09:00.","Fin del horario de lectura","Hora en formato de 24 horas. Si el fin es anterior al inicio, el intervalo cruza la medianoche.","Detener la l\xEDnea temporal tras","Publicaciones que mostrar antes de que el feed deje de crecer, con un control para continuar. Cero deja intacto el desplazamiento infinito de X. Nada de lo que ya est\xE1 en pantalla se mueve, y el control aparece debajo de la \xFAltima publicaci\xF3n, no encima.","Expandir publicaciones largas autom\xE1ticamente","Haz clic \xFAnicamente en el control Mostrar m\xE1s de la propia publicaci\xF3n cuando se detenga el desplazamiento. Las respuestas, las barras laterales, las publicaciones citadas y otros enlaces Mostrar m\xE1s no se modifican.","Restaurar la posici\xF3n al volver","Vuelve a la misma publicaci\xF3n visible despu\xE9s de abrir una publicaci\xF3n u otra p\xE1gina de X y usar el bot\xF3n Atr\xE1s del navegador. Cualquier desplazamiento con rueda, toque, puntero o teclado cancela la restauraci\xF3n de inmediato.","Mostrar marcador de lectura","Guarda una posici\xF3n local por feed y muestra una l\xEDnea de novedades desde tu \xFAltima visita. Nunca a\xF1ade un contador de no le\xEDdos.","Superficies del marcador de lectura","Elige d\xF3nde aparecen el marcador local y el separador de publicaciones nuevas.","Inicio","Publicaci\xF3n","Perfil","B\xFAsqueda","Notificaciones","Mensajes","Mientras el foco est\xE1 en el redactor, aten\xFAa la barra lateral y la cronolog\xEDa detr\xE1s. Todo vuelve en cuanto haces clic fuera.","Abrir Siguiendo en lugar de Para ti","Selecciona la segunda pesta\xF1a de inicio cada vez que llegas a la cronolog\xEDa. Si vuelves a Para ti, se queda ah\xED hasta que salgas de la p\xE1gina.","Ocultar pesta\xF1a Para ti","Selecciona Siguiendo y contrae la primera pesta\xF1a de Inicio. Solo afecta a Inicio y se restaura al desactivarlo.","Abrir publicaciones solo desde el icono de responder","X convierte toda la fila en un enlace, as\xED que pulsar sobre el texto o junto a un control abre una publicaci\xF3n que no elegiste. Esto quita el \xE1rea de clic de la fila y se la da al icono de responder, que abre la publicaci\xF3n en lugar del cuadro de respuesta. Los enlaces, los botones, el contenido multimedia y las publicaciones citadas siguen funcionando.","Ocultar elementos de navegaci\xF3n","Un identificador estable de la navegaci\xF3n de X por l\xEDnea: home, explore, notifications, follow, chat, messages, grok, history, studio, premium, profile o more.","Oculta los anuncios y las partes de X que no utilizas.","Protecci\xF3n contra anuncios","Elementos de la p\xE1gina","Flujo de lectura","Navegaci\xF3n","Las reglas est\xE1n activas en las rutas seleccionadas.","Activar filtros","Interruptor general de los filtros de palabras clave, expresiones regulares, Premium y multimedia.","Estado de las reglas","Inactivo hasta que se habiliten los filtros. Puedes editar las reglas antes de activarlos.","Atenuar las publicaciones que ya has visto","Aten\xFAa una publicaci\xF3n la segunda vez que pasa y conserva una copia local de las publicaciones que Aviary ha mostrado. Al pasar el cursor, la publicaci\xF3n vuelve a aparecer.","Ocultar publicaciones vistas en","Elige las superficies donde se aten\xFAan las publicaciones que ya has visto.","Reglas de filtrado","Una regla por l\xEDnea: campo, not opcional, operador, valor. Los campos son text, handle, media, verified, link; los operadores son contains, is, starts, ends, matches. \xDAnelos con and / or y antep\xF3n dim: para atenuar en vez de ocultar. Ponle nombre a una regla empezando la l\xEDnea con [un t\xEDtulo] y dale una vida limitada con for 7d from . Ejemplo: [Weekend sales] dim for 7d from 2026-08-19T10:00:00.000Z: text contains sale and media is photo","Conjunto de reglas port\xE1til","Exporta texto sin formato o pega un conjunto para previsualizarlo antes de a\xF1adir o reemplazar reglas.","Pega las reglas aqu\xED","Exportar .txt","Vista previa","A\xF1adir reglas","Reemplazar reglas","Pega reglas para ver las dos opciones de importaci\xF3n.","Reglas de palabras clave","Una palabra clave o frase por l\xEDnea. Coincidencia parcial sin distinguir may\xFAsculas.","Reglas de expresiones regulares","Un patr\xF3n por l\xEDnea. Usa /patr\xF3n/flags o un patr\xF3n simple (sin distinguir may\xFAsculas).","Cuentas en la lista blanca","Cuentas (una por l\xEDnea, sin @) que nunca se filtran.","Publicaciones Premium / verificadas","Desactivado","Ocultar","Publicaciones que citan","Publicaciones que citan otra publicaci\xF3n.","Ocultar las respuestas con im\xE1genes, GIF o v\xEDdeo","En la publicaci\xF3n que has abierto, descarta cada respuesta que lleve una foto, un GIF o un v\xEDdeo. El texto que la acompa\xF1e da igual, porque casi todos los memes vienen con pie. La publicaci\xF3n y el hilo que hay encima no se tocan, y una respuesta que solo cita otra publicaci\xF3n con imagen se queda. Funciona por su cuenta, sin los filtros de arriba, porque aplicar aquellos a una conversaci\xF3n ocultar\xEDa la publicaci\xF3n que viniste a leer.","Indicar por qu\xE9 se filtr\xF3 una publicaci\xF3n","Un filtro que oculta en silencio es dif\xEDcil de distinguir de un fallo. Las publicaciones atenuadas pueden indicar qu\xE9 las filtr\xF3 sin alterar la maquetaci\xF3n; la tercera opci\xF3n convierte adem\xE1s cada publicaci\xF3n oculta en una franja de una l\xEDnea que explica el motivo y se abre al pasar el cursor o al tabular hasta ella.","No indicar nada","En las publicaciones atenuadas","En las publicaciones atenuadas y ocultas","Publicaciones con poca interacci\xF3n","Publicaciones por debajo del m\xEDnimo indicado abajo. Una publicaci\xF3n cuyo n\xFAmero Aviary no puede leer nunca se filtra por \xE9l.","Interacci\xF3n medida en","A cu\xE1l de los n\xFAmeros bajo una publicaci\xF3n se aplica el m\xEDnimo.","Respuestas","Reposteos","Me gusta","Interacci\xF3n m\xEDnima","Las publicaciones por debajo de este n\xFAmero se filtran. Cero no filtra ninguna.","Ocultar publicaciones con fotos","Filtra las publicaciones que contienen fotos.","Ocultar publicaciones con v\xEDdeos","Filtra las publicaciones que contienen v\xEDdeos.","Ocultar publicaciones con GIF","Filtra las publicaciones que contienen GIF.","Activo en","Rutas en las que se ejecutan los filtros.","Cuentas bloqueadas / autorreposts","Pendiente de una captura autenticada; los controles siguen desactivados.","Oculta o aten\xFAa publicaciones por palabras, contenido multimedia, insignias de cuenta o p\xE1gina.","Estado de los filtros","Reglas","Tipos de contenido","Rutas","La preferencia de descarga se aplica a todos los controles multimedia.","Agrega una acci\xF3n Descargar a cada publicaci\xF3n con contenido multimedia, adem\xE1s de controles por archivo. Al desactivarla tambi\xE9n se oculta Copiar enlaces multimedia.","Mostrar Copiar enlaces multimedia","Agrega una acci\xF3n que copia las mejores URL directas de im\xE1genes, GIF, v\xEDdeos, audio y subt\xEDtulos, una por l\xEDnea. Solo copia el contenido multimedia de esa publicaci\xF3n y requiere los controles multimedia anteriores.","Prueba primero name=orig en el formato de origen y, si falla, 4096x4096.","Estado de calidad original","Mostrar im\xE1genes en calidad original","Carga las fotos de la cronolog\xEDa a tama\xF1o completo en lugar de la versi\xF3n que X elige para el hueco. M\xE1s n\xEDtidas, y varias veces m\xE1s datos.","Cuadr\xEDcula predeterminada","Plantilla de nombre de archivo","Campos: {handle}, {account}, {tweetId}, {mediaId}, {index}, {total}, {date}, {text}, {ext}. {account} es un alias del usuario que publica y puede crear carpetas por cuenta.","Archivo complementario de metadatos","Guarda un archivo complementario local de texto o JSON despu\xE9s de cada descarga multimedia completada.","Texto","JSON","Detectar im\xE1genes visualmente similares","Compara tambi\xE9n una firma visual de 256 bits. Las composiciones simples parecidas pueden confundirse, por eso est\xE1 desactivado de forma predeterminada.","Historial de duplicados","Omite el mismo recurso de X o los mismos bytes de imagen sin guardar la URL de origen.","Descargas simult\xE1neas","M\xE1ximo de descargas multimedia simult\xE1neas durante un lote (1-6).","Ritmo de descarga","Controla el impulso inicial y el ritmo sostenido de las solicitudes multimedia por lote.","Conservador","Equilibrado","Descargar todo el contenido visible","Pon en cola todas las fotos, videos, GIF, miniaturas, pistas de audio y subt\xEDtulos visibles en esta p\xE1gina.","Estado de las descargas","Entradas del historial","El resto del panel sigue funcionando. Se inform\xF3 a diagn\xF3sticos.","Esta secci\xF3n no se pudo dibujar","Configura los botones de descarga, la calidad, los nombres de archivo y las colas.","{bytes} repartidos en {count} colecciones","Almacenamiento de la biblioteca","Colecciones m\xE1s grandes","Informe de almacenamiento del navegador","Aviso de l\xEDmite de almacenamiento","Avisa antes de que una captura lleve la biblioteca local por encima de estos megabytes. 0 desactiva el aviso. Aviary nunca borra nada para mantenerse por debajo; la eliminaci\xF3n se elige en la vista previa de limpieza.","Reducir el tama\xF1o de las im\xE1genes capturadas","Se aplica a las capturas a partir de ahora. Nada de lo ya guardado cambia, y cada registro reducido indica que se redujo.","Conservar el original","Tres cuartos","La mitad","Un cuarto","Solo el fotograma de portada del v\xEDdeo","Guarda la imagen fija que X ofrece para un v\xEDdeo en lugar del v\xEDdeo. El registro indica que el v\xEDdeo qued\xF3 fuera, para que una exportaci\xF3n posterior no presente la imagen como la publicaci\xF3n completa.","Buscar en todas las colecciones locales","Busca publicaciones, Me gusta, marcadores, notas y capturas.","Buscar en la biblioteca local","Clasificaci\xF3n sem\xE1ntica","Descargar contenido multimedia","{count} elementos multimedia","Prueba source:bookmarks, tag:reading o has:media.","Mostrar el bot\xF3n de IA en las publicaciones","A\xF1ade a cada publicaci\xF3n un bot\xF3n que crea una instrucci\xF3n de Traducir, Resumir, Explicar o Verificar. Si no has configurado un proveedor de IA, copia la instrucci\xF3n al portapapeles; no se env\xEDa nada a ninguna parte.","Expandir enlaces t.co","Sustituye las redirecciones cortas \`t.co\` por el destino que aparece en aria-labels y t\xEDtulos.","Limpiar el rastreo de los enlaces","Elimina los tokens para compartir y los par\xE1metros de campa\xF1a (utm_*, fbclid y los propios t/s de X) de los enlaces del cronograma, de modo que lo que copias es la direcci\xF3n limpia.","Copiar enlaces de publicaciones como","A\xF1ade a cada publicaci\xF3n un control Copiar enlace que escribe la direcci\xF3n de esa publicaci\xF3n en el host elegido. No se reescribe nada de lo que X ha mostrado ni se redirige ninguna navegaci\xF3n: solo cambia lo que copias. D\xE9jalo en X para quitar el control.","Colores de cuentas","Formato: usuario: color. Uno por l\xEDnea. Los colores son amber, rose, violet, sky, green o slate. Una l\xEDnea vac\xEDa elimina la etiqueta.","Notas de cuentas","Formato: usuario: nota. Una por l\xEDnea. Las notas vac\xEDas eliminan la entrada.","Borrar todas las notas de cuentas","Elimina todas las notas guardadas.","Fragmentos del redactor","Un fragmento por l\xEDnea. Respuestas y plantillas reutilizables que se insertan desde la barra del compositor.","Busca y administra publicaciones guardadas en este navegador.","Herramientas de publicaciones","Herramientas de escritura","Almacenamiento e informes","Acumula las publicaciones visibles en la p\xE1gina activa para la pr\xF3xima exportaci\xF3n.","Lista separada por comas. Admitidos: json, csv, html, markdown, xlsx.","Guarda tambi\xE9n las respuestas GraphQL sin procesar que X env\xEDa a esta pesta\xF1a, para poder reinterpretar los registros m\xE1s tarde. Los tokens de sesi\xF3n se eliminan antes de escribir nada.","Capturar bytes multimedia en la exportaci\xF3n","Descarga el contenido multimedia durante la exportaci\xF3n e incluye los bytes obtenidos con longitud y suma de comprobaci\xF3n; los elementos fallidos quedan como referencias reintentables.","Detectar autom\xE1ticamente los ID de consulta","Analiza los scripts cargados en busca de ID de operaciones GraphQL de X y los guarda localmente.","Incluir publicaciones protegidas en las exportaciones para compartir","Las publicaciones protegidas quedan fuera de HTML, Markdown, WARC, WACZ y del visor est\xE1tico hasta que lo habilites expl\xEDcitamente. JSON y CSV siguen siendo archiv\xEDsticos y conservan el campo de audiencia.","Incluir publicaciones con audiencia desconocida en las exportaciones para compartir","Las entradas solo del DOM, importadas y antiguas quedan fuera de las exportaciones para compartir hasta que lo habilites expl\xEDcitamente. JSON y CSV siguen siendo archiv\xEDsticos.","Sugerencia de carpeta de guardado","Nombre de carpeta (o ruta) usado como ra\xEDz del ZIP de exportaci\xF3n y prefijo de descarga.","{jobs} trabajos seguidos \xB7 {queries} IDs de GraphQL en cach\xE9","Estado de la exportaci\xF3n","Exportar publicaciones visibles","Recopila las publicaciones visibles y descarga un ZIP.","Copiar diagn\xF3stico","Copia el diagn\xF3stico de soporte (versi\xF3n, ruta, registro reciente).","Descarga un WARC sin procesar o un WACZ listo para reproducir. WACZ mantiene sin comprimir los elementos del archivo y del \xEDndice.","WACZ estimado: {size} para {records} registros.","Archivo de preservaci\xF3n","Acciones del archivo de preservaci\xF3n","WARC","WACZ","Cancelar","Abrir replayweb.page","Prueba WACZ solo de Aviary","Acciones de prueba WACZ solo de Aviary","Exportar par de claves","Copiar como Markdown","Copia una exportaci\xF3n en Markdown simple al portapapeles.","Guardar Markdown para Obsidian","Markdown con frontmatter YAML y etiquetas de Aviary.","Guardar Markdown para Notion","Markdown basado en encabezados que Notion importa sin problemas.","Guardar registros en JSON","JSON ExportRecord[] sin comprimir en ZIP.","Registros por ZIP","Divide una exportaci\xF3n larga en varios archivos en lugar de uno enorme (25-1000).","M\xE1ximo de trabajos de exportaci\xF3n","Conserva los trabajos m\xE1s recientes. Usa 0 para ilimitado.","M\xE1ximo de registros por trabajo","Conserva los registros m\xE1s recientes de cada trabajo. Usa 0 para ilimitado.","Antig\xFCedad m\xE1xima de exportaci\xF3n (d\xEDas)","Elimina los trabajos antiguos al iniciar. Usa 0 para desactivar la limpieza por antig\xFCedad.","Captura publicaciones de la p\xE1gina y descarga copias port\xE1tiles.","Captura","Paquete","Destino","Tareas","Preservaci\xF3n","Qu\xE9 eliminar","La actividad seleccionada se elimina en este orden: marcadores, Me gusta, republicaciones, respuestas, publicaciones.","Marcadores","Quita las publicaciones guardadas del historial de X.","Quita los Me gusta del historial de X.","Deshaz las republicaciones desde la pesta\xF1a Republicaciones.","Borra tus respuestas sin tocar las publicaciones originales.","Publicaciones","Borra tus publicaciones y publicaciones citadas.","Vista previa completa. No se cambi\xF3 ning\xFAn dato de la cuenta de X.","Las publicaciones y respuestas eliminadas no se pueden recuperar. Aviary no puede restaurar los Me gusta, republicaciones ni marcadores quitados.","Ejecutar","Opciones avanzadas","Cambia la velocidad de eliminaci\xF3n o pausa despu\xE9s de un n\xFAmero determinado de acciones.","Velocidad","A\xF1ade una espera aleatoria entre acciones y pausas m\xE1s largas despu\xE9s de cada lote.","Cauteloso","R\xE1pido","Acciones por lote","Pausa despu\xE9s de esta cantidad de coincidencias. Usa 0 para no poner l\xEDmite. Al reanudar empieza un lote nuevo.","Selecciona la actividad y pulsa Ejecutar. La eliminaci\xF3n comienza de inmediato.","El resumen est\xE1 esperando","Activa Atenuar publicaciones ya vistas en Filtros. El resumen solo usa filas que Aviary ya ha mostrado.","Qu\xE9 incluye","Todo lo que Aviary vio en el perfil activo del navegador. Las publicaciones filtradas conservan el motivo escrito por la regla activa.","Revisa publicaciones que Aviary ya vio sin pedir m\xE1s datos a X.","Los botones Ocultar siguen el ajuste anterior.","Ocultar publicaciones descartadas","Mantiene contra\xEDdas las publicaciones que ocultaste para que la siguiente suba al principio.","Mostrar botones de ocultar","A\xF1ade un control Ocultar a cada publicaci\xF3n, junto al men\xFA M\xE1s.","Estado de los botones Ocultar","Se activa cuando Ocultar publicaciones descartadas est\xE1 habilitado.","Rutas en las que se aplican el ocultado y el bot\xF3n Ocultar.","M\xE1ximo de publicaciones recordadas","Las entradas m\xE1s antiguas se descartan cuando el almac\xE9n supera este tama\xF1o (100-50000).","Publicaciones ocultas guardadas","Deshacer la \xFAltima ocultaci\xF3n","Restaura la publicaci\xF3n ocultada m\xE1s recientemente.","Restaurar","Borrar publicaciones ocultas","Olvida todas las publicaciones ocultas y las restaura.","Elige d\xF3nde siguen ocultas las publicaciones o vuelve a mostrarlas.","Cobertura","Retenci\xF3n","Recuperaci\xF3n","Pausar el v\xEDdeo que sale de la pantalla","Deja de decodificar el v\xEDdeo de la cronolog\xEDa cuando sale de la pantalla y lo reanuda al volver. Un v\xEDdeo que hayas pausado t\xFA permanece en pausa.","Seguir reproduciendo el v\xEDdeo al cambiar de pesta\xF1a","X detiene el v\xEDdeo en reproducci\xF3n cuando cambias de pesta\xF1a. Esto lo reanuda al volver. Un v\xEDdeo que pausaste t\xFA sigue en pausa.","Repetir los v\xEDdeos","Reinicia el v\xEDdeo al llegar al final en lugar de detenerlo.","Fijar las listas de reproducci\xF3n a su mejor versi\xF3n","Cuando X entrega a Aviary una lista con varias calidades, conserva solo la m\xE1s alta. Con una conexi\xF3n r\xE1pida, X suele quedarse por debajo de la mejor disponible. Consume m\xE1s datos y solo puede actuar sobre las listas que Aviary ve.","Pausa los v\xEDdeos cuando salen de la pantalla.","Reproducci\xF3n","{count} entradas \xB7 \xFAltimo {kind}: {latestCount} a las {at}","Instant\xE1neas guardadas","Capturar seguidores desde esta vista","Recorre las filas UserCell de la p\xE1gina actual. Abre primero una vista /usuario/followers.","Capturar seguidos desde esta vista","Recorre las filas UserCell de la p\xE1gina actual. Abre primero una vista /usuario/following.","Borrar todas las instant\xE1neas","Elimina todas las instant\xE1neas de seguidores y seguidos.","Importar el archivo oficial de X","Elige un ZIP exportado desde x.com. Se admiten entradas STORE y DEFLATE; el origen permanece local mientras se puede reanudar.","Buscar registros capturados","B\xFAsqueda de texto completo en la \xFAltima ejecuci\xF3n del recolector de exportaci\xF3n.","@usuario, palabra clave, frase\u2026","Escribe para buscar los registros capturados por las ejecuciones de exportaci\xF3n.","Descargar informe en Markdown","Registro de auditor\xEDa, comparaci\xF3n de instant\xE1neas y vista previa de limpieza.","{total} elementos \xB7 en cola {queued} \xB7 aprobados {approved} \xB7 omitidos {skipped}","Cola de revisi\xF3n de limpieza","Acciones destructivas","Aviary nunca elimina publicaciones, me gusta ni seguimientos. La cola es una lista de revisi\xF3n; aprobar u omitir solo escribe en el registro de auditor\xEDa.","A\xF1adir la vista previa de limpieza a la cola","A\xF1ade a la cola todos los candidatos no protegidos de la \xFAltima vista previa de limpieza (sin acciones destructivas).","Vaciar la cola de limpieza","Elimina todos los elementos de la cola sin tocar los datos de la cuenta.","Importa un archivo oficial de X o compara instant\xE1neas de seguidores.","Instant\xE1neas activas","Traspaso a Aria2","Env\xEDa las descargas grandes a un endpoint Aria2 JSON-RPC autoalojado.","Endpoint de Aria2","http://localhost:6800 (no hace falta barra final)","Secreto RPC de Aria2","Secreto compartido opcional para la autenticaci\xF3n token:.","Mostrar","Derivar archivos mayores de (MB)","Los archivos m\xE1s peque\xF1os se guardan con el navegador. Aviary comprueba primero el tama\xF1o; si el servidor no lo indica, el archivo se deriva igualmente.","Probar la conexi\xF3n con Aria2","Env\xEDa una llamada JSON-RPC trivial.","Descargas activas de Aria2","Actualiza para listar transferencias en curso; pulsa Cancelar para abortar una.","Actualizar","Entrega local a yt-dlp","Ofrece una descarga adaptativa de mayor calidad cuando hay un asistente local autenticado en marcha.","Punto de acceso del asistente yt-dlp","http://127.0.0.1:8787 (solo bucle local)","Secreto del asistente yt-dlp","El AVIARY_YTDLP_TOKEN compartido con el proceso local.","Publicaci\xF3n cruzada en Bluesky","Publica el texto del redactor en tu cuenta de Bluesky cuando lo pidas.","URL del servicio de Bluesky","Predeterminado: https://bsky.social","Cuenta de Bluesky","Tu cuenta (sin @, p. ej. tu.bsky.social)","Contrase\xF1a de aplicaci\xF3n de Bluesky","Contrase\xF1a de aplicaci\xF3n de los ajustes de tu cuenta. Nunca tu contrase\xF1a principal.","Publicaci\xF3n cruzada en Mastodon","Publica el texto del redactor en tu cuenta de Mastodon cuando lo pidas.","Instancia de Mastodon","https://mastodon.social","Token de acceso de Mastodon","Token Bearer con el \xE1mbito write:statuses.","Adjuntar la \xFAltima descarga","Adjunta la \xFAltima descarga correcta de Aviary a la primera publicaci\xF3n de una publicaci\xF3n cruzada expl\xEDcita.","Publicar como hilo","Divide en p\xE1rrafos vac\xEDos y responde a cada segmento del anterior.","Publicar el redactor en Bluesky","Usa el texto actual del redactor.","Publicar el redactor en Mastodon","Ejecuciones del proveedor de IA","Permite que el men\xFA de comandos de IA env\xEDe las indicaciones a tu proveedor.","Proveedor de IA","Anthropic Messages API","OpenAI Chat Completions","Compatible con OpenAI (LocalAI, proxy de Ollama, \u2026)","Endpoint de IA (opcional)","Sustituye el endpoint predeterminado del proveedor elegido.","Modelo de IA","p. ej. claude-sonnet-4-6, gpt-4o, llama3.1:8b","Clave de API de IA","Se guarda solo en local. Aviary nunca la env\xEDa salvo como cabecera de autenticaci\xF3n a tu proveedor.","Permitido","Estado de red","Destino de IA","Divulgaci\xF3n de datos de IA","Antes de enviar, Aviary muestra el proveedor, el endpoint, los campos, la estimaci\xF3n de caracteres/tokens, la retenci\xF3n y el estado del presupuesto.","Uso de IA hoy","M\xE1ximo de bytes por solicitud de IA","Det\xE9n el env\xEDo de solicitudes de IA cuyo cuerpo UTF-8 supere este tama\xF1o. Usa 0 para bloquear todas las solicitudes de IA.","Bytes diarios de solicitudes de IA","Det\xE9n las llamadas al proveedor de IA tras estos bytes UTF-8 de solicitud en el d\xEDa local. Usa 0 para bloquear todas las solicitudes de IA.","B\xFAsqueda sem\xE1ntica","Env\xEDa el texto de los registros capturados al endpoint de embeddings configurado para buscar similitudes. Aqu\xED se muestran el destino, los campos, la retenci\xF3n y el presupuesto de bytes.","Endpoint de incrustaciones","Endpoint POST que devuelve {data: [{embedding: number[]}]}","Modelo de incrustaciones","p. ej. text-embedding-3-small","Clave de API de incrustaciones","Se guarda en local; se usa solo como cabecera Authorization.","No configurado","Destino de embeddings","Divulgaci\xF3n de datos de embeddings","Una solicitud contiene el modelo y el texto del registro capturado. Los vectores y el texto limitado permanecen en el \xEDndice local de Aviary; la retenci\xF3n del proveedor sigue su pol\xEDtica.","Uso de embeddings hoy","M\xE1ximo de bytes por registro de embedding","Det\xE9n el env\xEDo de registros cuyo cuerpo UTF-8 supere este tama\xF1o. Usa 0 para bloquear todas las llamadas de incrustaci\xF3n.","Bytes diarios de registros de embeddings","Det\xE9n las llamadas de incrustaci\xF3n tras estos bytes UTF-8 de registro en el d\xEDa local. Usa 0 para bloquear todas las llamadas de incrustaci\xF3n.","Incrustar autom\xE1ticamente cada exportaci\xF3n","Antes de activar, revisa arriba el endpoint, los campos de los registros capturados, la retenci\xF3n local y el presupuesto diario de bytes. Despu\xE9s de cada exportaci\xF3n, genera embeddings en segundo plano. Est\xE1 desactivado de forma predeterminada.","Reconstruir el \xEDndice sem\xE1ntico","Genera embeddings de cada registro capturado. Repetirlo es barato porque se omiten las entradas en cach\xE9.","Similitud vectorial en los registros capturados. Los embeddings se ejecutan bajo demanda.","Describe lo que buscas\u2026","Borrar el \xEDndice sem\xE1ntico","Olvida todos los registros con embeddings.","Borrar uso de IA y embeddings","Olvida solo los contadores locales de solicitudes. No elimina el \xEDndice sem\xE1ntico ni las credenciales del proveedor.","activado","desactivado","configurado","falta el endpoint","faltan las credenciales","falta la clave o el modelo","indexados","{name}: {state} \xB7 {config}","{name}: {state} \xB7 {count} {indexed}","Estado de las integraciones","Errores recientes de integraci\xF3n","Se muestran desde el registro de auditor\xEDa; solo aparecen las llamadas de integraci\xF3n fallidas.","Configura servicios locales opcionales y proveedores de IA.","Inteligencia","Redactadas: las credenciales guardadas se conservar\xE1n.","Detener despu\xE9s de la colecci\xF3n actual y revertir lo que ya se haya escrito.","Valida la copia y muestra los mismos conflictos sin escribir ni eliminar datos locales.","Aplica las colecciones seleccionadas del perfil. Si falla una escritura, se revierten las colecciones ya cambiadas.","Las credenciales est\xE1n redactadas; se conservar\xE1n los valores ya guardados en este perfil.","Restablecer todas las preferencias","Restaura los valores predeterminados de Aviary: el modo sin anuncios permanece activado y los dem\xE1s controles visuales o de comportamiento vuelven a desactivarse. Se conservan las publicaciones, notas, marcadores y el historial de descargas.","Exportar ajustes","Descarga tus preferencias en JSON. Las claves de API y las contrase\xF1as se sustituyen por un marcador, as\xED que el archivo es seguro de compartir; al importarlo aqu\xED se conservan las credenciales ya guardadas en este equipo.","Importar ajustes (JSON)","Pega un archivo de ajustes exportado desde Aviary y pulsa Importar. Las credenciales ocultas conservan los valores ya guardados aqu\xED.","Importar","Exportar copia completa de la biblioteca","Descarga una copia de seguridad JSON versionada que abarca todos los perfiles de este equipo, no solo el que tienes abierto. Las credenciales se excluyen por defecto; al restaurar se conservan las credenciales ya guardadas aqu\xED.","Exportar copia con credenciales","La misma copia, adem\xE1s de las claves API y la identidad de firma WACZ guardadas en este navegador. Cualquiera que abra el archivo puede usarlas, as\xED que gu\xE1rdalo como una contrase\xF1a.","Elegir una copia de la biblioteca","Selecciona una copia JSON para revisar sus versiones, cantidades, conflictos y suma de comprobaci\xF3n antes de cambiar los datos locales.","Mantener un registro local de acciones","Registra descargas, exportaciones y cambios de ajustes en este dispositivo para que puedas revisar lo que hizo Aviary. No se env\xEDa nada a ning\xFAn sitio. Al desactivarlo se dejan de a\xF1adir entradas de inmediato; las existentes se conservan hasta que las borres.","Entradas de auditor\xEDa","Borrar el registro de auditor\xEDa","Elimina el registro local de acciones.","Crea una copia de seguridad de los datos locales, rest\xE1urala o restablece Aviary.","Preferencias","Copia de seguridad de la biblioteca","Historial de auditor\xEDa","Almacenamiento","Los ajustes se quedan en este navegador.","Seguridad del CSS personalizado","El CSS personalizado es local, est\xE1 limitado a la superficie indicada y nunca se env\xEDa con diagn\xF3sticos. Es un ajuste avanzado, por lo que soporte no puede reproducir sus efectos visuales.","Modo solo local","Bloquea todas las peticiones a las integraciones que hayas configurado: Aria2, publicaci\xF3n cruzada, peticiones de IA e incrustaciones. Guardar multimedia sigue descargando de los servidores de X, que es de donde la p\xE1gina ya la hab\xEDa cargado. Activado de forma predeterminada; activar una integraci\xF3n es lo que lo desactiva.","Rechazar las balizas de anal\xEDtica de X","Detiene los avisos de seguimiento que X env\xEDa cuando te desplazas, haces clic o pausas. Solo se rechazan los puntos de anal\xEDtica: el tr\xE1fico del cronograma, los medios y el inicio de sesi\xF3n no se tocan.","Supervisar el estado de los selectores","Comprueba la superficie actual de X en busca de anclas obligatorias y alternativas. Desact\xEDvalo si no quieres diagn\xF3sticos de selectores.","Conectado a la p\xE1gina","Acceso a la p\xE1gina","Balizas rechazadas","No se pudieron guardar algunos cambios; el almacenamiento del navegador podr\xEDa estar lleno.","Guardado","Telemetr\xEDa","Idioma del panel","Supervisi\xF3n activa","Estado de los selectores","Consulta qu\xE9 permanece local y comprueba si Aviary sigue funcionando con X.","L\xEDmite de privacidad","Integraciones de p\xE1gina","Datos locales","Compatibilidad","Cambios sin guardar","No se pudieron guardar los ajustes. Int\xE9ntalo de nuevo.","Guarda o revierte los cambios antes de salir de esta secci\xF3n.","Guardando...","No se pudo guardar ese cambio. Vuelve a hacerlo y gu\xE1rdalo.","Corrige los valores no v\xE1lidos antes de guardar.","Diagn\xF3stico copiado al portapapeles.","El estado de eliminaci\xF3n se ha actualizado.","El comando de eliminaci\xF3n fall\xF3.","Modo solo local activado.","Modo solo local desactivado.","Balizas de anal\xEDtica rechazadas.","Balizas de anal\xEDtica permitidas.","Supervisi\xF3n del estado de selectores activada.","Supervisi\xF3n del estado de selectores desactivada.","Observaci\xF3n estructural copiada al portapapeles.","No se pudo copiar la observaci\xF3n estructural.","M\xE9tricas de rendimiento restablecidas.","No se pudieron restablecer las m\xE9tricas de rendimiento.","Avisos guardados borrados.","No se pudieron borrar los avisos guardados.","Observaciones de anuncios restablecidas.","No se pudieron restablecer las observaciones de anuncios.","Perfil cambiado. Recargando\u2026","No se pudo cambiar el perfil.","Se asignaron {moved} almacenes; {completedAfterRetry} se completaron tras reintentar; {skipped} ya exist\xEDan; {conflicted} entraron en conflicto; {failed} fallaron.","Perfil creado. Recargando\u2026","No se pudo crear el perfil.","Respuesta registrada.","Todas las funciones est\xE1n desactivadas. \xBFLa p\xE1gina sigue mal?","B\xFAsqueda de funciones borrada.","B\xFAsqueda de funciones detenida; todas las funciones est\xE1n activas de nuevo.","Transferencia a Aria2 activada.","Transferencia a Aria2 desactivada.","Endpoint de Aria2 guardado.","Secreto de Aria2 guardado.","Umbral de Aria2 guardado.","Aria2 accesible.","Aria2 no est\xE1 disponible: {error}","Fall\xF3 la prueba de conexi\xF3n con Aria2.","Se cancel\xF3 {gid}.","Fall\xF3 la cancelaci\xF3n de Aria2: {error}","Fall\xF3 la cancelaci\xF3n de Aria2.","Error al consultar Aria2.","Entrega a yt-dlp activada.","Entrega a yt-dlp desactivada.","Punto de acceso del asistente yt-dlp guardado.","Secreto del asistente yt-dlp guardado.","Bluesky activado.","Bluesky desactivado.","Servicio de Bluesky guardado.","Usuario de Bluesky guardado.","Contrase\xF1a de aplicaci\xF3n de Bluesky guardada.","Mastodon activado.","Mastodon desactivado.","Instancia de Mastodon guardada.","Token de Mastodon guardado.","Adjunto de publicaci\xF3n cruzada activado.","Adjunto de publicaci\xF3n cruzada desactivado.","Se publicaron {posts} en Bluesky.{url}","Fall\xF3 Bluesky: {error}","Fall\xF3 la publicaci\xF3n cruzada en Bluesky.","Se publicaron {posts} en Mastodon.{url}","Fall\xF3 Mastodon: {error}","Fall\xF3 la publicaci\xF3n cruzada en Mastodon.","Ejecuciones de IA activadas.","Ejecuciones de IA desactivadas.","Endpoint de IA guardado.","Modelo de IA guardado.","Clave de API de IA guardada.","Presupuesto de solicitudes de IA guardado.","Presupuesto diario de IA guardado.","B\xFAsqueda sem\xE1ntica activada.","B\xFAsqueda sem\xE1ntica desactivada.","Endpoint de embeddings guardado.","Modelo de embeddings guardado.","Clave de API de embeddings guardada.","Presupuesto de solicitudes de embeddings guardado.","Presupuesto diario de embeddings guardado.","Incrustaci\xF3n autom\xE1tica activada.","Incrustaci\xF3n autom\xE1tica desactivada.","Reconstruyendo el \xEDndice sem\xE1ntico\u2026","Los embeddings se detuvieron por el presupuesto ({blocked} registros no se enviaron).","Indexados: +{added} nuevos \xB7 omitidos {skipped} \xB7 errores {errors} \xB7 total {total}{trimmed}.","Fallaron los embeddings.","\xCDndice sem\xE1ntico borrado.","No se pudo borrar el \xEDndice sem\xE1ntico.","Uso de IA y embeddings borrado.","No se pudo borrar el uso de IA y embeddings.","Preferencias restablecidas. El modo sin anuncios est\xE1 activado.","No se pudieron restablecer los ajustes.","Ajustes exportados.","No se pudieron exportar los ajustes.","Ajustes importados. {warning}","Fall\xF3 la importaci\xF3n: {errors}","No se pudieron importar los ajustes.","Copia de la biblioteca descargada: {filename} ({collections} colecciones, {bytes}).","No se pudo exportar la copia completa de la biblioteca.","Copia con credenciales descargada: {filename} ({collections} colecciones, {bytes}).","Leyendo la copia de la biblioteca\u2026","Copia cargada: {collections} colecciones, {conflicts} cambios.","No se pudo leer la copia de la biblioteca.","Cancelando la restauraci\xF3n\u2026","Simulaci\xF3n completada. No se cambiaron los datos locales.","La simulaci\xF3n fall\xF3: {errors}","No se pudo simular la restauraci\xF3n de la biblioteca.","Copia de la biblioteca restaurada ({collections} colecciones). Recargando\u2026","Restauraci\xF3n cancelada; los datos locales se revirtieron.","Restauraci\xF3n cancelada.","La restauraci\xF3n fall\xF3: {errors}","No se pudo restaurar la copia de la biblioteca.","Registro de acciones activado.","Registro de acciones desactivado.","Registro de auditor\xEDa borrado.","No se pudo borrar el registro de auditor\xEDa.","Se capturaron {count} seguidores de @{handle}. La lista hab\xEDa terminado de cargarse, as\xED que est\xE1n todos.","Se capturaron {count} seguidores de @{handle}. La lista a\xFAn se estaba cargando, as\xED que esto es solo lo que hab\xEDa en pantalla. Despl\xE1zate hasta el final y captura de nuevo para obtener la lista completa.","No se encontraron filas UserCell.","La instant\xE1nea fall\xF3.","Se capturaron {count} cuentas seguidas de @{handle}. La lista hab\xEDa terminado de cargarse, as\xED que est\xE1n todas.","Se capturaron {count} cuentas seguidas de @{handle}. La lista a\xFAn se estaba cargando, as\xED que esto es solo lo que hab\xEDa en pantalla. Despl\xE1zate hasta el final y captura de nuevo para obtener la lista completa.","Instant\xE1neas borradas.","No se pudieron borrar las instant\xE1neas.","Importaci\xF3n del archivo pausada.","Importaci\xF3n del archivo reanudada.","Importaci\xF3n del archivo cancelada.","Se inici\xF3 el reintento de importaci\xF3n del archivo.","Leyendo el archivo: los ficheros grandes tardan un momento\u2026","Se ley\xF3 un archivo {layout}. Se importaron {records} registros. Reparaciones: {archiveLinks} enlaces del archivo, {corpusLinks} enlaces capturados, {participants} identificadores de participantes resueltos, {unresolved} sin resolver. Avisos: {warnings}; errores: {errors}. Ficheros: {recognized} reconocidos, {skipped} omitidos, {malformed} con formato incorrecto.{absent}","Error al importar el archivo.","Generando el informe\u2026","Informe descargado.","No se pudo generar el informe.","Generando la vista previa de limpieza\u2026","Se a\xF1adieron {added} elementos ({protected} protegidos omitidos).","No se pudo encolar la limpieza.","Cola de limpieza vaciada.","No se pudo vaciar la cola.","Aviso de l\xEDmite de almacenamiento desactivado.","Aviso de l\xEDmite de almacenamiento guardado.","Las im\xE1genes capturadas conservan su tama\xF1o original.","Las im\xE1genes capturadas se reducir\xE1n de tama\xF1o.","Los v\xEDdeos se capturar\xE1n como fotograma de portada.","Los v\xEDdeos se capturar\xE1n completos.","Leyendo el informe Bajo el cap\xF3\u2026","No se pudo leer el informe Bajo el cap\xF3.","No se pudieron exportar los informes Bajo el cap\xF3.","Descargando {count} archivos seleccionados.","No se pudo descargar el contenido multimedia capturado.","La b\xFAsqueda en la biblioteca fall\xF3. Revisa el endpoint y la clave de embeddings en Integraciones.","Marcador actualizado.","No se pudo actualizar el marcador.","Marcador eliminado.","El marcador ya se hab\xEDa eliminado.","No se pudo eliminar el marcador.","Marcadores exportados: {records} registros en {files} archivos.","No se pudieron exportar los marcadores.","Marcadores borrados.","No se pudieron borrar los marcadores.","Bot\xF3n de IA activado.","Bot\xF3n de IA desactivado.","Expansi\xF3n de enlaces activada.","Expansi\xF3n de enlaces desactivada.","Limpieza de enlaces activada.","Limpieza de enlaces desactivada.","Control de copiar enlace desactivado.","Control de copiar enlace activado.","Colores de cuentas guardados.","Notas de cuentas borradas.","No se pudieron borrar las notas.","Captura para exportaci\xF3n activada.","Captura para exportaci\xF3n desactivada.","Preferencia de payloads sin procesar guardada.","Captura de bytes multimedia activada.","Captura de bytes multimedia desactivada.","Preferencia de descubrimiento de consultas guardada.","Compartir publicaciones protegidas activado.","Publicaciones protegidas excluidas de las exportaciones para compartir.","Compartir publicaciones de audiencia desconocida activado.","Publicaciones de audiencia desconocida excluidas de las exportaciones para compartir.","Carpeta de guardado guardada.","Trabajo de exportaci\xF3n pausado.","Trabajo de exportaci\xF3n reanudado.","Trabajo de exportaci\xF3n cancelado.","Recopilando las publicaciones visibles\u2026","No se encontraron publicaciones en esta vista. Desplaza la cronolog\xEDa para cargar algunas y vuelve a exportar.","Se exportaron {records} registros en {files} ZIP \xB7 {filename}","Se export\xF3 {records} registro \xB7 {filename}","Se exportaron {records} registros \xB7 {filename}","La exportaci\xF3n fall\xF3. Consulta el diagn\xF3stico.","A\xFAn no hay publicaciones capturadas con datos de hilo.","Lector de hilos capturados exportado.","No se pudieron reconstruir los hilos. Consulta los diagn\xF3sticos.","No se pudo copiar el diagn\xF3stico.","Se copiaron {records} registros al portapapeles.","Se exportaron {records} registros a {target}.","La exportaci\xF3n externa fall\xF3.","Registros por ZIP guardados.","Retenci\xF3n de trabajos guardada.","Retenci\xF3n de registros guardada.","Retenci\xF3n por antig\xFCedad guardada.","WARC descargado ({records} registros).","Error en la exportaci\xF3n WARC.","WACZ descargado ({records} registros, {size}).","La exportaci\xF3n WACZ fall\xF3. Libera espacio en disco o exporta menos registros y vuelve a intentarlo.","Identidad de firma reemplazada.","No se pudo reemplazar la identidad de firma.","Prueba WACZ solo de Aviary descargada ({records} registros, {size}).","La exportaci\xF3n de la prueba WACZ solo de Aviary fall\xF3.","Par de claves de firma descargado: {filename}.","Fall\xF3 la exportaci\xF3n del par de claves de firma.","Botones de medios activados.","Botones de medios desactivados.","Copia de enlaces multimedia activada.","Copia de enlaces multimedia desactivada.","Preferencia de calidad original guardada.","Im\xE1genes a tama\xF1o completo activadas.","Im\xE1genes a tama\xF1o completo desactivadas.","Disposici\xF3n multimedia guardada.","Plantilla de nombre de archivo guardada.","Preferencia del archivo complementario guardada.","Detecci\xF3n visual de duplicados activada.","Detecci\xF3n visual de duplicados desactivada.","Historial de duplicados activado.","Historial de duplicados desactivado.","L\xEDmite de descargas simult\xE1neas guardado.","Ritmo de descarga guardado.","Descargando el contenido de esta vista\u2026","La descarga por lotes fall\xF3.","Historial borrado.","No se pudo borrar el historial.","Historial exportado: {records} registros en {files} archivos.","No se pudo exportar el historial de descargas.","Medios capturados: {downloaded} guardados / {duplicate} duplicados / {failed} fallidos.","No hay trabajos de medios fallidos para reintentar.","Ajuste predefinido aplicado: {preset} ({changes})","El ajuste predefinido ya estaba aplicado: {preset}","No se pudo aplicar el ajuste predefinido.","Ese tema no es compatible.","Tema actualizado.","Densidad actualizada.","Ancho de la cronolog\xEDa actualizado.","Fuente Chirp activada.","Fuente Chirp desactivada.","Contadores de interacci\xF3n ocultos.","Contadores de interacci\xF3n visibles.","Preferencia de recuentos guardada.","Contador de la pesta\xF1a oculto.","Contador de la pesta\xF1a visible.","Marcas de tiempo absolutas activadas.","Marcas de tiempo absolutas desactivadas.","Icono de pesta\xF1a de Aviary activado.","Icono de pesta\xF1a de X restaurado.","Bordes de fila ocultos.","Bordes de fila restaurados.","Preferencia de contraste guardada.","Preferencia de movimiento guardada.","Modo sin anuncios activado.","Modo sin anuncios desactivado.","Registro de anuncios rechazado.","Registro de anuncios permitido.","Preferencia de barra lateral guardada.","Preferencia de tendencias guardada.","Preferencia de dise\xF1o guardada.","Preferencia de Grok guardada.","Preferencia de desplazamiento guardada.","Modo concentraci\xF3n activado.","Modo concentraci\xF3n desactivado.","Horario de lectura guardado.","La l\xEDnea temporal se desplaza sin detenerse.","Las publicaciones largas se expanden autom\xE1ticamente.","Las publicaciones largas permanecen contra\xEDdas.","Al volver se restaura tu posici\xF3n.","Al volver se usa la posici\xF3n de X.","Marcador de lectura activado.","Marcador de lectura desactivado.","Superficies del marcador guardadas.","Modo escritura activado.","Modo escritura desactivado.","Cronolog\xEDa Siguiendo activada.","Cronolog\xEDa Siguiendo desactivada.","Pesta\xF1a Para ti oculta.","Pesta\xF1a Para ti restaurada.","Las publicaciones se abren desde el icono de responder.","Las publicaciones vuelven a abrirse desde la fila.","Visibilidad de navegaci\xF3n guardada.","V\xEDdeo fuera de pantalla en pausa.","V\xEDdeo fuera de pantalla sigue reproduci\xE9ndose.","El v\xEDdeo sigue reproduci\xE9ndose.","El v\xEDdeo se pausa con la pesta\xF1a.","Repetici\xF3n de v\xEDdeo activada.","Repetici\xF3n de v\xEDdeo desactivada.","Fijaci\xF3n de listas activada.","Fijaci\xF3n de listas desactivada.","Filtros activados.","Filtros desactivados.","Atenuaci\xF3n de publicaciones vistas activada.","Atenuaci\xF3n de publicaciones vistas desactivada.","Superficies de publicaciones vistas guardadas.","Se olvidaron las publicaciones vistas.","No se pudieron borrar las publicaciones vistas.","Reglas de filtrado guardadas.","Se renov\xF3 {count} regla.","Se renovaron {count} reglas.","No se pudieron renovar las reglas caducadas.","Filtro Premium guardado.","Filtro de citas guardado.","Respuestas con medios ocultas.","Respuestas con medios visibles de nuevo.","Ajuste del motivo del filtro guardado.","Filtro de interacci\xF3n guardado.","M\xE9trica de interacci\xF3n guardada.","Filtros desactivados en todas las rutas.","Conjunto de reglas exportado: {filename} ({count} l\xEDneas).","No se pudo exportar el conjunto de reglas.","El conjunto de reglas necesita revisi\xF3n.","La vista previa del conjunto de reglas est\xE1 lista.","No se pudo previsualizar el conjunto de reglas.","Se a\xF1adieron {count} reglas.","Se reemplaz\xF3 el conjunto por {count} reglas.","No se pudo importar el conjunto de reglas.","Publicaciones ocultas aplicadas.","Publicaciones ocultas mostradas.","Botones de ocultar activados.","Botones de ocultar desactivados.","Ocultaci\xF3n desactivada en todas las rutas.","No queda nada por restaurar.","No se pudo deshacer la \xFAltima ocultaci\xF3n.","Publicaci\xF3n restaurada.","Esa publicaci\xF3n ya se hab\xEDa restaurado.","No se pudo restaurar la publicaci\xF3n.","Se elimin\xF3 {removed} publicaci\xF3n oculta.","Se eliminaron {removed} publicaciones ocultas.","No se pudieron borrar las publicaciones ocultas.","No se pudieron asignar los datos heredados. No se movi\xF3 nada, as\xED que siguen donde estaban. Vuelve a abrir esta p\xE1gina para intentarlo de nuevo.","La b\xFAsqueda de funciones no pudo iniciarse.","La b\xFAsqueda de funciones no pudo borrarse.","La b\xFAsqueda no pudo registrar esa respuesta. Sigue donde estaba, as\xED que pulsa el mismo bot\xF3n otra vez.","La b\xFAsqueda de funciones no pudo detenerse.","No se pudo cancelar la restauraci\xF3n. Se detendr\xE1 por s\xED sola al terminar la colecci\xF3n actual.","No se pudo pausar la importaci\xF3n. Puede que ya haya terminado. Vuelve a abrir esta secci\xF3n para ver hasta d\xF3nde lleg\xF3.","No se pudo reanudar la importaci\xF3n. Puede que su origen guardado se haya borrado. Rein\xEDciala para empezar de nuevo desde el archivo.","No se pudo cancelar la importaci\xF3n. Puede que ya haya terminado. Vuelve a abrir esta secci\xF3n para ver hasta d\xF3nde lleg\xF3.","No se pudo reintentar la importaci\xF3n. Elige de nuevo el archivo para empezar una importaci\xF3n nueva.","No se pudo pausar la tarea de exportaci\xF3n. Puede que ya haya terminado. Vuelve a abrir esta secci\xF3n para ver su estado actual.","No se pudo reanudar la tarea de exportaci\xF3n. Puede que su punto de control se haya borrado. Inicia una exportaci\xF3n nueva.","No se pudo cancelar la tarea de exportaci\xF3n. Puede que ya haya terminado. Vuelve a abrir esta secci\xF3n para ver su estado actual.","Ese lote no pudo ejecutarse. Concede acceso de descarga en la p\xE1gina de permisos de Aviary y vuelve a intentarlo.","El lote no acept\xF3 esa instrucci\xF3n. Puede que ya haya terminado. Vuelve a abrir esta secci\xF3n para ver su estado actual.","No se pudieron reanudar las descargas en cola. Concede acceso de descarga en la p\xE1gina de permisos de Aviary y vuelve a intentarlo.","No se pudieron reintentar las descargas fallidas. Concede acceso de descarga en la p\xE1gina de permisos de Aviary y vuelve a intentarlo.","No se pudo abrir el resumen. No se ha perdido nada, as\xED que recarga la p\xE1gina y vuelve a intentarlo.","Nada coincide con esa b\xFAsqueda.","Prueba con una palabra m\xE1s corta o elige una secci\xF3n a la izquierda.","Conservado: el navegador no borrar\xE1 esta biblioteca para recuperar espacio.","Mejor esfuerzo: el navegador puede borrar esta biblioteca cuando quede poco espacio. Conserva una copia.","El navegador no indic\xF3 si conservar\xE1 esta biblioteca. Conserva una copia.","Este gestor de userscripts no da a Aviary acceso a la propia p\xE1gina.","Este navegador no carg\xF3 el script de p\xE1gina de Aviary.","El script de p\xE1gina de Aviary est\xE1 cargado, pero algo respondi\xF3 antes que \xE9l, probablemente otra extensi\xF3n. En esta p\xE1gina la protecci\xF3n de anuncios a nivel de red no est\xE1 bajo el control de Aviary.","No disponible en este navegador.","Coincidencias de selectores","Superficies obligatorias ausentes","Superficies opcionales ausentes","Selectores alternativos en uso","Funciones afectadas","\xDAltima transici\xF3n de selectores","Observaciones de anuncios","Recuentos de marcadores de anuncios","Desviaci\xF3n del contrato de anuncios","Observaciones de anuncios conservadas","Nativo","Tendencia","Promoci\xF3n propia","V\xEDdeo","Inicia sesi\xF3n en X antes de ejecutar.","Selecciona al menos un tipo de actividad para activar Ejecutar.","Iniciando eliminaci\xF3n\u2026","Long Animation Frame no disponible","A\xFAn no hay muestras de aplicaci\xF3n","error","errores","La p\xE1gina segu\xEDa mal con todas las funciones de Aviary desactivadas, as\xED que nada de lo que hace Aviary lo est\xE1 causando. Otra extensi\xF3n, un userscript o la propia X es el siguiente lugar donde mirar.","No hab\xEDa ninguna funci\xF3n de Aviary en marcha, as\xED que no hab\xEDa nada que buscar.","No hay descargas activas.","Bloqueado por el modo solo local","bloqueado (presupuesto en 0)","No hay coincidencias (o la integraci\xF3n est\xE1 desactivada).","Abre la lista de seguidores o seguidos de un perfil y usa \xABCapturar instant\xE1nea\xBB para registrarla.","No existe en este formato:","No hay registros capturados que coincidan con \xAB{query}\xBB.","Bajo el cap\xF3 de X","Lee localmente el resumen mensual de visibilidad de X. Muestra etiquetas agregadas, no los pesos de producci\xF3n ni una auditor\xEDa completa de publicaciones.","Importar JSON de Bajo el cap\xF3 de X","Informe Bajo el cap\xF3 guardado localmente.","No se informaron etiquetas de visibilidad este mes.","Todav\xEDa no se ha importado un informe de X.","Importa otro mes para comparar informes.","Descargar lo seleccionado","{selected} de {total} archivos seleccionados. {unavailable} no se pueden descargar.","Tipo de medio","Todos los tipos","Seleccionar todo","No disponible.","Esta b\xFAsqueda contiene m\xE1s de {limit} archivos descargables. Ac\xF3tala primero.","Ninguna colecci\xF3n local coincide con esta b\xFAsqueda.","Coincidencia de texto y sem\xE1ntica","Coincidencia sem\xE1ntica","Coincidencia de texto","(sin texto)","Buscar marcadores locales","Busca publicaciones guardadas por texto, usuario, etiquetas, carpeta o ID. Los marcadores capturados solo incluyen publicaciones que X envi\xF3 mientras pasabas por ellas.","Buscar marcadores locales","A\xFAn no has guardado nada. Usa \xABGuardar localmente\xBB en cualquier publicaci\xF3n para conservar una copia aqu\xED.","Ning\xFAn marcador local coincide con esta b\xFAsqueda.","Notas","Notas del marcador","Eliminar","A\xF1ade una abajo con el formato usuario: nota. Las notas aparecen junto a las publicaciones de esa cuenta.","Activa la captura, despl\xE1zate por una cronolog\xEDa y luego exporta. Los trabajos y sus registros aparecer\xE1n aqu\xED.","Generando el archivo WARC\u2026","Creando archivo WACZ\u2026","El par de claves guardado no es v\xE1lido. Reempl\xE1zalo antes de firmar otro archivo.","El primer uso crea una identidad P-384 local. La firma permanece desactivada en las descargas WACZ normales.","Creando una identidad de firma nueva\u2026","Creando una prueba WACZ exclusiva de Aviary\u2026","Preparando el par de claves de firma\u2026","Exportar historial de descargas","Exporta los registros locales de duplicados como JSON y CSV para un intervalo de fechas. Nunca se incluyen las URL de los medios.","Fecha inicial del historial","Fecha final del historial","Exportar intervalo","Descargar audio capturado","Descarga las pistas de audio que ya est\xE1n en las capturas locales. No se solicita metadata nueva.","Descargar subt\xEDtulos capturados","Descarga las pistas de subt\xEDtulos que ya est\xE1n en las capturas locales. No se solicita metadata nueva.","l\xEDnea","Ya no se detectan marcadores observados anteriormente: {markers}.","Listo para ejecutar en @{handle}.","{feature}: {count} ejecuciones \xB7 {total} ms total \xB7 {max} ms m\xE1ximo \xB7 {full} completas / {incremental} incrementales","{observed} fotogramas largos \xB7 {correlated} correlacionados","{count} funciones","X est\xE1 en {language}, un idioma para el que Aviary no tiene etiquetas de anuncios. Aqu\xED las publicaciones patrocinadas no se ocultan por etiqueta.","{feature} es lo que cambi\xF3 esta p\xE1gina. Hicieron falta {rounds} rondas para encontrarlo. Todas las funciones vuelven a estar activas, as\xED que desactiva esa con su propio ajuste si quieres que siga desactivada.","Ronda {round} de {total}. Las {off} funciones est\xE1n desactivadas.","Ronda {round} de {total}. {off} de las {suspect} funciones a\xFAn sospechosas est\xE1n desactivadas.","ID {gid} \xB7 {status}","{count} entradas","{posts} publicaciones \xB7 {likes} me gusta \xB7 {messages} mensajes directos (fuera de la b\xFAsqueda p\xFAblica) \xB7 {media} referencias multimedia \xB7 {followers} seguidores \xB7 {following} seguidos \xB7 {lists} listas","{archiveLinks} enlaces del archivo + {corpusLinks} enlaces capturados ampliados \xB7 {participants} ID de participantes resueltos \xB7 {unresolved} conservados como ID sin resolver \xB7 no se realizaron solicitudes","{status} \xB7 {filename} \xB7 {records} registros \xB7 {files} archivos \xB7 {warnings} advertencias","{saved} guardados \xB7 {mirrored} reflejados \xB7 {due} pendientes \xB7 {tags} etiquetas \xB7 {folders} carpetas","{public} p\xFAblicas \xB7 {protected} protegidas \xB7 {unknown} desconocidas \xB7 {excluded} excluidas de las exportaciones para compartir","{status} \xB7 {records} registros \xB7 {surface}","Identidad local {fingerprint}. Demuestra la continuidad de esta clave, no lo que sirvi\xF3 X.","{count} en esta sesi\xF3n","Se encontraron {imported} reglas. Reemplazar est\xE1 listo. A\xF1adir est\xE1 bloqueado en la l\xEDnea {line}: {error}","Se encontraron {imported} reglas. A\xF1adir\xEDa {added}; {duplicates} ya est\xE1n presentes. Reemplazar\xEDa {replaced} por {total}.","Olvida los avisos y errores almacenados. Aqu\xED solo se escriben el texto de los mensajes de Aviary, la hora y los nombres de sus campos de detalle.","Borra el historial local limitado de marcadores y su aviso de desviaci\xF3n. Aqu\xED no se almacenan textos de publicaciones, nombres de usuario, URL ni cuerpos de respuesta.","Desactiva todas las funciones de Aviary y las vuelve a activar por mitades, preguntando despu\xE9s de cada ronda si la p\xE1gina sigue mal. Nombra a la responsable en unas cinco rondas. No se escribe nada en tus ajustes, as\xED que recargar lo restaura todo hagas lo que hagas, incluso si te detienes a medias. El Centro de control y su idioma siguen activos todo el tiempo, as\xED que ninguno puede ser se\xF1alado.","Empieza de nuevo con todas las funciones desactivadas.","Guarda la b\xFAsqueda. No cambia nada; todas las funciones ya est\xE1n activas.","El problema sigue con estas funciones desactivadas, as\xED que es una de las otras.","El problema desapareci\xF3 con estas funciones desactivadas, as\xED que es una de ellas.","Vuelve a activar todas las funciones y olvida la b\xFAsqueda. No se registra ninguna respuesta.","Pausar {filename}.","Reanudar {filename}.","Cancelar {filename}.","Reintentar {filename}.","Pausar {jobId}.","Reanudar {jobId}.","Cancelar {jobId}.","Copiar observaci\xF3n estructural","Rendimiento de mutaciones","Restablecer m\xE9tricas de rendimiento","Etiquetas de anuncios para este idioma","Avisos guardados","Borrar avisos guardados","Restablecer observaciones de anuncios","Perfil activo","Cambiar perfil","Asignar aqu\xED datos heredados","Nuevo perfil","Encontrar la funci\xF3n que rompe esta p\xE1gina","B\xFAsqueda de funciones","Buscar de nuevo","Borrar el resultado","A\xFAn sospechosas","La p\xE1gina sigue mal","La p\xE1gina se ve bien ahora","Detener la b\xFAsqueda","Versi\xF3n de la copia","Colecciones de la copia","Cambios en las colecciones","Credenciales","Advertencias de la copia","Cancelar restauraci\xF3n","Simular restauraci\xF3n","Restaurar esta copia de la biblioteca","A\xFAn no hay instant\xE1neas","Colecciones importadas","Reparaciones locales del archivo","Importaci\xF3n de archivo","Pausar importaci\xF3n del archivo","Reanudar importaci\xF3n del archivo","Cancelar importaci\xF3n del archivo","Reintentar importaci\xF3n del archivo","\xDAltimo informe Bajo el cap\xF3","Etiquetas del \xFAltimo informe","Informes Bajo el cap\xF3","Comparaci\xF3n mensual","Exportar informes Bajo el cap\xF3 guardados","Marcadores locales","Exportar marcadores locales","Exportar para gestores de marcadores","Borrar marcadores locales","A\xFAn no hay notas de cuentas","Cobertura de audiencia","A\xFAn no hay trabajos de exportaci\xF3n","Trabajo de exportaci\xF3n","Pausar trabajo de exportaci\xF3n","Reanudar trabajo de exportaci\xF3n","Cancelar trabajo de exportaci\xF3n","Reconstruir hilos capturados","Lote multimedia activo","Coincidencias duplicadas","Comprobantes de calidad","\xDAltima coincidencia duplicada","Borrar historial de descargas","Reanudar medios en cola","Reintentar medios fallidos","Listas reescritas","Olvidar las publicaciones vistas","Reglas que no se pudieron leer","Reglas caducadas","Renovar las reglas caducadas","Publicaciones disponibles","Abrir resumen","Pausar","Reanudar","Detener","Reemplazar par de claves","Correcto: se han guardado todos los cambios.","Copia c\xF3mo construye X esta p\xE1gina (recuentos de elementos, anidamiento y dise\xF1o) para actualizar los datos de prueba de Aviary. Sin texto de publicaciones, nombres, usuarios, enlaces ni identificadores.","El tiempo de mutaci\xF3n permanece local y solo guarda identificadores de funciones y duraciones acotadas.","Mueve al perfil activo los ajustes y almacenes de biblioteca anteriores a los perfiles que no est\xE9n asignados. No se deduce nada de la ruta actual de X.","Crea un perfil sin conexi\xF3n vac\xEDo antes de cambiar de cuenta o importar otro archivo.","No hay ninguno registrado.","Midiendo\u2026","Este almac\xE9n del navegador no se puede medir desde aqu\xED, as\xED que Aviary no indica su tama\xF1o.","Este navegador no desglosa su informe de almacenamiento por tipo, as\xED que solo se muestra la medici\xF3n propia de Aviary.","Descarga los informes normalizados como JSON local. Son datos del usuario procedentes de X; Aviary no a\xF1ade pesos de ranking ni calcula una puntuaci\xF3n.","Descarga JSON y CSV de cada marcador de este perfil. El espejo solo conserva lo que X envi\xF3 a la p\xE1gina mientras pasabas por ello.","Descarga un archivo de marcadores de navegador que importan Karakeep, Linkwarden, linkding y cualquier navegador, adem\xE1s del CSV que importa Raindrop.io.","Elimina todos los marcadores locales guardados.","Lee las respuestas capturadas en orden, desde el mensaje principal. Los mensajes principales ausentes quedan visibles como huecos locales.","Reinicia el \xEDndice local de duplicados.","Recupera las descargas pausadas o en cola de una sesi\xF3n anterior.","Reintenta todas las tareas de medios fallidas o canceladas de la cola persistente.","Los paquetes predefinidos no est\xE1n disponibles en esta compilaci\xF3n.","Borra los ID de publicaciones guardados para que todo vuelva a figurar como no visto.","Reinicia desde ahora el periodo propio de cada regla caducada. Al caducar no se borra nada, as\xED que siempre se puede recuperar una regla.","Revisa un intervalo, filtra por tipo, agrupa por autor y abre la publicaci\xF3n original. No se realizan solicitudes.","El almac\xE9n de publicaciones ocultas no est\xE1 disponible en esta compilaci\xF3n.","Listo.","Eliminaci\xF3n completa.","Se alcanz\xF3 el l\xEDmite de acciones. Reanuda para ejecutar otro lote.","Eliminaci\xF3n en pausa.","Eliminaci\xF3n detenida.","La vista previa est\xE1 en curso.","La eliminaci\xF3n est\xE1 en curso.","La cuenta con la sesi\xF3n iniciada cambi\xF3. No se realizaron m\xE1s acciones.","Otra pesta\xF1a de X ya est\xE1 ejecutando esta eliminaci\xF3n.","Esta pesta\xF1a ya est\xE1 ejecutando una eliminaci\xF3n.","X mostr\xF3 un desaf\xEDo de inicio de sesi\xF3n o antiabuso. Compl\xE9talo y luego reanuda.","Selecciona al menos una categor\xEDa de la cuenta.","No hay ninguna eliminaci\xF3n en curso para pausar.","No hay ninguna eliminaci\xF3n en pausa para reanudar.","No hay ninguna eliminaci\xF3n para detener.","Eliminar actividad de X todav\xEDa se est\xE1 cargando.","Reanuda esta eliminaci\xF3n desde la pesta\xF1a de X que la inici\xF3.","X no aplic\xF3 la acci\xF3n tras cinco recargas autom\xE1ticas de la p\xE1gina. Reanuda para intentarlo de nuevo.","Un error inesperado detuvo la eliminaci\xF3n.","No se pudo completar el comando de eliminaci\xF3n.","Limpieza de la cuenta en pausa.","Limpieza de la cuenta detenida.","Registro de limpieza de la cuenta borrado.","Esta limpieza pas\xF3 a otra pesta\xF1a de X.","Abriendo {category}.","Previsualizando {category}.","Limpiando {category}.","Las pasadas de limpieza seleccionadas han terminado.","Cargando m\xE1s elementos de {categoryLower}.","Se cargaron {count} elementos m\xE1s de {categoryLower}.","X todav\xEDa est\xE1 cargando elementos anteriores de {categoryLower}.","Buscando m\xE1s elementos de {categoryLower} ({checks}/{limit}).","{category}: {count} encontrados.","{category}: {count} eliminados.","Descansando {seconds} segundos despu\xE9s de {count} acciones. La eliminaci\xF3n contin\xFAa autom\xE1ticamente.","Continuando con {category}.","Se omiti\xF3 un elemento porque faltaba el control esperado.","Una acci\xF3n de la cuenta no surti\xF3 efecto. Aviary lo intentar\xE1 de nuevo.","Recargando {category} desde el principio para verificar que no falte nada.","La verificaci\xF3n desde cero no encontr\xF3 m\xE1s elementos de {categoryLower}.","No se encontraron m\xE1s elementos de {categoryLower}.","Recargando Me gusta para la siguiente ventana de l\xEDmite de X.","X no aplic\xF3 la acci\xF3n dos veces. Esperando {seconds} segundos antes de recargar {category} ({attempt}/{max}).","Recargando {category} ahora. La eliminaci\xF3n contin\xFAa autom\xE1ticamente.","No se pudo renovar el bloqueo de la limpieza de la cuenta.","Inicia sesi\xF3n en X y luego reanuda.","Un error inesperado detuvo la limpieza de la cuenta.","La limpieza de la cuenta est\xE1 bloqueada y necesita atenci\xF3n.","Se alcanz\xF3 el l\xEDmite de X de 500 acciones de Me gusta. Esperando {seconds} segundos para la siguiente ventana. La eliminaci\xF3n contin\xFAa autom\xE1ticamente.","Se alcanz\xF3 el l\xEDmite de X de 500 acciones de Me gusta. Esperando 1 minuto para la siguiente ventana. La eliminaci\xF3n contin\xFAa autom\xE1ticamente.","Se alcanz\xF3 el l\xEDmite de X de 500 acciones de Me gusta. Esperando {minutes} minutos para la siguiente ventana. La eliminaci\xF3n contin\xFAa autom\xE1ticamente.","Abrir el men\xFA de comandos de IA de Aviary","Ejecutar con el proveedor","ejecutando\u2026","resultado copiado al portapapeles.","No se pudo copiar el resultado. Tu navegador bloque\xF3 el acceso al portapapeles.","el proveedor no respondi\xF3","Revisa la clave y el modelo en Integraciones.","Prompt copiado al portapapeles: p\xE9galo en tu asistente.","No se pudo copiar el prompt. Tu navegador bloque\xF3 el acceso al portapapeles.","Revisar solicitud de IA externa","No se env\xEDa nada hasta que elijas Enviar solicitud.","ilimitado","Aviary solo guarda contadores de uso; la retenci\xF3n del proveedor sigue su pol\xEDtica.","El presupuesto bloque\xF3 esta solicitud.","Enviar solicitud","Traducir","Traduce la publicaci\xF3n seleccionada a tu idioma activo.","Resumir","Resume un hilo o una publicaci\xF3n larga en 3 puntos.","Explicar","Explica el contexto, la jerga y las referencias de la publicaci\xF3n.","Prompt de verificaci\xF3n","Genera un prompt de verificaci\xF3n para la publicaci\xF3n (sin llamadas de red si no hay clave).","Fragmentos","Abrir los fragmentos del redactor de Aviary","A\xFAn no hay fragmentos. A\xF1\xE1delos en el Centro de control \u2192 Biblioteca.","Haz clic en el redactor y luego elige un fragmento.","Aviary est\xE1 activo","Dos cosas est\xE1n activadas desde el principio. Todo lo dem\xE1s permanece desactivado hasta que t\xFA lo actives.","Las publicaciones patrocinadas, las tendencias promocionadas y los anuncios previos est\xE1n ocultos.","Las fotos y los v\xEDdeos reciben un control de descarga que solo act\xFAa cuando haces clic en \xE9l.","Abre Aviary desde la \xFAltima fila de la navegaci\xF3n izquierda de X para cambiar cualquiera de estas opciones.","Entendido","Tu biblioteca local ya supera el l\xEDmite de almacenamiento que fijaste. No se borr\xF3 nada.","Esta captura lleva tu biblioteca local por encima del l\xEDmite de almacenamiento que fijaste. No se borr\xF3 nada.","Originales","Citas","Filtradas","Todas","Categor\xEDas del resumen","Resumen","Cerrar el resumen","Periodo","Ordenar","M\xE1s recientes primero","M\xE1s antiguos primero","Menos densas primero","Agrupar por autor","Un periodo tranquilo. Nada nuevo que revisar.","Nada en este periodo.","El resumen solo incluye publicaciones que Aviary ya mostr\xF3. No pide m\xE1s a X.","Eso es todo.","Cuenta desconocida","Foto","Audio","Subt\xEDtulos","Miniatura","Cargar vista previa","Abrir subt\xEDtulos","Abrir publicaci\xF3n","Enlaces principales","publicaci\xF3n que Aviary vio en este periodo","publicaciones que Aviary vio en este periodo","vez compartido","veces compartido","Por debajo de tu m\xEDnimo de interacci\xF3n","Oculta: esta publicaci\xF3n tiene una foto","Oculta: esta publicaci\xF3n tiene un v\xEDdeo","Oculta: esta publicaci\xF3n tiene un GIF","Oculta: esta publicaci\xF3n es de una cuenta verificada","Oculta: esta publicaci\xF3n cita a otra","Atenuada por tu regla","Oculta por tu regla","Atenuada por tu palabra clave","Oculta por tu palabra clave","Atenuada por tu patr\xF3n","Oculta por tu patr\xF3n","Ocultar esta publicaci\xF3n","Publicaci\xF3n oculta","No se pudo guardar la publicaci\xF3n oculta. El almacenamiento rechaz\xF3 la escritura.","Deshacer","No se pudo restaurar esa publicaci\xF3n.","Fuera de tu horario de lectura","Aviary cubre la cronolog\xEDa hasta tu pr\xF3ximo intervalo. No se bloquea nada y nada sali\xF3 de este dispositivo.","D\xE9jame pasar cinco minutos","Las pulsaciones en la fila est\xE1n desactivadas. El icono de responder abre la publicaci\xF3n.","Mostrar m\xE1s publicaciones","Error al guardar el marcador.","Guardar localmente","Eliminar marcador local","Copiar enlace","Copiar el enlace de esta publicaci\xF3n","Esta publicaci\xF3n no tiene ning\xFAn enlace que Aviary pueda copiar.","Copiado","Fall\xF3","El portapapeles rechaz\xF3 esta copia.","Nota","Etiqueta","mejor directo","No se concedi\xF3 el acceso de descarga. Abre las opciones de Aviary para habilitar las descargas del navegador.","Fall\xF3 la descarga del contenido. Vuelve a intentarlo con el bot\xF3n de la publicaci\xF3n.","Haz clic derecho en una imagen o un v\xEDdeo y luego elige la descarga de Aviary.","Descargar \xB7 Mejor MP4 directo","Descargar","Descarga los archivos propios de esta publicaci\xF3n. El contenido citado y el de las tarjetas tiene su propio bot\xF3n Descargar.","Descargar todo el contenido multimedia de esta publicaci\xF3n","El v\xEDdeo directo a\xFAn se est\xE1 cargando. Int\xE9ntalo de nuevo en un momento.","Copiar enlaces","Copiar los mejores enlaces directos del contenido multimedia de esta publicaci\xF3n","adaptativo","Enviar a yt-dlp","Enviar el v\xEDdeo adaptativo observado al yt-dlp local","Copiar el comando de yt-dlp","Copiar el comando de yt-dlp para el v\xEDdeo adaptativo observado","V\xEDdeo adaptativo de mayor calidad","Enviando\u2026","Rechazado","El asistente local de yt-dlp rechaz\xF3 esta tarea.","El asistente local de yt-dlp fall\xF3.","Guardado","V\xEDdeo adaptativo guardado por yt-dlp.","Faltante","La tarea de yt-dlp ya no est\xE1 disponible. Copia el comando para reintentarlo.","No se pudo contactar con el asistente local de yt-dlp.","Comando de yt-dlp copiado.","No se pudo copiar el comando de yt-dlp.","Descargando\u2026","Reintentar","No disponible","Iniciada","El navegador sigue transfiriendo este archivo. Consulta tus descargas para ver el resultado.","Tu navegador abri\xF3 el archivo en lugar de guardarlo: concede a Aviary el permiso de descargas para guardarlo de verdad.","Omitido porque los bytes descargados coinciden con un elemento del historial.","Omitido porque la imagen se parece a un elemento del historial.","Omitido porque es el mismo recurso multimedia de X en otro tama\xF1o.","Aviary necesita el permiso de descargas del navegador. Abriendo su p\xE1gina de opciones.","Reintentar imagen original","Descargado anteriormente","Calidad original","Calidad alternativa. Haz clic para reintentar la original","Mejor calidad directa","Calidad desconocida","Esta imagen no est\xE1 disponible para descargar.","Permitir","Permisos","Acceso de descarga","Activa los permisos que Aviary necesita para descargar v\xEDdeos e im\xE1genes con la mejor calidad. Nada sale de tu navegador.","Estado de las descargas","concedido","opcionales","Todo es opcional. T\xFA tienes el control.","Guardar v\xEDdeos e im\xE1genes","comprobando\u2026","Guarda el v\xEDdeo o la imagen de mejor calidad disponible mediante el navegador y respeta tus ajustes de nombres de archivo y duplicados.","Conceder acceso a descargas","Revocar","Leer contenido original directamente","Permite que Aviary obtenga directamente el contenido a tama\xF1o completo. Los botones de descarga siguen funcionando sin este permiso.","Conceder servidores de medios","Conectar con el asistente local de yt-dlp","Solo para el asistente opcional de yt-dlp. Aviary se comunica con \xE9l desde la extensi\xF3n, as\xED que Chrome no le pide a x.com acceso a la red local.","Conceder acceso al asistente","Empieza a descargar","Activa el guardado con un clic mediante el navegador.","Abre X","Aviary a\xF1ade el bot\xF3n Descargar autom\xE1ticamente a las publicaciones con contenido.","Pulsa Descargar","Aviary elige la mejor calidad disponible.","Abrir X para descargar","Privado de forma predeterminada","Nada sale de tu navegador.","Los ajustes, filtros, notas y archivos est\xE1n en el Centro de control en x.com. Esta p\xE1gina solo gestiona los permisos del navegador.","Este navegador no expone la API de permisos.","Solicitud descartada: no ha cambiado nada.","Revocado.","No hay nada que revocar.","no concedido","Concedido. Ahora los medios se guardan con el navegador.","Concedido. Ahora Aviary puede leer medios a tama\xF1o completo para las exportaciones.","Concedido. Aviary se conecta con el asistente local sin que el navegador pregunte.","Aviary para X","Mejora local de X/Twitter con controles reversibles y privacidad por defecto.","Descargar contenido multimedia con Aviary","Archivo de Aviary","Visor de archivo local. Las referencias remotas nunca se descargan autom\xE1ticamente.","Buscar registros","Estado multimedia","Todo el contenido","Bytes capturados","Referencia remota","Usuario","Vista de hilos","Multimedia","registros","mostrados","No hay registros coincidentes.","origen","bytes","SHA-256","Abrir URL de origen","publicaciones","listo sin conexi\xF3n","puede requerir red","Publicaci\xF3n capturada ausente","Esta publicaci\xF3n principal no se captur\xF3 localmente.","Conversaci\xF3n","{count} publicaciones de {author}","Inicio","Limpieza de la cuenta","registro","Permisos opcionales","La acci\xF3n fall\xF3.","Controles en publicaciones","Nombres de archivo","Comportamiento por lotes","Estado de la cola","En cola","La calidad original se aplica cuando los controles de descarga est\xE1n habilitados.","Guardar lista"],"pt":["Defini\xE7\xF5es do Aviary","Um X mais tranquilo. Dados locais.","Fechar","Aviary","Pesquisar an\xFAncios, downloads, filtros e mais","Pesquisar defini\xE7\xF5es","Reverter","Salvar","Interruptores e campos aguardam Salvar. Os bot\xF5es agem imediatamente.","Guardado localmente","Sec\xE7\xF5es de defini\xE7\xF5es","Comece aqui","Configura\xE7\xE3o r\xE1pida","Uso di\xE1rio","Apar\xEAncia","Limpeza da p\xE1gina","Filtros de conte\xFAdo","Downloads","Seus dados","Posts salvos","Importar e exportar","Excluir atividade do X","Mais ferramentas","Colocar em dia","Posts ocultos","Reprodu\xE7\xE3o de v\xEDdeo","Arquivo do X","Liga\xE7\xF5es","Backup e redefini\xE7\xE3o","Privacidade e diagn\xF3sticos","Como o salvamento funciona","Interruptores e campos aguardam Salvar. Bot\xF5es como Aplicar, Exportar, Pr\xE9-visualizar e Excluir agem imediatamente.","Abrir configura\xE7\xF5es","Deixar o X mais tranquilo","Oculte an\xFAncios, tend\xEAncias, sugest\xF5es e a navega\xE7\xE3o que voc\xEA n\xE3o usa.","Ocultar posts indesejados","Filtre por palavras, m\xEDdia, selos ou p\xE1gina.","Salvar fotos e v\xEDdeos","Escolha qualidade, nomes de arquivo, verifica\xE7\xE3o de duplicatas e comportamento da fila.","Excluir atividade da conta","Remova publica\xE7\xF5es, respostas, republica\xE7\xF5es, curtidas ou favoritos.","Leitura tranquila","Oculta tend\xEAncias, limites de linha e contadores de intera\xE7\xE3o, atenua publica\xE7\xF5es premium, limpa t.co, tema denso e esbatido.","Ocultar barra lateral direita","Ativado","Suprimir pr\xE9-visualiza\xE7\xF5es ao passar o cursor","Ocultar contadores de intera\xE7\xE3o","Tema","Escurecido","Aplicar","Arquivo de multim\xE9dia","Transfer\xEAncias com qualidade original, nomes de ficheiro determin\xEDsticos, hist\xF3rico sem duplicados, multim\xE9dia empilhada.","Preferir qualidade original","Layout de m\xEDdia","Empilhado","Mostrar bot\xF5es de download","Criador","Modo de escrita, excertos no editor, limpeza do bot\xE3o de partilha, barra lateral e tend\xEAncias ocultas.","Modo escrita","Ocultar tend\xEAncias","Grade estrita","Investiga\xE7\xE3o","Captura para exporta\xE7\xE3o ativada, formatos JSON+CSV+HTML+MD, dete\xE7\xE3o de IDs de consulta, dados em bruto.","Capturar posts vis\xEDveis","Preservar cargas brutas","Formatos de exporta\xE7\xE3o","JSON, CSV, HTML, Markdown","Cl\xE1ssico","Rep\xF5e o tema atenuado, mant\xE9m a barra lateral, oculta apenas o Grok, sem filtro premium.","Modo denso","Desativada","Ocultar superf\xEDcies do Grok","M\xEDnimo","Limpeza m\xE1xima: sem contadores, sem limites, sem tend\xEAncias, zonas seguras para texto grande.","Noir","Idioma","Traduz o painel e define a dire\xE7\xE3o de leitura: da direita para a esquerda em \xE1rabe e hebraico. Privacidade mostra quanto do idioma escolhido est\xE1 preenchido; o que faltar permanece em ingl\xEAs.","Escolha uma configura\xE7\xE3o pronta ou v\xE1 direto para uma tarefa comum.","Tarefas comuns","Configura\xE7\xF5es prontas","Idioma","O Noir \xE9 aplicado automaticamente. Escolha Desligado para usar o visual original do X.","Desativado (o tema do pr\xF3prio X)","Luzes apagadas","Grafite","Ameixa","Meia-noite","Noir (padr\xE3o)","Compacta o espa\xE7amento da linha do tempo para leitura r\xE1pida.","Largura da cronologia","Largo usa todo o espa\xE7o ao lado da navega\xE7\xE3o e oculta o painel de descoberta. Confort\xE1vel mant\xE9m esse painel.","Predefinido","Confort\xE1vel","Largo (padr\xE3o)","Repor o tipo de letra Chirp","For\xE7a o tipo de letra Chirp do X onde o site recorreu a um tipo de letra do sistema.","Interruptor principal dos quatro n\xFAmeros abaixo. Os controles continuam funcionando e os leitores de tela continuam anunciando os totais.","Ocultar a contagem de respostas","Aplica-se enquanto \\"Ocultar contagens de intera\xE7\xE3o\\" estiver ativo.","Ocultar a contagem de reposts","Ocultar a contagem de curtidas","Ocultar a contagem de visualiza\xE7\xF5es","Aplica-se enquanto \\"Ocultar contagens de intera\xE7\xE3o\\" estiver ativo. O total de visualiza\xE7\xF5es fica em um link de an\xE1lises, n\xE3o em um bot\xE3o de a\xE7\xE3o.","Ocultar o contador no t\xEDtulo da aba","Remove a contagem de n\xE3o lidos do X do t\xEDtulo da aba, para que a aba n\xE3o traga de volta um aviso que voc\xEA j\xE1 ocultou.","Carimbos de data/hora absolutos","Mostra a data e a hora exatas em cada publica\xE7\xE3o em vez do texto relativo do X.","Usar o \xEDcone de aba do Aviary","Substitui o favicon do X pela marca do Aviary para identificar suas abas rapidamente. Ao desativar, restaura o \xEDcone original do X.","Ocultar bordas das linhas","Remove o divisor de 1 px sob cada post e as linhas laterais da coluna principal.","Alto contraste","Usa bordas e contraste de texto mais fortes.","Movimento reduzido","Seguir a configura\xE7\xE3o do sistema","Sempre reduzir","Nunca reduzir","CSS personalizado","Substitui\xE7\xF5es locais opcionais para as superf\xEDcies delimitadas abaixo. O CSS nunca sai deste perfil e n\xE3o faz parte dos relat\xF3rios de erros.","CSS das publica\xE7\xF5es","Limitado \xE0s publica\xE7\xF5es renderizadas. Exemplo: article { border-radius: 18px; }","CSS das a\xE7\xF5es de m\xEDdia","Limitado aos bot\xF5es de m\xEDdia do Aviary e ao conte\xFAdo deles.","CSS da navega\xE7\xE3o","Limitado \xE0 barra de navega\xE7\xE3o do X.","CSS da barra lateral","Limitado \xE0 barra lateral de descoberta do X.","CSS do editor","Limitado \xE0 barra de ferramentas e \xE0 \xE1rea de texto do editor.","Altere cores, espa\xE7amento, texto e os n\xFAmeros exibidos nos posts.","Apar\xEAncia e layout","Detalhes dos posts","Acessibilidade","Estilos avan\xE7ados","A prote\xE7\xE3o come\xE7a ao carregar o documento.","Modo sem an\xFAncios","Oculta posts patrocinados, parcerias pagas, tend\xEAncias promovidas, promo\xE7\xF5es da pr\xF3pria plataforma e an\xFAncios de pr\xE9-reprodu\xE7\xE3o vis\xEDveis. O Aviary tamb\xE9m recusa a chamada separada de registo de conte\xFAdo promovido do X sem bloquear a entrega da cronologia.","Recusar a chamada de registro de an\xFAncios do X","S\xF3 se aplica enquanto o modo sem an\xFAncios est\xE1 ativado. O Aviary recusa exatamente uma requisi\xE7\xE3o (a chamada de registo de conte\xFAdo promovido do X) e mais nenhuma, incluindo as verifica\xE7\xF5es que o X usa para detetar um bloqueador de an\xFAncios. Desative isto se o X reclamar mesmo assim: as publica\xE7\xF5es patrocinadas continuam ocultas e o Aviary deixa de recusar qualquer requisi\xE7\xE3o.","Estado da prote\xE7\xE3o contra an\xFAncios","Reduz o ru\xEDdo de tend\xEAncias, recomenda\xE7\xF5es e rodap\xE9.","Remove os t\xF3picos do momento e os m\xF3dulos de not\xEDcias.","Ocultar sugest\xF5es de contas","Remove os cart\xF5es \xABQuem seguir\xBB sem ocultar o resto da barra lateral.","Ocultar o editor da p\xE1gina inicial","Remove o editor de publica\xE7\xE3o r\xE1pida da p\xE1gina inicial. O bot\xE3o Publicar continua a abri-lo quando necess\xE1rio.","Ocultar recomenda\xE7\xF5es da conversa","Encerra a conversa na \xFAltima resposta real, recolhendo o bloco Descobrir mais e as publica\xE7\xF5es sugeridas abaixo.","Remove o painel e o link de navega\xE7\xE3o do Grok, as entradas de gera\xE7\xE3o de imagens e as a\xE7\xF5es por publica\xE7\xE3o.","Impedir que o X abra um cart\xE3o de perfil ou bal\xE3o ao passar o cursor sobre um nome, avatar ou controle. Menus, r\xF3tulos e nomes para leitores de tela permanecem iguais.","Modo foco","Fora do hor\xE1rio abaixo, cobre a coluna de leitura com um painel local discreto. A navega\xE7\xE3o continua utiliz\xE1vel e uma exce\xE7\xE3o de cinco minutos fica a um clique. Nada \xE9 bloqueado e nada sai deste dispositivo.","In\xEDcio do hor\xE1rio de leitura","Hora no formato de 24 horas, por exemplo 09:00.","Fim do hor\xE1rio de leitura","Hora no formato de 24 horas. Se o fim vier antes do in\xEDcio, o intervalo atravessa a meia-noite.","Parar a linha do tempo ap\xF3s","Publica\xE7\xF5es a mostrar antes de o feed parar de crescer, com um controle para continuar. Zero deixa a rolagem infinita do X intacta. Nada do que j\xE1 est\xE1 na tela se move, e o controle aparece abaixo da \xFAltima publica\xE7\xE3o, n\xE3o acima.","Expandir posts longos automaticamente","Clique apenas no controle Mostrar mais do pr\xF3prio post depois que a rolagem parar. Respostas, barras laterais, posts citados e outros links Mostrar mais n\xE3o s\xE3o alterados.","Restaurar posi\xE7\xE3o ao voltar","Volte ao mesmo post vis\xEDvel depois de abrir um post ou outra p\xE1gina do X e usar o bot\xE3o Voltar do navegador. Qualquer rolagem por roda, toque, ponteiro ou teclado cancela a restaura\xE7\xE3o imediatamente.","Mostrar marcador de leitura","Guarda uma posi\xE7\xE3o local por feed e mostra uma linha de novidades desde a \xFAltima visita. Nunca adiciona um contador de n\xE3o lidas.","Superf\xEDcies do marcador de leitura","Escolha onde aparecem o marcador local e o separador de publica\xE7\xF5es novas.","In\xEDcio","Publica\xE7\xE3o","Perfil","Pesquisa","Notifica\xE7\xF5es","Mensagens","Enquanto o foco est\xE1 no editor, esmaece a barra lateral e a linha do tempo atr\xE1s dele. Tudo volta assim que voc\xEA clica fora.","Abrir A seguir em vez de Para ti","Seleciona o segundo separador do in\xEDcio sempre que chegas \xE0 cronologia. Se voltares a Para ti, fica assim at\xE9 sa\xEDres da p\xE1gina.","Ocultar aba Para voc\xEA","Seleciona Seguindo e recolhe a primeira aba da p\xE1gina inicial. S\xF3 afeta a p\xE1gina inicial e \xE9 restaurada ao desativar.","Abrir posts apenas pelo \xEDcone de responder","O X transforma a linha inteira em um link, ent\xE3o um toque no texto ou ao lado de um controle abre um post que voc\xEA n\xE3o escolheu. Isto tira a \xE1rea de clique da linha e a entrega ao \xEDcone de responder, que abre o post em vez da caixa de resposta. Links, bot\xF5es, m\xEDdia e posts citados continuam funcionando.","Ocultar itens de navega\xE7\xE3o","Um identificador est\xE1vel da navega\xE7\xE3o do X por linha: home, explore, notifications, follow, chat, messages, grok, history, studio, premium, profile ou more.","Oculte an\xFAncios e partes do X que voc\xEA n\xE3o usa.","Prote\xE7\xE3o contra an\xFAncios","Elementos da p\xE1gina","Fluxo de leitura","Navega\xE7\xE3o","As regras est\xE3o ativas nas rotas selecionadas.","Ativar filtros","Chave geral dos filtros de palavra-chave, regex, Premium e m\xEDdia.","Estado das regras","Inativo at\xE9 os filtros serem ativados. Podes editar as regras antes de as ligares.","Esmaecer publica\xE7\xF5es que voc\xEA j\xE1 viu","Desbota uma publica\xE7\xE3o na segunda vez que ela passa e mant\xE9m uma c\xF3pia local das publica\xE7\xF5es exibidas pelo Aviary. Passar o cursor restaura a publica\xE7\xE3o.","Ocultar publica\xE7\xF5es vistas em","Escolha as superf\xEDcies onde as publica\xE7\xF5es j\xE1 vistas ficam esmaecidas.","Regras de filtragem","Uma regra por linha: campo, not opcional, operador, valor. Os campos s\xE3o text, handle, media, verified, link; os operadores s\xE3o contains, is, starts, ends, matches. Junte com and / or e use o prefixo dim: para esmaecer em vez de ocultar. D\xEA nome a uma regra come\xE7ando a linha com [um t\xEDtulo] e d\xEA a ela uma vida limitada com for 7d from . Exemplo: [Weekend sales] dim for 7d from 2026-08-19T10:00:00.000Z: text contains sale and media is photo","Conjunto de regras port\xE1til","Exporte texto simples ou cole um conjunto para visualiz\xE1-lo antes de adicionar ou substituir regras.","Cole as regras aqui","Exportar .txt","Pr\xE9via","Adicionar regras","Substituir regras","Cole regras para ver as duas op\xE7\xF5es de importa\xE7\xE3o.","Regras de palavras-chave","Uma palavra-chave ou frase por linha. Correspond\xEAncia parcial sem diferenciar mai\xFAsculas.","Regras de express\xF5es regulares","Um padr\xE3o por linha. Use /padr\xE3o/flags ou um padr\xE3o simples (sem diferenciar mai\xFAsculas).","Perfis na lista branca","Perfis (um por linha, sem @) que nunca s\xE3o filtrados.","Posts Premium / verificados","Desligado","Ocultar","Publica\xE7\xF5es que citam","Publica\xE7\xF5es que citam outra publica\xE7\xE3o.","Ocultar respostas com imagens, GIFs ou v\xEDdeo","No post que voc\xEA abriu, descarta toda resposta que traga foto, GIF ou v\xEDdeo. O texto ao lado n\xE3o muda nada, porque quase todo meme vem legendado. O post em si e o fio acima dele ficam intactos, e uma resposta que apenas cita outro post com imagem permanece. Funciona sozinho, sem os filtros acima, porque apontar aqueles para uma conversa esconderia o post que voc\xEA veio ler.","Dizer por que uma publica\xE7\xE3o foi filtrada","Um filtro que oculta em sil\xEAncio \xE9 dif\xEDcil de distinguir de um defeito. Publica\xE7\xF5es esmaecidas podem dizer o que as filtrou sem custo para o layout; a terceira op\xE7\xE3o tamb\xE9m transforma cada publica\xE7\xE3o oculta em uma faixa de uma linha que diz o motivo e se abre ao passar o mouse ou ao chegar nela pelo teclado.","N\xE3o dizer nada","Nas publica\xE7\xF5es esmaecidas","Nas publica\xE7\xF5es esmaecidas e ocultas","Publica\xE7\xF5es com pouco engajamento","Publica\xE7\xF5es abaixo do m\xEDnimo indicado abaixo. Uma publica\xE7\xE3o cujo n\xFAmero o Aviary n\xE3o consegue ler nunca \xE9 filtrada por ele.","Engajamento medido em","A qual dos n\xFAmeros abaixo de uma publica\xE7\xE3o o m\xEDnimo se aplica.","Respostas","Reposts","Curtidas","Engajamento m\xEDnimo","Publica\xE7\xF5es abaixo deste n\xFAmero s\xE3o filtradas. Zero n\xE3o filtra nenhuma.","Ocultar posts com fotos","Filtra posts que cont\xEAm fotos.","Ocultar posts com v\xEDdeos","Filtra posts que cont\xEAm v\xEDdeos.","Ocultar posts com GIFs","Filtra posts que cont\xEAm GIFs.","Ativo em","Rotas onde os filtros s\xE3o aplicados.","Contas bloqueadas / reposts pr\xF3prios","Aguardando uma captura autenticada; os controles permanecem desativados.","Oculte ou esmae\xE7a posts por palavras, m\xEDdia, selos da conta ou p\xE1gina.","Estado dos filtros","Regras","Tipos de conte\xFAdo","Rotas","A prefer\xEAncia de transfer\xEAncia aplica-se a todos os controlos de multim\xE9dia.","Adiciona uma a\xE7\xE3o Baixar a cada post com m\xEDdia, al\xE9m de controles por arquivo. Desativar esta op\xE7\xE3o tamb\xE9m oculta Copiar links de m\xEDdia.","Mostrar Copiar links de m\xEDdia","Adiciona uma a\xE7\xE3o que copia as melhores URLs diretas de imagens, GIFs, v\xEDdeos, \xE1udio e legendas, uma por linha. Ela copia apenas a m\xEDdia do pr\xF3prio post e requer os controles de m\xEDdia acima.","Tente primeiro name=orig no formato de origem e, se falhar, 4096x4096.","Estado da qualidade original","Mostrar imagens na qualidade original","Carrega as fotos da cronologia em tamanho completo em vez da vers\xE3o que o X escolhe para o espa\xE7o. Mais n\xEDtidas, e v\xE1rias vezes mais dados.","Grade padr\xE3o","Modelo de nome de arquivo","Campos: {handle}, {account}, {tweetId}, {mediaId}, {index}, {total}, {date}, {text}, {ext}. {account} \xE9 um alias do perfil que publicou e pode criar pastas por conta.","Arquivo auxiliar de metadados","Salva um arquivo auxiliar local em texto ou JSON ap\xF3s cada download de m\xEDdia conclu\xEDdo.","Texto","JSON","Detectar imagens visualmente semelhantes","Tamb\xE9m compara uma assinatura visual de 256 bits. Composi\xE7\xF5es simples parecidas podem ser confundidas, por isso fica desativado por padr\xE3o.","Hist\xF3rico de duplicados","Ignora o mesmo recurso do X ou os mesmos bytes de imagem sem armazenar a URL de origem.","Downloads simult\xE2neos","M\xE1ximo de downloads de m\xEDdia simult\xE2neos durante um lote (1-6).","Ritmo de download","Controla o pico inicial e o ritmo cont\xEDnuo das solicita\xE7\xF5es de m\xEDdia em lote.","Conservador","Equilibrado","Transferir toda a m\xE9dia vis\xEDvel","Enfileire todas as fotos, v\xEDdeos, GIFs, miniaturas, faixas de \xE1udio e legendas vis\xEDveis nesta p\xE1gina.","Estado das transfer\xEAncias","Entradas do hist\xF3rico","O resto do painel continua funcionando. Informado ao diagn\xF3stico.","Esta se\xE7\xE3o n\xE3o p\xF4de ser desenhada","Configure bot\xF5es de download, qualidade, nomes de arquivo e filas.","{bytes} distribu\xEDdos por {count} cole\xE7\xF5es","Armazenamento da biblioteca","Maiores cole\xE7\xF5es","Relat\xF3rio de armazenamento do navegador","Aviso de limite de armazenamento","Avisa antes de uma captura levar a biblioteca local acima destes megabytes. 0 desliga o aviso. O Aviary nunca apaga nada para ficar abaixo do limite; a remo\xE7\xE3o \xE9 escolhida na pr\xE9-visualiza\xE7\xE3o de limpeza.","Reduzir as imagens capturadas","Aplica-se \xE0s capturas daqui em diante. Nada do que j\xE1 est\xE1 guardado muda, e cada registo reduzido indica que foi reduzido.","Manter o original","Tr\xEAs quartos","Metade","Um quarto","Apenas o fotograma de capa do v\xEDdeo","Guarda a imagem fixa que o X fornece para um v\xEDdeo em vez do pr\xF3prio v\xEDdeo. O registo indica que o v\xEDdeo ficou de fora, para que uma exporta\xE7\xE3o posterior n\xE3o apresente a imagem como a publica\xE7\xE3o inteira.","Pesquisar todas as cole\xE7\xF5es locais","Pesquise posts, curtidas, favoritos, notas e capturas.","Pesquisar na biblioteca local","Classifica\xE7\xE3o sem\xE2ntica","Baixar m\xEDdia","{count} itens de m\xEDdia","Experimente source:bookmarks, tag:reading ou has:media.","Mostrar o bot\xE3o de IA nas publica\xE7\xF5es","Adiciona a cada publica\xE7\xE3o um bot\xE3o que comp\xF5e um pedido de Traduzir, Resumir, Explicar ou Verificar factos. Sem um fornecedor de IA configurado, copia o pedido para a \xE1rea de transfer\xEAncia; nada \xE9 enviado para lado nenhum.","Expandir links t.co","Substitui os redirecionamentos curtos \`t.co\` pelo destino obtido de aria-labels e t\xEDtulos.","Limpar o rastreio dos liga\xE7\xF5es","Remove os tokens de partilha e os par\xE2metros de campanha (utm_*, fbclid e os pr\xF3prios t/s do X) das liga\xE7\xF5es na cronologia, para que o que copia seja o endere\xE7o simples.","Copiar links de publica\xE7\xF5es como","Adiciona a cada publica\xE7\xE3o um controle Copiar link que escreve o endere\xE7o dessa publica\xE7\xE3o no host escolhido. Nada do que o X renderizou \xE9 reescrito e nenhuma navega\xE7\xE3o \xE9 redirecionada. s\xF3 muda o que voc\xEA copia. Deixe em X para remover o controle.","Cores de contas","Formato: usu\xE1rio: cor. Uma por linha. As cores s\xE3o amber, rose, violet, sky, green ou slate. Uma linha vazia remove a etiqueta.","Notas de contas","Formato: utilizador: nota. Uma por linha. Notas vazias removem a entrada.","Limpar todas as notas de contas","Elimina todas as notas guardadas.","Trechos do editor","Um trecho por linha. Respostas e modelos reutiliz\xE1veis inseridos pela barra de ferramentas do compositor.","Pesquise e gerencie posts armazenados neste navegador.","Ferramentas de posts","Ferramentas de escrita","Armazenamento e relat\xF3rios","Acumula os posts vis\xEDveis na p\xE1gina ativa para a pr\xF3xima exporta\xE7\xE3o.","Lista separada por v\xEDrgulas. Suportados: json, csv, html, markdown, xlsx.","Tamb\xE9m guarda as respostas GraphQL brutas que o X envia a esta aba, para que os registros possam ser reprocessados depois. Os tokens de sess\xE3o s\xE3o removidos antes de qualquer grava\xE7\xE3o.","Capturar bytes de m\xEDdia na exporta\xE7\xE3o","Busca a m\xEDdia durante a exporta\xE7\xE3o e inclui os bytes obtidos com tamanho e checksum; itens que falharem permanecem como refer\xEAncias que podem ser tentadas novamente.","Descobrir IDs de consulta automaticamente","Varre os scripts carregados em busca de IDs de opera\xE7\xF5es GraphQL do X e os guarda localmente.","Incluir posts protegidos nas exporta\xE7\xF5es para compartilhar","Posts protegidos ficam fora de HTML, Markdown, WARC, WACZ e do visualizador est\xE1tico at\xE9 que voc\xEA ative isso explicitamente. JSON e CSV continuam arquiv\xEDsticos e mant\xEAm o campo de audi\xEAncia.","Incluir posts de audi\xEAncia desconhecida nas exporta\xE7\xF5es para compartilhar","Registros apenas do DOM, importados e antigos ficam fora das exporta\xE7\xF5es para compartilhar at\xE9 que voc\xEA ative isso explicitamente. JSON e CSV continuam arquiv\xEDsticos.","Sugest\xE3o de pasta de destino","Nome da pasta (ou caminho) usado como raiz do ZIP de exporta\xE7\xE3o e prefixo de download.","{jobs} trabalhos acompanhados \xB7 {queries} IDs GraphQL em cache","Estado da exporta\xE7\xE3o","Exportar publica\xE7\xF5es vis\xEDveis","Re\xFAne as publica\xE7\xF5es vis\xEDveis e transfere um ZIP.","Copiar diagn\xF3stico","Copia o diagn\xF3stico de suporte (vers\xE3o, rota, registo recente).","Baixe um WARC bruto ou um WACZ pronto para reprodu\xE7\xE3o. O WACZ mant\xE9m os membros do arquivo e do \xEDndice sem compress\xE3o.","WACZ estimado: {size} para {records} registros.","Arquivo de preserva\xE7\xE3o","A\xE7\xF5es do arquivo de preserva\xE7\xE3o","WARC","WACZ","Cancelar","Abrir replayweb.page","Prova WACZ exclusiva do Aviary","A\xE7\xF5es da prova WACZ exclusiva do Aviary","Exportar par de chaves","Copiar como Markdown","Copia uma exporta\xE7\xE3o em Markdown simples para a \xE1rea de transfer\xEAncia.","Guardar Markdown para Obsidian","Markdown com frontmatter YAML e etiquetas do Aviary.","Guardar Markdown para Notion","Markdown baseado em t\xEDtulos que o Notion importa sem problemas.","Guardar registos em JSON","JSON ExportRecord[] sem compress\xE3o ZIP.","Registos por ZIP","Divide uma exporta\xE7\xE3o longa em v\xE1rios ficheiros em vez de um enorme (25-1000).","M\xE1ximo de trabalhos de exporta\xE7\xE3o","Mant\xE9m os trabalhos mais recentes. Use 0 para ilimitado.","M\xE1ximo de registos por trabalho","Mant\xE9m os registos mais recentes de cada trabalho. Use 0 para ilimitado.","Idade m\xE1xima da exporta\xE7\xE3o (dias)","Remove os trabalhos antigos no arranque. Use 0 para desativar a limpeza por idade.","Capture posts da p\xE1gina e baixe c\xF3pias port\xE1teis.","Captura","Pacote","Destino","Tarefas","Preserva\xE7\xE3o","O que excluir","A atividade selecionada \xE9 removida nesta ordem: favoritos, curtidas, republica\xE7\xF5es, respostas, publica\xE7\xF5es.","Itens salvos","Remove publica\xE7\xF5es salvas do hist\xF3rico do X.","Remove curtidas do hist\xF3rico do X.","Desfaz republica\xE7\xF5es pela aba Republica\xE7\xF5es.","Exclui suas respostas sem alterar as publica\xE7\xF5es originais.","Publica\xE7\xF5es","Exclui suas publica\xE7\xF5es e republica\xE7\xF5es com coment\xE1rio.","Pr\xE9-visualiza\xE7\xE3o conclu\xEDda. Nenhum dado da conta do X foi alterado.","Publica\xE7\xF5es e respostas exclu\xEDdas n\xE3o podem ser recuperadas. O Aviary n\xE3o consegue restaurar curtidas, republica\xE7\xF5es ou favoritos removidos.","Executar","Op\xE7\xF5es avan\xE7adas","Altere a velocidade da exclus\xE3o ou pause ap\xF3s um n\xFAmero definido de a\xE7\xF5es.","Velocidade","Adiciona uma espera aleat\xF3ria entre a\xE7\xF5es e pausas mais longas ap\xF3s cada lote.","Cauteloso","R\xE1pido","A\xE7\xF5es por lote","Pausa ap\xF3s esta quantidade de resultados. Use 0 para n\xE3o limitar. Retomar inicia um novo lote.","Selecione a atividade e pressione Executar. A exclus\xE3o come\xE7a imediatamente.","O resumo est\xE1 aguardando","Ative Esmaecer publica\xE7\xF5es j\xE1 vistas em Filtros. O resumo usa apenas linhas que o Aviary j\xE1 exibiu.","O que inclui","Tudo o que o Aviary viu no perfil ativo do navegador. Publica\xE7\xF5es filtradas mant\xEAm o motivo escrito pela regra ativa.","Revise posts que o Aviary j\xE1 viu sem pedir mais dados ao X.","Os bot\xF5es Ocultar seguem a defini\xE7\xE3o acima.","Ocultar posts dispensados","Mant\xE9m recolhidos os posts que voc\xEA ocultou, para que o pr\xF3ximo suba ao topo.","Mostrar bot\xF5es de ocultar","Adiciona um controle Ocultar a cada post, ao lado do menu Mais.","Estado dos bot\xF5es Ocultar","Ativa quando Ocultar posts dispensados est\xE1 ligado.","Rotas onde o ocultamento e o bot\xE3o Ocultar se aplicam.","M\xE1ximo de posts lembrados","As entradas mais antigas s\xE3o descartadas quando o armazenamento passa deste tamanho (100-50000).","Publica\xE7\xF5es ocultas guardadas","Desfazer a \xFAltima oculta\xE7\xE3o","Restaura a publica\xE7\xE3o ocultada mais recentemente.","Restaurar","Limpar publica\xE7\xF5es ocultas","Esquece todas as publica\xE7\xF5es ocultas e traz todas de volta.","Escolha onde os posts ocultos continuam ocultos ou mostre-os novamente.","Cobertura","Reten\xE7\xE3o","Recupera\xE7\xE3o","Pausar v\xEDdeo que sai do ecr\xE3","Deixa de descodificar o v\xEDdeo da cronologia quando este sai do ecr\xE3 e retoma-o quando regressa. Um v\xEDdeo que tenhas pausado permanece em pausa.","Manter o v\xEDdeo tocando ao trocar de aba","O X interrompe o v\xEDdeo em reprodu\xE7\xE3o quando voc\xEA troca de aba. Isto o retoma quando voc\xEA volta. Um v\xEDdeo que voc\xEA mesmo pausou continua pausado.","Repetir v\xEDdeos","Reinicia o v\xEDdeo ao chegar ao fim em vez de parar.","Fixar as playlists de v\xEDdeo na melhor vers\xE3o","Quando o X entrega ao Aviary uma playlist com v\xE1rias qualidades, mant\xE9m apenas a mais alta. Em conex\xF5es r\xE1pidas, o X frequentemente fica abaixo da melhor dispon\xEDvel. Isto consome mais dados e s\xF3 age sobre playlists que o Aviary v\xEA.","Pause v\xEDdeos depois que sa\xEDrem da tela.","Reprodu\xE7\xE3o","{count} entradas \xB7 mais recente: {kind}, {latestCount} em {at}","Instant\xE2neos guardados","Capturar seguidores a partir desta vista","Percorre as linhas UserCell da p\xE1gina atual. Abra primeiro uma vista /utilizador/followers.","Capturar seguidos a partir desta vista","Percorre as linhas UserCell da p\xE1gina atual. Abra primeiro uma vista /utilizador/following.","Limpar todos os instant\xE2neos","Elimina todos os instant\xE2neos de seguidores e seguidos.","Importar o arquivo oficial do X","Escolha um ZIP exportado de x.com. S\xE3o suportadas entradas STORE e DEFLATE; a origem permanece local enquanto puder ser retomada.","Pesquisar registos capturados","Pesquisa de texto completo na execu\xE7\xE3o mais recente do coletor de exporta\xE7\xE3o.","@utilizador, palavra-chave, frase\u2026","Escreva para pesquisar os registos capturados pelas execu\xE7\xF5es de exporta\xE7\xE3o.","Transferir relat\xF3rio em Markdown","Registo de auditoria, compara\xE7\xE3o de instant\xE2neos e pr\xE9-visualiza\xE7\xE3o de limpeza.","{total} itens \xB7 em fila {queued} \xB7 aprovados {approved} \xB7 ignorados {skipped}","Fila de revis\xE3o de limpeza","A\xE7\xF5es destrutivas","O Aviary nunca elimina publica\xE7\xF5es, gostos ou seguimentos. A fila \xE9 uma lista de revis\xE3o; aprovar ou ignorar apenas escreve no registo de auditoria.","Adicionar a pr\xE9-visualiza\xE7\xE3o de limpeza \xE0 fila","Acrescenta \xE0 fila todos os candidatos n\xE3o protegidos da \xFAltima pr\xE9-visualiza\xE7\xE3o de limpeza (sem a\xE7\xF5es destrutivas).","Esvaziar a fila de limpeza","Elimina todos os itens da fila sem tocar nos dados da conta.","Importe um arquivo oficial do X ou compare instant\xE2neos de seguidores.","Instant\xE2neos ativos","Repasse para o Aria2","Envia downloads grandes para um endpoint Aria2 JSON-RPC auto-hospedado.","Endpoint do Aria2","http://localhost:6800 (sem necessidade de barra final)","Segredo RPC do Aria2","Segredo compartilhado opcional para a autentica\xE7\xE3o token:.","Mostrar","Encaminhar ficheiros maiores que (MB)","Os ficheiros mais pequenos s\xE3o guardados pelo navegador. O Aviary verifica primeiro o tamanho; se o servidor n\xE3o o indicar, o ficheiro \xE9 encaminhado \xE0 mesma.","Testar a liga\xE7\xE3o ao Aria2","Envia uma chamada JSON-RPC trivial.","Transfer\xEAncias ativas do Aria2","Atualize para listar transfer\xEAncias em curso; toque em Cancelar para interromper uma.","Atualizar","Entrega local ao yt-dlp","Oferece uma grava\xE7\xE3o adaptativa de maior qualidade quando h\xE1 um auxiliar local autenticado em execu\xE7\xE3o.","Endere\xE7o do auxiliar yt-dlp","http://127.0.0.1:8787 (apenas loopback)","Segredo do auxiliar yt-dlp","O AVIARY_YTDLP_TOKEN partilhado com o processo local.","Publica\xE7\xE3o cruzada no Bluesky","Publica o texto do editor na sua conta do Bluesky quando voc\xEA pedir.","URL do servi\xE7o Bluesky","Padr\xE3o: https://bsky.social","Perfil do Bluesky","Seu perfil (sem @, ex.: voce.bsky.social)","Senha de aplicativo do Bluesky","Senha de aplicativo das configura\xE7\xF5es da sua conta. Nunca a sua senha principal.","Publica\xE7\xE3o cruzada no Mastodon","Publica o texto do editor na sua conta do Mastodon quando voc\xEA pedir.","Inst\xE2ncia do Mastodon","https://mastodon.social","Token de acesso do Mastodon","Token Bearer com o escopo write:statuses.","Anexar o \xFAltimo download","Anexa o \xFAltimo download bem-sucedido do Aviary ao primeiro post de uma publica\xE7\xE3o cruzada expl\xEDcita.","Publicar como t\xF3pico","Divida nas linhas vazias e responda a cada segmento ao anterior.","Publicar o editor no Bluesky","Usa o texto atual do editor.","Publicar o editor no Mastodon","Execu\xE7\xF5es do provedor de IA","Permite que o menu de comandos de IA envie os prompts ao provedor configurado.","Provedor de IA","Anthropic Messages API","OpenAI Chat Completions","Compat\xEDvel com OpenAI (LocalAI, proxy do Ollama, \u2026)","Endpoint de IA (opcional)","Substitui o endpoint padr\xE3o do provedor escolhido.","Modelo de IA","ex.: claude-sonnet-4-6, gpt-4o, llama3.1:8b","Chave de API de IA","Guardada apenas localmente. O Aviary s\xF3 a envia como cabe\xE7alho de autentica\xE7\xE3o para o seu provedor.","Permitido","Status da rede","Destino da IA","Divulga\xE7\xE3o de dados da IA","Antes de enviar, o Aviary mostra o provedor, endpoint, campos, estimativa de caracteres/tokens, reten\xE7\xE3o e status do or\xE7amento.","Uso de IA hoje","M\xE1ximo de bytes por solicita\xE7\xE3o de IA","Pare antes de enviar uma solicita\xE7\xE3o de IA maior que este corpo UTF-8. Use 0 para bloquear todas as solicita\xE7\xF5es de IA.","Bytes di\xE1rios de solicita\xE7\xF5es de IA","Pare as chamadas ao provedor de IA ap\xF3s esta quantidade de bytes UTF-8 de solicita\xE7\xE3o no dia local. Use 0 para bloquear todas as solicita\xE7\xF5es de IA.","Busca sem\xE2ntica","Envie o texto dos registros capturados ao endpoint de embeddings configurado para busca por similaridade. O destino, os campos, a reten\xE7\xE3o e o or\xE7amento de bytes aparecem aqui.","Endpoint de embeddings","Endpoint POST que retorna {data: [{embedding: number[]}]}","Modelo de embeddings","ex.: text-embedding-3-small","Chave de API de embeddings","Guardada localmente; usada apenas como cabe\xE7alho Authorization.","N\xE3o configurado","Destino dos embeddings","Divulga\xE7\xE3o de dados dos embeddings","Uma solicita\xE7\xE3o cont\xE9m o modelo e o texto do registro capturado. Vetores e texto limitado ficam no \xEDndice local do Aviary; a reten\xE7\xE3o do provedor segue a pol\xEDtica dele.","Uso de embeddings hoje","M\xE1ximo de bytes por registro de embedding","Pare antes de enviar um registro maior que este corpo UTF-8. Use 0 para bloquear todas as chamadas de incorpora\xE7\xE3o.","Bytes di\xE1rios de registros de embeddings","Pare as chamadas de incorpora\xE7\xE3o ap\xF3s esta quantidade de bytes UTF-8 de registro no dia local. Use 0 para bloquear todas as chamadas de incorpora\xE7\xE3o.","Gerar embeddings a cada exporta\xE7\xE3o","Antes de ativar, confira acima o endpoint, os campos dos registros capturados, a reten\xE7\xE3o local e o or\xE7amento di\xE1rio de bytes. Depois de cada exporta\xE7\xE3o, gere embeddings em segundo plano. Desativado por padr\xE3o.","Reconstruir o \xEDndice sem\xE2ntico","Gera embeddings de cada registo capturado. Repetir \xE9 barato porque as entradas em cache s\xE3o ignoradas.","Similaridade vetorial nos registos capturados. Os embeddings s\xE3o executados a pedido.","Descreva o que procura\u2026","Limpar o \xEDndice sem\xE2ntico","Esquece todos os registos com embeddings.","Limpar uso de IA e embeddings","Esque\xE7a apenas os contadores locais de solicita\xE7\xF5es. Isso n\xE3o remove o \xEDndice sem\xE2ntico nem as credenciais do provedor.","ativado","desativado","configurado","endpoint em falta","credenciais em falta","chave/modelo em falta","indexados","{name}: {state} \xB7 {config}","{name}: {state} \xB7 {count} {indexed}","Estado das integra\xE7\xF5es","Erros recentes de integra\xE7\xE3o","Obtidos do registo de auditoria; s\xF3 s\xE3o mostradas chamadas de integra\xE7\xE3o falhadas.","Configure servi\xE7os locais opcionais e provedores de IA.","Intelig\xEAncia","Redigidas. As credenciais salvas ser\xE3o mantidas.","Pare ap\xF3s a cole\xE7\xE3o atual e reverta tudo o que j\xE1 foi escrito.","Valide o backup e mostre os mesmos conflitos sem escrever ou remover dados locais.","Aplique as cole\xE7\xF5es selecionadas do perfil. Uma falha de grava\xE7\xE3o reverte as cole\xE7\xF5es j\xE1 alteradas.","As credenciais est\xE3o redigidas; os valores j\xE1 salvos neste perfil ser\xE3o mantidos.","Repor todas as prefer\xEAncias","Restaura as predefini\xE7\xF5es do Aviary: o modo sem an\xFAncios permanece ligado e todos os outros controlos visuais ou de comportamento voltam a ficar desligados. Os posts, notas, marcadores e hist\xF3rico de transfer\xEAncias s\xE3o mantidos.","Exportar defini\xE7\xF5es","Transfere as suas prefer\xEAncias em JSON. As chaves de API e as palavras-passe s\xE3o substitu\xEDdas por um marcador, por isso o ficheiro \xE9 seguro de partilhar; ao import\xE1-lo aqui, as credenciais j\xE1 guardadas nesta m\xE1quina s\xE3o mantidas.","Importar defini\xE7\xF5es (JSON)","Cole um ficheiro de defini\xE7\xF5es exportado do Aviary e escolha Importar. As credenciais ocultadas mant\xEAm os valores j\xE1 guardados aqui.","Importar","Exportar backup completo da biblioteca","Transfere uma c\xF3pia de seguran\xE7a JSON versionada que abrange todos os perfis desta m\xE1quina, n\xE3o apenas aquele que tens aberto. As credenciais s\xE3o exclu\xEDdas por predefini\xE7\xE3o; ao restaurar mant\xEAm-se as credenciais j\xE1 guardadas aqui.","Exportar backup com credenciais","O mesmo backup, mais as chaves de API e a identidade de assinatura WACZ salvas neste navegador. Quem abrir o arquivo poder\xE1 us\xE1-las, portanto guarde-o como uma senha.","Escolher um backup da biblioteca","Selecione um backup JSON para conferir vers\xF5es, quantidades, conflitos e soma de verifica\xE7\xE3o antes de alterar os dados locais.","Manter um registo local de a\xE7\xF5es","Regista transfer\xEAncias, exporta\xE7\xF5es e altera\xE7\xF5es de defini\xE7\xF5es neste dispositivo para poder rever o que o Aviary fez. Nada \xE9 enviado para lado nenhum. Ao desativar, deixam de ser criadas novas entradas; as existentes permanecem at\xE9 as limpar.","Entradas de auditoria","Limpar o registo de auditoria","Elimina o registo local de a\xE7\xF5es.","Fa\xE7a backup dos dados locais, restaure-os ou redefina o Aviary.","Prefer\xEAncias","C\xF3pia de seguran\xE7a da biblioteca","Hist\xF3rico de auditoria","Armazenamento","As configura\xE7\xF5es ficam neste navegador.","Seguran\xE7a do CSS personalizado","O CSS personalizado \xE9 local, limitado \xE0 superf\xEDcie indicada e nunca \xE9 enviado com diagn\xF3sticos. \xC9 um ajuste avan\xE7ado, por isso o suporte n\xE3o consegue reproduzir seus efeitos visuais.","Modo apenas local","Bloqueia todos os pedidos \xE0s integra\xE7\xF5es que configurou: Aria2, publica\xE7\xE3o cruzada, pedidos de IA e embeddings. Guardar multim\xE9dia continua a descarregar dos servidores da X, que \xE9 de onde a p\xE1gina j\xE1 a tinha carregado. Ativado por predefini\xE7\xE3o; ativar uma integra\xE7\xE3o \xE9 o que o desliga.","Recusar os sinalizadores de an\xE1lise do X","Impede os sinais de rastreio que o X envia quando percorres, clicas e pausas. S\xF3 os pontos de an\xE1lise s\xE3o recusados. o tr\xE1fego da cronologia, da multim\xE9dia e do in\xEDcio de sess\xE3o fica intacto.","Monitorar a sa\xFAde dos seletores","Verifica a superf\xEDcie atual do X em busca de \xE2ncoras obrigat\xF3rias e alternativas. Desative se n\xE3o quiser diagn\xF3sticos de seletores.","Ligado \xE0 p\xE1gina","Acesso \xE0 p\xE1gina","Sinalizadores recusados","N\xE3o foi poss\xEDvel gravar algumas altera\xE7\xF5es; o armazenamento do navegador pode estar cheio.","Grava\xE7\xE3o","Telemetria","Idioma do painel","Monitoramento ativo","Sa\xFAde dos seletores","Veja o que permanece local e confira se o Aviary ainda funciona com o X.","Limite de privacidade","Integra\xE7\xF5es da p\xE1gina","Dados locais","Compatibilidade","Altera\xE7\xF5es n\xE3o guardadas","N\xE3o foi poss\xEDvel guardar as defini\xE7\xF5es. Tente novamente.","Guarda ou reverte as altera\xE7\xF5es antes de sair desta sec\xE7\xE3o.","A guardar...","N\xE3o foi poss\xEDvel salvar essa altera\xE7\xE3o. Fa\xE7a-a novamente e salve.","Corrija os valores inv\xE1lidos antes de salvar.","Diagn\xF3stico copiado para a \xE1rea de transfer\xEAncia.","A exclus\xE3o foi atualizada.","O comando de exclus\xE3o falhou.","Modo apenas local ativado.","Modo apenas local desativado.","Sinalizadores de an\xE1lise recusados.","Sinalizadores de an\xE1lise permitidos.","Monitoramento da sa\xFAde dos seletores ativado.","Monitoramento da sa\xFAde dos seletores desativado.","Observa\xE7\xE3o estrutural copiada para a \xE1rea de transfer\xEAncia.","N\xE3o foi poss\xEDvel copiar a observa\xE7\xE3o estrutural.","M\xE9tricas de desempenho redefinidas.","N\xE3o foi poss\xEDvel redefinir as m\xE9tricas de desempenho.","Avisos salvos limpos.","N\xE3o foi poss\xEDvel limpar os avisos salvos.","Observa\xE7\xF5es de an\xFAncios redefinidas.","N\xE3o foi poss\xEDvel redefinir as observa\xE7\xF5es de an\xFAncios.","Perfil alterado. A recarregar\u2026","N\xE3o foi poss\xEDvel alterar o perfil.","{moved} armazenamentos atribu\xEDdos; {completedAfterRetry} conclu\xEDdos ap\xF3s nova tentativa; {skipped} j\xE1 existiam; {conflicted} em conflito; {failed} falharam.","Perfil criado. A recarregar\u2026","N\xE3o foi poss\xEDvel criar o perfil.","Resposta registrada.","Todos os recursos est\xE3o desativados. A p\xE1gina ainda est\xE1 errada?","Busca de recursos limpa.","Busca de recursos interrompida; todos os recursos voltaram a funcionar.","Entrega ao Aria2 ativada.","Entrega ao Aria2 desativada.","Endpoint do Aria2 guardado.","Segredo do Aria2 salvo.","Limite do Aria2 guardado.","Aria2 acess\xEDvel.","O Aria2 est\xE1 inacess\xEDvel: {error}","Falha no teste de liga\xE7\xE3o ao Aria2.","{gid} cancelado.","Falha ao cancelar o Aria2: {error}","Falha ao cancelar o Aria2.","Falha ao consultar o Aria2.","Entrega ao yt-dlp ligada.","Entrega ao yt-dlp desligada.","Endere\xE7o do auxiliar yt-dlp guardado.","Segredo do auxiliar yt-dlp guardado.","Bluesky ativado.","Bluesky desativado.","Servi\xE7o do Bluesky salvo.","Utilizador do Bluesky guardado.","Senha de aplicativo do Bluesky salva.","Mastodon ativado.","Mastodon desativado.","Inst\xE2ncia do Mastodon guardada.","Token do Mastodon guardado.","Anexo de publica\xE7\xE3o cruzada ativado.","Anexo de publica\xE7\xE3o cruzada desativado.","Foram publicados {posts} no Bluesky.{url}","Falha no Bluesky: {error}","Falha na publica\xE7\xE3o cruzada para o Bluesky.","Foram publicados {posts} no Mastodon.{url}","Falha no Mastodon: {error}","Falha na publica\xE7\xE3o cruzada para o Mastodon.","Execu\xE7\xF5es de IA ativadas.","Execu\xE7\xF5es de IA desativadas.","Endpoint de IA guardado.","Modelo de IA salvo.","Chave de API de IA salva.","Or\xE7amento de solicita\xE7\xF5es de IA salvo.","Or\xE7amento di\xE1rio de IA salvo.","Pesquisa sem\xE2ntica ativada.","Pesquisa sem\xE2ntica desativada.","Endpoint de embeddings guardado.","Modelo de embeddings guardado.","Chave de API de embeddings guardada.","Or\xE7amento de solicita\xE7\xF5es de embeddings salvo.","Or\xE7amento di\xE1rio de embeddings salvo.","Incorpora\xE7\xE3o autom\xE1tica ativada.","Incorpora\xE7\xE3o autom\xE1tica desativada.","A reconstruir o \xEDndice sem\xE2ntico\u2026","Os embeddings pararam no or\xE7amento ({blocked} registros n\xE3o foram enviados).","Indexados: +{added} novos \xB7 ignorados {skipped} \xB7 erros {errors} \xB7 total {total}{trimmed}.","Os embeddings falharam.","\xCDndice sem\xE2ntico limpo.","N\xE3o foi poss\xEDvel limpar o \xEDndice sem\xE2ntico.","Uso de IA e embeddings limpo.","N\xE3o foi poss\xEDvel limpar o uso de IA e embeddings.","Prefer\xEAncias repostas. O modo sem an\xFAncios est\xE1 ligado.","N\xE3o foi poss\xEDvel repor as defini\xE7\xF5es.","Defini\xE7\xF5es exportadas.","N\xE3o foi poss\xEDvel exportar as defini\xE7\xF5es.","Defini\xE7\xF5es importadas. {warning}","Falha na importa\xE7\xE3o: {errors}","N\xE3o foi poss\xEDvel importar as defini\xE7\xF5es.","Backup da biblioteca baixado: {filename} ({collections} cole\xE7\xF5es, {bytes}).","N\xE3o foi poss\xEDvel exportar o backup completo da biblioteca.","Backup com credenciais baixado: {filename} ({collections} cole\xE7\xF5es, {bytes}).","Lendo o backup da biblioteca\u2026","Backup carregado: {collections} cole\xE7\xF5es, {conflicts} altera\xE7\xF5es.","N\xE3o foi poss\xEDvel ler o backup da biblioteca.","Cancelando a restaura\xE7\xE3o\u2026","Simula\xE7\xE3o conclu\xEDda. Nenhum dado local foi alterado.","A simula\xE7\xE3o falhou: {errors}","N\xE3o foi poss\xEDvel simular a restaura\xE7\xE3o da biblioteca.","Backup da biblioteca restaurado ({collections} cole\xE7\xF5es). Recarregando\u2026","Restaura\xE7\xE3o cancelada; os dados locais foram revertidos.","Restaura\xE7\xE3o cancelada.","A restaura\xE7\xE3o falhou: {errors}","N\xE3o foi poss\xEDvel restaurar o backup da biblioteca.","Registo de a\xE7\xF5es ativado.","Registo de a\xE7\xF5es desativado.","Registro de auditoria limpo.","N\xE3o foi poss\xEDvel limpar o registo de auditoria.","Foram capturados {count} seguidores de @{handle}. A lista tinha acabado de carregar, por isso est\xE3o todos aqui.","Foram capturados {count} seguidores de @{handle}. A lista ainda estava a carregar, por isso isto \xE9 s\xF3 o que estava no ecr\xE3. Desce at\xE9 ao fim e captura outra vez para teres a lista completa.","N\xE3o foram encontradas linhas UserCell.","O instant\xE2neo falhou.","Foram capturadas {count} contas seguidas por @{handle}. A lista tinha acabado de carregar, por isso est\xE3o todas aqui.","Foram capturadas {count} contas seguidas por @{handle}. A lista ainda estava a carregar, por isso isto \xE9 s\xF3 o que estava no ecr\xE3. Desce at\xE9 ao fim e captura outra vez para teres a lista completa.","Instant\xE2neos limpos.","N\xE3o foi poss\xEDvel limpar os instant\xE2neos.","Importa\xE7\xE3o do arquivo pausada.","Importa\xE7\xE3o do arquivo retomada.","Importa\xE7\xE3o do arquivo cancelada.","Foi iniciada uma nova tentativa de importa\xE7\xE3o do arquivo.","A ler o arquivo: ficheiros grandes demoram um momento\u2026","Foi lido um arquivo {layout}. Importados {records} registos. Repara\xE7\xF5es: {archiveLinks} liga\xE7\xF5es do arquivo, {corpusLinks} liga\xE7\xF5es capturadas, {participants} identificadores de participantes resolvidos, {unresolved} por resolver. Avisos: {warnings}; erros: {errors}. Ficheiros: {recognized} reconhecidos, {skipped} ignorados, {malformed} malformados.{absent}","Falha ao importar o arquivo.","A gerar o relat\xF3rio\u2026","Relat\xF3rio transferido.","N\xE3o foi poss\xEDvel gerar o relat\xF3rio.","A gerar a pr\xE9-visualiza\xE7\xE3o de limpeza\u2026","Foram adicionados {added} itens \xE0 fila ({protected} protegidos ignorados).","N\xE3o foi poss\xEDvel colocar a limpeza na fila.","Fila de limpeza esvaziada.","N\xE3o foi poss\xEDvel esvaziar a fila.","Aviso de limite de armazenamento desligado.","Aviso de limite de armazenamento guardado.","As imagens capturadas mant\xEAm o tamanho original.","As imagens capturadas ser\xE3o reduzidas.","Os v\xEDdeos ser\xE3o capturados como fotograma de capa.","Os v\xEDdeos ser\xE3o capturados na \xEDntegra.","Lendo o relat\xF3rio Por dentro\u2026","N\xE3o foi poss\xEDvel ler o relat\xF3rio Por dentro.","N\xE3o foi poss\xEDvel exportar os relat\xF3rios Por dentro.","A transferir {count} ficheiros selecionados.","Falha ao baixar a m\xEDdia capturada.","A busca na biblioteca falhou. Verifique o endpoint e a chave de embeddings em Integra\xE7\xF5es.","Marcador atualizado.","N\xE3o foi poss\xEDvel atualizar o marcador.","Marcador removido.","O marcador j\xE1 tinha sido removido.","N\xE3o foi poss\xEDvel remover o marcador.","Marcadores exportados: {records} registros em {files} arquivos.","N\xE3o foi poss\xEDvel exportar os marcadores.","Marcadores apagados.","N\xE3o foi poss\xEDvel apagar os marcadores.","Bot\xE3o de IA ativado.","Bot\xE3o de IA desativado.","Expans\xE3o de liga\xE7\xF5es ativada.","Expans\xE3o de liga\xE7\xF5es desativada.","Limpeza de liga\xE7\xF5es ativada.","Limpeza de liga\xE7\xF5es desativada.","Controle de copiar link desativado.","Controle de copiar link ativado.","Cores de contas salvas.","Notas de contas limpas.","N\xE3o foi poss\xEDvel limpar as notas.","Captura para exporta\xE7\xE3o ativada.","Captura para exporta\xE7\xE3o desativada.","Prefer\xEAncia de payloads em bruto guardada.","Captura de bytes de m\xEDdia ativada.","Captura de bytes de m\xEDdia desativada.","Prefer\xEAncia de descoberta de consultas guardada.","Compartilhamento de posts protegidos ativado.","Posts protegidos exclu\xEDdos das exporta\xE7\xF5es para compartilhar.","Compartilhamento de posts de audi\xEAncia desconhecida ativado.","Posts de audi\xEAncia desconhecida exclu\xEDdos das exporta\xE7\xF5es para compartilhar.","Pasta de destino guardada.","Trabalho de exporta\xE7\xE3o pausado.","Trabalho de exporta\xE7\xE3o retomado.","Trabalho de exporta\xE7\xE3o cancelado.","A reunir as publica\xE7\xF5es vis\xEDveis\u2026","N\xE3o foram encontradas publica\xE7\xF5es nesta vista. Percorre a cronologia para carregar algumas e exporta de novo.","{records} registos exportados em {files} ZIPs \u2192 {filename}","{records} registo exportado \u2192 {filename}","{records} registos exportados \u2192 {filename}","A exporta\xE7\xE3o falhou. Consulte o diagn\xF3stico.","Ainda n\xE3o h\xE1 publica\xE7\xF5es capturadas com dados de conversa.","Leitor de conversas capturadas exportado.","Falha ao reconstruir as conversas. Consulte os diagn\xF3sticos.","N\xE3o foi poss\xEDvel copiar o diagn\xF3stico.","{records} registos copiados para a \xE1rea de transfer\xEAncia.","{records} registos exportados para {target}.","A exporta\xE7\xE3o externa falhou.","Registos por ZIP guardados.","Reten\xE7\xE3o de trabalhos guardada.","Reten\xE7\xE3o de registos guardada.","Reten\xE7\xE3o por idade guardada.","WARC descarregado ({records} registos).","Falha na exporta\xE7\xE3o WARC.","WACZ baixado ({records} registros, {size}).","A exporta\xE7\xE3o WACZ falhou. Liberte espa\xE7o em disco ou exporte menos registos e tente novamente.","Identidade de assinatura substitu\xEDda.","N\xE3o foi poss\xEDvel substituir a identidade de assinatura.","Prova WACZ exclusiva do Aviary baixada ({records} registros, {size}).","A exporta\xE7\xE3o da prova WACZ exclusiva do Aviary falhou.","Par de chaves de assinatura baixado: {filename}.","Falha ao exportar o par de chaves de assinatura.","Bot\xF5es de multim\xE9dia ativados.","Bot\xF5es de multim\xE9dia desativados.","C\xF3pia de links de m\xEDdia ativada.","C\xF3pia de links de m\xEDdia desativada.","Prefer\xEAncia de qualidade original guardada.","Imagens em tamanho completo ativadas.","Imagens em tamanho completo desativadas.","Layout de m\xEDdia salvo.","Modelo de nome de ficheiro guardado.","Prefer\xEAncia do arquivo auxiliar salva.","Detec\xE7\xE3o visual de duplicados ativada.","Detec\xE7\xE3o visual de duplicados desativada.","Hist\xF3rico de duplicados ativado.","Hist\xF3rico de duplicados desativado.","Limite de downloads simult\xE2neos salvo.","Ritmo de download salvo.","A transferir a m\xE9dia desta vista\u2026","A transfer\xEAncia em lote falhou.","Hist\xF3rico limpo.","N\xE3o foi poss\xEDvel limpar o hist\xF3rico.","Hist\xF3rico exportado: {records} registros em {files} arquivos.","N\xE3o foi poss\xEDvel exportar o hist\xF3rico de downloads.","M\xEDdia capturada: {downloaded} salvas / {duplicate} duplicadas / {failed} falhas.","N\xE3o existem trabalhos de multim\xE9dia falhados para repetir.","Predefini\xE7\xE3o aplicada: {preset} ({changes})","A predefini\xE7\xE3o j\xE1 estava aplicada: {preset}","N\xE3o foi poss\xEDvel aplicar a predefini\xE7\xE3o.","Esse tema n\xE3o \xE9 suportado.","Tema atualizado.","Densidade atualizada.","Largura da cronologia atualizada.","Tipo de letra Chirp ativado.","Tipo de letra Chirp desativado.","Contadores de intera\xE7\xE3o ocultos.","Contadores de intera\xE7\xE3o vis\xEDveis.","Prefer\xEAncia de contagem salva.","Contador da aba oculto.","Contador da aba vis\xEDvel.","Carimbos absolutos ativados.","Carimbos absolutos desativados.","\xCDcone de aba do Aviary ativado.","\xCDcone de aba do X restaurado.","Limites das linhas ocultos.","Limites das linhas repostos.","Prefer\xEAncia de contraste guardada.","Prefer\xEAncia de movimento guardada.","Modo sem an\xFAncios ligado.","Modo sem an\xFAncios desligado.","Registro de an\xFAncios recusado.","Registro de an\xFAncios permitido.","Prefer\xEAncia de barra lateral guardada.","Prefer\xEAncia de tend\xEAncias guardada.","Prefer\xEAncia de layout guardada.","Prefer\xEAncia do Grok guardada.","Prefer\xEAncia de foco salva.","Modo foco ativado.","Modo foco desativado.","Hor\xE1rio de leitura salvo.","A linha do tempo rola sem parar.","Os posts longos s\xE3o expandidos automaticamente.","Os posts longos permanecem recolhidos.","Ao voltar, sua posi\xE7\xE3o \xE9 restaurada.","Ao voltar, \xE9 usada a posi\xE7\xE3o do X.","Marcador de leitura ativado.","Marcador de leitura desativado.","Superf\xEDcies do marcador guardadas.","Modo de escrita ativado.","Modo de escrita desativado.","Cronologia A seguir ativada.","Cronologia A seguir desativada.","Aba Para voc\xEA oculta.","Aba Para voc\xEA restaurada.","Os posts abrem pelo \xEDcone de responder.","Os posts voltam a abrir pela linha.","Visibilidade da navega\xE7\xE3o salva.","V\xEDdeo fora do ecr\xE3 em pausa.","V\xEDdeo fora do ecr\xE3 continua a reproduzir.","O v\xEDdeo continua tocando.","O v\xEDdeo pausa junto com a aba.","Repeti\xE7\xE3o de v\xEDdeo ativada.","Repeti\xE7\xE3o de v\xEDdeo desativada.","Fixa\xE7\xE3o de playlists ativada.","Fixa\xE7\xE3o de playlists desativada.","Filtros ativados.","Filtros desativados.","Esmaecimento de publica\xE7\xF5es vistas ativado.","Esmaecimento de publica\xE7\xF5es vistas desativado.","Superf\xEDcies de publica\xE7\xF5es vistas guardadas.","Publica\xE7\xF5es vistas esquecidas.","N\xE3o foi poss\xEDvel limpar as publica\xE7\xF5es vistas.","Regras de filtragem salvas.","Foi renovada {count} regra.","{count} regras renovadas.","N\xE3o foi poss\xEDvel renovar as regras expiradas.","Filtro Premium salvo.","Filtro de cita\xE7\xF5es salvo.","Respostas com m\xEDdia ocultas.","Respostas com m\xEDdia vis\xEDveis de novo.","Configura\xE7\xE3o do motivo do filtro salva.","Filtro de engajamento salvo.","M\xE9trica de engajamento salva.","Filtros desativados em todas as rotas.","Conjunto de regras exportado: {filename} ({count} linhas).","N\xE3o foi poss\xEDvel exportar o conjunto de regras.","O conjunto de regras precisa de revis\xE3o.","A pr\xE9via do conjunto de regras est\xE1 pronta.","N\xE3o foi poss\xEDvel visualizar o conjunto de regras.","Foram adicionadas {count} regras.","O conjunto foi substitu\xEDdo por {count} regras.","N\xE3o foi poss\xEDvel importar o conjunto de regras.","Publica\xE7\xF5es ocultas aplicadas.","Publica\xE7\xF5es ocultas reveladas.","Bot\xF5es de ocultar ativados.","Bot\xF5es de ocultar desativados.","Oculta\xE7\xE3o desativada em todas as rotas.","N\xE3o h\xE1 nada para restaurar.","N\xE3o foi poss\xEDvel desfazer a \xFAltima oculta\xE7\xE3o.","Publica\xE7\xE3o restaurada.","Essa publica\xE7\xE3o j\xE1 tinha sido restaurada.","N\xE3o foi poss\xEDvel restaurar a publica\xE7\xE3o.","Foi limpa {removed} publica\xE7\xE3o oculta.","Foram limpas {removed} publica\xE7\xF5es ocultas.","N\xE3o foi poss\xEDvel limpar as publica\xE7\xF5es ocultas.","N\xE3o foi poss\xEDvel atribuir os dados legados. Nada foi movido, ent\xE3o continuam onde estavam. Reabra esta p\xE1gina para tentar de novo.","A busca de recursos n\xE3o p\xF4de iniciar.","A busca de recursos n\xE3o p\xF4de ser limpa.","A busca n\xE3o conseguiu registrar essa resposta. Ela continua onde estava, ent\xE3o pressione o mesmo bot\xE3o novamente.","A busca de recursos n\xE3o p\xF4de ser interrompida.","N\xE3o foi poss\xEDvel cancelar a restaura\xE7\xE3o. Ela vai parar sozinha ao terminar a cole\xE7\xE3o atual.","N\xE3o foi poss\xEDvel pausar a importa\xE7\xE3o. Talvez ela j\xE1 tenha terminado. Reabra esta se\xE7\xE3o para ver at\xE9 onde chegou.","N\xE3o foi poss\xEDvel retomar a importa\xE7\xE3o. A origem salva pode ter sido apagada. Tente novamente para recome\xE7ar a partir do arquivo.","N\xE3o foi poss\xEDvel cancelar a importa\xE7\xE3o. Talvez ela j\xE1 tenha terminado. Reabra esta se\xE7\xE3o para ver at\xE9 onde chegou.","N\xE3o foi poss\xEDvel repetir a importa\xE7\xE3o. Escolha o arquivo novamente para iniciar uma importa\xE7\xE3o nova.","N\xE3o foi poss\xEDvel pausar a tarefa de exporta\xE7\xE3o. Talvez ela j\xE1 tenha terminado. Reabra esta se\xE7\xE3o para ver o estado atual.","N\xE3o foi poss\xEDvel retomar a tarefa de exporta\xE7\xE3o. O ponto de verifica\xE7\xE3o pode ter sido apagado. Inicie uma nova exporta\xE7\xE3o.","N\xE3o foi poss\xEDvel cancelar a tarefa de exporta\xE7\xE3o. Talvez ela j\xE1 tenha terminado. Reabra esta se\xE7\xE3o para ver o estado atual.","Esse lote n\xE3o p\xF4de ser executado. Conceda acesso de download na p\xE1gina de permiss\xF5es do Aviary e tente novamente.","O lote n\xE3o aceitou essa instru\xE7\xE3o. Talvez ele j\xE1 tenha terminado. Reabra esta se\xE7\xE3o para ver o estado atual.","N\xE3o foi poss\xEDvel retomar os downloads na fila. Conceda acesso de download na p\xE1gina de permiss\xF5es do Aviary e tente novamente.","N\xE3o foi poss\xEDvel repetir os downloads que falharam. Conceda acesso de download na p\xE1gina de permiss\xF5es do Aviary e tente novamente.","N\xE3o foi poss\xEDvel abrir o resumo. N\xE3o se perdeu nada, por isso recarrega a p\xE1gina e tenta novamente.","Nada corresponde a essa pesquisa.","Tenta uma palavra mais curta ou escolhe uma sec\xE7\xE3o \xE0 esquerda.","Mantido: o navegador n\xE3o limpar\xE1 esta biblioteca para recuperar espa\xE7o.","Melhor esfor\xE7o: o navegador pode limpar esta biblioteca quando houver pouco espa\xE7o. Mantenha um backup.","O navegador n\xE3o informou se manter\xE1 esta biblioteca. Mantenha um backup.","Este gestor de userscripts n\xE3o d\xE1 ao Aviary acesso \xE0 pr\xF3pria p\xE1gina.","Este navegador n\xE3o carregou o script de p\xE1gina do Aviary.","O script de p\xE1gina do Aviary est\xE1 carregado, mas outra coisa respondeu antes, provavelmente outra extens\xE3o. Nesta p\xE1gina a prote\xE7\xE3o contra an\xFAncios no n\xEDvel de rede n\xE3o est\xE1 sob o controle do Aviary.","Indispon\xEDvel neste navegador.","Correspond\xEAncias de seletores","Superf\xEDcies obrigat\xF3rias ausentes","Superf\xEDcies opcionais ausentes","Seletores alternativos em uso","Funcionalidades afetadas","\xDAltima transi\xE7\xE3o de seletores","Observa\xE7\xF5es de an\xFAncios","Contagens de marcadores de an\xFAncios","Desvio do contrato de an\xFAncios","Observa\xE7\xF5es de an\xFAncios mantidas","Nativo","Tend\xEAncia","Promo\xE7\xE3o interna","V\xEDdeo","Entre no X antes de executar.","Selecione pelo menos um tipo de atividade para ativar Executar.","Iniciando exclus\xE3o\u2026","Long Animation Frame indispon\xEDvel","Nenhuma amostra de aplica\xE7\xE3o ainda","erro","erros","A p\xE1gina continuava errada com todos os recursos do Aviary desativados, ent\xE3o nada que o Aviary faz est\xE1 causando isso. Outra extens\xE3o, um userscript ou o pr\xF3prio X \xE9 o pr\xF3ximo lugar para procurar.","Nenhum recurso do Aviary estava em execu\xE7\xE3o, ent\xE3o n\xE3o havia nada a pesquisar.","N\xE3o existem transfer\xEAncias ativas.","Bloqueado pelo modo somente local","bloqueado (or\xE7amento \xE9 0)","Sem correspond\xEAncias (ou a integra\xE7\xE3o est\xE1 desativada).","Abra a lista de seguidores ou de quem um perfil segue e use \\"Capturar instant\xE2neo\\" para registr\xE1-la.","N\xE3o existe neste formato:","Nenhum registo capturado corresponde a \xAB{query}\xBB.","Por dentro do X","Leia localmente o resumo mensal de visibilidade do X. Ele mostra r\xF3tulos agregados, n\xE3o pesos de produ\xE7\xE3o nem uma auditoria completa de posts.","Importar JSON Por dentro do X","Relat\xF3rio Por dentro salvo localmente.","Nenhum r\xF3tulo de visibilidade foi informado neste m\xEAs.","Nenhum relat\xF3rio do X foi importado ainda.","Importe outro m\xEAs para comparar os relat\xF3rios.","Transferir os selecionados","{selected} de {total} ficheiros selecionados. {unavailable} n\xE3o podem ser transferidos.","Tipo de multim\xE9dia","Todos os tipos","Selecionar tudo","Indispon\xEDvel.","Esta pesquisa cont\xE9m mais de {limit} ficheiros transfer\xEDveis. Restringe-a primeiro.","Nenhuma cole\xE7\xE3o local corresponde a esta pesquisa.","Correspond\xEAncia de texto e sem\xE2ntica","Correspond\xEAncia sem\xE2ntica","Correspond\xEAncia de texto","(sem texto)","Encontrar marcadores locais","Pesquise posts salvos por texto, usu\xE1rio, tags, pasta ou ID. Os marcadores capturados incluem apenas posts que o X enviou enquanto voc\xEA rolava por eles.","Pesquisar marcadores locais","Nada salvo ainda. Use \\"Salvar localmente\\" em qualquer publica\xE7\xE3o para manter uma c\xF3pia aqui.","Nenhum marcador local corresponde a esta pesquisa.","Notas","Notas do marcador","Remover","Adicione uma abaixo no formato usu\xE1rio: nota. As notas aparecem ao lado das publica\xE7\xF5es dessa conta.","Ative a captura, percorra uma linha do tempo e depois exporte. Os trabalhos e seus registros aparecem aqui.","A gerar o arquivo WARC\u2026","Criando arquivo WACZ\u2026","O par de chaves armazenado \xE9 inv\xE1lido. Substitua-o antes de assinar outro arquivo.","O primeiro uso cria uma identidade P-384 local. A assinatura permanece desativada nos downloads WACZ comuns.","Criando uma nova identidade de assinatura\u2026","Criando prova WACZ exclusiva do Aviary\u2026","Preparando o par de chaves de assinatura\u2026","Exportar hist\xF3rico de downloads","Exporte os registros locais de duplicatas como JSON e CSV para um intervalo de datas. URLs de m\xEDdia nunca s\xE3o inclu\xEDdas.","Data inicial do hist\xF3rico","Data final do hist\xF3rico","Exportar intervalo","Baixar \xE1udio capturado","Baixe faixas de \xE1udio que j\xE1 est\xE3o nas capturas locais. Nenhuma busca de metadados \xE9 feita.","Baixar legendas capturadas","Baixe faixas de legendas que j\xE1 est\xE3o nas capturas locais. Nenhuma busca de metadados \xE9 feita.","linha","Marcadores observados anteriormente n\xE3o s\xE3o mais detectados: {markers}.","Pronto para executar em @{handle}.","{feature}: {count} execu\xE7\xF5es \xB7 {total} ms no total \xB7 {max} ms no m\xE1ximo \xB7 {full} completas / {incremental} incrementais","{observed} frames longos \xB7 {correlated} correlacionados","{count} recursos","O X est\xE1 em {language}, um idioma para o qual o Aviary n\xE3o tem r\xF3tulos de an\xFAncio. Aqui as publica\xE7\xF5es patrocinadas n\xE3o s\xE3o ocultadas por r\xF3tulo.","{feature} foi o que alterou esta p\xE1gina. Foram precisas {rounds} rondas para o encontrar. Todas as funcionalidades voltaram a estar ativas, por isso desativa essa com a defini\xE7\xE3o pr\xF3pria dela se quiseres que continue desativada.","Rodada {round} de {total}. Todos os {off} recursos est\xE3o desativados.","Rodada {round} de {total}. {off} dos {suspect} recursos ainda suspeitos est\xE3o desativados.","ID {gid} \xB7 {status}","{count} entradas","{posts} publica\xE7\xF5es \xB7 {likes} gostos \xB7 {messages} mensagens diretas (fora da pesquisa p\xFAblica) \xB7 {media} refer\xEAncias multim\xE9dia \xB7 {followers} seguidores \xB7 {following} a seguir \xB7 {lists} listas","{archiveLinks} links do arquivo + {corpusLinks} links capturados expandidos \xB7 {participants} IDs de participantes resolvidos \xB7 {unresolved} mantidos como IDs n\xE3o resolvidos \xB7 nenhuma solicita\xE7\xE3o feita","{status} \xB7 {filename} \xB7 {records} registos \xB7 {files} ficheiros \xB7 {warnings} avisos","{saved} salvos \xB7 {mirrored} espelhados \xB7 {due} pendentes \xB7 {tags} tags \xB7 {folders} pastas","{public} p\xFAblicos \xB7 {protected} protegidos \xB7 {unknown} desconhecidos \xB7 {excluded} exclu\xEDdos das exporta\xE7\xF5es para compartilhar","{status} \xB7 {records} registos \xB7 {surface}","Identidade local {fingerprint}. Comprova a continuidade desta chave, n\xE3o o que o X forneceu.","{count} nesta sess\xE3o","Foram encontradas {imported} regras. Substituir est\xE1 pronto. Adicionar est\xE1 bloqueado na linha {line}: {error}","Foram encontradas {imported} regras. Adicionaria {added}; {duplicates} j\xE1 existem. Substituiria {replaced} por {total}.","Esquece os avisos e erros armazenados. Aqui s\xE3o gravados apenas o texto das mensagens do Aviary, o hor\xE1rio e os nomes dos seus campos de detalhe.","Limpe o hist\xF3rico local limitado de marcadores e seu aviso de desvio. Nenhum texto de publica\xE7\xE3o, nome de usu\xE1rio, URL ou corpo de resposta \xE9 armazenado aqui.","Desativa todos os recursos do Aviary e os reativa pela metade, perguntando ap\xF3s cada rodada se a p\xE1gina ainda est\xE1 errada. Nomeia o respons\xE1vel em cerca de cinco rodadas. Nada \xE9 gravado nas suas configura\xE7\xF5es, ent\xE3o recarregar restaura tudo fa\xE7a o que fizer, inclusive parar no meio. O Centro de Controle e seu idioma permanecem ativos o tempo todo, ent\xE3o nenhum dos dois pode ser apontado.","Recome\xE7ar com todos os recursos desativados.","Guardar a busca. Nada muda; todos os recursos j\xE1 est\xE3o ativos.","O problema continua com esses recursos desativados, ent\xE3o \xE9 um dos outros.","O problema sumiu com esses recursos desativados, ent\xE3o \xE9 um deles.","Reativar todos os recursos e esquecer a busca. Nenhuma resposta \xE9 registrada.","Pausar {filename}.","Retomar {filename}.","Cancelar {filename}.","Tentar novamente {filename}.","Pausar {jobId}.","Retomar {jobId}.","Cancelar {jobId}.","Copiar observa\xE7\xE3o estrutural","Desempenho das muta\xE7\xF5es","Redefinir m\xE9tricas de desempenho","R\xF3tulos de an\xFAncio para este idioma","Avisos salvos","Limpar avisos salvos","Redefinir observa\xE7\xF5es de an\xFAncios","Perfil ativo","Trocar perfil","Atribuir dados legados aqui","Novo perfil","Encontrar o recurso que quebra esta p\xE1gina","Busca de recursos","Buscar de novo","Limpar o resultado","Ainda suspeitos","A p\xE1gina ainda est\xE1 errada","A p\xE1gina parece certa agora","Parar a busca","Vers\xE3o do backup","Cole\xE7\xF5es do backup","Altera\xE7\xF5es nas cole\xE7\xF5es","Credenciais","Avisos do backup","Cancelar restaura\xE7\xE3o","Simular restaura\xE7\xE3o","Restaurar este backup da biblioteca","Ainda n\xE3o h\xE1 instant\xE2neos","Cole\xE7\xF5es importadas","Corre\xE7\xF5es locais do arquivo","Importa\xE7\xE3o de arquivo","Pausar importa\xE7\xE3o do arquivo","Retomar importa\xE7\xE3o do arquivo","Cancelar importa\xE7\xE3o do arquivo","Tentar novamente a importa\xE7\xE3o do arquivo","Relat\xF3rio Por dentro mais recente","R\xF3tulos no relat\xF3rio mais recente","Relat\xF3rios Por dentro","Compara\xE7\xE3o mensal","Exportar relat\xF3rios Por dentro salvos","Marcadores locais","Exportar marcadores locais","Exportar para gerenciadores de marcadores","Limpar marcadores locais","Ainda n\xE3o h\xE1 notas de contas","Cobertura de audi\xEAncia","Ainda n\xE3o h\xE1 trabalhos de exporta\xE7\xE3o","Tarefa de exporta\xE7\xE3o","Pausar tarefa de exporta\xE7\xE3o","Retomar tarefa de exporta\xE7\xE3o","Cancelar tarefa de exporta\xE7\xE3o","Reconstruir conversas capturadas","Lote de m\xEDdia ativo","Correspond\xEAncias duplicadas","Comprovantes de qualidade","\xDAltima correspond\xEAncia duplicada","Limpar hist\xF3rico de transfer\xEAncias","Retomar m\xEDdia na fila","Tentar novamente m\xEDdias com falha","Playlists reescritas","Esquecer publica\xE7\xF5es vistas","Regras que n\xE3o puderam ser lidas","Regras expiradas","Renovar as regras expiradas","Publica\xE7\xF5es dispon\xEDveis","Abrir resumo","Pausar","Retomar","Parar","Substituir par de chaves","Tudo certo: todas as altera\xE7\xF5es foram gravadas.","Copia como o X monta esta p\xE1gina (contagem de elementos, aninhamento e layout) para atualizar os dados de teste do Aviary. Sem texto de publica\xE7\xF5es, nomes, usu\xE1rios, links ou identificadores.","O tempo das muta\xE7\xF5es permanece local e armazena apenas IDs de recursos e dura\xE7\xF5es limitadas.","Move para o perfil ativo as configura\xE7\xF5es e os armazenamentos de biblioteca anteriores aos perfis que n\xE3o estejam atribu\xEDdos. Nada \xE9 deduzido da rota atual do X.","Crie um perfil offline vazio antes de trocar de conta ou importar outro arquivo.","Nenhum registado.","A medir\u2026","Este armazenamento do navegador n\xE3o pode ser medido a partir daqui, por isso o Aviary n\xE3o indica um tamanho.","Este navegador n\xE3o separa o relat\xF3rio de armazenamento por tipo, por isso mostra-se apenas a medi\xE7\xE3o do pr\xF3prio Aviary.","Baixa os relat\xF3rios normalizados como JSON local. S\xE3o dados do usu\xE1rio vindos do X; o Aviary n\xE3o adiciona pesos de ranking nem infere uma pontua\xE7\xE3o.","Baixe JSON e CSV de cada marcador deste perfil. O espelho mant\xE9m apenas o que o X enviou para a p\xE1gina enquanto voc\xEA rolava por ele.","Baixe um arquivo de marcadores de navegador que Karakeep, Linkwarden, linkding e qualquer navegador importam, al\xE9m do CSV que o Raindrop.io importa.","Remove todos os favoritos locais salvos.","Leia as respostas capturadas na ordem do post principal. Posts principais ausentes permanecem vis\xEDveis como lacunas locais.","Reinicia o \xEDndice local de duplicados.","Recupera downloads pausados ou na fila de uma sess\xE3o anterior.","Repete todas as tarefas de m\xEDdia que falharam ou foram canceladas na fila persistente.","Pacotes de predefini\xE7\xF5es indispon\xEDveis nesta compila\xE7\xE3o.","Limpa os IDs de publica\xE7\xF5es armazenados para que tudo volte a constar como n\xE3o visto.","Reinicia a partir de agora o per\xEDodo de cada regra expirada. Nada \xE9 apagado quando uma regra expira, ent\xE3o ela sempre pode ser recuperada.","Revise um intervalo, filtre por tipo, agrupe por autor e abra a publica\xE7\xE3o original. Nenhuma solicita\xE7\xE3o \xE9 feita.","Armazenamento de posts ocultos indispon\xEDvel nesta compila\xE7\xE3o.","Pronto.","Exclus\xE3o conclu\xEDda.","O limite de a\xE7\xF5es foi atingido. Retome para executar outro lote.","Exclus\xE3o pausada.","Exclus\xE3o interrompida.","A pr\xE9-visualiza\xE7\xE3o est\xE1 em andamento.","A exclus\xE3o est\xE1 em andamento.","A conta conectada mudou. Nenhuma outra a\xE7\xE3o foi realizada.","Outra aba do X j\xE1 est\xE1 executando esta exclus\xE3o.","Esta aba j\xE1 est\xE1 executando uma exclus\xE3o.","O X exibiu um desafio de login ou antiabuso. Conclua-o e depois retome.","Selecione pelo menos uma categoria da conta.","N\xE3o h\xE1 exclus\xE3o em andamento para pausar.","N\xE3o h\xE1 exclus\xE3o pausada para retomar.","N\xE3o h\xE1 exclus\xE3o para interromper.","Excluir atividade do X ainda est\xE1 carregando.","Retome esta exclus\xE3o na aba do X que a iniciou.","O X n\xE3o aplicou a a\xE7\xE3o ap\xF3s cinco recarregamentos autom\xE1ticos da p\xE1gina. Retome para tentar novamente.","Um erro inesperado interrompeu a exclus\xE3o.","N\xE3o foi poss\xEDvel concluir o comando de exclus\xE3o.","Limpeza da conta pausada.","Limpeza da conta interrompida.","Registro de limpeza da conta apagado.","Esta limpeza passou para outra aba do X.","Abrindo {category}.","Pr\xE9-visualizando {category}.","Limpando {category}.","As passagens de limpeza selecionadas foram conclu\xEDdas.","Carregando mais itens de {categoryLower}.","Mais {count} itens de {categoryLower} carregados.","O X ainda est\xE1 carregando itens mais antigos de {categoryLower}.","Procurando mais itens de {categoryLower} ({checks}/{limit}).","{category}: {count} encontrados.","{category}: {count} removidos.","Pausa de {seconds} segundos ap\xF3s {count} a\xE7\xF5es. A exclus\xE3o continua automaticamente.","Continuando {category}.","Um item foi ignorado porque o controle esperado n\xE3o estava presente.","Uma a\xE7\xE3o da conta n\xE3o teve efeito. O Aviary vai tentar novamente.","Recarregando {category} desde o in\xEDcio para verificar se nada ficou para tr\xE1s.","A verifica\xE7\xE3o desde o in\xEDcio n\xE3o encontrou mais itens de {categoryLower}.","Nenhum outro item de {categoryLower} encontrado.","Recarregando Curtidas para a pr\xF3xima janela de limite do X.","O X n\xE3o aplicou a a\xE7\xE3o duas vezes. Aguardando {seconds} segundos antes de recarregar {category} ({attempt}/{max}).","Recarregando {category} agora. A exclus\xE3o continua automaticamente.","N\xE3o foi poss\xEDvel renovar o bloqueio da limpeza da conta.","Entre no X e depois retome.","Um erro inesperado interrompeu a limpeza da conta.","A limpeza da conta est\xE1 bloqueada e precisa de aten\xE7\xE3o.","O limite do X de 500 a\xE7\xF5es de curtida foi atingido. Aguardando {seconds} segundos pela pr\xF3xima janela. A exclus\xE3o continua automaticamente.","O limite do X de 500 a\xE7\xF5es de curtida foi atingido. Aguardando 1 minuto pela pr\xF3xima janela. A exclus\xE3o continua automaticamente.","O limite do X de 500 a\xE7\xF5es de curtida foi atingido. Aguardando {minutes} minutos pela pr\xF3xima janela. A exclus\xE3o continua automaticamente.","Abrir o menu de comandos de IA do Aviary","Executar com o fornecedor","a executar\u2026","resultado copiado para a \xE1rea de transfer\xEAncia.","N\xE3o foi poss\xEDvel copiar o resultado. O teu navegador bloqueou o acesso \xE0 \xE1rea de transfer\xEAncia.","o fornecedor n\xE3o respondeu","Verifica a chave e o modelo em Integra\xE7\xF5es.","Prompt copiado para a \xE1rea de transfer\xEAncia. Cola-o no teu assistente.","N\xE3o foi poss\xEDvel copiar o prompt. O teu navegador bloqueou o acesso \xE0 \xE1rea de transfer\xEAncia.","Revisar solicita\xE7\xE3o externa de IA","Nada \xE9 enviado at\xE9 voc\xEA escolher Enviar solicita\xE7\xE3o.","ilimitado","O Aviary armazena apenas contadores de uso; a reten\xE7\xE3o do provedor segue a pol\xEDtica dele.","O or\xE7amento bloqueou esta solicita\xE7\xE3o.","Enviar solicita\xE7\xE3o","Traduzir","Traduz a publica\xE7\xE3o selecionada para o teu idioma ativo.","Resumir","Resume uma sequ\xEAncia ou publica\xE7\xE3o longa em 3 pontos.","Explicar","Explica o contexto, o jarg\xE3o e as refer\xEAncias da publica\xE7\xE3o.","Prompt de verifica\xE7\xE3o","Gera um prompt de verifica\xE7\xE3o para a publica\xE7\xE3o (sem chamadas de rede sem a tua chave).","Excertos","Abrir os excertos do editor do Aviary","Ainda n\xE3o h\xE1 excertos. Adiciona alguns no Centro de Controlo \u2192 Biblioteca.","Clica primeiro no editor e depois escolhe um excerto.","O Aviary est\xE1 ativo","Duas coisas ficam ativadas desde o in\xEDcio. Todo o restante permanece desligado at\xE9 voc\xEA ativar.","Publica\xE7\xF5es patrocinadas, tend\xEAncias promovidas e an\xFAncios pr\xE9-v\xEDdeo ficam ocultos.","Fotos e v\xEDdeos ganham um controlo de transfer\xEAncia que s\xF3 age quando clicas nele.","Abra o Aviary na \xFAltima linha da navega\xE7\xE3o esquerda do X para alterar qualquer uma dessas op\xE7\xF5es.","Entendi","A tua biblioteca local j\xE1 ultrapassa o limite de armazenamento que definiste. Nada foi apagado.","Esta captura leva a tua biblioteca local acima do limite de armazenamento que definiste. Nada foi apagado.","Originais","Cita\xE7\xF5es","Filtradas","Todas","Categorias do resumo","Resumo","Fechar o resumo","Per\xEDodo","Ordenar","Mais recentes primeiro","Mais antigas primeiro","Menos densas primeiro","Agrupar por autor","Um per\xEDodo tranquilo. Nada de novo para rever.","Nada neste per\xEDodo.","O resumo s\xF3 inclui publica\xE7\xF5es que o Aviary j\xE1 exibiu. Ele n\xE3o pede mais nada ao X.","\xC9 tudo.","Conta desconhecida","Foto","\xC1udio","Legendas","Miniatura","Carregar pr\xE9-visualiza\xE7\xE3o","Abrir legendas","Abrir publica\xE7\xE3o","Principais links","publica\xE7\xE3o que o Aviary viu neste per\xEDodo","publica\xE7\xF5es que o Aviary viu neste per\xEDodo","compartilhamento","compartilhamentos","Abaixo do seu m\xEDnimo de engajamento","Oculta: esta publica\xE7\xE3o tem uma foto","Oculta: esta publica\xE7\xE3o tem um v\xEDdeo","Oculta: esta publica\xE7\xE3o tem um GIF","Oculta: esta publica\xE7\xE3o \xE9 de uma conta verificada","Oculta: esta publica\xE7\xE3o cita outra","Atenuada pela sua regra","Oculta pela sua regra","Atenuada pela sua palavra-chave","Oculta pela sua palavra-chave","Atenuada pelo seu padr\xE3o","Oculta pelo seu padr\xE3o","Ocultar esta publica\xE7\xE3o","Publica\xE7\xE3o oculta","N\xE3o foi poss\xEDvel guardar a publica\xE7\xE3o oculta. O armazenamento rejeitou a escrita.","Anular","N\xE3o foi poss\xEDvel restaurar essa publica\xE7\xE3o.","Fora do seu hor\xE1rio de leitura","O Aviary est\xE1 cobrindo a linha do tempo at\xE9 o seu pr\xF3ximo intervalo. Nada \xE9 bloqueado e nada saiu deste dispositivo.","Deixe-me passar por cinco minutos","Os toques na linha est\xE3o desativados. O \xEDcone de responder abre o post.","Mostrar mais publica\xE7\xF5es","Falha ao guardar o marcador.","Guardar localmente","Remover marcador local","Copiar link","Copiar o link desta publica\xE7\xE3o","Esta publica\xE7\xE3o n\xE3o tem link que o Aviary possa copiar.","Copiado","Falhou","A \xE1rea de transfer\xEAncia recusou esta c\xF3pia.","Nota","Etiqueta","melhor direto","O acesso de download n\xE3o foi concedido. Abra as op\xE7\xF5es do Aviary para ativar os downloads do navegador.","Falha ao baixar a m\xEDdia. Tente novamente pelo bot\xE3o na publica\xE7\xE3o.","Clique com o bot\xE3o direito em uma imagem ou v\xEDdeo e escolha o download do Aviary.","Transferir \xB7 Melhor MP4 direto","Transferir","Baixa a m\xEDdia pr\xF3pria desta publica\xE7\xE3o. A m\xEDdia citada e a dos cards tem o pr\xF3prio bot\xE3o Transferir.","Transferir toda a m\xEDdia desta publica\xE7\xE3o","O v\xEDdeo direto ainda est\xE1 carregando. Tente novamente em instantes.","Copiar links","Copiar os melhores links diretos da m\xEDdia deste post","adaptativo","Enviar para o yt-dlp","Enviar o v\xEDdeo adaptativo observado para o yt-dlp local","Copiar o comando do yt-dlp","Copiar o comando do yt-dlp para o v\xEDdeo adaptativo observado","V\xEDdeo adaptativo de maior qualidade","A enviar\u2026","Recusado","O auxiliar local do yt-dlp recusou esta tarefa.","O auxiliar local do yt-dlp falhou.","Guardado","V\xEDdeo adaptativo guardado pelo yt-dlp.","Ausente","A tarefa do yt-dlp j\xE1 n\xE3o est\xE1 dispon\xEDvel. Copia o comando para tentar de novo.","N\xE3o foi poss\xEDvel contactar o auxiliar local do yt-dlp.","Comando do yt-dlp copiado.","N\xE3o foi poss\xEDvel copiar o comando do yt-dlp.","A transferir\u2026","Tentar de novo","Indispon\xEDvel","Iniciado","O navegador ainda est\xE1 transferindo este arquivo. Veja o resultado nos seus downloads.","O teu navegador abriu o ficheiro em vez de o guardar. Concede ao Aviary a permiss\xE3o de transfer\xEAncias para guardar mesmo.","Ignorado porque os bytes baixados correspondem a um item do hist\xF3rico.","Ignorado porque a imagem se parece com um item do hist\xF3rico.","Ignorado porque \xE9 o mesmo recurso de m\xEDdia do X em outro tamanho.","O Aviary precisa da permiss\xE3o de transfer\xEAncias do navegador. A abrir a p\xE1gina de op\xE7\xF5es.","Tentar novamente a imagem original","Baixado anteriormente","Qualidade original","Qualidade alternativa. Clique para tentar a original","Melhor qualidade direta","Qualidade desconhecida","Esta imagem n\xE3o est\xE1 dispon\xEDvel para download.","Permitir","Permiss\xF5es","Acesso para downloads","Ative as permiss\xF5es de que o Aviary precisa para baixar v\xEDdeos e imagens na melhor qualidade. Nada sai do seu navegador.","Status dos downloads","concedido","opcionais","Tudo \xE9 opcional. Tu mant\xE9ns o controlo.","Salvar v\xEDdeos e imagens","a verificar\u2026","Salva o v\xEDdeo ou a imagem com a melhor qualidade dispon\xEDvel pelo navegador e respeita suas configura\xE7\xF5es de nome de arquivo e duplicados.","Conceder acesso a transfer\xEAncias","Revogar","Ler m\xEDdia original diretamente","Permite que o Aviary busque a m\xEDdia em tamanho real diretamente. Os bot\xF5es de download continuam funcionando sem essa permiss\xE3o.","Conceder servidores de multim\xE9dia","Conectar ao assistente local do yt-dlp","S\xF3 para o assistente opcional do yt-dlp. O Aviary fala com ele a partir da extens\xE3o, ent\xE3o o Chrome n\xE3o pede ao x.com acesso \xE0 rede local.","Conceder acesso ao assistente","Comece a baixar","Ative salvamentos com um clique pelo navegador.","Abra o X","O Aviary adiciona Download automaticamente \xE0s publica\xE7\xF5es com m\xEDdia.","Escolha Download","O Aviary escolhe a melhor qualidade dispon\xEDvel.","Abrir o X para baixar","Privado por padr\xE3o","Nada sai do seu navegador.","As defini\xE7\xF5es, filtros, notas e arquivos est\xE3o no Centro de Controlo em x.com. Esta p\xE1gina s\xF3 gere as permiss\xF5es do navegador.","Este navegador n\xE3o exp\xF5e a API de permiss\xF5es.","Pedido dispensado. Nada mudou.","Revogado.","N\xE3o h\xE1 nada para revogar.","n\xE3o concedido","Concedido. A multim\xE9dia passa agora a ser guardada pelo navegador.","Concedido. O Aviary pode agora ler multim\xE9dia em tamanho completo para as exporta\xE7\xF5es.","Concedido. O Aviary conecta-se ao assistente local sem pedido do navegador.","Aviary para X","Aprimorador local do X/Twitter com controles revers\xEDveis e privacidade por padr\xE3o.","Baixar m\xEDdia com o Aviary","Arquivo Aviary","Visualizador de arquivo local. Refer\xEAncias remotas nunca s\xE3o buscadas automaticamente.","Pesquisar registros","Status da m\xEDdia","Todas as m\xEDdias","Bytes capturados","Refer\xEAncia remota","Usu\xE1rio","Visualiza\xE7\xE3o de t\xF3picos","M\xEDdia","registros","exibidos","Nenhum registro correspondente.","origem","bytes","SHA-256","Abrir URL de origem","publica\xE7\xF5es","pronto off-line","a rede pode ser necess\xE1ria","Publica\xE7\xE3o capturada ausente","Esta publica\xE7\xE3o pai n\xE3o foi capturada localmente.","Conversa","{count} publica\xE7\xF5es de {author}","In\xEDcio","Limpeza da conta","registo","Permiss\xF5es opcionais","A a\xE7\xE3o falhou.","Controlos nos posts","Nomes de ficheiros","Comportamento em lote","Estado da fila","Em fila","A qualidade original \xE9 aplicada quando os controlos de transfer\xEAncia est\xE3o ativados.","Salvar lista"],"fr":["Param\xE8tres d\u2019Aviary","Un X plus calme. Des donn\xE9es locales.","Fermer","Aviary","Rechercher des publicit\xE9s, t\xE9l\xE9chargements, filtres et plus","Rechercher un r\xE9glage","Annuler","Enregistrer","Les interrupteurs et les champs attendent Enregistrer. Les boutons agissent imm\xE9diatement.","Enregistr\xE9 localement","Sections des r\xE9glages","Commencer ici","Configuration rapide","Au quotidien","Apparence","Nettoyage de la page","Filtres de contenu","T\xE9l\xE9chargements","Vos donn\xE9es","Publications enregistr\xE9es","Importer et exporter","Supprimer l\u2019activit\xE9 X","Plus d\u2019outils","Rattrapage","Publications masqu\xE9es","Lecture vid\xE9o","Archive X","Connexions","Sauvegarde et r\xE9initialisation","Confidentialit\xE9 et diagnostics","Fonctionnement de l\u2019enregistrement","Les interrupteurs et les champs attendent Enregistrer. Les boutons comme Appliquer, Exporter, Aper\xE7u et Supprimer agissent imm\xE9diatement.","Ouvrir les r\xE9glages","Rendre X plus calme","Masquez les publicit\xE9s, tendances, suggestions et \xE9l\xE9ments de navigation inutiles.","Masquer les publications ind\xE9sirables","Filtrez par mots, m\xE9dias, badges ou page.","Enregistrer les photos et vid\xE9os","Choisissez la qualit\xE9, les noms de fichiers, la d\xE9tection des doublons et le comportement de la file.","Supprimer l\u2019activit\xE9 du compte","Supprimez les publications, r\xE9ponses, republications, J\u2019aime ou signets.","Lecture calme","Masque les tendances, les bordures de ligne et les compteurs d'interaction, att\xE9nue les posts premium, nettoie t.co, th\xE8me dense et sombre.","Masquer la colonne de droite","Activ\xE9","D\xE9sactiver les aper\xE7us au survol","Masquer les compteurs d'engagement","Th\xE8me","Sombre","Appliquer","Archiviste m\xE9dia","T\xE9l\xE9chargements en qualit\xE9 d'origine, noms de fichiers d\xE9terministes, historique d\xE9dupliqu\xE9, m\xE9dias empil\xE9s.","Pr\xE9f\xE9rer la qualit\xE9 d'origine","Disposition des m\xE9dias","Empil\xE9","Afficher les boutons de t\xE9l\xE9chargement","Cr\xE9ateur","Mode \xE9criture, extraits dans le compositeur, nettoyage du bouton de partage, barre lat\xE9rale et tendances masqu\xE9es.","Mode \xE9criture","Masquer les tendances","Grille stricte","Recherche","Capture pour l'export activ\xE9e, formats JSON+CSV+HTML+MD, d\xE9tection des ID de requ\xEAte, donn\xE9es brutes.","Capturer les publications visibles","Conserver les charges utiles brutes","Formats d'export","JSON, CSV, HTML, Markdown","Classique","R\xE9tablit le th\xE8me att\xE9nu\xE9, garde la barre lat\xE9rale, masque seulement Grok, sans filtre premium.","Mode dense","D\xE9sactiv\xE9e","Masquer les surfaces Grok","Minimaliste","\xC9puration maximale : pas de compteurs, pas de bordures, pas de tendances, zones s\xFBres pour le grand texte.","Noir","Langue","Traduit le panneau et d\xE9finit le sens de lecture : de droite \xE0 gauche pour l'arabe et l'h\xE9breu. Confiance indique la part de la langue choisie qui est renseign\xE9e ; ce qui manque reste en anglais.","Choisissez une configuration pr\xEAte \xE0 l\u2019emploi ou ouvrez directement une t\xE2che courante.","T\xE2ches courantes","Configurations pr\xEAtes \xE0 l\u2019emploi","Langue","Noir est appliqu\xE9 automatiquement. Choisissez D\xE9sactiv\xE9 pour utiliser le style d\u2019origine de X.","D\xE9sactiv\xE9 (th\xE8me natif de X)","Extinction des feux","Gris graphite","Prune","Minuit","Noir (par d\xE9faut)","Resserre l'espacement du fil pour parcourir plus vite.","Largeur du fil","Large utilise tout l\u2019espace \xE0 c\xF4t\xE9 de la navigation et masque le panneau de d\xE9couverte. Confortable conserve ce panneau.","Par d\xE9faut","Confortable","Large (par d\xE9faut)","R\xE9tablir la police Chirp","Impose la police Chirp de X l\xE0 o\xF9 le site est revenu \xE0 une police syst\xE8me.","Interrupteur principal des quatre nombres ci-dessous. Les contr\xF4les restent utilisables et les lecteurs d'\xE9cran annoncent toujours les totaux.","Masquer le nombre de r\xE9ponses","S'applique tant que \xAB Masquer les compteurs d'engagement \xBB est activ\xE9.","Masquer le nombre de reposts","Masquer le nombre de j'aime","Masquer le nombre de vues","S'applique tant que \xAB Masquer les compteurs d'engagement \xBB est activ\xE9. Le total des vues se trouve dans un lien d'analyse, pas dans un bouton d'action.","Masquer le compteur du titre d'onglet","Retire le compteur de non-lus de X du titre de l'onglet, pour que l'onglet ne ram\xE8ne pas une notification que vous aviez masqu\xE9e.","Horodatages absolus","Affiche la date et l'heure exactes sur chaque post au lieu du texte relatif de X.","Utiliser l'ic\xF4ne d'onglet d'Aviary","Remplace le favicon de X par la marque d'Aviary pour rep\xE9rer ses onglets d'un coup d'\u0153il. D\xE9sactiv\xE9, l'ic\xF4ne d'origine de X revient.","Masquer les bordures de ligne","Supprime le trait de 1 px sous chaque publication ainsi que les filets lat\xE9raux de la colonne principale.","Contraste \xE9lev\xE9","Utilise des bordures et un contraste de texte plus marqu\xE9s.","Mouvement r\xE9duit","Suivre le r\xE9glage du syst\xE8me","Toujours r\xE9duire","Ne jamais r\xE9duire","CSS personnalis\xE9","Surcharges locales facultatives pour les surfaces d\xE9limit\xE9es ci-dessous. Le CSS ne quitte jamais ce profil et n'est pas couvert par les rapports de bug.","CSS des publications","Limit\xE9 aux publications affich\xE9es. Exemple : article { border-radius: 18px; }","CSS des actions multim\xE9dias","Limit\xE9 aux boutons multim\xE9dias d'Aviary et \xE0 leur contenu.","CSS de navigation","Limit\xE9 \xE0 la barre de navigation de X.","CSS de la barre lat\xE9rale","Limit\xE9 \xE0 la barre lat\xE9rale de d\xE9couverte de X.","CSS de l'\xE9diteur","Limit\xE9 \xE0 la barre d'outils et \xE0 la zone de texte de l'\xE9diteur.","Modifiez les couleurs, l\u2019espacement, le texte et les chiffres affich\xE9s sur les publications.","Apparence et disposition","D\xE9tails des publications","Accessibilit\xE9","Styles avanc\xE9s","La protection d\xE9marre au chargement du document.","Mode sans publicit\xE9","Masque les publications sponsoris\xE9es, partenariats r\xE9mun\xE9r\xE9s, tendances promues, promotions internes et pr\xE9-rolls visibles. Aviary refuse aussi l'appel s\xE9par\xE9 de journalisation du contenu promu de X sans bloquer la livraison du fil.","Refuser l'appel de journalisation publicitaire de X","Ne s'applique que lorsque le mode sans publicit\xE9 est activ\xE9. Aviary refuse exactement une requ\xEAte (l'appel de journalisation du contenu sponsoris\xE9 de X) et aucune autre, y compris les v\xE9rifications que X utilise pour rep\xE9rer un bloqueur de publicit\xE9s. D\xE9sactivez ceci si X se plaint quand m\xEAme : les posts sponsoris\xE9s restent masqu\xE9s et Aviary cesse de refuser la moindre requ\xEAte.","\xC9tat de la protection publicitaire","R\xE9duit le bruit des tendances, des recommandations et du pied de page.","Supprime les sujets tendance et les modules d'actualit\xE9.","Masquer les suggestions de comptes","Supprime les cartes \xAB Qui suivre \xBB sans masquer le reste de la barre lat\xE9rale.","Masquer le r\xE9dacteur de l\u2019accueil","Supprime le r\xE9dacteur rapide de l\u2019accueil. Le bouton Publier permet toujours de l\u2019ouvrir au besoin.","Masquer les recommandations du fil","Arr\xEAte la conversation \xE0 sa derni\xE8re vraie r\xE9ponse en repliant le bloc D\xE9couvrir plus et les posts sugg\xE9r\xE9s en dessous.","Supprime le panneau et le lien de navigation Grok, les entr\xE9es de g\xE9n\xE9ration d\u2019images et les actions par publication.","Emp\xEAcher X d'ouvrir une carte de profil ou une infobulle au survol d'un nom, d'un avatar ou d'un contr\xF4le. Les menus, libell\xE9s et noms pour lecteurs d'\xE9cran restent inchang\xE9s.","Mode concentration","En dehors des heures ci-dessous, couvre la colonne de lecture par un panneau local discret. La navigation reste utilisable et une d\xE9rogation de cinq minutes est \xE0 un clic. Rien n'est bloqu\xE9 et rien ne quitte cet appareil.","D\xE9but des heures de lecture","Heure au format 24 h, par exemple 09:00.","Fin des heures de lecture","Heure au format 24 h. Une fin ant\xE9rieure au d\xE9but franchit minuit.","Arr\xEAter le fil apr\xE8s","Nombre de posts \xE0 afficher avant que le fil cesse de s'allonger, avec un bouton pour continuer. Z\xE9ro laisse le d\xE9filement infini de X tel quel. Rien de ce qui est d\xE9j\xE0 \xE0 l'\xE9cran ne bouge, et le bouton appara\xEEt sous le dernier post, pas au-dessus.","D\xE9velopper automatiquement les posts longs","Clique uniquement sur la commande Afficher plus du post lorsque le d\xE9filement s'arr\xEAte. Les r\xE9ponses, les barres lat\xE9rales, les posts cit\xE9s et les autres liens Afficher plus restent inchang\xE9s.","R\xE9tablir la position apr\xE8s Retour","Revenez au m\xEAme post visible apr\xE8s avoir ouvert un post ou une autre page X puis utilis\xE9 le bouton Retour du navigateur. Tout d\xE9filement \xE0 la molette, au toucher, au pointeur ou au clavier annule imm\xE9diatement le r\xE9tablissement.","Afficher le marqueur de lecture","Garde une position locale par fil et affiche une ligne indiquant les nouveaut\xE9s depuis votre derni\xE8re visite. Aucun compteur de non-lus n'est ajout\xE9.","Fils du marqueur de lecture","Choisissez o\xF9 afficher le marqueur local et le s\xE9parateur des nouvelles publications.","Accueil","Publication","Profil","Recherche","Alertes","Messagerie","Tant que le focus est dans le r\xE9dacteur, la colonne lat\xE9rale et le fil s'estompent. Tout revient d\xE8s que vous cliquez ailleurs.","Ouvrir Abonnements plut\xF4t que Pour vous","S\xE9lectionne le deuxi\xE8me onglet d'accueil \xE0 chaque arriv\xE9e sur le fil. Si vous revenez \xE0 Pour vous, cela reste ainsi jusqu'\xE0 ce que vous quittiez la page.","Masquer l\u2019onglet Pour vous","S\xE9lectionne Abonnements, puis r\xE9duit le premier onglet de l\u2019accueil. S\u2019applique uniquement \xE0 l\u2019accueil et se restaure \xE0 la d\xE9sactivation.","Ouvrir les posts uniquement depuis l'ic\xF4ne de r\xE9ponse","X transforme toute la ligne en lien, donc un clic sur le texte ou \xE0 c\xF4t\xE9 d'un bouton ouvre un post que vous n'avez pas choisi. Cette option retire la zone cliquable de la ligne et la confie \xE0 l'ic\xF4ne de r\xE9ponse, qui ouvre le post au lieu du champ de r\xE9ponse. Les liens, les boutons, les m\xE9dias et les posts cit\xE9s continuent de fonctionner.","Masquer les \xE9l\xE9ments de navigation","Un identifiant stable de la navigation X par ligne : home, explore, notifications, follow, chat, messages, grok, history, studio, premium, profile ou more.","Masquez les publicit\xE9s et les parties de X que vous n\u2019utilisez pas.","Protection publicitaire","\xC9l\xE9ments de la page","Flux de lecture","Parcours","Les r\xE8gles sont actives sur les routes s\xE9lectionn\xE9es.","Activer les filtres","Interrupteur g\xE9n\xE9ral des filtres mots-cl\xE9s, regex, Premium et m\xE9dias.","\xC9tat des r\xE8gles","Inactif tant que les filtres ne sont pas activ\xE9s. Vous pouvez modifier les r\xE8gles avant de les activer.","Att\xE9nuer les posts d\xE9j\xE0 vus","Att\xE9nue une publication \xE0 son deuxi\xE8me passage et conserve une copie locale des publications affich\xE9es par Aviary. Survolez une publication att\xE9nu\xE9e pour la restaurer.","Masquer les publications vues sur","Choisissez les fils o\xF9 les publications d\xE9j\xE0 vues sont att\xE9nu\xE9es.","R\xE8gles de filtrage","Une r\xE8gle par ligne : champ, not facultatif, op\xE9rateur, valeur. Les champs sont text, handle, media, verified, link ; les op\xE9rateurs sont contains, is, starts, ends, matches. Reliez-les avec and / or, et pr\xE9fixez par dim: pour estomper au lieu de masquer. Nommez une r\xE8gle en commen\xE7ant la ligne par [un titre], et donnez-lui une dur\xE9e limit\xE9e avec for 7d from . Exemple : [Weekend sales] dim for 7d from 2026-08-19T10:00:00.000Z: text contains sale and media is photo","Jeu de r\xE8gles portable","Exportez du texte brut ou collez un jeu pour le v\xE9rifier avant d\u2019ajouter ou de remplacer des r\xE8gles.","Collez les r\xE8gles ici","Exporter en .txt","Aper\xE7u","Ajouter des r\xE8gles","Remplacer les r\xE8gles","Collez des r\xE8gles pour voir les deux options d\u2019importation.","R\xE8gles de mots-cl\xE9s","Un mot-cl\xE9 ou une expression par ligne. Correspondance partielle, insensible \xE0 la casse.","R\xE8gles d'expressions r\xE9guli\xE8res","Un motif par ligne. Utilisez /motif/flags ou un motif simple (insensible \xE0 la casse).","Comptes sur liste blanche","Comptes (un par ligne, sans @) qui ne sont jamais filtr\xE9s.","Publications Premium / certifi\xE9es","D\xE9sactiv\xE9","Masquer","Posts de citation","Les posts qui en citent un autre.","Masquer les r\xE9ponses avec images, GIF ou vid\xE9o","Sous un post que vous avez ouvert, retire chaque r\xE9ponse portant une photo, un GIF ou une vid\xE9o. Le texte qui l'accompagne n'y change rien, car presque tous les m\xE8mes arrivent l\xE9gend\xE9s. Le post lui-m\xEAme et le fil au-dessus ne bougent pas, et une r\xE9ponse qui se contente de citer un post avec image reste. Cette option fonctionne seule, sans les filtres ci-dessus, car les appliquer \xE0 une conversation masquerait le post que vous \xEAtes venu lire.","Indiquer pourquoi un post a \xE9t\xE9 filtr\xE9","Un filtre qui masque en silence se distingue mal d'un bug. Les posts estomp\xE9s peuvent indiquer ce qui les a filtr\xE9s sans rien changer \xE0 la mise en page ; la troisi\xE8me option transforme en plus chaque post masqu\xE9 en une bande d'une ligne qui en donne la raison et s'ouvre au survol ou \xE0 la tabulation.","Ne rien indiquer","Sur les posts estomp\xE9s","Sur les posts estomp\xE9s et masqu\xE9s","Posts peu engageants","Les posts sous le minimum ci-dessous. Un post dont Aviary ne peut pas lire le compteur n'est jamais filtr\xE9 dessus.","Engagement mesur\xE9 en","Lequel des compteurs sous un post le minimum concerne.","R\xE9ponses","Reposts","J'aime","Engagement minimum","Les posts sous ce nombre sont filtr\xE9s. Z\xE9ro n'en filtre aucun.","Masquer les publications avec photos","Filtre les publications contenant des photos.","Masquer les publications avec vid\xE9os","Filtre les publications contenant des vid\xE9os.","Masquer les publications avec GIF","Filtre les publications contenant des GIF.","Actif sur","Routes o\xF9 les filtres s'appliquent.","Comptes bloqu\xE9s / republications de soi","En attente d'une capture authentifi\xE9e ; les contr\xF4les restent d\xE9sactiv\xE9s.","Masquez ou att\xE9nuez les publications selon les mots, m\xE9dias, badges de compte ou la page.","\xC9tat des filtres","R\xE8gles","Types de contenu","Pages","La pr\xE9f\xE9rence de t\xE9l\xE9chargement s'applique \xE0 chaque contr\xF4le multim\xE9dia.","Ajoute une action T\xE9l\xE9charger \xE0 chaque post contenant des m\xE9dias, ainsi que des commandes par fichier. La d\xE9sactiver masque aussi Copier les liens des m\xE9dias.","Afficher Copier les liens des m\xE9dias","Ajoute une action qui copie les meilleures URL directes des images, GIF, vid\xE9os, pistes audio et sous-titres, une par ligne. Elle copie uniquement les m\xE9dias propres \xE0 ce post et n\xE9cessite les commandes multim\xE9dias ci-dessus.","Essaie d\u2019abord name=orig dans le format source, puis 4096x4096 en cas d\u2019\xE9chec.","\xC9tat de la qualit\xE9 d'origine","Afficher les images en qualit\xE9 d'origine","Charge les photos du fil en taille r\xE9elle plut\xF4t que la version choisie par X pour l'emplacement. Plus net, et plusieurs fois plus de donn\xE9es.","Grille par d\xE9faut","Mod\xE8le de nom de fichier","Champs : {handle}, {account}, {tweetId}, {mediaId}, {index}, {total}, {date}, {text}, {ext}. {account} est un alias du compte \xE9diteur et peut cr\xE9er des dossiers par compte.","Fichier annexe de m\xE9tadonn\xE9es","Enregistre un fichier annexe local au format texte ou JSON apr\xE8s chaque t\xE9l\xE9chargement de m\xE9dia termin\xE9.","Texte","JSON","D\xE9tecter les images visuellement similaires","Compare aussi une signature visuelle de 256 bits. Des compositions simples proches peuvent \xEAtre confondues, donc cette option reste d\xE9sactiv\xE9e par d\xE9faut.","Historique des doublons","Ignore le m\xEAme m\xE9dia X ou les m\xEAmes octets d\u2019image sans stocker son URL source.","T\xE9l\xE9chargements simultan\xE9s","Nombre maximal de t\xE9l\xE9chargements multim\xE9dias simultan\xE9s pendant un lot (1-6).","Cadence des t\xE9l\xE9chargements","Contr\xF4le la rafale initiale et le rythme soutenu des requ\xEAtes multim\xE9dias par lot.","Prudent","\xC9quilibr\xE9","T\xE9l\xE9charger tous les m\xE9dias visibles","Mettez en file toutes les photos, vid\xE9os, GIF, miniatures, pistes audio et pistes de sous-titres visibles sur cette page.","\xC9tat des t\xE9l\xE9chargements","Entr\xE9es de l'historique","Le reste du panneau fonctionne toujours. Signal\xE9 aux diagnostics.","Cette section n'a pas pu \xEAtre dessin\xE9e","Configurez les boutons de t\xE9l\xE9chargement, la qualit\xE9, les noms de fichiers et les files.","{bytes} r\xE9partis sur {count} collections","Stockage de la biblioth\xE8que","Collections les plus volumineuses","Rapport de stockage du navigateur","Alerte de plafond de stockage","Pr\xE9vient avant qu'une capture ne fasse d\xE9passer ce nombre de m\xE9gaoctets \xE0 la biblioth\xE8que locale. 0 d\xE9sactive l'alerte. Aviary ne supprime jamais rien pour rester sous le plafond ; la suppression se choisit dans l'aper\xE7u de nettoyage.","R\xE9duire les images captur\xE9es","S'applique aux captures \xE0 partir de maintenant. Rien de ce qui est d\xE9j\xE0 stock\xE9 ne change, et chaque enregistrement r\xE9duit indique qu'il l'a \xE9t\xE9.","Garder l'original","Trois quarts","Moiti\xE9","Quart","Image d'aper\xE7u de la vid\xE9o seulement","Enregistre l'image fixe que X fournit pour une vid\xE9o au lieu de la vid\xE9o elle-m\xEAme. L'enregistrement indique que la vid\xE9o a \xE9t\xE9 \xE9cart\xE9e, pour qu'un export ult\xE9rieur ne pr\xE9sente pas l'image comme le post entier.","Rechercher dans toutes les collections locales","Recherchez des publications, mentions J'aime, favoris, notes et captures.","Rechercher dans la biblioth\xE8que locale","Classement s\xE9mantique","T\xE9l\xE9charger les m\xE9dias","{count} m\xE9dias","Essayez source:bookmarks, tag:reading ou has:media.","Afficher le bouton IA sur les posts","Ajoute \xE0 chaque post un bouton qui compose une requ\xEAte Traduire, R\xE9sumer, Expliquer ou V\xE9rifier. Sans fournisseur d'IA configur\xE9, la requ\xEAte est copi\xE9e dans le presse-papiers ; rien n'est envoy\xE9 nulle part.","D\xE9velopper les liens t.co","Remplace les redirections courtes \`t.co\` par la destination lue dans les aria-labels et les titres.","Nettoyer le suivi des liens","Supprime les jetons de partage et les param\xE8tres de campagne (utm_*, fbclid et les t/s propres \xE0 X) des liens du fil, pour que ce que vous copiez soit l'adresse brute.","Copier les liens des posts en","Ajoute \xE0 chaque post un bouton Copier le lien qui \xE9crit l'adresse de ce post sur l'h\xF4te choisi. Rien de ce que X a affich\xE9 n'est r\xE9\xE9crit et aucune navigation n'est redirig\xE9e : seul ce que vous copiez change. Laissez sur X pour retirer le bouton.","Couleurs de comptes","Format : identifiant : couleur. Une par ligne. Les couleurs sont amber, rose, violet, sky, green ou slate. Une ligne vide retire l'\xE9tiquette.","Notes de comptes","Format : identifiant : note. Une par ligne. Une note vide supprime l'entr\xE9e.","Effacer toutes les notes de comptes","Supprime toutes les notes enregistr\xE9es.","Extraits du r\xE9dacteur","Un extrait par ligne. R\xE9ponses et mod\xE8les r\xE9utilisables \xE0 ins\xE9rer depuis la barre d\u2019outils du composeur.","Recherchez et g\xE9rez les publications stock\xE9es dans ce navigateur.","Outils de publication","Outils d'\xE9criture","Stockage et rapports","Accumule les publications visibles sur la page active pour le prochain export.","Liste s\xE9par\xE9e par des virgules. Pris en charge : json, csv, html, markdown, xlsx.","Conserve aussi les r\xE9ponses GraphQL brutes que X envoie \xE0 cet onglet, pour pouvoir r\xE9analyser les enregistrements plus tard. Les jetons de session sont retir\xE9s avant toute \xE9criture.","Capturer les octets multim\xE9dias dans l\u2019export","R\xE9cup\xE8re les m\xE9dias pendant l\u2019export et inclut les octets obtenus avec leur taille et leur somme de contr\xF4le ; les \xE9l\xE9ments \xE9chou\xE9s restent des r\xE9f\xE9rences r\xE9essayables.","D\xE9tecter automatiquement les ID de requ\xEAte","Analyse les scripts charg\xE9s pour y trouver les ID d'op\xE9rations GraphQL de X et les met en cache localement.","Inclure les posts prot\xE9g\xE9s dans les exportations \xE0 partager","Les posts prot\xE9g\xE9s restent absents du HTML, Markdown, WARC, WACZ et du lecteur statique jusqu\u2019\xE0 activation explicite. JSON et CSV restent archiv\xE9s et conservent le champ d\u2019audience.","Inclure les posts \xE0 audience inconnue dans les exportations \xE0 partager","Les entr\xE9es provenant seulement du DOM, import\xE9es ou anciennes restent absentes des exportations \xE0 partager jusqu\u2019\xE0 activation explicite. JSON et CSV restent archiv\xE9s.","Dossier d'enregistrement sugg\xE9r\xE9","Nom de dossier (ou chemin) utilis\xE9 comme racine du ZIP d'export et pr\xE9fixe de t\xE9l\xE9chargement.","{jobs} t\xE2ches suivies \xB7 {queries} identifiants GraphQL en cache","\xC9tat de l'export","Exporter les publications visibles","Rassemble les publications affich\xE9es et t\xE9l\xE9charge une archive ZIP.","Copier le diagnostic","Copie le diagnostic d'assistance (version, route, journal r\xE9cent).","T\xE9l\xE9chargez un WARC brut ou un WACZ pr\xEAt \xE0 \xEAtre relu. WACZ conserve les membres d\u2019archive et d\u2019index non compress\xE9s.","WACZ estim\xE9 : {size} pour {records} enregistrements.","Archive de pr\xE9servation","Actions de l\u2019archive de pr\xE9servation","WARC","WACZ","Annuler","Ouvrir replayweb.page","Preuve WACZ propre \xE0 Aviary","Actions de preuve WACZ propre \xE0 Aviary","Exporter la paire de cl\xE9s","Copier en Markdown","Copie un export Markdown simple dans le presse-papiers.","Enregistrer le Markdown Obsidian","Markdown avec en-t\xEAte YAML et \xE9tiquettes Aviary.","Enregistrer le Markdown Notion","Markdown structur\xE9 par titres, import\xE9 proprement par Notion.","Enregistrer les enregistrements en JSON","JSON ExportRecord[] brut, sans archive ZIP.","Enregistrements par ZIP","R\xE9partit un export volumineux sur plusieurs archives au lieu d'un seul \xE9norme fichier (25-1000).","Nombre maximal de t\xE2ches d'export","Conserve les t\xE2ches les plus r\xE9centes. 0 pour illimit\xE9.","Nombre maximal d'enregistrements par t\xE2che","Conserve les enregistrements les plus r\xE9cents de chaque t\xE2che. 0 pour illimit\xE9.","Anciennet\xE9 maximale des exports (jours)","Supprime les t\xE2ches anciennes au d\xE9marrage. 0 pour d\xE9sactiver le nettoyage par anciennet\xE9.","Capturez les publications de la page et t\xE9l\xE9chargez des copies portables.","Collecte","Paquet","Cible","T\xE2ches","Pr\xE9servation","\xC9l\xE9ments \xE0 supprimer","L\u2019activit\xE9 s\xE9lectionn\xE9e est supprim\xE9e dans cet ordre : signets, J\u2019aime, republications, r\xE9ponses, publications.","Signets","Retire les publications enregistr\xE9es de l'historique X.","Retire les mentions J'aime de l'historique X.","Annule les republications depuis l'onglet Republications.","Supprime vos r\xE9ponses sans toucher aux publications d'origine.","Publications","Supprime vos publications et vos citations.","Aper\xE7u termin\xE9. Aucune donn\xE9e du compte X n\u2019a \xE9t\xE9 modifi\xE9e.","Les publications et r\xE9ponses supprim\xE9es ne peuvent pas \xEAtre r\xE9cup\xE9r\xE9es. Aviary ne peut pas r\xE9tablir les J\u2019aime, republications ou signets retir\xE9s.","Ex\xE9cuter","Options avanc\xE9es","Modifiez la vitesse de suppression ou mettez en pause apr\xE8s un nombre d\xE9fini d\u2019actions.","Vitesse","Ajoute un d\xE9lai al\xE9atoire entre les actions et des pauses plus longues apr\xE8s chaque lot.","Prudent","Rapide","Actions par lot","Met en pause apr\xE8s ce nombre de r\xE9sultats. Utilisez 0 pour ne pas limiter. La reprise lance un nouveau lot.","S\xE9lectionnez l\u2019activit\xE9 et appuyez sur Ex\xE9cuter. La suppression commence imm\xE9diatement.","Le r\xE9capitulatif vous attend","Activez Att\xE9nuer les publications d\xE9j\xE0 vues dans Filtres. Le r\xE9capitulatif utilise uniquement les lignes d\xE9j\xE0 affich\xE9es par Aviary.","Contenu","Tout ce qu'Aviary a vu dans le profil actif du navigateur. Les publications filtr\xE9es conservent le motif de la r\xE8gle active.","Consultez les publications d\xE9j\xE0 vues par Aviary sans demander plus de donn\xE9es \xE0 X.","Les boutons Masquer suivent le r\xE9glage ci-dessus.","Masquer les publications \xE9cart\xE9es","Garde repli\xE9es les publications que vous avez masqu\xE9es, pour que la suivante remonte.","Afficher les boutons Masquer","Ajoute un bouton Masquer \xE0 chaque publication, \xE0 c\xF4t\xE9 du menu Plus.","\xC9tat des boutons Masquer","S'active lorsque Masquer les publications ignor\xE9es est activ\xE9.","Routes o\xF9 le masquage et le bouton Masquer s'appliquent.","Nombre maximal de publications m\xE9moris\xE9es","Les entr\xE9es les plus anciennes sont supprim\xE9es d\xE8s que le stock d\xE9passe cette taille (100-50000).","Publications masqu\xE9es enregistr\xE9es","Annuler le dernier masquage","Restaure la publication masqu\xE9e la plus r\xE9cente.","Restaurer","Effacer les publications masqu\xE9es","Oublie toutes les publications masqu\xE9es et les r\xE9tablit.","Choisissez o\xF9 les publications masqu\xE9es restent cach\xE9es ou r\xE9affichez-les.","Couverture","R\xE9tention","R\xE9cup\xE9ration","Mettre en pause la vid\xE9o qui sort de l'\xE9cran","Arr\xEAte le d\xE9codage de la vid\xE9o du fil d\xE8s qu'elle quitte l'\xE9cran, et la relance \xE0 son retour. Une vid\xE9o que vous avez mise en pause vous-m\xEAme le reste.","Continuer la lecture quand l'onglet perd le focus","X arr\xEAte la vid\xE9o en cours quand vous changez d'onglet. Ceci la relance \xE0 votre retour. Une vid\xE9o que vous avez mise en pause le reste.","Lire les vid\xE9os en boucle","Relance la vid\xE9o \xE0 la fin au lieu de l'arr\xEAter.","Fixer les playlists vid\xE9o sur leur meilleure version","Quand X transmet \xE0 Aviary une playlist listant plusieurs qualit\xE9s, ne garder que la plus \xE9lev\xE9e. Sur une connexion rapide, X se contente souvent d'une qualit\xE9 inf\xE9rieure \xE0 la meilleure disponible. Cela consomme plus de donn\xE9es et n'agit que sur les playlists qu'Aviary voit.","Mettez les vid\xE9os en pause lorsqu\u2019elles quittent l\u2019\xE9cran.","Lecture","{count} entr\xE9es \xB7 dernier {kind} de {latestCount} \xE0 {at}","Instantan\xE9s enregistr\xE9s","Capturer les abonn\xE9s depuis cette vue","Parcourt les lignes UserCell de la page actuelle. Ouvrez d'abord une vue /identifiant/followers.","Capturer les abonnements depuis cette vue","Parcourt les lignes UserCell de la page actuelle. Ouvrez d'abord une vue /identifiant/following.","Effacer tous les instantan\xE9s","Supprime tous les instantan\xE9s d'abonn\xE9s et d'abonnements.","Importer l\u2019archive X officielle","Choisissez un ZIP export\xE9 depuis x.com. Les entr\xE9es STORE et DEFLATE sont prises en charge ; la source reste locale pendant sa reprise.","Rechercher les enregistrements captur\xE9s","Recherche plein texte dans la derni\xE8re collecte d\u2019exportation.","@compte, mot-cl\xE9, phrase\u2026","Saisissez votre recherche dans les enregistrements captur\xE9s par les exports.","T\xE9l\xE9charger le rapport Markdown","Journal d'audit, comparaison d'instantan\xE9s et aper\xE7u du nettoyage.","{total} \xE9l\xE9ments \xB7 en attente {queued} \xB7 approuv\xE9s {approved} \xB7 ignor\xE9s {skipped}","File de revue du nettoyage","Actions destructrices","Aviary ne supprime jamais de publications, de mentions J'aime ni d'abonnements. La file est une liste de revue ; approuver ou ignorer n'\xE9crit que dans le journal d'audit.","Ajouter l'aper\xE7u du nettoyage \xE0 la file","Ajoute \xE0 la file tous les candidats non prot\xE9g\xE9s du dernier aper\xE7u de nettoyage (aucune action destructrice).","Vider la file de nettoyage","Supprime tous les \xE9l\xE9ments de la file sans toucher aux donn\xE9es du compte.","Importez une archive X officielle ou comparez des instantan\xE9s d\u2019abonn\xE9s.","Instantan\xE9s actifs","Transfert vers Aria2","Envoie les t\xE9l\xE9chargements volumineux vers un point de terminaison Aria2 JSON-RPC auto-h\xE9berg\xE9.","Point de terminaison Aria2","http://localhost:6800 (barre finale inutile)","Secret RPC Aria2","Secret partag\xE9 facultatif pour l'authentification token:.","Afficher","Transf\xE9rer les fichiers de plus de (Mo)","Les fichiers plus petits sont enregistr\xE9s par le navigateur. Aviary v\xE9rifie d'abord la taille ; si le serveur ne l'indique pas, le fichier est transf\xE9r\xE9 quand m\xEAme.","Tester la connexion Aria2","Envoie un appel JSON-RPC trivial.","T\xE9l\xE9chargements Aria2 actifs","Actualisez pour lister les transferts en cours ; touchez Annuler pour en interrompre un.","Actualiser","Transfert local vers yt-dlp","Propose un enregistrement adaptatif de meilleure qualit\xE9 quand un assistant local authentifi\xE9 tourne.","Adresse de l'assistant yt-dlp","http://127.0.0.1:8787 (boucle locale uniquement)","Secret de l'assistant yt-dlp","L'AVIARY_YTDLP_TOKEN partag\xE9 avec le processus local.","Republication vers Bluesky","Publie le texte du r\xE9dacteur sur votre compte Bluesky \xE0 la demande.","URL du service Bluesky","Par d\xE9faut : https://bsky.social","Compte Bluesky","Votre compte (sans @, p. ex. vous.bsky.social)","Mot de passe d'application Bluesky","Mot de passe d'application issu des r\xE9glages de votre compte. Jamais votre mot de passe principal.","Republication vers Mastodon","Publie le texte du r\xE9dacteur sur votre compte Mastodon \xE0 la demande.","Instance Mastodon","https://mastodon.social","Jeton d'acc\xE8s Mastodon","Jeton Bearer avec la port\xE9e write:statuses.","Joindre le dernier t\xE9l\xE9chargement","Joint le dernier t\xE9l\xE9chargement Aviary r\xE9ussi \xE0 la premi\xE8re publication d'une republication explicite.","Publier en fil","S\xE9pare les paragraphes vides et r\xE9pond \xE0 chaque segment au pr\xE9c\xE9dent.","Publier le brouillon sur Bluesky","Utilise le texte actuel du r\xE9dacteur.","Publier le brouillon sur Mastodon","Ex\xE9cutions du fournisseur d'IA","Autorise le menu de commandes IA \xE0 envoyer les invites \xE0 votre fournisseur.","Fournisseur d'IA","Anthropic Messages API","OpenAI Chat Completions","Compatible OpenAI (LocalAI, proxy Ollama, \u2026)","Point de terminaison IA (facultatif)","Remplace le point de terminaison par d\xE9faut du fournisseur choisi.","Mod\xE8le d'IA","p. ex. claude-sonnet-4-6, gpt-4o, llama3.1:8b","Cl\xE9 d'API d'IA","Stock\xE9e en local uniquement. Aviary ne l'envoie que comme en-t\xEAte d'authentification vers votre fournisseur.","Autoris\xE9","\xC9tat du r\xE9seau","Destination de l\u2019IA","Donn\xE9es envoy\xE9es \xE0 l\u2019IA","Avant l\u2019envoi, Aviary affiche le fournisseur, le point de terminaison, les champs, l\u2019estimation des caract\xE8res/tokens, la conservation et l\u2019\xE9tat du budget.","Utilisation de l\u2019IA aujourd\u2019hui","Octets maximum par requ\xEAte IA","Arr\xEAter avant d\u2019envoyer une requ\xEAte IA dont le corps UTF-8 d\xE9passe cette taille. Mettre 0 pour bloquer toutes les requ\xEAtes IA.","Octets quotidiens des requ\xEAtes IA","Arr\xEAter les appels au fournisseur IA apr\xE8s ce nombre d\u2019octets UTF-8 de requ\xEAte dans la journ\xE9e locale. Mettre 0 pour bloquer toutes les requ\xEAtes IA.","Recherche s\xE9mantique","Envoyer le texte des enregistrements captur\xE9s au point de terminaison d\u2019embeddings configur\xE9 pour la recherche par similarit\xE9. La destination, les champs, la conservation et le budget d\u2019octets sont affich\xE9s ici.","Point de terminaison des plongements","Point de terminaison POST renvoyant {data: [{embedding: number[]}]}","Mod\xE8le de plongements","p. ex. text-embedding-3-small","Cl\xE9 d'API des plongements","Stock\xE9e en local ; utilis\xE9e uniquement comme en-t\xEAte Authorization.","Non configur\xE9","Destination des embeddings","Donn\xE9es envoy\xE9es aux embeddings","Une requ\xEAte contient le mod\xE8le et le texte de l\u2019enregistrement captur\xE9. Les vecteurs et le texte limit\xE9 restent dans l\u2019index local d\u2019Aviary ; la conservation du fournisseur suit sa politique.","Utilisation des embeddings aujourd\u2019hui","Octets maximum par enregistrement d\u2019embedding","Arr\xEAter avant d\u2019envoyer un enregistrement dont le corps UTF-8 d\xE9passe cette taille. Mettre 0 pour bloquer tous les appels d\u2019embedding.","Octets quotidiens des enregistrements d\u2019embeddings","Arr\xEAter les appels d\u2019embedding apr\xE8s ce nombre d\u2019octets UTF-8 d\u2019enregistrement dans la journ\xE9e locale. Mettre 0 pour bloquer tous les appels d\u2019embedding.","Indexer automatiquement chaque export","Avant l\u2019activation, v\xE9rifiez ci-dessus le point de terminaison, les champs des enregistrements captur\xE9s, la conservation locale et le budget quotidien d\u2019octets. Apr\xE8s chaque exportation, les embeddings sont g\xE9n\xE9r\xE9s en arri\xE8re-plan. D\xE9sactiv\xE9 par d\xE9faut.","Reconstruire l'index s\xE9mantique","Calcule les embeddings de chaque enregistrement captur\xE9. Relancer co\xFBte peu car les entr\xE9es en cache sont ignor\xE9es.","Similarit\xE9 vectorielle sur les enregistrements captur\xE9s. Les embeddings sont lanc\xE9s \xE0 la demande.","D\xE9crivez votre recherche\u2026","Effacer l'index s\xE9mantique","Oublie tous les enregistrements vectoris\xE9s.","Effacer l\u2019utilisation de l\u2019IA et des embeddings","Effacer uniquement les compteurs locaux de requ\xEAtes. Cela ne supprime ni l\u2019index s\xE9mantique ni les identifiants du fournisseur.","activ\xE9","d\xE9sactiv\xE9","configur\xE9","point de terminaison manquant","identifiants manquants","cl\xE9 ou mod\xE8le manquant","index\xE9s","{name} : {state} \xB7 {config}","{name} : {state} \xB7 {count} {indexed}","\xC9tat des int\xE9grations","Erreurs d\u2019int\xE9gration r\xE9centes","Issues du journal d\u2019audit ; seules les int\xE9grations \xE9chou\xE9es apparaissent.","Configurez des services locaux facultatifs et des fournisseurs d\u2019IA.","Intelligence artificielle","Masqu\xE9s ; les identifiants enregistr\xE9s seront conserv\xE9s.","Arr\xEAter apr\xE8s la collection actuelle et r\xE9tablir tout ce qui a d\xE9j\xE0 \xE9t\xE9 \xE9crit.","Valider la sauvegarde et afficher les m\xEAmes conflits sans \xE9crire ni supprimer de donn\xE9es locales.","Appliquer les collections s\xE9lectionn\xE9es du profil. Une \xE9criture \xE9chou\xE9e r\xE9tablit les collections d\xE9j\xE0 modifi\xE9es.","Les identifiants sont masqu\xE9s ; les valeurs d\xE9j\xE0 enregistr\xE9es dans ce profil seront conserv\xE9es.","R\xE9initialiser toutes les pr\xE9f\xE9rences","Restaure les valeurs par d\xE9faut d'Aviary : le mode sans publicit\xE9 reste activ\xE9 et tous les autres contr\xF4les visuels ou de comportement sont d\xE9sactiv\xE9s. Les publications, notes, favoris et l'historique de t\xE9l\xE9chargement sont conserv\xE9s.","Exporter les r\xE9glages","T\xE9l\xE9charge vos pr\xE9f\xE9rences en JSON. Les cl\xE9s d'API et les mots de passe sont remplac\xE9s par un espace r\xE9serv\xE9, le fichier est donc s\xFBr \xE0 partager ; l'importer ici conserve les identifiants d\xE9j\xE0 enregistr\xE9s sur cette machine.","Importer des r\xE9glages (JSON)","Collez un fichier de r\xE9glages export\xE9 depuis Aviary, puis choisissez Importer. Les identifiants masqu\xE9s conservent les valeurs d\xE9j\xE0 enregistr\xE9es ici.","Importer","Exporter une sauvegarde compl\xE8te de la biblioth\xE8que","T\xE9l\xE9charge une sauvegarde JSON versionn\xE9e couvrant tous les profils de cette machine, pas seulement celui qui est ouvert. Les identifiants sont exclus par d\xE9faut ; une restauration conserve ceux d\xE9j\xE0 enregistr\xE9s ici.","Exporter la sauvegarde avec identifiants","La m\xEAme sauvegarde, avec les cl\xE9s API et l'identit\xE9 de signature WACZ enregistr\xE9es dans ce navigateur. Toute personne ouvrant le fichier peut les utiliser, gardez-le comme un mot de passe.","Choisir une sauvegarde de biblioth\xE8que","S\xE9lectionnez une sauvegarde JSON pour v\xE9rifier ses versions, quantit\xE9s, conflits et somme de contr\xF4le avant de modifier les donn\xE9es locales.","Conserver un journal local des actions","Enregistre les t\xE9l\xE9chargements, les exports et les changements de r\xE9glages sur cet appareil afin que vous puissiez v\xE9rifier ce qu'Aviary a fait. Rien n'est envoy\xE9 nulle part. D\xE9sactiver cette option arr\xEAte imm\xE9diatement les nouvelles entr\xE9es ; les existantes restent jusqu'\xE0 ce que vous les effaciez.","Entr\xE9es d'audit","Effacer le journal d'audit","Supprime le journal local des actions.","Sauvegardez les donn\xE9es locales, restaurez-les ou r\xE9initialisez Aviary.","Pr\xE9f\xE9rences","Sauvegarde de la biblioth\xE8que","Historique d'audit","Stockage","Les r\xE9glages restent dans ce navigateur.","S\xE9curit\xE9 du CSS personnalis\xE9","Le CSS personnalis\xE9 reste local, est limit\xE9 \xE0 la surface nomm\xE9e et n'est jamais envoy\xE9 avec les diagnostics. C'est une option avanc\xE9e, donc le support ne peut pas reproduire ses effets visuels.","Mode local uniquement","Bloque toutes les requ\xEAtes vers les int\xE9grations que vous avez configur\xE9es : Aria2, republication, requ\xEAtes d'IA et embeddings. L'enregistrement des m\xE9dias continue de les r\xE9cup\xE9rer sur les serveurs de X, d'o\xF9 la page les avait d\xE9j\xE0 charg\xE9s. Activ\xE9 par d\xE9faut ; activer une int\xE9gration est ce qui le d\xE9sactive.","Refuser les balises d'analyse de X","Bloque les signaux de suivi que X envoie lorsque vous faites d\xE9filer, cliquez et mettez en pause. Seuls les points d'analyse sont refus\xE9s : le trafic du fil, des m\xE9dias et de la connexion reste intact.","Surveiller l\u2019\xE9tat des s\xE9lecteurs","V\xE9rifie la surface X actuelle pour trouver les ancres requises et de secours. D\xE9sactivez cette option si vous ne voulez pas de diagnostics des s\xE9lecteurs.","Connect\xE9 \xE0 la page","Acc\xE8s \xE0 la page","Balises refus\xE9es","Certaines modifications n'ont pas pu \xEAtre enregistr\xE9es ; le stockage du navigateur est peut-\xEAtre plein.","Enregistrement","T\xE9l\xE9m\xE9trie","Langue du panneau","Surveillance active","\xC9tat des s\xE9lecteurs","Voyez ce qui reste local et v\xE9rifiez si Aviary fonctionne toujours avec X.","P\xE9rim\xE8tre de confidentialit\xE9","Int\xE9grations de page","Donn\xE9es locales","Compatibilit\xE9","Modifications non enregistr\xE9es","Impossible d'enregistrer les r\xE9glages. R\xE9essayez.","Enregistrez ou annulez vos modifications avant de quitter cette section.","Enregistrement...","Cette modification n'a pas pu \xEAtre enregistr\xE9e. Refaites-la, puis enregistrez.","Corrigez les valeurs non valides avant d\u2019enregistrer.","Diagnostic copi\xE9 dans le presse-papiers.","Suppression mise \xE0 jour.","La commande de suppression a \xE9chou\xE9.","Mode local uniquement activ\xE9.","Mode local uniquement d\xE9sactiv\xE9.","Balises d'analyse refus\xE9es.","Balises d'analyse autoris\xE9es.","Surveillance de l\u2019\xE9tat des s\xE9lecteurs activ\xE9e.","Surveillance de l\u2019\xE9tat des s\xE9lecteurs d\xE9sactiv\xE9e.","Observation structurelle copi\xE9e dans le presse-papiers.","Impossible de copier l\u2019observation structurelle.","M\xE9triques de performance r\xE9initialis\xE9es.","Impossible de r\xE9initialiser les m\xE9triques de performance.","Avertissements enregistr\xE9s effac\xE9s.","Impossible d'effacer les avertissements enregistr\xE9s.","Observations publicitaires r\xE9initialis\xE9es.","Impossible de r\xE9initialiser les observations publicitaires.","Profil chang\xE9. Rechargement\u2026","\xC9chec du changement de profil.","{moved} stockages attribu\xE9s ; {completedAfterRetry} termin\xE9s apr\xE8s une nouvelle tentative ; {skipped} existaient d\xE9j\xE0 ; {conflicted} en conflit ; {failed} \xE9checs.","Profil cr\xE9\xE9. Rechargement\u2026","\xC9chec de la cr\xE9ation du profil.","R\xE9ponse enregistr\xE9e.","Toutes les fonctionnalit\xE9s sont d\xE9sactiv\xE9es. La page est-elle toujours incorrecte ?","Recherche de fonctionnalit\xE9 effac\xE9e.","Recherche de fonctionnalit\xE9 arr\xEAt\xE9e ; toutes les fonctionnalit\xE9s sont r\xE9activ\xE9es.","Transfert vers Aria2 activ\xE9.","Transfert vers Aria2 d\xE9sactiv\xE9.","Point de terminaison Aria2 enregistr\xE9.","Secret Aria2 enregistr\xE9.","Seuil Aria2 enregistr\xE9.","Aria2 joignable.","Aria2 inaccessible : {error}","\xC9chec du test de connexion \xE0 Aria2.","{gid} annul\xE9.","\xC9chec de l\u2019annulation d\u2019Aria2 : {error}","\xC9chec de l\u2019annulation d\u2019Aria2.","\xC9chec de l'interrogation d'Aria2.","Transfert vers yt-dlp activ\xE9.","Transfert vers yt-dlp d\xE9sactiv\xE9.","Adresse de l'assistant yt-dlp enregistr\xE9e.","Secret de l'assistant yt-dlp enregistr\xE9.","Bluesky activ\xE9.","Bluesky d\xE9sactiv\xE9.","Service Bluesky enregistr\xE9.","Identifiant Bluesky enregistr\xE9.","Mot de passe d'application Bluesky enregistr\xE9.","Mastodon activ\xE9.","Mastodon d\xE9sactiv\xE9.","Instance Mastodon enregistr\xE9e.","Jeton Mastodon enregistr\xE9.","Pi\xE8ce jointe de republication activ\xE9e.","Pi\xE8ce jointe de republication d\xE9sactiv\xE9e.","{posts} publications envoy\xE9es sur Bluesky.{url}","\xC9chec de Bluesky : {error}","\xC9chec de la publication crois\xE9e vers Bluesky.","{posts} publications envoy\xE9es sur Mastodon.{url}","\xC9chec de Mastodon : {error}","\xC9chec de la publication crois\xE9e vers Mastodon.","Ex\xE9cutions IA activ\xE9es.","Ex\xE9cutions IA d\xE9sactiv\xE9es.","Point de terminaison IA enregistr\xE9.","Mod\xE8le d'IA enregistr\xE9.","Cl\xE9 d'API d'IA enregistr\xE9e.","Budget des requ\xEAtes IA enregistr\xE9.","Budget quotidien IA enregistr\xE9.","Recherche s\xE9mantique activ\xE9e.","Recherche s\xE9mantique d\xE9sactiv\xE9e.","Point de terminaison d'embeddings enregistr\xE9.","Mod\xE8le d'embeddings enregistr\xE9.","Cl\xE9 d'API d'embeddings enregistr\xE9e.","Budget des requ\xEAtes d\u2019embedding enregistr\xE9.","Budget quotidien des embeddings enregistr\xE9.","Vectorisation automatique activ\xE9e.","Vectorisation automatique d\xE9sactiv\xE9e.","Reconstruction de l'index s\xE9mantique\u2026","Les embeddings se sont arr\xEAt\xE9s au budget ({blocked} enregistrements n\u2019ont pas \xE9t\xE9 envoy\xE9s).","Indexation : +{added} nouvelles \xB7 ignor\xE9es {skipped} \xB7 erreurs {errors} \xB7 total {total}{trimmed}.","Le calcul des embeddings a \xE9chou\xE9.","Index s\xE9mantique effac\xE9.","Impossible d\u2019effacer l\u2019index s\xE9mantique.","Utilisation de l\u2019IA et des embeddings effac\xE9e.","Impossible d\u2019effacer l\u2019utilisation de l\u2019IA et des embeddings.","Pr\xE9f\xE9rences r\xE9initialis\xE9es. Le mode sans publicit\xE9 est activ\xE9.","Impossible de r\xE9initialiser les r\xE9glages.","R\xE9glages export\xE9s.","Impossible d'exporter les r\xE9glages.","Param\xE8tres import\xE9s. {warning}","\xC9chec de l\u2019importation : {errors}","Impossible d'importer les r\xE9glages.","Sauvegarde de la biblioth\xE8que t\xE9l\xE9charg\xE9e : {filename} ({collections} collections, {bytes}).","Impossible d\u2019exporter la sauvegarde compl\xE8te de la biblioth\xE8que.","Sauvegarde avec identifiants t\xE9l\xE9charg\xE9e : {filename} ({collections} collections, {bytes}).","Lecture de la sauvegarde de la biblioth\xE8que\u2026","Sauvegarde charg\xE9e : {collections} collections, {conflicts} changements.","Impossible de lire la sauvegarde de la biblioth\xE8que.","Annulation de la restauration\u2026","Simulation termin\xE9e. Aucune donn\xE9e locale n\u2019a chang\xE9.","\xC9chec de la simulation : {errors}","Impossible de simuler la restauration de la biblioth\xE8que.","Sauvegarde de la biblioth\xE8que restaur\xE9e ({collections} collections). Rechargement\u2026","Restauration annul\xE9e ; les donn\xE9es locales ont \xE9t\xE9 r\xE9tablies.","Restauration annul\xE9e.","\xC9chec de la restauration : {errors}","Impossible de restaurer la sauvegarde de la biblioth\xE8que.","Journal des actions activ\xE9.","Journal des actions d\xE9sactiv\xE9.","Journal d'audit effac\xE9.","Impossible d'effacer le journal d'audit.","{count} abonn\xE9s de @{handle} captur\xE9s. La liste avait fini de charger, ce sont donc tous les abonn\xE9s.","{count} abonn\xE9s de @{handle} captur\xE9s. La liste \xE9tait encore en cours de chargement, ceci ne correspond donc qu'\xE0 ce qui \xE9tait affich\xE9. Faites d\xE9filer jusqu'au bout et recommencez pour obtenir la liste compl\xE8te.","Aucune ligne UserCell trouv\xE9e.","L'instantan\xE9 a \xE9chou\xE9.","{count} abonnements de @{handle} captur\xE9s. La liste avait fini de charger, ce sont donc tous les abonnements.","{count} abonnements de @{handle} captur\xE9s. La liste \xE9tait encore en cours de chargement, ceci ne correspond donc qu'\xE0 ce qui \xE9tait affich\xE9. Faites d\xE9filer jusqu'au bout et recommencez pour obtenir la liste compl\xE8te.","Instantan\xE9s effac\xE9s.","Impossible d'effacer les instantan\xE9s.","Importation de l\u2019archive suspendue.","Importation de l\u2019archive reprise.","Importation de l\u2019archive annul\xE9e.","Nouvelle tentative d\u2019importation de l\u2019archive d\xE9marr\xE9e.","Lecture de l'archive : les gros fichiers prennent un instant\u2026","Archive {layout} lue. {records} enregistrements import\xE9s. R\xE9parations : {archiveLinks} liens de l'archive, {corpusLinks} liens captur\xE9s, {participants} identifiants de participants r\xE9solus, {unresolved} laiss\xE9s non r\xE9solus. Avertissements : {warnings} ; erreurs : {errors}. Fichiers : {recognized} reconnus, {skipped} ignor\xE9s, {malformed} mal form\xE9s.{absent}","\xC9chec de l'import de l'archive.","G\xE9n\xE9ration du rapport\u2026","Rapport t\xE9l\xE9charg\xE9.","Impossible de g\xE9n\xE9rer le rapport.","G\xE9n\xE9ration de l'aper\xE7u du nettoyage\u2026","{added} \xE9l\xE9ments ajout\xE9s ({protected} prot\xE9g\xE9s ignor\xE9s).","Impossible d'ajouter le nettoyage \xE0 la file.","File de nettoyage vid\xE9e.","Impossible de vider la file.","Alerte de plafond de stockage d\xE9sactiv\xE9e.","Alerte de plafond de stockage enregistr\xE9e.","Les images captur\xE9es gardent leur taille d'origine.","Les images captur\xE9es seront r\xE9duites.","Les vid\xE9os seront captur\xE9es sous forme d'image d'aper\xE7u.","Les vid\xE9os seront captur\xE9es en entier.","Lecture du rapport Dans les coulisses\u2026","Le rapport Dans les coulisses n'a pas pu \xEAtre lu.","Impossible d'exporter les rapports Dans les coulisses.","T\xE9l\xE9chargement de {count} fichiers s\xE9lectionn\xE9s.","\xC9chec du t\xE9l\xE9chargement des m\xE9dias captur\xE9s.","La recherche dans la biblioth\xE8que a \xE9chou\xE9. V\xE9rifiez le point de terminaison et la cl\xE9 d'embeddings dans Int\xE9grations.","Marque-page mis \xE0 jour.","Impossible de mettre \xE0 jour le marque-page.","Marque-page supprim\xE9.","Le marque-page avait d\xE9j\xE0 \xE9t\xE9 supprim\xE9.","Impossible de supprimer le marque-page.","Signets export\xE9s : {records} enregistrements dans {files} fichiers.","Impossible d\u2019exporter les signets.","Marque-pages supprim\xE9s.","Impossible de supprimer les marque-pages.","Bouton IA activ\xE9.","Bouton IA d\xE9sactiv\xE9.","D\xE9veloppement des liens activ\xE9.","D\xE9veloppement des liens d\xE9sactiv\xE9.","Nettoyage des liens activ\xE9.","Nettoyage des liens d\xE9sactiv\xE9.","Bouton Copier le lien d\xE9sactiv\xE9.","Bouton Copier le lien activ\xE9.","Couleurs de comptes enregistr\xE9es.","Notes de comptes effac\xE9es.","Impossible d'effacer les notes.","Capture pour l'export activ\xE9e.","Capture pour l'export d\xE9sactiv\xE9e.","Pr\xE9f\xE9rence de donn\xE9es brutes enregistr\xE9e.","Capture des octets multim\xE9dias activ\xE9e.","Capture des octets multim\xE9dias d\xE9sactiv\xE9e.","Pr\xE9f\xE9rence de d\xE9couverte des requ\xEAtes enregistr\xE9e.","Partage des posts prot\xE9g\xE9s activ\xE9.","Posts prot\xE9g\xE9s exclus des exportations \xE0 partager.","Partage des posts \xE0 audience inconnue activ\xE9.","Posts \xE0 audience inconnue exclus des exportations \xE0 partager.","Dossier d'enregistrement enregistr\xE9.","T\xE2che d\u2019exportation suspendue.","T\xE2che d\u2019exportation reprise.","T\xE2che d\u2019exportation annul\xE9e.","Collecte des publications visibles\u2026","Aucun post trouv\xE9 sur cette vue. Faites d\xE9filer le fil pour en charger, puis relancez l'export.","{records} enregistrements export\xE9s dans {files} ZIP \u2192 {filename}","{records} enregistrement export\xE9 \u2192 {filename}","{records} enregistrements export\xE9s \u2192 {filename}","L'export a \xE9chou\xE9. Consultez le diagnostic.","Aucune publication captur\xE9e ne contient encore de donn\xE9es de fil.","Lecteur des fils captur\xE9s export\xE9.","La reconstruction des fils a \xE9chou\xE9. Consultez les diagnostics.","Impossible de copier le diagnostic.","{records} enregistrements copi\xE9s dans le presse-papiers.","{records} enregistrements export\xE9s vers {target}.","L'export externe a \xE9chou\xE9.","Enregistrements par ZIP enregistr\xE9s.","R\xE9tention des t\xE2ches enregistr\xE9e.","R\xE9tention des enregistrements enregistr\xE9e.","R\xE9tention par anciennet\xE9 enregistr\xE9e.","WARC t\xE9l\xE9charg\xE9 ({records} enregistrements).","\xC9chec de l'export WARC.","WACZ t\xE9l\xE9charg\xE9 ({records} enregistrements, {size}).","L'export WACZ a \xE9chou\xE9. Lib\xE9rez de l'espace disque ou exportez moins d'enregistrements, puis r\xE9essayez.","Identit\xE9 de signature remplac\xE9e.","Impossible de remplacer l\u2019identit\xE9 de signature.","Preuve WACZ propre \xE0 Aviary t\xE9l\xE9charg\xE9e ({records} enregistrements, {size}).","L\u2019export de la preuve WACZ propre \xE0 Aviary a \xE9chou\xE9.","Paire de cl\xE9s de signature t\xE9l\xE9charg\xE9e : {filename}.","\xC9chec de l\u2019export de la paire de cl\xE9s de signature.","Boutons m\xE9dia activ\xE9s.","Boutons m\xE9dia d\xE9sactiv\xE9s.","Copie des liens des m\xE9dias activ\xE9e.","Copie des liens des m\xE9dias d\xE9sactiv\xE9e.","Pr\xE9f\xE9rence de qualit\xE9 d'origine enregistr\xE9e.","Images en taille r\xE9elle activ\xE9es.","Images en taille r\xE9elle d\xE9sactiv\xE9es.","Disposition des m\xE9dias enregistr\xE9e.","Mod\xE8le de nom de fichier enregistr\xE9.","Pr\xE9f\xE9rence de fichier annexe enregistr\xE9e.","D\xE9tection visuelle des doublons activ\xE9e.","D\xE9tection visuelle des doublons d\xE9sactiv\xE9e.","Historique des doublons activ\xE9.","Historique des doublons d\xE9sactiv\xE9.","Limite de t\xE9l\xE9chargements simultan\xE9s enregistr\xE9e.","Cadence des t\xE9l\xE9chargements enregistr\xE9e.","T\xE9l\xE9chargement des m\xE9dias de cette vue\u2026","Le t\xE9l\xE9chargement par lot a \xE9chou\xE9.","Historique effac\xE9.","Impossible d'effacer l'historique.","Historique export\xE9 : {records} entr\xE9es dans {files} fichiers.","Impossible d\u2019exporter l\u2019historique des t\xE9l\xE9chargements.","M\xE9dias captur\xE9s : {downloaded} enregistr\xE9s / {duplicate} doublons / {failed} \xE9checs.","Aucune t\xE2che multim\xE9dia \xE9chou\xE9e \xE0 r\xE9essayer.","Pr\xE9r\xE9glage appliqu\xE9 : {preset} ({changes})","Le pr\xE9r\xE9glage \xE9tait d\xE9j\xE0 appliqu\xE9 : {preset}","Impossible d'appliquer le pr\xE9r\xE9glage.","Ce th\xE8me n'est pas pris en charge.","Th\xE8me mis \xE0 jour.","Densit\xE9 mise \xE0 jour.","Largeur du fil mise \xE0 jour.","Police Chirp activ\xE9e.","Police Chirp d\xE9sactiv\xE9e.","Compteurs d'engagement masqu\xE9s.","Compteurs d'engagement affich\xE9s.","Pr\xE9f\xE9rence de compteurs enregistr\xE9e.","Compteur d'onglet masqu\xE9.","Compteur d'onglet affich\xE9.","Horodatages absolus activ\xE9s.","Horodatages absolus d\xE9sactiv\xE9s.","Ic\xF4ne d'onglet Aviary activ\xE9e.","Ic\xF4ne d'onglet de X restaur\xE9e.","Bordures de ligne masqu\xE9es.","Bordures de ligne r\xE9tablies.","Pr\xE9f\xE9rence de contraste enregistr\xE9e.","Pr\xE9f\xE9rence d'animation enregistr\xE9e.","Mode sans publicit\xE9 activ\xE9.","Mode sans publicit\xE9 d\xE9sactiv\xE9.","Journalisation publicitaire refus\xE9e.","Journalisation publicitaire autoris\xE9e.","Pr\xE9f\xE9rence de barre lat\xE9rale enregistr\xE9e.","Pr\xE9f\xE9rence de tendances enregistr\xE9e.","Pr\xE9f\xE9rence de mise en page enregistr\xE9e.","Pr\xE9f\xE9rence Grok enregistr\xE9e.","Pr\xE9f\xE9rence de survol enregistr\xE9e.","Mode concentration activ\xE9.","Mode concentration d\xE9sactiv\xE9.","Heures de lecture enregistr\xE9es.","Le fil d\xE9file sans s'arr\xEAter.","Les posts longs se d\xE9veloppent automatiquement.","Les posts longs restent r\xE9duits.","Le retour r\xE9tablit votre position.","Le retour utilise la position de X.","Marqueur de lecture activ\xE9.","Marqueur de lecture d\xE9sactiv\xE9.","Fils du marqueur enregistr\xE9s.","Mode \xE9criture activ\xE9.","Mode \xE9criture d\xE9sactiv\xE9.","Fil Abonnements activ\xE9.","Fil Abonnements d\xE9sactiv\xE9.","Onglet Pour vous masqu\xE9.","Onglet Pour vous restaur\xE9.","Les posts s'ouvrent depuis l'ic\xF4ne de r\xE9ponse.","Les posts s'ouvrent de nouveau depuis la ligne.","Visibilit\xE9 de la navigation enregistr\xE9e.","Vid\xE9o hors \xE9cran mise en pause.","Vid\xE9o hors \xE9cran laiss\xE9e en lecture.","La vid\xE9o continue.","La vid\xE9o se met en pause avec l'onglet.","Lecture en boucle activ\xE9e.","Lecture en boucle d\xE9sactiv\xE9e.","Fixation des playlists activ\xE9e.","Fixation des playlists d\xE9sactiv\xE9e.","Filtres activ\xE9s.","Filtres d\xE9sactiv\xE9s.","Att\xE9nuation des posts vus activ\xE9e.","Att\xE9nuation des posts vus d\xE9sactiv\xE9e.","Fils des publications vues enregistr\xE9s.","Posts vus oubli\xE9s.","Impossible d'effacer les posts vus.","R\xE8gles de filtrage enregistr\xE9es.","{count} r\xE8gle renouvel\xE9e.","{count} r\xE8gles renouvel\xE9es.","Impossible de renouveler les r\xE8gles expir\xE9es.","Filtre Premium enregistr\xE9.","Filtre des citations enregistr\xE9.","R\xE9ponses avec m\xE9dias masqu\xE9es.","R\xE9ponses avec m\xE9dias de nouveau visibles.","R\xE9glage du motif de filtrage enregistr\xE9.","Filtre d'engagement enregistr\xE9.","Mesure d'engagement enregistr\xE9e.","Filtres d\xE9sactiv\xE9s sur toutes les routes.","Jeu de r\xE8gles export\xE9 : {filename} ({count} lignes).","Impossible d\u2019exporter le jeu de r\xE8gles.","Le jeu de r\xE8gles doit \xEAtre v\xE9rifi\xE9.","L\u2019aper\xE7u du jeu de r\xE8gles est pr\xEAt.","Impossible d\u2019afficher l\u2019aper\xE7u du jeu de r\xE8gles.","{count} r\xE8gles ont \xE9t\xE9 ajout\xE9es.","Le jeu a \xE9t\xE9 remplac\xE9 par {count} r\xE8gles.","Impossible d\u2019importer le jeu de r\xE8gles.","Posts masqu\xE9s appliqu\xE9s.","Posts masqu\xE9s r\xE9affich\xE9s.","Boutons Masquer activ\xE9s.","Boutons Masquer d\xE9sactiv\xE9s.","Masquage d\xE9sactiv\xE9 sur toutes les routes.","Plus rien \xE0 restaurer.","Impossible d'annuler le dernier masquage.","Post restaur\xE9.","Ce post avait d\xE9j\xE0 \xE9t\xE9 restaur\xE9.","Impossible de restaurer la publication.","{removed} publication masqu\xE9e supprim\xE9e.","{removed} publications masqu\xE9es supprim\xE9es.","Impossible d'effacer les publications masqu\xE9es.","Les donn\xE9es h\xE9rit\xE9es n'ont pas pu \xEAtre affect\xE9es. Rien n'a \xE9t\xE9 d\xE9plac\xE9, elles sont donc rest\xE9es o\xF9 elles \xE9taient. Rouvrez cette page pour r\xE9essayer.","La recherche de fonctionnalit\xE9s n'a pas pu d\xE9marrer.","La recherche de fonctionnalit\xE9s n'a pas pu \xEAtre effac\xE9e.","La recherche n'a pas pu enregistrer cette r\xE9ponse. Elle en est rest\xE9e au m\xEAme point, appuyez donc de nouveau sur le m\xEAme bouton.","La recherche de fonctionnalit\xE9s n'a pas pu \xEAtre arr\xEAt\xE9e.","La restauration n'a pas pu \xEAtre annul\xE9e. Elle s'arr\xEAtera d'elle-m\xEAme \xE0 la fin de la collection en cours.","L'import n'a pas pu \xEAtre mis en pause. Il est peut-\xEAtre d\xE9j\xE0 termin\xE9. Rouvrez cette section pour voir o\xF9 il en est.","L'import n'a pas pu reprendre. Sa source enregistr\xE9e a peut-\xEAtre \xE9t\xE9 effac\xE9e. Relancez-le pour repartir du fichier.","L'import n'a pas pu \xEAtre annul\xE9. Il est peut-\xEAtre d\xE9j\xE0 termin\xE9. Rouvrez cette section pour voir o\xF9 il en est.","L'import n'a pas pu \xEAtre relanc\xE9. Choisissez de nouveau le fichier pour d\xE9marrer un import neuf.","La t\xE2che d'export n'a pas pu \xEAtre mise en pause. Elle est peut-\xEAtre d\xE9j\xE0 termin\xE9e. Rouvrez cette section pour voir son \xE9tat actuel.","La t\xE2che d'export n'a pas pu reprendre. Son point de reprise a peut-\xEAtre \xE9t\xE9 effac\xE9. Lancez plut\xF4t un nouvel export.","La t\xE2che d'export n'a pas pu \xEAtre annul\xE9e. Elle est peut-\xEAtre d\xE9j\xE0 termin\xE9e. Rouvrez cette section pour voir son \xE9tat actuel.","Ce lot n'a pas pu s'ex\xE9cuter. Accordez l'acc\xE8s au t\xE9l\xE9chargement sur la page des autorisations d'Aviary, puis r\xE9essayez.","Le lot n'a pas accept\xE9 cette instruction. Il est peut-\xEAtre d\xE9j\xE0 termin\xE9. Rouvrez cette section pour voir son \xE9tat actuel.","Les t\xE9l\xE9chargements en file d'attente n'ont pas pu reprendre. Accordez l'acc\xE8s au t\xE9l\xE9chargement sur la page des autorisations d'Aviary, puis r\xE9essayez.","Les t\xE9l\xE9chargements en \xE9chec n'ont pas pu \xEAtre relanc\xE9s. Accordez l'acc\xE8s au t\xE9l\xE9chargement sur la page des autorisations d'Aviary, puis r\xE9essayez.","Le r\xE9sum\xE9 n'a pas pu \xEAtre ouvert. Rien n'a \xE9t\xE9 perdu, rechargez la page et r\xE9essayez.","Aucun r\xE9sultat pour cette recherche.","Essayez un mot plus court ou choisissez une section \xE0 gauche.","Conserv\xE9e : le navigateur ne supprimera pas cette biblioth\xE8que pour r\xE9cup\xE9rer de l'espace.","Au mieux : le navigateur peut supprimer cette biblioth\xE8que si l'espace disque manque. Gardez une sauvegarde.","Le navigateur n'a pas indiqu\xE9 s'il conservera cette biblioth\xE8que. Gardez une sauvegarde.","Ce gestionnaire d'userscripts ne donne pas \xE0 Aviary l'acc\xE8s \xE0 la page elle-m\xEAme.","Ce navigateur n'a pas charg\xE9 le script de page d'Aviary.","Le script de page d'Aviary est charg\xE9, mais quelque chose d'autre a r\xE9pondu en premier, probablement une autre extension. Sur cette page, la protection anti-publicit\xE9 au niveau r\xE9seau n'est pas sous le contr\xF4le d'Aviary.","Indisponible dans ce navigateur.","Correspondances des s\xE9lecteurs","Surfaces obligatoires manquantes","Surfaces facultatives manquantes","S\xE9lecteurs de secours utilis\xE9s","Fonctionnalit\xE9s concern\xE9es","Derni\xE8re transition de s\xE9lecteur","Observations publicitaires","Nombre de marqueurs publicitaires","D\xE9rive du contrat publicitaire","Observations publicitaires conserv\xE9es","Native","Tendance","Promotion interne","Vid\xE9o","Connectez-vous \xE0 X avant d\u2019ex\xE9cuter.","S\xE9lectionnez au moins un type d\u2019activit\xE9 pour activer Ex\xE9cuter.","D\xE9marrage de la suppression\u2026","Long Animation Frame indisponible","Aucun \xE9chantillon d\u2019application","erreur","erreurs","La page \xE9tait toujours incorrecte avec toutes les fonctionnalit\xE9s d'Aviary d\xE9sactiv\xE9es : rien de ce que fait Aviary n'en est la cause. Une autre extension, un userscript ou X lui-m\xEAme est le prochain endroit o\xF9 chercher.","Aucune fonctionnalit\xE9 d'Aviary n'\xE9tait active, il n'y avait donc rien \xE0 chercher.","Aucun t\xE9l\xE9chargement actif.","Bloqu\xE9 par le mode local uniquement","bloqu\xE9 (budget \xE0 0)","Aucun r\xE9sultat (ou int\xE9gration d\xE9sactiv\xE9e).","Ouvrez la liste des abonn\xE9s ou des abonnements d'un profil, puis utilisez \xAB Capturer un instantan\xE9 \xBB pour l'enregistrer.","Absent de ce format :","Aucun enregistrement captur\xE9 ne correspond \xE0 \xAB {query} \xBB.","Dans les coulisses de X","Lisez localement le r\xE9sum\xE9 mensuel de visibilit\xE9 de X. Il pr\xE9sente des libell\xE9s agr\xE9g\xE9s, pas les pond\xE9rations de production ni un audit complet des posts.","Importer le JSON Dans les coulisses de X","Rapport Dans les coulisses enregistr\xE9 localement.","Aucun libell\xE9 de visibilit\xE9 n'a \xE9t\xE9 signal\xE9 ce mois-ci.","Aucun rapport X n'est encore import\xE9.","Importez un autre mois pour comparer les rapports.","T\xE9l\xE9charger la s\xE9lection","{selected} fichiers sur {total} s\xE9lectionn\xE9s. {unavailable} ne peuvent pas \xEAtre t\xE9l\xE9charg\xE9s.","Type de m\xE9dia","Tous les types","Tout s\xE9lectionner","Indisponible.","Cette recherche contient plus de {limit} fichiers t\xE9l\xE9chargeables. Affinez-la d'abord.","Aucune collection locale ne correspond \xE0 cette recherche.","Correspondance textuelle et s\xE9mantique","Correspondance s\xE9mantique","Correspondance textuelle","(sans texte)","Trouver les marque-pages locaux","Recherchez des publications enregistr\xE9es par texte, identifiant, tags, dossier ou ID. Les signets captur\xE9s incluent seulement les publications envoy\xE9es par X pendant votre d\xE9filement.","Rechercher dans les marque-pages locaux","Rien d'enregistr\xE9 pour l'instant. Utilisez \xAB Enregistrer localement \xBB sur un post pour en garder une copie ici.","Aucun marque-page local ne correspond \xE0 cette recherche.","Annotations","Notes du marque-page","Supprimer","Ajoutez-en une ci-dessous au format identifiant : note. Les notes apparaissent \xE0 c\xF4t\xE9 des posts de ce compte.","Activez la capture, faites d\xE9filer un fil, puis exportez. Les t\xE2ches et leurs enregistrements apparaissent ici.","G\xE9n\xE9ration de l'archive WARC\u2026","Cr\xE9ation de l\u2019archive WACZ\u2026","La paire de cl\xE9s stock\xE9e n\u2019est pas valide. Remplacez-la avant de signer une autre archive.","La premi\xE8re utilisation cr\xE9e une identit\xE9 P-384 locale. La signature reste d\xE9sactiv\xE9e pour les t\xE9l\xE9chargements WACZ ordinaires.","Cr\xE9ation d\u2019une nouvelle identit\xE9 de signature\u2026","Cr\xE9ation de la preuve WACZ propre \xE0 Aviary\u2026","Pr\xE9paration de la paire de cl\xE9s de signature\u2026","Exporter l\u2019historique des t\xE9l\xE9chargements","Exportez les doublons locaux en JSON et CSV pour une p\xE9riode choisie. Les URL des m\xE9dias ne sont jamais incluses.","Date de d\xE9but de l\u2019historique","Date de fin de l\u2019historique","Exporter la p\xE9riode","T\xE9l\xE9charger l\u2019audio captur\xE9","T\xE9l\xE9chargez les pistes audio d\xE9j\xE0 pr\xE9sentes dans les captures locales. Aucune recherche de m\xE9tadonn\xE9es n\u2019est effectu\xE9e.","T\xE9l\xE9charger les sous-titres captur\xE9s","T\xE9l\xE9chargez les pistes de sous-titres d\xE9j\xE0 pr\xE9sentes dans les captures locales. Aucune recherche de m\xE9tadonn\xE9es n\u2019est effectu\xE9e.","ligne","Les marqueurs pr\xE9c\xE9demment observ\xE9s ne sont plus d\xE9tect\xE9s : {markers}.","Pr\xEAt \xE0 ex\xE9cuter sur @{handle}.","{feature} : {count} ex\xE9cutions \xB7 {total} ms au total \xB7 {max} ms au maximum \xB7 {full} compl\xE8tes / {incremental} incr\xE9mentales","{observed} longues animations \xB7 {correlated} corr\xE9l\xE9es","{count} fonctions","X est en {language}, une langue pour laquelle Aviary n'a pas d'\xE9tiquettes publicitaires. Ici, les posts sponsoris\xE9s ne sont pas masqu\xE9s par \xE9tiquette.","{feature} est ce qui a modifi\xE9 cette page. Il a fallu {rounds} tours pour le trouver. Toutes les fonctionnalit\xE9s sont de nouveau actives, d\xE9sactivez donc celle-ci avec son propre r\xE9glage si vous voulez qu'elle le reste.","Tour {round} sur {total}. Les {off} fonctionnalit\xE9s sont d\xE9sactiv\xE9es.","Tour {round} sur {total}. {off} des {suspect} fonctionnalit\xE9s encore suspect\xE9es sont d\xE9sactiv\xE9es.","ID {gid} \xB7 {status}","{count} entr\xE9es","{posts} publications \xB7 {likes} mentions J\u2019aime \xB7 {messages} messages directs (exclus de la recherche publique) \xB7 {media} r\xE9f\xE9rences multim\xE9dias \xB7 {followers} abonn\xE9s \xB7 {following} abonnements \xB7 {lists} listes","{archiveLinks} liens de l\u2019archive + {corpusLinks} liens captur\xE9s d\xE9velopp\xE9s \xB7 {participants} identifiants de participants r\xE9solus \xB7 {unresolved} conserv\xE9s comme identifiants non r\xE9solus \xB7 aucune requ\xEAte effectu\xE9e","{status} \xB7 {filename} \xB7 {records} enregistrements \xB7 {files} fichiers \xB7 {warnings} avertissements","{saved} enregistr\xE9s \xB7 {mirrored} en miroir \xB7 {due} \xE0 \xE9ch\xE9ance \xB7 {tags} tags \xB7 {folders} dossiers","{public} publics \xB7 {protected} prot\xE9g\xE9s \xB7 {unknown} inconnus \xB7 {excluded} exclus des exportations \xE0 partager","{status} \xB7 {records} enregistrements \xB7 {surface}","Identit\xE9 locale {fingerprint}. Elle prouve la continuit\xE9 de cette cl\xE9, pas ce que X a servi.","{count} durant cette session","{imported} r\xE8gles trouv\xE9es. Le remplacement est pr\xEAt. L\u2019ajout est bloqu\xE9 \xE0 la ligne {line} : {error}","{imported} r\xE8gles trouv\xE9es. Ajout de {added}; {duplicates} sont d\xE9j\xE0 pr\xE9sentes. Remplacement de {replaced} par {total}.","Oublie les avertissements et erreurs stock\xE9s. Seuls le texte des messages d'Aviary, l'heure et les noms de ses champs de d\xE9tail sont \xE9crits ici.","Effacez l\u2019historique local limit\xE9 des marqueurs et son avertissement de d\xE9rive. Aucun texte de publication, identifiant, URL ou corps de r\xE9ponse n\u2019est stock\xE9 ici.","D\xE9sactive toutes les fonctionnalit\xE9s d'Aviary, puis les r\xE9active par moiti\xE9s en demandant apr\xE8s chaque tour si la page est toujours incorrecte. Elle nomme la responsable en cinq tours environ. Rien n'est \xE9crit dans vos r\xE9glages : recharger restaure tout quoi que vous fassiez, y compris si vous vous arr\xEAtez en cours de route. Le Centre de contr\xF4le et sa langue restent actifs tout du long, aucun des deux ne peut donc \xEAtre d\xE9sign\xE9.","Recommencer avec toutes les fonctionnalit\xE9s d\xE9sactiv\xE9es.","Ranger la recherche. Rien ne change ; toutes les fonctionnalit\xE9s sont d\xE9j\xE0 actives.","Le probl\xE8me persiste avec ces fonctionnalit\xE9s d\xE9sactiv\xE9es : c'est donc l'une des autres.","Le probl\xE8me a disparu avec ces fonctionnalit\xE9s d\xE9sactiv\xE9es : c'est donc l'une d'elles.","R\xE9activer toutes les fonctionnalit\xE9s et oublier la recherche. Aucune r\xE9ponse n'est enregistr\xE9e.","Mettre {filename} en pause.","Reprendre {filename}.","Annuler {filename}.","R\xE9essayer {filename}.","Mettre {jobId} en pause.","Reprendre {jobId}.","Annuler {jobId}.","Copier l\u2019observation structurelle","Performance des mutations","R\xE9initialiser les m\xE9triques de performance","\xC9tiquettes publicitaires pour cette langue","Avertissements enregistr\xE9s","Effacer les avertissements enregistr\xE9s","R\xE9initialiser les observations publicitaires","Profil actif","Changer de profil","Attribuer ici les donn\xE9es h\xE9rit\xE9es","Nouveau profil","Trouver la fonctionnalit\xE9 qui casse cette page","Recherche de fonctionnalit\xE9","Chercher \xE0 nouveau","Effacer le r\xE9sultat","Encore suspect\xE9es","La page est toujours incorrecte","La page semble correcte maintenant","Arr\xEAter la recherche","Version de la sauvegarde","Collections de la sauvegarde","Changements des collections","Identifiants","Avertissements de la sauvegarde","Annuler la restauration","Simuler la restauration","Restaurer cette sauvegarde de biblioth\xE8que","Aucun instantan\xE9 pour l'instant","Collections import\xE9es","R\xE9parations locales de l\u2019archive","Importation d\u2019archive","Mettre en pause l\u2019importation de l\u2019archive","Reprendre l\u2019importation de l\u2019archive","Annuler l\u2019importation de l\u2019archive","R\xE9essayer l\u2019importation de l\u2019archive","Dernier rapport Dans les coulisses","Libell\xE9s du dernier rapport","Rapports Dans les coulisses","Comparaison mensuelle","Exporter les rapports Dans les coulisses enregistr\xE9s","Signets locaux","Exporter les signets locaux","Exporter pour les gestionnaires de signets","Effacer les signets locaux","Aucune note de compte pour l'instant","Couverture d\u2019audience","Aucune t\xE2che d'export pour l'instant","T\xE2che d\u2019exportation","Mettre en pause la t\xE2che d\u2019exportation","Reprendre la t\xE2che d\u2019exportation","Annuler la t\xE2che d\u2019exportation","Reconstruire les fils captur\xE9s","Lot de m\xE9dias actif","Correspondances de doublons","Re\xE7us de qualit\xE9","Derni\xE8re correspondance de doublon","Effacer l'historique des t\xE9l\xE9chargements","Reprendre les m\xE9dias en file","R\xE9essayer les m\xE9dias \xE9chou\xE9s","Playlists r\xE9\xE9crites","Oublier les posts vus","R\xE8gles illisibles","R\xE8gles expir\xE9es","Renouveler les r\xE8gles expir\xE9es","Publications disponibles","Ouvrir le r\xE9capitulatif","Mettre en pause","Reprendre","Arr\xEAter","Remplacer la paire de cl\xE9s","Tout va bien : chaque modification a \xE9t\xE9 enregistr\xE9e.","Copie la fa\xE7on dont X construit cette page (nombre d\u2019\xE9l\xE9ments, imbrication et mise en page) pour actualiser les donn\xE9es de test d\u2019Aviary. Aucun texte de publication, nom, identifiant d\u2019utilisateur, lien ni ID.","Le minutage des mutations reste local et ne conserve que les identifiants de fonctions et des dur\xE9es limit\xE9es.","D\xE9place vers le profil actif les r\xE9glages et les stockages de biblioth\xE8que ant\xE9rieurs aux profils qui ne sont attribu\xE9s \xE0 personne. Rien n'est d\xE9duit de la route X actuelle.","Cr\xE9ez un profil hors ligne vide avant de changer de compte ou d'importer une autre archive.","Aucun enregistrement.","Mesure en cours\u2026","Ce magasin du navigateur ne peut pas \xEAtre mesur\xE9 d'ici, donc Aviary n'en indique pas la taille.","Ce navigateur ne d\xE9taille pas son rapport de stockage par type, seule la mesure propre \xE0 Aviary est affich\xE9e.","T\xE9l\xE9charge les rapports normalis\xE9s en JSON local. Ce sont vos donn\xE9es provenant de X ; Aviary n'ajoute pas de pond\xE9rations de classement et n'inf\xE8re aucun score.","T\xE9l\xE9chargez un JSON et un CSV pour chaque signet de ce profil. Le miroir ne conserve que ce que X a envoy\xE9 \xE0 la page pendant votre d\xE9filement.","T\xE9l\xE9chargez un fichier de signets de navigateur que Karakeep, Linkwarden, linkding et tous les navigateurs importent, ainsi que le CSV qu\u2019importe Raindrop.io.","Supprime tous les favoris locaux enregistr\xE9s.","Lisez les r\xE9ponses captur\xE9es dans l\u2019ordre du message parent. Les messages parents absents restent visibles comme des lacunes locales.","R\xE9initialise l'index local de doublons.","R\xE9cup\xE8re les t\xE9l\xE9chargements en pause ou en file d'attente d'une session pr\xE9c\xE9dente.","Relance toutes les t\xE2ches m\xE9dia \xE9chou\xE9es ou annul\xE9es de la file persistante.","Packs de pr\xE9r\xE9glages indisponibles dans cette version.","Efface les identifiants de posts enregistr\xE9s pour que tout redevienne non vu.","Red\xE9marre d\xE8s maintenant la p\xE9riode propre \xE0 chaque r\xE8gle expir\xE9e. Rien n'est supprim\xE9 \xE0 l'expiration : une r\xE8gle peut toujours \xEAtre r\xE9tablie.","Choisissez une p\xE9riode, filtrez par type, regroupez par auteur et ouvrez la publication d'origine. Aucune requ\xEAte n'est effectu\xE9e.","Stock des publications masqu\xE9es indisponible dans cette version.","Pr\xEAt.","Suppression termin\xE9e.","La limite d\u2019actions est atteinte. Reprenez pour lancer un autre lot.","Suppression en pause.","Suppression arr\xEAt\xE9e.","L\u2019aper\xE7u est en cours.","La suppression est en cours.","Le compte connect\xE9 a chang\xE9. Aucune autre action n\u2019a \xE9t\xE9 effectu\xE9e.","Un autre onglet X ex\xE9cute d\xE9j\xE0 cette suppression.","Cet onglet ex\xE9cute d\xE9j\xE0 une suppression.","X a affich\xE9 une v\xE9rification de connexion ou anti-abus. Terminez-la, puis reprenez.","S\xE9lectionnez au moins une cat\xE9gorie du compte.","Aucune suppression en cours \xE0 mettre en pause.","Aucune suppression en pause \xE0 reprendre.","Aucune suppression \xE0 arr\xEAter.","Supprimer l\u2019activit\xE9 X est encore en cours de chargement.","Reprenez cette suppression depuis l\u2019onglet X qui l\u2019a lanc\xE9e.","X n\u2019a pas appliqu\xE9 l\u2019action apr\xE8s cinq rechargements automatiques de la page. Reprenez pour r\xE9essayer.","Une erreur inattendue a arr\xEAt\xE9 la suppression.","La commande de suppression n\u2019a pas pu aboutir.","Nettoyage du compte en pause.","Nettoyage du compte arr\xEAt\xE9.","Historique du nettoyage du compte effac\xE9.","Ce nettoyage est pass\xE9 dans un autre onglet X.","Ouverture de {category}.","Aper\xE7u de {category}.","Nettoyage de {category}.","Les passes de nettoyage s\xE9lectionn\xE9es sont termin\xE9es.","Chargement d\u2019autres \xE9l\xE9ments ({categoryLower}).","{count} \xE9l\xE9ments suppl\xE9mentaires charg\xE9s ({categoryLower}).","X charge encore des \xE9l\xE9ments plus anciens ({categoryLower}).","Recherche d\u2019autres \xE9l\xE9ments ({categoryLower}, {checks}/{limit}).","{category} : {count} trouv\xE9s.","{category} : {count} supprim\xE9s.","Pause de {seconds} secondes apr\xE8s {count} actions. La suppression reprend automatiquement.","Reprise de {category}.","Un \xE9l\xE9ment a \xE9t\xE9 ignor\xE9, car la commande attendue \xE9tait absente.","Une action sur le compte n\u2019a pas pris effet. Aviary va r\xE9essayer.","Rechargement de {category} depuis le d\xE9but pour v\xE9rifier que rien n\u2019a \xE9t\xE9 oubli\xE9.","La nouvelle v\xE9rification n\u2019a plus trouv\xE9 d\u2019\xE9l\xE9ments ({categoryLower}).","Plus aucun \xE9l\xE9ment trouv\xE9 ({categoryLower}).","Rechargement des J'aime pour la prochaine fen\xEAtre de limite de X.","X n\u2019a pas appliqu\xE9 l\u2019action deux fois. Attente de {seconds} secondes avant de recharger {category} ({attempt}/{max}).","Rechargement de {category} maintenant. La suppression reprend automatiquement.","Le verrou du nettoyage du compte n\u2019a pas pu \xEAtre renouvel\xE9.","Connectez-vous \xE0 X, puis reprenez.","Une erreur inattendue a arr\xEAt\xE9 le nettoyage du compte.","Le nettoyage du compte est bloqu\xE9 et demande votre attention.","La limite de X de 500 actions J'aime est atteinte. Attente de {seconds} secondes avant la prochaine fen\xEAtre. La suppression reprend automatiquement.","La limite de X de 500 actions J'aime est atteinte. Attente de 1 minute avant la prochaine fen\xEAtre. La suppression reprend automatiquement.","La limite de X de 500 actions J'aime est atteinte. Attente de {minutes} minutes avant la prochaine fen\xEAtre. La suppression reprend automatiquement.","Ouvrir le menu de commandes IA d'Aviary","Ex\xE9cuter avec le fournisseur","en cours\u2026","r\xE9sultat copi\xE9 dans le presse-papiers.","Le r\xE9sultat n'a pas pu \xEAtre copi\xE9. Votre navigateur a bloqu\xE9 l'acc\xE8s au presse-papiers.","le fournisseur n'a pas r\xE9pondu","V\xE9rifiez la cl\xE9 et le mod\xE8le dans Int\xE9grations.","Prompt copi\xE9 dans le presse-papiers. Collez-le dans votre assistant.","Le prompt n'a pas pu \xEAtre copi\xE9. Votre navigateur a bloqu\xE9 l'acc\xE8s au presse-papiers.","V\xE9rifier la requ\xEAte IA externe","Rien n\u2019est envoy\xE9 avant de choisir Envoyer la requ\xEAte.","illimit\xE9","Aviary conserve uniquement des compteurs d'utilisation ; la conservation du fournisseur suit sa politique.","Le budget a bloqu\xE9 cette requ\xEAte.","Envoyer la requ\xEAte","Traduire","Traduit le post s\xE9lectionn\xE9 dans votre langue active.","R\xE9sumer","R\xE9sume un fil ou un long post en 3 points.","Expliquer","Explique le contexte, le jargon et les r\xE9f\xE9rences du post.","Prompt de v\xE9rification","G\xE9n\xE8re un prompt de v\xE9rification pour le post (aucun appel r\xE9seau sans votre cl\xE9).","Extraits","Ouvrir les extraits du compositeur Aviary","Aucun extrait pour l'instant. Ajoutez-en dans le Centre de contr\xF4le \u2192 Biblioth\xE8que.","Cliquez d'abord dans le compositeur, puis choisissez un extrait.","Aviary est actif","Deux choses sont activ\xE9es d\xE8s le d\xE9part. Tout le reste reste d\xE9sactiv\xE9 jusqu'\xE0 ce que vous l'activiez.","Les posts sponsoris\xE9s, les tendances promues et les pre-rolls sont masqu\xE9s.","Les photos et vid\xE9os re\xE7oivent un bouton de t\xE9l\xE9chargement qui n'agit que lorsque vous cliquez dessus.","Ouvrez Aviary depuis la derni\xE8re ligne de la navigation gauche de X pour modifier tout cela.","Compris","Votre biblioth\xE8que locale d\xE9passe d\xE9j\xE0 le plafond de stockage que vous avez fix\xE9. Rien n'a \xE9t\xE9 supprim\xE9.","Cette capture fait d\xE9passer \xE0 votre biblioth\xE8que locale le plafond de stockage que vous avez fix\xE9. Rien n'a \xE9t\xE9 supprim\xE9.","Originales","Citations","Filtr\xE9es","Toutes","Cat\xE9gories du r\xE9capitulatif","R\xE9capitulatif","Fermer le r\xE9capitulatif","P\xE9riode","Trier","Plus r\xE9cent d\u2019abord","Plus ancien d\u2019abord","Les moins denses d'abord","Grouper par auteur","Une p\xE9riode calme. Rien de nouveau \xE0 consulter.","Rien sur cette p\xE9riode.","Le r\xE9capitulatif ne contient que les publications qu'Aviary a d\xE9j\xE0 affich\xE9es. Il n'en demande pas d'autres \xE0 X.","C'est tout.","Compte inconnu","Photo","Audio","Sous-titres","Miniature","Charger l'aper\xE7u","Ouvrir les sous-titres","Ouvrir la publication","Liens principaux","publication vue par Aviary sur cette p\xE9riode","publications vues par Aviary sur cette p\xE9riode","partage","partages","Sous votre seuil d'engagement","Masqu\xE9 : ce post contient une photo","Masqu\xE9 : ce post contient une vid\xE9o","Masqu\xE9 : ce post contient un GIF","Masqu\xE9 : ce post vient d'un compte certifi\xE9","Masqu\xE9 : ce post en cite un autre","Att\xE9nu\xE9 par votre r\xE8gle","Masqu\xE9 par votre r\xE8gle","Att\xE9nu\xE9 par votre mot-cl\xE9","Masqu\xE9 par votre mot-cl\xE9","Att\xE9nu\xE9 par votre motif","Masqu\xE9 par votre motif","Masquer ce post","Post masqu\xE9","Impossible d'enregistrer le post masqu\xE9. Le stockage a refus\xE9 l'\xE9criture.","Annuler","Impossible de restaurer ce post.","En dehors de vos heures de lecture","Aviary masque le fil jusqu'\xE0 votre prochaine plage. Rien n'est bloqu\xE9 et rien n'a quitt\xE9 cet appareil.","Laisse-moi passer cinq minutes","Les clics sur la ligne sont d\xE9sactiv\xE9s. L'ic\xF4ne de r\xE9ponse ouvre le post.","Afficher plus de posts","\xC9chec de l\u2019enregistrement du marque-page.","Enregistrer localement","Supprimer le marque-page local","Copier le lien","Copier le lien de ce post","Ce post n'a aucun lien qu'Aviary puisse copier.","Copi\xE9","\xC9chec","Le presse-papiers a refus\xE9 cette copie.","Annotation","\xC9tiquette","meilleur direct","L'acc\xE8s au t\xE9l\xE9chargement n'a pas \xE9t\xE9 accord\xE9. Ouvrez les options d'Aviary pour activer les t\xE9l\xE9chargements du navigateur.","\xC9chec du t\xE9l\xE9chargement du m\xE9dia. R\xE9essayez avec le bouton sur le post.","Faites un clic droit sur une image ou une vid\xE9o, puis choisissez le t\xE9l\xE9chargement Aviary.","T\xE9l\xE9charger \xB7 Meilleur MP4 direct","T\xE9l\xE9charger","T\xE9l\xE9charge les m\xE9dias propres \xE0 ce post. Les m\xE9dias cit\xE9s et ceux des cartes ont leur propre bouton T\xE9l\xE9charger.","T\xE9l\xE9charger tous les m\xE9dias de cette publication","La vid\xE9o directe est encore en cours de chargement. R\xE9essayez dans un instant.","Copier les liens","Copier les meilleurs liens directs des m\xE9dias de ce post","adaptatif","Envoyer \xE0 yt-dlp","Envoyer la vid\xE9o adaptative observ\xE9e au yt-dlp local","Copier la commande yt-dlp","Copier la commande yt-dlp pour la vid\xE9o adaptative observ\xE9e","Vid\xE9o adaptative de meilleure qualit\xE9","Envoi en cours\u2026","Refus\xE9","L'assistant yt-dlp local a refus\xE9 cette t\xE2che.","L'assistant yt-dlp local a \xE9chou\xE9.","Enregistr\xE9","Vid\xE9o adaptative enregistr\xE9e par yt-dlp.","Manquant","La t\xE2che yt-dlp n'est plus disponible. Copiez la commande pour r\xE9essayer.","L'assistant yt-dlp local est injoignable.","Commande yt-dlp copi\xE9e.","La commande yt-dlp n'a pas pu \xEAtre copi\xE9e.","T\xE9l\xE9chargement\u2026","R\xE9essayer","Indisponible","D\xE9marr\xE9","Le navigateur transf\xE8re encore ce fichier. Consultez vos t\xE9l\xE9chargements pour le r\xE9sultat.","Votre navigateur a ouvert ce fichier au lieu de l'enregistrer. Accordez \xE0 Aviary l'autorisation de t\xE9l\xE9chargement pour un vrai enregistrement.","Ignor\xE9 car les octets t\xE9l\xE9charg\xE9s correspondent \xE0 un \xE9l\xE9ment de l\u2019historique.","Ignor\xE9 car l\u2019image ressemble \xE0 un \xE9l\xE9ment de l\u2019historique.","Ignor\xE9 car il s\u2019agit du m\xEAme m\xE9dia X dans une autre taille.","Aviary a besoin de l'autorisation de t\xE9l\xE9chargement du navigateur. Ouverture de sa page d'options.","R\xE9essayer l\u2019image originale","T\xE9l\xE9charg\xE9 pr\xE9c\xE9demment","Qualit\xE9 originale","Qualit\xE9 de secours. Cliquez pour r\xE9essayer l\u2019originale","Meilleure qualit\xE9 directe","Qualit\xE9 inconnue","Cette image n'est pas disponible au t\xE9l\xE9chargement.","Autoriser","Autorisations","Acc\xE8s aux t\xE9l\xE9chargements","Activez les autorisations dont Aviary a besoin pour t\xE9l\xE9charger des vid\xE9os et des images dans la meilleure qualit\xE9. Rien ne quitte votre navigateur.","T\xE9l\xE9chargements pr\xEAts","accord\xE9","facultatives","Tout est facultatif. Vous gardez le contr\xF4le.","Enregistrer des vid\xE9os et des images","v\xE9rification\u2026","Enregistre la meilleure version disponible de la vid\xE9o ou de l\u2019image avec vos r\xE9glages de nom de fichier et de doublons.","Autoriser les t\xE9l\xE9chargements","R\xE9voquer","Lire les m\xE9dias d\u2019origine directement","Permet \xE0 Aviary de r\xE9cup\xE9rer directement les m\xE9dias en taille r\xE9elle. Les boutons de t\xE9l\xE9chargement fonctionnent aussi sans cette autorisation.","Autoriser les h\xF4tes m\xE9dia","Joindre l\u2019assistant yt-dlp local","Uniquement pour l\u2019assistant yt-dlp facultatif. Aviary lui parle depuis l\u2019extension, donc Chrome ne demande pas \xE0 x.com l\u2019acc\xE8s au r\xE9seau local.","Autoriser l\u2019assistant","Commencer \xE0 t\xE9l\xE9charger","Activez l\u2019enregistrement en un clic dans votre navigateur.","Ouvrez X","Aviary ajoute automatiquement T\xE9l\xE9charger aux publications avec un m\xE9dia.","Choisissez T\xE9l\xE9charger","Aviary choisit la meilleure qualit\xE9 disponible.","Ouvrir X pour t\xE9l\xE9charger","Priv\xE9 par d\xE9faut","Rien ne quitte votre navigateur.","Les r\xE9glages, filtres, notes et archives se trouvent dans le Centre de contr\xF4le sur x.com. Cette page ne g\xE8re que les autorisations du navigateur.","Ce navigateur n'expose pas l'API des autorisations.","Demande abandonn\xE9e. Rien n'a chang\xE9.","R\xE9voqu\xE9.","Rien \xE0 r\xE9voquer.","non accord\xE9","Accord\xE9. Les m\xE9dias sont d\xE9sormais enregistr\xE9s par le navigateur.","Accord\xE9. Aviary peut d\xE9sormais lire les m\xE9dias en taille r\xE9elle pour les exports.","Accord\xE9. Aviary joint l\u2019assistant local sans demande du navigateur.","Aviary pour X","Am\xE9lioration locale de X/Twitter avec contr\xF4les r\xE9versibles et confidentialit\xE9 par d\xE9faut.","T\xE9l\xE9charger le m\xE9dia avec Aviary","Archive Aviary","Lecteur d\u2019archive local. Les r\xE9f\xE9rences distantes ne sont jamais r\xE9cup\xE9r\xE9es automatiquement.","Rechercher des entr\xE9es","\xC9tat des m\xE9dias","Tous les m\xE9dias","Octets captur\xE9s","R\xE9f\xE9rence distante","Compte","Vue des fils","M\xE9dias","entr\xE9es","affich\xE9es","Aucune entr\xE9e correspondante.","source","octets","SHA-256","Ouvrir l\u2019URL source","publications","pr\xEAt hors ligne","r\xE9seau potentiellement n\xE9cessaire","Publication captur\xE9e manquante","Ce message parent n\u2019a pas \xE9t\xE9 captur\xE9 localement.","\xC9change","{count} publications de {author}","D\xE9marrer","Nettoyage du compte","enregistrement","Autorisations facultatives","L\u2019action a \xE9chou\xE9.","Contr\xF4les sur les publications","Nommage des fichiers","Comportement par lot","\xC9tat de la file","En file","La qualit\xE9 d'origine est appliqu\xE9e lorsque les contr\xF4les de t\xE9l\xE9chargement sont activ\xE9s.","Enregistrer la liste"],"de":["Aviary-Einstellungen","Ein ruhigeres X. Lokale Daten.","Schlie\xDFen","Aviary","Anzeigen, Downloads, Filter und mehr durchsuchen","Einstellungen durchsuchen","Verwerfen","Speichern","Schalter und Felder warten auf Speichern. Schaltfl\xE4chen werden sofort ausgef\xFChrt.","Lokal gespeichert","Einstellungsbereiche","Hier starten","Schnelleinrichtung","Alltag","Darstellung","Seite aufr\xE4umen","Inhaltsfilter","Downloads","Deine Daten","Gespeicherte Beitr\xE4ge","Import und Export","X-Aktivit\xE4t l\xF6schen","Weitere Werkzeuge","Nachholen","Ausgeblendete Beitr\xE4ge","Videowiedergabe","X-Archiv","Verbindungen","Sicherung und Zur\xFCcksetzen","Datenschutz und Diagnose","So funktioniert das Speichern","Schalter und Felder warten auf Speichern. Schaltfl\xE4chen wie Anwenden, Exportieren, Vorschau und L\xF6schen werden sofort ausgef\xFChrt.","Einstellungen \xF6ffnen","X ruhiger machen","Blende Anzeigen, Trends, Vorschl\xE4ge und nicht verwendete Navigation aus.","Unerw\xFCnschte Beitr\xE4ge ausblenden","Nach W\xF6rtern, Medien, Abzeichen oder Seite filtern.","Fotos und Videos speichern","Lege Qualit\xE4t, Dateinamen, Duplikatpr\xFCfung und Warteschlangenverhalten fest.","Kontoaktivit\xE4t l\xF6schen","Entferne Beitr\xE4ge, Antworten, Reposts, Likes oder Lesezeichen.","Ruhiges Lesen","Blendet Trends, Zeilenrahmen und Interaktionszahlen aus, dimmt Premium-Beitr\xE4ge, bereinigt t.co, dichtes und gedimmtes Design.","Rechte Seitenleiste ausblenden","Aktiviert","Hover-Vorschauen unterdr\xFCcken","Interaktionszahlen ausblenden","Design","Gedimmt","Anwenden","Medienarchiv","Downloads in Originalqualit\xE4t, deterministische Dateinamen, Verlauf ohne Duplikate, gestapelte Medien.","Originalqualit\xE4t bevorzugen","Medienlayout","Gestapelt","Download-Schaltfl\xE4chen anzeigen","Inhaltserstellung","Schreibmodus, Textbausteine im Editor, bereinigte Teilen-Schaltfl\xE4che, Seitenleiste und Trends ausgeblendet.","Schreibmodus","Trends ausblenden","Striktes Raster","Recherche","Export-Erfassung an, Formate JSON+CSV+HTML+MD, Query-IDs automatisch erkennen, Rohdaten.","Sichtbare Beitr\xE4ge erfassen","Rohdaten aufbewahren","Exportformate","JSON, CSV, HTML, Markdown","Klassisch","Stellt das gedimmte Thema wieder her, beh\xE4lt die Seitenleiste, blendet nur Grok aus, kein Premium-Filter.","Kompaktmodus","Deaktiviert","Grok-Oberfl\xE4chen ausblenden","Minimalistisch","Maximal aufger\xE4umt: keine Zahlen, keine Rahmen, keine Trends, sichere Zonen f\xFCr gro\xDFe Schrift.","Noir","Sprache","\xDCbersetzt das Panel und legt die Leserichtung fest, rechts nach links f\xFCr Arabisch und Hebr\xE4isch. Unter Vertrauen steht, wie vollst\xE4ndig die gew\xE4hlte Sprache ist; Fehlendes bleibt Englisch.","W\xE4hle eine fertige Einrichtung oder springe direkt zu einer h\xE4ufigen Aufgabe.","H\xE4ufige Aufgaben","Fertige Einrichtungen","Sprache","Noir wird automatisch angewendet. W\xE4hle Aus, um das X-eigene Design zu verwenden.","Aus (X' eigenes Design)","Lichter aus","Graphit","Pflaume","Mitternacht","Noir (Standard)","Verdichtet die Abst\xE4nde der Timeline zum schnellen \xDCberfliegen.","Timeline-Breite","Breit nutzt den gesamten Platz neben der Navigation und blendet die Entdeckungsleiste aus. Komfortabel beh\xE4lt diese Leiste bei.","Standard","Komfortabel","Breit (Standard)","Chirp-Schrift wiederherstellen","Erzwingt X' eigene Chirp-Schrift dort, wo die Seite auf eine Systemschrift zur\xFCckgefallen ist.","Hauptschalter f\xFCr die vier Zahlen unten. Die Bedienelemente funktionieren weiterhin, und Screenreader nennen die Summen weiterhin.","Antwortzahlen ausblenden","Gilt, solange \u201EInteraktionszahlen ausblenden\u201C aktiv ist.","Repost-Zahlen ausblenden","Gef\xE4llt-mir-Zahlen ausblenden","Aufrufzahlen ausblenden","Gilt, solange \u201EInteraktionszahlen ausblenden\u201C aktiv ist. Die Aufrufsumme steht in einem Analyse-Link, nicht in einer Aktionsschaltfl\xE4che.","Z\xE4hler im Tab-Titel ausblenden","Entfernt X' Ungelesen-Z\xE4hler aus dem Tab-Titel, damit der Tab keinen Hinweis zur\xFCckbringt, den du bereits ausgeblendet hast.","Absolute Zeitstempel","Zeigt auf jedem Beitrag das genaue Datum und die genaue Uhrzeit statt X' relativer Angabe.","Aviarys Tab-Symbol verwenden","Ersetzt X' Favicon durch Aviarys Marke, damit sich dessen Tabs leicht herausgreifen lassen. Ausgeschaltet kehrt X' eigenes Symbol zur\xFCck.","Zeilentrenner ausblenden","Entfernt den 1-px-Trenner unter jedem Beitrag und die Seitenlinien der Hauptspalte.","Hoher Kontrast","Verwendet kr\xE4ftigere R\xE4nder und st\xE4rkeren Textkontrast.","Reduzierte Bewegung","Systemeinstellung folgen","Immer reduzieren","Nie reduzieren","Benutzerdefiniertes CSS","Optionale lokale Anpassungen f\xFCr die unten begrenzten Bereiche. CSS verl\xE4sst dieses Profil nie und geh\xF6rt nicht zur Fehlerbericht-Unterst\xFCtzung.","CSS f\xFCr Beitr\xE4ge","Auf angezeigte Beitr\xE4ge begrenzt. Beispiel: article { border-radius: 18px; }","CSS f\xFCr Medienaktionen","Auf Aviary-Medienbuttons und deren Inhalte begrenzt.","Navigations-CSS","Auf die Navigationsleiste von X begrenzt.","CSS f\xFCr die Seitenleiste","Auf die Entdeckungsseitenleiste von X begrenzt.","Editor-CSS","Auf die Editor-Symbolleiste und das Textfeld begrenzt.","\xC4ndere Farben, Abst\xE4nde, Text und die auf Beitr\xE4gen gezeigten Zahlen.","Darstellung und Layout","Beitragsdetails","Barrierefreiheit","Erweiterte Gestaltung","Der Schutz beginnt beim Laden des Dokuments.","Werbefreier Modus","Blendet gesponserte Beitr\xE4ge, bezahlte Partnerschaften, beworbene Trends, Eigenwerbung und sichtbare Pre-Rolls aus. Aviary verweigert au\xDFerdem den separaten Protokollierungsaufruf f\xFCr beworbene Inhalte von X, ohne die Timeline-Auslieferung zu blockieren.","X' Werbe-Protokollaufruf ablehnen","Gilt nur, solange der werbefreie Modus aktiv ist. Aviary verweigert genau eine Anfrage (den separaten Protokollierungsaufruf f\xFCr beworbene Inhalte von X) und sonst keine, auch nicht die Pr\xFCfungen, mit denen X einen Werbeblocker erkennt. Schalte dies aus, falls X sich trotzdem beschwert: Gesponserte Beitr\xE4ge bleiben ausgeblendet und Aviary verweigert \xFCberhaupt keine Anfrage mehr.","Status des Werbeschutzes","Reduziert L\xE4rm durch Trends, Empfehlungen und Fu\xDFzeile.","Entfernt Trendthemen und Nachrichtenmodule.","Kontovorschl\xE4ge ausblenden","Entfernt \u201EWem folgen?\u201C-Karten, ohne den Rest der Seitenleiste auszublenden.","Startseiten-Editor ausblenden","Entfernt den Schnellbeitrag-Editor auf der Startseite. \xDCber die Schaltfl\xE4che \u201EPosten\u201C l\xE4sst er sich bei Bedarf weiterhin \xF6ffnen.","Thread-Empfehlungen ausblenden","Beendet die Unterhaltung bei der letzten echten Antwort und blendet den Bereich \u201EMehr entdecken\u201C samt der vorgeschlagenen Beitr\xE4ge darunter aus.","Blendet die Grok-Leiste und den Navigationslink, die Bildgenerierungseintr\xE4ge und die Aktionen pro Beitrag aus.","X soll beim Verweilen auf Namen, Avatar oder Steuerelement keine Profilkarte oder Sprechblase \xF6ffnen. Angeclickte Men\xFCs, Beschriftungen und Screenreader-Namen bleiben unver\xE4ndert.","Fokusmodus","Au\xDFerhalb der Zeiten unten wird die Lesespalte mit einem ruhigen lokalen Feld abgedeckt. Die Navigation bleibt nutzbar, und eine Ausnahme von f\xFCnf Minuten ist einen Klick entfernt. Nichts wird blockiert, und nichts verl\xE4sst dieses Ger\xE4t.","Beginn der Lesezeit","Uhrzeit im 24-Stunden-Format, zum Beispiel 09:00.","Ende der Lesezeit","Uhrzeit im 24-Stunden-Format. Ein Ende vor dem Beginn l\xE4uft \xFCber Mitternacht.","Timeline anhalten nach","Anzahl der Beitr\xE4ge, bevor der Feed aufh\xF6rt zu wachsen, mit einer Schaltfl\xE4che zum Weiterlesen. Null l\xE4sst das endlose Scrollen von X unangetastet. Nichts, was bereits auf dem Bildschirm ist, verschiebt sich, und die Schaltfl\xE4che erscheint unter dem letzten Beitrag, nicht dar\xFCber.","Lange Posts automatisch erweitern","Klickt nach dem Ende des Scrollens nur im jeweiligen Post auf Mehr anzeigen. Antworten, Seitenleisten, zitierte Posts und andere Mehr-anzeigen-Links bleiben unver\xE4ndert.","Position nach Zur\xFCck wiederherstellen","Kehrt nach dem \xD6ffnen eines Posts oder einer anderen X-Seite mit der Zur\xFCck-Schaltfl\xE4che des Browsers zum selben sichtbaren Post zur\xFCck. Scrollen mit Mausrad, Touch, Zeiger oder Tastatur bricht die Wiederherstellung sofort ab.","Lesemarker anzeigen","Speichert eine lokale Position pro Feed und zeigt eine Zeile mit Neuigkeiten seit dem letzten Besuch. Es gibt keinen Z\xE4hler f\xFCr ungelesene Beitr\xE4ge.","Oberfl\xE4chen f\xFCr Lesemarker","W\xE4hlen Sie, wo der lokale Marker und der Trenner f\xFCr neue Beitr\xE4ge erscheinen.","Startseite","Beitrag","Profil","Suche","Mitteilungen","Nachrichten","Solange der Fokus im Verfasser liegt, treten Seitenleiste und Timeline dahinter zur\xFCck. Alles kehrt zur\xFCck, sobald Sie daneben klicken.","Folge ich statt F\xFCr dich \xF6ffnen","W\xE4hlt bei jedem Aufruf der Timeline den zweiten Start-Tab. Wechselst du zur\xFCck zu F\xFCr dich, bleibt es dabei, bis du die Seite verl\xE4sst.","F\xFCr dich-Tab ausblenden","W\xE4hlt \u201EFolge ich\u201C und klappt den ersten Home-Tab ein. Gilt nur f\xFCr Home und wird beim Ausschalten sofort wiederhergestellt.","Beitr\xE4ge nur \xFCber das Antwortsymbol \xF6ffnen","X macht die ganze Zeile zu einem Link, sodass ein Klick auf den Text oder neben ein Bedienelement einen Beitrag \xF6ffnet, den du nicht gew\xE4hlt hast. Das nimmt der Zeile die Klickfl\xE4che und gibt sie dem Antwortsymbol, das den Beitrag \xF6ffnet statt des Antwortfelds. Links, Schaltfl\xE4chen, Medien und zitierte Beitr\xE4ge funktionieren weiter.","Navigationselemente ausblenden","Eine stabile Navigations-ID von X pro Zeile: home, explore, notifications, follow, chat, messages, grok, history, studio, premium, profile oder more.","Blende Anzeigen und nicht verwendete Teile von X aus.","Werbeschutz","Seitenelemente","Lesefluss","Navigationselemente","Die Regeln sind auf den ausgew\xE4hlten Routen aktiv.","Filter aktivieren","Hauptschalter f\xFCr Stichwort-, Regex-, Premium- und Medienfilter.","Regelstatus","Inaktiv, bis Filter aktiviert werden. Du kannst die Regeln vor dem Einschalten bearbeiten.","Bereits gesehene Beitr\xE4ge abblenden","Blendet einen Beitrag beim zweiten Vorbeiscrollen ab und bewahrt eine lokale Kopie der von Aviary angezeigten Beitr\xE4ge. Beim \xDCberfahren wird er wieder eingeblendet.","Gesehene Beitr\xE4ge ausblenden auf","W\xE4hlen Sie die Feeds, in denen bereits gesehene Beitr\xE4ge abgeschw\xE4cht werden.","Filterregeln","Eine Regel pro Zeile: Feld, optionales not, Operator, Wert. Felder sind text, handle, media, verified, link; Operatoren sind contains, is, starts, ends, matches. Mit and / or verbinden, und dim: voranstellen, um abzublenden statt auszublenden. Benenne eine Regel, indem du die Zeile mit [einem Titel] beginnst, und gib ihr mit for 7d from eine begrenzte Laufzeit. Beispiel: [Weekend sales] dim for 7d from 2026-08-19T10:00:00.000Z: text contains sale and media is photo","Portabler Regelsatz","Als Klartext exportieren oder einen Satz einf\xFCgen, um das Hinzuf\xFCgen und Ersetzen vorab zu pr\xFCfen.","Regeln hier einf\xFCgen",".txt exportieren","Vorschau","Regeln hinzuf\xFCgen","Regeln ersetzen","Regeln einf\xFCgen, um beide Importoptionen zu sehen.","Stichwortregeln","Ein Stichwort oder eine Wendung pro Zeile. Teiltreffer ohne Beachtung der Gro\xDF-/Kleinschreibung.","Regex-Regeln","Ein Muster pro Zeile. Verwenden Sie /muster/flags oder ein einfaches Muster (ohne Gro\xDF-/Kleinschreibung).","Konten auf der Positivliste","Konten (eines pro Zeile, ohne @), die nie gefiltert werden.","Premium-/verifizierte Beitr\xE4ge","Aus","Ausblenden","Zitat-Beitr\xE4ge","Beitr\xE4ge, die einen anderen Beitrag zitieren.","Antworten mit Bildern, GIFs oder Video ausblenden","Unter einem ge\xF6ffneten Beitrag f\xE4llt jede Antwort weg, die ein Foto, ein GIF oder ein Video tr\xE4gt. Text daneben \xE4ndert nichts daran, denn die meisten Memes kommen mit Bildunterschrift. Der Beitrag selbst und der Strang dar\xFCber bleiben unber\xFChrt, und eine Antwort, die nur einen Beitrag mit Bild zitiert, bleibt stehen. Das l\xE4uft eigenst\xE4ndig, ohne die Filter oben, denn auf eine Unterhaltung angewendet w\xFCrden die den Beitrag ausblenden, den du lesen wolltest.","Angeben, warum ein Beitrag gefiltert wurde","Ein Filter, der stillschweigend ausblendet, ist kaum von einem Fehler zu unterscheiden. Abgeblendete Beitr\xE4ge k\xF6nnen nennen, was sie gefiltert hat, ohne das Layout zu ver\xE4ndern; die dritte Einstellung macht aus jedem ausgeblendeten Beitrag zus\xE4tzlich einen einzeiligen Streifen, der den Grund nennt und sich beim \xDCberfahren oder Antabben \xF6ffnet.","Nichts angeben","Bei abgeblendeten Beitr\xE4gen","Bei abgeblendeten und ausgeblendeten Beitr\xE4gen","Beitr\xE4ge mit wenig Interaktion","Beitr\xE4ge unter dem Mindestwert unten. Ein Beitrag, dessen Zahl Aviary nicht lesen kann, wird danach nie gefiltert.","Interaktion gemessen an","Auf welche der Zahlen unter einem Beitrag der Mindestwert angewendet wird.","Antworten","Reposts","Gef\xE4llt mir","Mindestinteraktion","Beitr\xE4ge unter dieser Zahl werden gefiltert. Null filtert keinen.","Beitr\xE4ge mit Fotos ausblenden","Filtert Beitr\xE4ge mit Fotos.","Beitr\xE4ge mit Videos ausblenden","Filtert Beitr\xE4ge mit Videos.","Beitr\xE4ge mit GIFs ausblenden","Filtert Beitr\xE4ge mit GIFs.","Aktiv auf","Routen, auf denen die Filter laufen.","Blockierte Konten / eigene Reposts","Wartet auf eine authentifizierte Aufnahme; die Bedienelemente bleiben deaktiviert.","Blende Beitr\xE4ge nach W\xF6rtern, Medien, Kontoabzeichen oder Seite aus oder dimme sie.","Filterstatus","Regeln","Inhaltstypen","Routen","Die Download-Einstellung gilt f\xFCr jedes Mediensteuerelement.","F\xFCgt jedem Medienbeitrag eine Download-Aktion sowie Steuerelemente f\xFCr einzelne Dateien hinzu. Beim Ausschalten wird auch Medienlinks kopieren ausgeblendet.","Medienlinks kopieren anzeigen","F\xFCgt eine Beitragsaktion hinzu, die die besten direkten URLs f\xFCr Bilder, GIFs, Videos, Audio und Untertitel zeilenweise kopiert. Sie kopiert nur die eigenen Medien des Beitrags und ben\xF6tigt die Mediensteuerelemente oben.","Versucht zuerst name=orig im Quellformat und bei einem Fehler 4096x4096.","Status der Originalqualit\xE4t","Bilder in Originalqualit\xE4t anzeigen","L\xE4dt Timeline-Fotos in voller Gr\xF6\xDFe statt in der Version, die X f\xFCr den Platz ausw\xE4hlt. Sch\xE4rfer, und ein Vielfaches an Daten.","Standardraster","Dateinamenvorlage","Felder: {handle}, {account}, {tweetId}, {mediaId}, {index}, {total}, {date}, {text}, {ext}. {account} ist ein Alias f\xFCr das ver\xF6ffentlichende Konto und kann Kontoordner anlegen.","Metadaten-Begleitdatei","Speichert nach jedem abgeschlossenen Mediendownload eine lokale Text- oder JSON-Begleitdatei.","Textdatei","JSON-Datei","Visuell \xE4hnliche Bilder erkennen","Vergleicht zus\xE4tzlich eine visuelle 256-Bit-Signatur. \xC4hnliche einfache Kompositionen k\xF6nnen verwechselt werden, deshalb bleibt dies standardm\xE4\xDFig aus.","Duplikatverlauf","\xDCberspringt dasselbe X-Medium oder identische Bildbytes, ohne die Quell-URL zu speichern.","Gleichzeitige Downloads","Maximale Anzahl gleichzeitig laufender Mediendownloads w\xE4hrend eines Stapels (1-6).","Download-Taktung","Steuert den anf\xE4nglichen Burst und das anhaltende Tempo von Medienanfragen im Stapel.","Konservativ","Ausgewogen","Alle sichtbaren Medien herunterladen","Alle sichtbaren Fotos, Videos, GIFs, Vorschaubilder, Audiospuren und Untertitelspuren dieser Seite einreihen.","Download-Status","Verlaufseintr\xE4ge","Der Rest des Panels funktioniert weiterhin. An die Diagnose gemeldet.","Dieser Abschnitt konnte nicht gezeichnet werden","Richte Download-Schaltfl\xE4chen, Qualit\xE4t, Dateinamen und Warteschlangen ein.","{bytes} verteilt auf {count} Sammlungen","Speicher der Bibliothek","Gr\xF6\xDFte Sammlungen","Speicherbericht des Browsers","Warnung bei Speichergrenze","Warnt, bevor eine Aufnahme die lokale Bibliothek \xFCber so viele Megabyte bringt. 0 schaltet die Warnung ab. Aviary l\xF6scht nie etwas, um darunter zu bleiben; das Entfernen wird in der Aufr\xE4um-Vorschau ausgew\xE4hlt.","Aufgenommene Bilder verkleinern","Gilt f\xFCr Aufnahmen ab jetzt. Nichts bereits Gespeichertes \xE4ndert sich, und jeder verkleinerte Eintrag h\xE4lt fest, dass er verkleinert wurde.","Original behalten","Drei Viertel","H\xE4lfte","Viertel","Nur das Vorschaubild des Videos","Speichert das Standbild, das X zu einem Video ausliefert, statt des Videos selbst. Der Eintrag h\xE4lt fest, dass das Video fehlt, damit ein sp\xE4terer Export das Standbild nicht als ganzen Beitrag ausgibt.","Alle lokalen Sammlungen durchsuchen","Durchsuche Beitr\xE4ge, Likes, Lesezeichen, Notizen und Aufnahmen.","Lokale Bibliothek durchsuchen","Semantische Rangfolge","Medien herunterladen","{count} Medien","Versuche source:bookmarks, tag:reading oder has:media.","KI-Schaltfl\xE4che an Beitr\xE4gen anzeigen","F\xFCgt jedem Beitrag eine Schaltfl\xE4che hinzu, die eine Anfrage zum \xDCbersetzen, Zusammenfassen, Erkl\xE4ren oder Faktenpr\xFCfen erstellt. Ohne eingerichteten KI-Anbieter wird die Anfrage in die Zwischenablage kopiert; es wird nichts irgendwohin gesendet.","t.co-Links aufl\xF6sen","Ersetzt kurze \`t.co\`-Weiterleitungen durch das Ziel aus aria-labels und Titeln.","Tracking aus Links entfernen","Entfernt Share-Tokens und Kampagnenparameter (utm_*, fbclid und X' eigene t/s) aus Links in der Timeline, sodass du die blanke Adresse kopierst.","Beitragslinks kopieren als","F\xFCgt jedem Beitrag eine Schaltfl\xE4che \u201ELink kopieren\u201C hinzu, die die Adresse dieses Beitrags auf dem gew\xE4hlten Host schreibt. Nichts, was X dargestellt hat, wird umgeschrieben, und keine Navigation wird umgeleitet. nur das, was du kopierst, \xE4ndert sich. Auf X belassen, um die Schaltfl\xE4che zu entfernen.","Kontofarben","Format: Name: Farbe. Eine pro Zeile. Farben sind amber, rose, violet, sky, green oder slate. Eine leere Zeile entfernt die Markierung.","Konto-Notizen","Format: Name: Notiz. Eine pro Zeile. Leere Notizen entfernen den Eintrag.","Alle Konto-Notizen l\xF6schen","Entfernt alle gespeicherten Notizen.","Verfasser-Textbausteine","Ein Baustein pro Zeile. Wiederverwendbare Antworten und Vorlagen, die \xFCber die Composer-Leiste eingef\xFCgt werden.","Durchsuche und verwalte Beitr\xE4ge, die in diesem Browser gespeichert sind.","Beitragswerkzeuge","Schreibwerkzeuge","Speicher und Berichte","Sammelt die auf der aktiven Seite sichtbaren Beitr\xE4ge f\xFCr den n\xE4chsten Exportlauf.","Kommagetrennte Liste. Unterst\xFCtzt: json, csv, html, markdown, xlsx.","Speichert zus\xE4tzlich die rohen GraphQL-Antworten, die X an diesen Tab sendet, damit Datens\xE4tze sp\xE4ter neu ausgewertet werden k\xF6nnen. Sitzungstoken werden vor dem Schreiben entfernt.","Mediendaten beim Export erfassen","L\xE4dt Medien w\xE4hrend des Exports und f\xFCgt erfolgreiche Bytes mit L\xE4nge und Pr\xFCfsumme ein; fehlgeschlagene Elemente bleiben wiederholbare Referenzen.","Query-IDs automatisch ermitteln","Durchsucht geladene Skripte nach GraphQL-Operations-IDs von X und legt sie lokal ab.","Gesch\xFCtzte Posts in Freigabeexporte aufnehmen","Gesch\xFCtzte Posts bleiben aus HTML, Markdown, WARC, WACZ und der statischen Ansicht ausgeschlossen, bis du dies ausdr\xFCcklich aktivierst. JSON und CSV bleiben archivisch und behalten das Zielgruppenfeld.","Posts mit unbekannter Zielgruppe in Freigabeexporte aufnehmen","Nur im DOM vorhandene, importierte und \xE4ltere Eintr\xE4ge bleiben aus Freigabeexporten ausgeschlossen, bis du dies ausdr\xFCcklich aktivierst. JSON und CSV bleiben archivisch.","Zielordner-Hinweis","Ordnername (oder Pfad) als Wurzel des Export-ZIP und Download-Pr\xE4fix.","{jobs} Jobs verfolgt \xB7 {queries} GraphQL-IDs im Cache","Export-Status","Sichtbare Beitr\xE4ge exportieren","Sammelt die aktuell angezeigten Beitr\xE4ge und l\xE4dt eine ZIP-Datei herunter.","Diagnose kopieren","Kopiert die Support-Diagnose (Version, Route, letztes Protokoll).","Laden Sie eine WARC-Rohdatei oder eine wiedergabefertige WACZ-Datei herunter. WACZ speichert Archiv- und Indexeintr\xE4ge unkomprimiert.","Gesch\xE4tzte WACZ-Gr\xF6\xDFe: {size} f\xFCr {records} Datens\xE4tze.","Archiv zur Langzeitarchivierung","Aktionen f\xFCr das Langzeitarchiv","WARC","WACZ","Abbrechen","In replayweb.page \xF6ffnen","Aviary-eigener WACZ-Nachweis","Aktionen f\xFCr den Aviary-eigenen WACZ-Nachweis","Schl\xFCsselpaar exportieren","Als Markdown kopieren","Kopiert einen einfachen Markdown-Export in die Zwischenablage.","Obsidian-Markdown speichern","Markdown mit YAML-Frontmatter und Aviary-Tags.","Notion-Markdown speichern","\xDCberschriftenbasiertes Markdown, das Notion sauber importiert.","Datens\xE4tze als JSON speichern","Rohes ExportRecord[]-JSON ohne ZIP-Verpackung.","Datens\xE4tze pro ZIP","Verteilt einen langen Export auf mehrere Archive statt auf eine riesige Datei (25-1000).","Maximale Anzahl Export-Auftr\xE4ge","Beh\xE4lt die neuesten Auftr\xE4ge. 0 bedeutet unbegrenzt.","Maximale Datens\xE4tze pro Auftrag","Beh\xE4lt die neuesten Datens\xE4tze jedes Auftrags. 0 bedeutet unbegrenzt.","Maximales Export-Alter (Tage)","Entfernt \xE4ltere Auftr\xE4ge beim Start. 0 deaktiviert die Bereinigung nach Alter.","Erfasse Beitr\xE4ge auf der Seite und lade portable Kopien herunter.","Erfassung","Paket","Ziel","Auftr\xE4ge","Archivierung","Was gel\xF6scht wird","Die ausgew\xE4hlte Aktivit\xE4t wird in dieser Reihenfolge entfernt: Lesezeichen, Likes, Reposts, Antworten, Beitr\xE4ge.","Lesezeichen","Entfernt gespeicherte Beitr\xE4ge aus dem X-Verlauf.","Entfernt Likes aus dem X-Verlauf.","Macht Reposts \xFCber den Reposts-Tab r\xFCckg\xE4ngig.","L\xF6scht eigene Antworten, ohne die urspr\xFCnglichen Beitr\xE4ge anzutasten.","Beitr\xE4ge","L\xF6scht eigene Beitr\xE4ge und zitierte Beitr\xE4ge.","Vorschau abgeschlossen. Es wurden keine Daten des X-Kontos ge\xE4ndert.","Gel\xF6schte Beitr\xE4ge und Antworten lassen sich nicht wiederherstellen. Aviary kann entfernte Likes, Reposts oder Lesezeichen nicht zur\xFCckholen.","Ausf\xFChren","Erweiterte Optionen","\xC4ndere die L\xF6schgeschwindigkeit oder pausiere nach einer festgelegten Anzahl von Aktionen.","Geschwindigkeit","F\xFCgt eine zuf\xE4llige Wartezeit zwischen Aktionen und l\xE4ngere Pausen nach jedem Stapel ein.","Vorsichtig","Z\xFCgig","Aktionen pro Stapel","Pausiert nach dieser Anzahl von Treffern. 0 bedeutet kein Limit. Beim Fortsetzen beginnt ein neuer Stapel.","W\xE4hle Aktivit\xE4ten aus und klicke auf Ausf\xFChren. Die L\xF6schung beginnt sofort.","Der R\xFCckblick wartet","Aktiviere Bereits gesehene Beitr\xE4ge dimmen unter Filter. Der R\xFCckblick verwendet nur Zeilen, die Aviary bereits angezeigt hat.","Enthaltene Daten","Alles, was Aviary im aktiven Browserprofil gesehen hat. Gefilterte Beitr\xE4ge behalten den Grund der aktiven Filterregel.","Pr\xFCfe Beitr\xE4ge, die Aviary bereits gesehen hat, ohne weitere Daten von X anzufordern.","Die Ausblenden-Schaltfl\xE4chen folgen der Einstellung oben.","Verworfene Beitr\xE4ge ausblenden","H\xE4lt von Ihnen ausgeblendete Beitr\xE4ge eingeklappt, damit der n\xE4chste nachr\xFCckt.","Ausblenden-Schaltfl\xE4chen anzeigen","F\xFCgt jedem Beitrag neben dem Mehr-Men\xFC eine Ausblenden-Schaltfl\xE4che hinzu.","Status der Ausblenden-Schaltfl\xE4chen","Wird aktiv, wenn Verworfene Beitr\xE4ge ausblenden eingeschaltet ist.","Routen, auf denen das Ausblenden und die Ausblenden-Schaltfl\xE4che gelten.","Maximal gemerkte Beitr\xE4ge","Die \xE4ltesten Eintr\xE4ge entfallen, sobald der Speicher diese Gr\xF6\xDFe \xFCberschreitet (100-50000).","Gespeicherte ausgeblendete Beitr\xE4ge","Letztes Ausblenden r\xFCckg\xE4ngig machen","Stellt den zuletzt ausgeblendeten Beitrag wieder her.","Wiederherstellen","Ausgeblendete Beitr\xE4ge l\xF6schen","Vergisst alle ausgeblendeten Beitr\xE4ge und stellt sie wieder her.","Lege fest, wo ausgeblendete Beitr\xE4ge verborgen bleiben, oder zeige sie wieder an.","Abdeckung","Aufbewahrung","Wiederherstellung","Video pausieren, das aus dem Bild scrollt","Beendet das Dekodieren von Timeline-Videos, sobald sie aus dem Bild scrollen, und setzt sie bei der R\xFCckkehr fort. Ein selbst pausiertes Video bleibt pausiert.","Video weiterlaufen lassen, wenn der Tab den Fokus verliert","X stoppt ein laufendes Video, wenn du den Tab wechselst. Dies setzt es bei deiner R\xFCckkehr fort. Ein Video, das du selbst pausiert hast, bleibt pausiert.","Videos wiederholen","Startet ein Video am Ende neu, statt es anzuhalten.","Video-Playlists auf ihre beste Fassung festlegen","Wenn X eine Playlist mit mehreren Qualit\xE4ten \xFCbergibt, nur die h\xF6chste behalten. Bei schneller Verbindung bleibt X oft unter der besten verf\xFCgbaren. Das verbraucht mehr Daten und wirkt nur auf Playlists, die Aviary zu sehen bekommt.","Pausiere Videos, nachdem sie den Bildschirm verlassen.","Wiedergabe","{count} Eintr\xE4ge \xB7 zuletzt {kind} mit {latestCount} am {at}","Gespeicherte Momentaufnahmen","Follower aus dieser Ansicht erfassen","Durchl\xE4uft die UserCell-Zeilen der aktuellen Seite. \xD6ffne zuerst eine /name/followers-Ansicht.","Gefolgte aus dieser Ansicht erfassen","Durchl\xE4uft die UserCell-Zeilen der aktuellen Seite. \xD6ffne zuerst eine /name/following-Ansicht.","Alle Momentaufnahmen l\xF6schen","Entfernt alle gespeicherten Follower- und Gefolgt-Momentaufnahmen.","Offizielle X-Archivdatei importieren","W\xE4hle ein von x.com exportiertes ZIP. STORE- und DEFLATE-Eintr\xE4ge werden unterst\xFCtzt; die Quelle bleibt lokal, solange der Vorgang fortgesetzt werden kann.","Erfasste Datens\xE4tze suchen","Volltextsuche \xFCber den letzten Export-Sammlerlauf.","@Handle, Stichwort, Ausdruck\u2026","Gib einen Suchbegriff f\xFCr die von Exportl\xE4ufen erfassten Datens\xE4tze ein.","Markdown-Bericht herunterladen","Pr\xFCfprotokoll, Momentaufnahmen-Vergleich und Bereinigungsvorschau.","{total} Elemente \xB7 in Warteschlange {queued} \xB7 genehmigt {approved} \xB7 \xFCbersprungen {skipped}","Pr\xFCfliste f\xFCr die Bereinigung","Destruktive Aktionen","Aviary l\xF6scht niemals Beitr\xE4ge, Likes oder Follows. Die Liste dient nur der Pr\xFCfung; Zustimmen oder \xDCberspringen schreibt lediglich ins Pr\xFCfprotokoll.","Bereinigungsvorschau zur Pr\xFCfung einreihen","F\xFCgt alle ungesch\xFCtzten Kandidaten der letzten Bereinigungsvorschau der Liste hinzu (keine destruktive Aktion).","Bereinigungsliste leeren","Entfernt alle Eintr\xE4ge der Liste, ohne Kontodaten anzur\xFChren.","Importiere ein offizielles X-Archiv oder vergleiche Follower-Schnappsch\xFCsse.","Aktive Snapshots","Aria2-\xDCbergabe","Sendet gro\xDFe Mediendownloads an einen selbst gehosteten Aria2-JSON-RPC-Endpunkt.","Aria2-Endpunkt","http://localhost:6800 (kein abschlie\xDFender Schr\xE4gstrich n\xF6tig)","Aria2-RPC-Secret","Optionales gemeinsames Secret f\xFCr die token:-Authentifizierung.","Anzeigen","Dateien \xFCbergeben ab (MB)","Kleinere Dateien werden \xFCber den Browser gespeichert. Aviary pr\xFCft zuerst die Gr\xF6\xDFe; nennt der Server keine, wird die Datei trotzdem \xFCbergeben.","Aria2-Verbindung testen","Sendet einen einfachen JSON-RPC-Aufruf.","Aktive Aria2-Downloads","Aktualisieren, um laufende \xDCbertragungen aufzulisten; mit \u201EAbbrechen\u201C eine abbrechen.","Aktualisieren","Lokale \xDCbergabe an yt-dlp","Bietet eine adaptive Speicherung in h\xF6herer Qualit\xE4t an, wenn ein lokaler authentifizierter Helfer l\xE4uft.","Endpunkt des yt-dlp-Helfers","http://127.0.0.1:8787 (nur Loopback)","Geheimnis des yt-dlp-Helfers","Das AVIARY_YTDLP_TOKEN, das mit dem lokalen Prozess geteilt wird.","Bluesky-Crosspost","Ver\xF6ffentlicht den Verfassertext auf Wunsch in Ihrem Bluesky-Konto.","Bluesky-Dienst-URL","Standard: https://bsky.social","Bluesky-Konto","Ihr Konto (ohne @, z. B. sie.bsky.social)","Bluesky-App-Passwort","App-Passwort aus Ihren Kontoeinstellungen. Niemals Ihr Hauptpasswort.","Mastodon-Crosspost","Ver\xF6ffentlicht den Verfassertext auf Wunsch in Ihrem Mastodon-Konto.","Mastodon-Instanz","https://mastodon.social","Mastodon-Zugriffstoken","Bearer-Token mit dem Geltungsbereich write:statuses.","Letzten Download anh\xE4ngen","H\xE4ngt den letzten erfolgreichen Aviary-Mediendownload an den ersten Beitrag eines ausdr\xFCcklichen Crossposts an.","Als Thread crossposten","An leeren Zeilen teilen und jedes Segment als Antwort auf das vorherige senden.","Entwurf auf Bluesky posten","Verwendet den aktuellen Text im Editor.","Entwurf auf Mastodon posten","KI-Anbieter nutzen","Erlaubt dem KI-Befehlsmen\xFC, Prompts an Ihren konfigurierten Anbieter zu senden.","KI-Anbieter","Anthropic Messages API","OpenAI Chat Completions","OpenAI-kompatibel (LocalAI, Ollama-Proxy, \u2026)","KI-Endpunkt (optional)","\xDCberschreibt den Standardendpunkt des gew\xE4hlten Anbieters.","KI-Modell","z. B. claude-sonnet-4-6, gpt-4o, llama3.1:8b","KI-API-Schl\xFCssel","Wird nur lokal gespeichert. Aviary sendet ihn ausschlie\xDFlich als Auth-Header an Ihren Anbieter.","Erlaubt","Netzwerkstatus","KI-Ziel","KI-Datenhinweis","Vor dem Senden zeigt Aviary Anbieter, Endpunkt, Felder, Zeichen-/Token-Sch\xE4tzung, Aufbewahrung und Budgetstatus.","KI-Nutzung heute","Maximale Bytes pro KI-Anfrage","Vor dem Senden stoppen, wenn der UTF-8-Textk\xF6rper einer KI-Anfrage gr\xF6\xDFer ist. 0 blockiert jede KI-Anfrage.","T\xE4gliche Bytes f\xFCr KI-Anfragen","KI-Anbieteraufrufe nach dieser Menge an UTF-8-Anfragebytes am lokalen Tag stoppen. 0 blockiert jede KI-Anfrage.","Semantische Suche","Erfassten Datensatztext zur \xC4hnlichkeitssuche an den konfigurierten Embedding-Endpunkt senden. Ziel, Felder, Aufbewahrung und Bytebudget werden hier angezeigt.","Embedding-Endpunkt","POST-Endpunkt, der {data: [{embedding: number[]}]} zur\xFCckgibt","Embedding-Modell","z. B. text-embedding-3-small","Embedding-API-Schl\xFCssel","Wird lokal gespeichert und nur als Authorization-Header verwendet.","Nicht konfiguriert","Embedding-Ziel","Embedding-Datenhinweis","Eine Anfrage enth\xE4lt Modell und erfassten Datensatztext. Vektoren und begrenzter Text bleiben in Aviarys lokalem Index; die Aufbewahrung des Anbieters folgt dessen Richtlinie.","Embedding-Nutzung heute","Maximale Bytes pro Embedding-Datensatz","Vor dem Senden stoppen, wenn der UTF-8-Textk\xF6rper eines Datensatzes gr\xF6\xDFer ist. 0 blockiert jeden Embedding-Aufruf.","T\xE4gliche Datensatzbytes f\xFCr Embeddings","Embedding-Aufrufe nach dieser Menge an UTF-8-Datensatzbytes am lokalen Tag stoppen. 0 blockiert jeden Embedding-Aufruf.","Jeden Export automatisch einbetten","Pr\xFCfe vor dem Aktivieren oben Endpunkt, Felder erfasster Datens\xE4tze, lokale Aufbewahrung und t\xE4gliches Bytebudget. Nach jedem Export werden Embeddings im Hintergrund erstellt. Standardm\xE4\xDFig aus.","Semantischen Index neu aufbauen","Erzeugt Embeddings f\xFCr jeden erfassten Datensatz. Ein erneuter Lauf ist g\xFCnstig, da zwischengespeicherte Eintr\xE4ge \xFCbersprungen werden.","Vektorsimilarit\xE4t \xFCber erfasste Datens\xE4tze. Embeddings werden bei Bedarf ausgef\xFChrt.","Beschreibe, wonach du suchst\u2026","Semantischen Index l\xF6schen","Vergisst alle eingebetteten Datens\xE4tze.","KI- und Embedding-Nutzung l\xF6schen","Nur lokale Anfragez\xE4hler vergessen. Der semantische Index und Anbieterzugangsdaten bleiben erhalten.","ein","aus","konfiguriert","Endpunkt fehlt","Zugangsdaten fehlen","Schl\xFCssel/Modell fehlt","indexiert","{name}: {state} \xB7 {config}","{name}: {state} \xB7 {count} {indexed}","Status der Integrationen","Aktuelle Integrationsfehler","Aus dem Auditprotokoll; nur fehlgeschlagene Integrationsaufrufe werden angezeigt.","Richte optionale lokale Dienste und KI-Anbieter ein.","Intelligenz","Ausgeblendet. Gespeicherte Zugangsdaten bleiben erhalten.","Nach der aktuellen Sammlung stoppen und alle bisherigen Schreibvorg\xE4nge zur\xFCcksetzen.","Die Sicherung pr\xFCfen und dieselben Konflikte anzeigen, ohne lokale Daten zu schreiben oder zu l\xF6schen.","Die ausgew\xE4hlten Profilsammlungen anwenden. Bei einem fehlgeschlagenen Schreibvorgang werden bereits ge\xE4nderte Sammlungen zur\xFCckgesetzt.","Zugangsdaten sind ausgeblendet; die bereits in diesem Profil gespeicherten Werte bleiben erhalten.","Alle Einstellungen zur\xFCcksetzen","Stellt Aviarys Standardwerte wieder her: Der werbefreie Modus bleibt aktiv, alle anderen visuellen oder Verhaltenssteuerungen werden deaktiviert. Gespeicherte Beitr\xE4ge, Notizen, Lesezeichen und der Download-Verlauf bleiben erhalten.","Einstellungen exportieren","L\xE4dt deine Einstellungen als JSON herunter. API-Schl\xFCssel und Passw\xF6rter werden durch einen Platzhalter ersetzt, die Datei l\xE4sst sich also gefahrlos weitergeben; beim Import hier bleiben die auf diesem Rechner gespeicherten Zugangsdaten erhalten.","Einstellungen importieren (JSON)","F\xFCge eine aus Aviary exportierte Einstellungsdatei ein und w\xE4hle Importieren. Geschw\xE4rzte Zugangsdaten behalten die hier gespeicherten Werte.","Importieren","Vollst\xE4ndige Bibliothekssicherung exportieren","L\xE4dt eine versionierte JSON-Sicherung herunter, die alle Profile auf diesem Rechner umfasst, nicht nur das gerade ge\xF6ffnete. Zugangsdaten bleiben standardm\xE4\xDFig ausgenommen; beim Wiederherstellen bleiben die hier bereits gespeicherten erhalten.","Backup mit Anmeldedaten exportieren","Dasselbe Backup sowie die in diesem Browser gespeicherten API-Schl\xFCssel und die WACZ-Signaturidentit\xE4t. Wer die Datei \xF6ffnet, kann sie verwenden, also bewahre sie wie ein Passwort auf.","Bibliothekssicherung ausw\xE4hlen","W\xE4hle eine JSON-Sicherung aus, um Versionen, Anzahlen, Konflikte und Pr\xFCfsumme vor einer \xC4nderung lokaler Daten zu pr\xFCfen.","Lokales Aktionsprotokoll f\xFChren","Zeichnet Downloads, Exporte und Einstellungs\xE4nderungen auf diesem Ger\xE4t auf, damit du nachvollziehen kannst, was Aviary getan hat. Es wird nichts \xFCbertragen. Beim Ausschalten werden sofort keine neuen Eintr\xE4ge mehr angelegt; vorhandene bleiben, bis du sie l\xF6schst.","Pr\xFCfprotokoll-Eintr\xE4ge","Pr\xFCfprotokoll l\xF6schen","Entfernt das lokale Aktionsprotokoll.","Sichere lokale Daten, stelle sie wieder her oder setze Aviary zur\xFCck.","Einstellungen","Bibliothekssicherung","Pr\xFCfverlauf","Speicher","Einstellungen bleiben in diesem Browser.","Sicherheit des benutzerdefinierten CSS","Benutzerdefiniertes CSS bleibt lokal, ist auf die benannte Oberfl\xE4che begrenzt und wird nie mit Diagnosedaten gesendet. Es ist eine Expertenanpassung, daher kann der Support die visuellen Effekte nicht reproduzieren.","Nur-lokal-Modus","Blockiert jede Anfrage an eine von dir eingerichtete Integration: Aria2, Crossposting, KI-Anfragen und Embeddings. Medien werden weiterhin von den Servern von X geladen, von wo die Seite sie ohnehin geladen hat. Standardm\xE4\xDFig an; das Einschalten einer Integration schaltet ihn aus.","Analyse-Beacons von X abweisen","Stoppt die Tracking-Signale, die X beim Scrollen, Klicken und Pausieren sendet. Nur die Analyse-Endpunkte werden abgewiesen. Timeline-, Medien- und Anmeldeverkehr bleibt unber\xFChrt.","Selektorstatus \xFCberwachen","Pr\xFCft die aktuelle X-Oberfl\xE4che auf erforderliche und alternative Anker. Deaktivieren Sie dies, wenn Sie keine Selektordiagnose w\xFCnschen.","Mit der Seite verbunden","Seitenzugriff","Abgewiesene Beacons","Einige \xC4nderungen konnten nicht gespeichert werden. Der Browser-Speicher ist m\xF6glicherweise voll.","Speichern","Telemetrie","Sprache des Panels","\xDCberwachung aktiv","Selektor-Zustand","Sieh nach, was lokal bleibt, und pr\xFCfe, ob Aviary noch mit X funktioniert.","Datenschutzgrenze","Seitenanbindungen","Lokale Daten","Kompatibilit\xE4t","Ungespeicherte \xC4nderungen","Einstellungen konnten nicht gespeichert werden. Bitte erneut versuchen.","Speichere oder verwirf deine \xC4nderungen, bevor du diesen Abschnitt verl\xE4sst.","Wird gespeichert...","Diese \xC4nderung konnte nicht gespeichert werden. Nimm sie erneut vor und speichere.","Korrigiere ung\xFCltige Werte vor dem Speichern.","Diagnose in die Zwischenablage kopiert.","L\xF6schung aktualisiert.","Der L\xF6schbefehl ist fehlgeschlagen.","Nur-lokal-Modus an.","Nur-lokal-Modus aus.","Analyse-Beacons abgewiesen.","Analyse-Beacons zugelassen.","\xDCberwachung des Selektorstatus aktiviert.","\xDCberwachung des Selektorstatus deaktiviert.","Strukturbeobachtung in die Zwischenablage kopiert.","Strukturbeobachtung konnte nicht kopiert werden.","Leistungsmetriken zur\xFCckgesetzt.","Leistungsmetriken konnten nicht zur\xFCckgesetzt werden.","Gespeicherte Warnungen gel\xF6scht.","Gespeicherte Warnungen konnten nicht gel\xF6scht werden.","Werbebeobachtungen zur\xFCckgesetzt.","Werbebeobachtungen konnten nicht zur\xFCckgesetzt werden.","Profil gewechselt. Wird neu geladen\u2026","Profilwechsel fehlgeschlagen.","{moved} Speicher zugewiesen; {completedAfterRetry} nach einem erneuten Versuch abgeschlossen; {skipped} waren bereits vorhanden; {conflicted} in Konflikt; {failed} fehlgeschlagen.","Profil erstellt. Wird neu geladen\u2026","Profilerstellung fehlgeschlagen.","Antwort erfasst.","Alle Funktionen sind aus. Ist die Seite immer noch falsch?","Funktionssuche gel\xF6scht.","Funktionssuche gestoppt; alle Funktionen sind wieder an.","Aria2-\xDCbergabe an.","Aria2-\xDCbergabe aus.","Aria2-Endpunkt gespeichert.","Aria2-Secret gespeichert.","Aria2-Schwelle gespeichert.","Aria2 erreichbar.","Aria2 nicht erreichbar: {error}","Aria2-Verbindungstest fehlgeschlagen.","{gid} abgebrochen.","Abbruch von Aria2 fehlgeschlagen: {error}","Abbruch von Aria2 fehlgeschlagen.","Aria2-Abfrage fehlgeschlagen.","\xDCbergabe an yt-dlp ein.","\xDCbergabe an yt-dlp aus.","Endpunkt des yt-dlp-Helfers gespeichert.","Geheimnis des yt-dlp-Helfers gespeichert.","Bluesky an.","Bluesky aus.","Bluesky-Dienst gespeichert.","Bluesky-Name gespeichert.","Bluesky-App-Passwort gespeichert.","Mastodon an.","Mastodon aus.","Mastodon-Instanz gespeichert.","Mastodon-Token gespeichert.","Crosspost-Anhang an.","Crosspost-Anhang aus.","{posts} auf Bluesky ver\xF6ffentlicht.{url}","Bluesky fehlgeschlagen: {error}","Bluesky-Crosspost fehlgeschlagen.","{posts} auf Mastodon ver\xF6ffentlicht.{url}","Mastodon fehlgeschlagen: {error}","Mastodon-Crosspost fehlgeschlagen.","KI-L\xE4ufe an.","KI-L\xE4ufe aus.","KI-Endpunkt gespeichert.","KI-Modell gespeichert.","KI-API-Schl\xFCssel gespeichert.","KI-Anfragebudget gespeichert.","T\xE4gliches KI-Budget gespeichert.","Semantische Suche an.","Semantische Suche aus.","Embedding-Endpunkt gespeichert.","Embedding-Modell gespeichert.","Embedding-API-Schl\xFCssel gespeichert.","Embedding-Anfragebudget gespeichert.","T\xE4gliches Embedding-Budget gespeichert.","Automatisches Einbetten an.","Automatisches Einbetten aus.","Semantischer Index wird neu aufgebaut\u2026","Embeddings am Budget gestoppt ({blocked} Datens\xE4tze wurden nicht gesendet).","Indexiert: +{added} neu \xB7 {skipped} \xFCbersprungen \xB7 Fehler {errors} \xB7 gesamt {total}{trimmed}.","Embedding fehlgeschlagen.","Semantischer Index gel\xF6scht.","Semantischer Index konnte nicht gel\xF6scht werden.","KI- und Embedding-Nutzung gel\xF6scht.","KI- und Embedding-Nutzung konnte nicht gel\xF6scht werden.","Einstellungen zur\xFCckgesetzt. Der werbefreie Modus ist aktiv.","Einstellungen konnten nicht zur\xFCckgesetzt werden.","Einstellungen exportiert.","Einstellungen konnten nicht exportiert werden.","Einstellungen importiert. {warning}","Import fehlgeschlagen: {errors}","Einstellungen konnten nicht importiert werden.","Bibliothekssicherung heruntergeladen: {filename} ({collections} Sammlungen, {bytes}).","Die vollst\xE4ndige Bibliothekssicherung konnte nicht exportiert werden.","Backup mit Anmeldedaten heruntergeladen: {filename} ({collections} Sammlungen, {bytes}).","Bibliothekssicherung wird gelesen\u2026","Sicherung geladen: {collections} Sammlungen, {conflicts} \xC4nderungen.","Die Bibliothekssicherung konnte nicht gelesen werden.","Wiederherstellung wird abgebrochen\u2026","Probelauf abgeschlossen. Lokale Daten wurden nicht ge\xE4ndert.","Probelauf fehlgeschlagen: {errors}","Der Probelauf der Bibliothekswiederherstellung ist fehlgeschlagen.","Bibliothekssicherung wiederhergestellt ({collections} Sammlungen). Wird neu geladen\u2026","Wiederherstellung abgebrochen; lokale Daten wurden zur\xFCckgesetzt.","Wiederherstellung abgebrochen.","Wiederherstellung fehlgeschlagen: {errors}","Die Bibliothekssicherung konnte nicht wiederhergestellt werden.","Aktionsprotokoll an.","Aktionsprotokoll aus.","Auditprotokoll geleert.","Pr\xFCfprotokoll konnte nicht gel\xF6scht werden.","{count} Follower von @{handle} erfasst. Die Liste war fertig geladen, das sind also alle.","{count} Follower von @{handle} erfasst. Die Liste wurde noch geladen, das ist also nur, was auf dem Bildschirm stand. Scrolle bis ans Ende und erfasse erneut, um die ganze Liste zu bekommen.","Keine UserCell-Zeilen gefunden.","Momentaufnahme fehlgeschlagen.","{count} von @{handle} gefolgte Konten erfasst. Die Liste war fertig geladen, das sind also alle.","{count} von @{handle} gefolgte Konten erfasst. Die Liste wurde noch geladen, das ist also nur, was auf dem Bildschirm stand. Scrolle bis ans Ende und erfasse erneut, um die ganze Liste zu bekommen.","Momentaufnahmen gel\xF6scht.","Momentaufnahmen konnten nicht gel\xF6scht werden.","Archivimport pausiert.","Archivimport fortgesetzt.","Archivimport abgebrochen.","Erneuter Archivimport gestartet.","Archiv wird gelesen, gro\xDFe Dateien dauern einen Moment\u2026","Ein {layout}-Archiv gelesen. {records} Eintr\xE4ge importiert. Reparaturen: {archiveLinks} Archivlinks, {corpusLinks} erfasste Links, {participants} Teilnehmer-IDs aufgel\xF6st, {unresolved} ungel\xF6st belassen. Warnungen: {warnings}; Fehler: {errors}. Dateien: {recognized} erkannt, {skipped} \xFCbersprungen, {malformed} fehlerhaft.{absent}","Archivimport fehlgeschlagen.","Bericht wird erstellt\u2026","Bericht heruntergeladen.","Bericht konnte nicht erstellt werden.","Bereinigungsvorschau wird erstellt\u2026","{added} Elemente eingereiht ({protected} gesch\xFCtzte \xFCbersprungen).","Bereinigung konnte nicht eingereiht werden.","Bereinigungsliste geleert.","Liste konnte nicht geleert werden.","Warnung bei Speichergrenze aus.","Warnung bei Speichergrenze gespeichert.","Aufgenommene Bilder behalten ihre Originalgr\xF6\xDFe.","Aufgenommene Bilder werden verkleinert.","Videos werden als Vorschaubild aufgenommen.","Videos werden vollst\xE4ndig aufgenommen.","Under-the-Hood-Bericht wird gelesen\u2026","Der Under-the-Hood-Bericht konnte nicht gelesen werden.","Under-the-Hood-Berichte konnten nicht exportiert werden.","{count} ausgew\xE4hlte Dateien werden heruntergeladen.","Die erfassten Medien konnten nicht heruntergeladen werden.","Die Suche in der Bibliothek ist fehlgeschlagen. Pr\xFCfe Endpunkt und Schl\xFCssel f\xFCr Embeddings unter Integrationen.","Lesezeichen aktualisiert.","Lesezeichen konnte nicht aktualisiert werden.","Lesezeichen entfernt.","Das Lesezeichen war bereits entfernt.","Lesezeichen konnte nicht entfernt werden.","Lesezeichen exportiert: {records} Eintr\xE4ge in {files} Dateien.","Lesezeichen konnten nicht exportiert werden.","Lesezeichen gel\xF6scht.","Lesezeichen konnten nicht gel\xF6scht werden.","KI-Schaltfl\xE4che an.","KI-Schaltfl\xE4che aus.","Linkaufl\xF6sung an.","Linkaufl\xF6sung aus.","Linkbereinigung an.","Linkbereinigung aus.","Schaltfl\xE4che \u201ELink kopieren\u201C aus.","Schaltfl\xE4che \u201ELink kopieren\u201C an.","Kontofarben gespeichert.","Konto-Notizen gel\xF6scht.","Notizen konnten nicht gel\xF6scht werden.","Export-Erfassung an.","Export-Erfassung aus.","Einstellung f\xFCr Rohdaten gespeichert.","Erfassung von Mediendaten aktiviert.","Erfassung von Mediendaten deaktiviert.","Einstellung zur Query-Erkennung gespeichert.","Freigabe gesch\xFCtzter Posts aktiviert.","Gesch\xFCtzte Posts aus Freigabeexporten ausgeschlossen.","Freigabe von Posts mit unbekannter Zielgruppe aktiviert.","Posts mit unbekannter Zielgruppe aus Freigabeexporten ausgeschlossen.","Zielordner gespeichert.","Exportauftrag pausiert.","Exportauftrag fortgesetzt.","Exportauftrag abgebrochen.","Sichtbare Beitr\xE4ge werden gesammelt\u2026","In dieser Ansicht wurden keine Beitr\xE4ge gefunden. Scrolle die Timeline, um welche zu laden, und exportiere erneut.","{records} Datens\xE4tze in {files} ZIPs exportiert \u2192 {filename}","{records} Datensatz exportiert \u2192 {filename}","{records} Datens\xE4tze exportiert \u2192 {filename}","Export fehlgeschlagen. Siehe Diagnose.","Noch keine erfassten Beitr\xE4ge mit Thread-Daten.","Leser f\xFCr erfasste Threads exportiert.","Thread-Wiederherstellung fehlgeschlagen. Siehe Diagnose.","Diagnose konnte nicht kopiert werden.","{records} Datens\xE4tze in die Zwischenablage kopiert.","{records} Datens\xE4tze nach {target} exportiert.","Externer Export fehlgeschlagen.","Datens\xE4tze pro ZIP gespeichert.","Aufbewahrung der Export-Auftr\xE4ge gespeichert.","Aufbewahrung der Datens\xE4tze gespeichert.","Aufbewahrung nach Alter gespeichert.","WARC heruntergeladen ({records} Datens\xE4tze).","WARC-Export fehlgeschlagen.","WACZ heruntergeladen ({records} Datens\xE4tze, {size}).","Der WACZ-Export ist fehlgeschlagen. Schaffe Speicherplatz frei oder exportiere weniger Eintr\xE4ge und versuche es erneut.","Signieridentit\xE4t ersetzt.","Die Signieridentit\xE4t konnte nicht ersetzt werden.","Aviary-eigener WACZ-Nachweis heruntergeladen ({records} Eintr\xE4ge, {size}).","Der Export des Aviary-eigenen WACZ-Nachweises ist fehlgeschlagen.","Signaturschl\xFCsselpaar heruntergeladen: {filename}.","Export des Signaturschl\xFCsselpaars fehlgeschlagen.","Medienschaltfl\xE4chen an.","Medienschaltfl\xE4chen aus.","Kopieren von Medienlinks aktiviert.","Kopieren von Medienlinks deaktiviert.","Einstellung f\xFCr Originalqualit\xE4t gespeichert.","Bilder in voller Gr\xF6\xDFe an.","Bilder in voller Gr\xF6\xDFe aus.","Medienlayout gespeichert.","Dateinamen-Vorlage gespeichert.","Einstellung f\xFCr Begleitdateien gespeichert.","Visuelle Duplikaterkennung ein.","Visuelle Duplikaterkennung aus.","Duplikatverlauf an.","Duplikatverlauf aus.","Limit f\xFCr gleichzeitige Downloads gespeichert.","Download-Taktung gespeichert.","Medien dieser Ansicht werden heruntergeladen\u2026","Stapel-Download fehlgeschlagen.","Verlauf geleert.","Verlauf konnte nicht gel\xF6scht werden.","Verlauf exportiert: {records} Eintr\xE4ge in {files} Dateien.","Downloadverlauf konnte nicht exportiert werden.","Erfasste Medien: {downloaded} gespeichert / {duplicate} Duplikate / {failed} Fehler.","Keine fehlgeschlagenen Medienauftr\xE4ge zum Wiederholen.","Voreinstellung angewendet: {preset} ({changes})","Voreinstellung bereits angewendet: {preset}","Voreinstellung konnte nicht angewendet werden.","Dieses Design wird nicht unterst\xFCtzt.","Design aktualisiert.","Dichte aktualisiert.","Timeline-Breite aktualisiert.","Chirp-Schrift an.","Chirp-Schrift aus.","Interaktionszahlen ausgeblendet.","Interaktionszahlen eingeblendet.","Z\xE4hler-Einstellung gespeichert.","Tab-Z\xE4hler ausgeblendet.","Tab-Z\xE4hler sichtbar.","Absolute Zeitstempel an.","Absolute Zeitstempel aus.","Aviary-Tab-Symbol an.","X-Tab-Symbol wiederhergestellt.","Zeilenrahmen ausgeblendet.","Zeilenrahmen wiederhergestellt.","Kontrast-Einstellung gespeichert.","Bewegungs-Einstellung gespeichert.","Werbefreier Modus aktiviert.","Werbefreier Modus deaktiviert.","Werbeprotokollierung abgelehnt.","Werbeprotokollierung zugelassen.","Seitenleisten-Einstellung gespeichert.","Trend-Einstellung gespeichert.","Layout-Einstellung gespeichert.","Grok-Einstellung gespeichert.","Hover-Einstellung gespeichert.","Fokusmodus an.","Fokusmodus aus.","Lesezeit gespeichert.","Die Timeline scrollt ohne Ende.","Lange Posts werden automatisch erweitert.","Lange Posts bleiben eingeklappt.","Zur\xFCck stellt deine Position wieder her.","Zur\xFCck verwendet die Position von X.","Lesemarker aktiviert.","Lesemarker deaktiviert.","Lesemarker-Oberfl\xE4chen gespeichert.","Schreibmodus an.","Schreibmodus aus.","Timeline \u201EFolge ich\u201C an.","Timeline \u201EFolge ich\u201C aus.","F\xFCr dich-Tab ausgeblendet.","F\xFCr dich-Tab wiederhergestellt.","Beitr\xE4ge \xF6ffnen \xFCber das Antwortsymbol.","Beitr\xE4ge \xF6ffnen wieder \xFCber die Zeile.","Sichtbarkeit der Navigation gespeichert.","Video au\xDFerhalb des Bilds pausiert.","Video au\xDFerhalb des Bilds l\xE4uft weiter.","Video l\xE4uft weiter.","Video pausiert mit dem Tab.","Videowiederholung an.","Videowiederholung aus.","Playlist-Festlegung an.","Playlist-Festlegung aus.","Filter aktiviert.","Filter deaktiviert.","Abblenden gesehener Beitr\xE4ge an.","Abblenden gesehener Beitr\xE4ge aus.","Oberfl\xE4chen f\xFCr gesehene Beitr\xE4ge gespeichert.","Gesehene Beitr\xE4ge vergessen.","Gesehene Beitr\xE4ge konnten nicht gel\xF6scht werden.","Filterregeln gespeichert.","{count} Regel erneuert.","{count} Regeln erneuert.","Die abgelaufenen Regeln konnten nicht erneuert werden.","Premium-Filter gespeichert.","Zitatfilter gespeichert.","Antworten mit Medien ausgeblendet.","Antworten mit Medien wieder sichtbar.","Einstellung f\xFCr den Filtergrund gespeichert.","Interaktionsfilter gespeichert.","Interaktionsma\xDF gespeichert.","Filter auf allen Routen aus.","Regelsatz exportiert: {filename} ({count} Zeilen).","Der Regelsatz konnte nicht exportiert werden.","Der Regelsatz muss gepr\xFCft werden.","Die Vorschau des Regelsatzes ist bereit.","Die Vorschau des Regelsatzes konnte nicht erstellt werden.","{count} Regeln wurden hinzugef\xFCgt.","Der Regelsatz wurde durch {count} Regeln ersetzt.","Der Regelsatz konnte nicht importiert werden.","Ausgeblendete Beitr\xE4ge angewendet.","Ausgeblendete Beitr\xE4ge eingeblendet.","Ausblenden-Schaltfl\xE4chen an.","Ausblenden-Schaltfl\xE4chen aus.","Ausblenden auf allen Routen aus.","Nichts mehr wiederherzustellen.","Das letzte Ausblenden konnte nicht r\xFCckg\xE4ngig gemacht werden.","Beitrag wiederhergestellt.","Dieser Beitrag wurde bereits wiederhergestellt.","Der Beitrag konnte nicht wiederhergestellt werden.","{removed} ausgeblendeter Beitrag gel\xF6scht.","{removed} ausgeblendete Beitr\xE4ge gel\xF6scht.","Ausgeblendete Beitr\xE4ge konnten nicht gel\xF6scht werden.","Die Altdaten konnten nicht zugewiesen werden. Es wurde nichts verschoben, sie liegen also weiterhin dort, wo sie waren. \xD6ffne diese Seite erneut, um es noch einmal zu versuchen.","Die Funktionssuche konnte nicht gestartet werden.","Die Funktionssuche konnte nicht zur\xFCckgesetzt werden.","Die Suche konnte diese Antwort nicht aufnehmen. Sie steht unver\xE4ndert da, dr\xFCcke also dieselbe Schaltfl\xE4che noch einmal.","Die Funktionssuche konnte nicht beendet werden.","Die Wiederherstellung konnte nicht abgebrochen werden. Sie h\xE4lt am Ende der aktuellen Sammlung von selbst an.","Der Import konnte nicht pausiert werden. M\xF6glicherweise ist er bereits fertig. \xD6ffne diesen Abschnitt erneut, um zu sehen, wie weit er kam.","Der Import konnte nicht fortgesetzt werden. Seine gespeicherte Quelle wurde m\xF6glicherweise gel\xF6scht. Starte ihn erneut, um wieder von der Datei zu beginnen.","Der Import konnte nicht abgebrochen werden. M\xF6glicherweise ist er bereits fertig. \xD6ffne diesen Abschnitt erneut, um zu sehen, wie weit er kam.","Der Import konnte nicht wiederholt werden. W\xE4hle die Archivdatei erneut aus, um einen frischen Import zu starten.","Der Exportauftrag konnte nicht pausiert werden. M\xF6glicherweise ist er bereits fertig. \xD6ffne diesen Abschnitt erneut, um seinen aktuellen Stand zu sehen.","Der Exportauftrag konnte nicht fortgesetzt werden. Sein Pr\xFCfpunkt wurde m\xF6glicherweise gel\xF6scht. Starte stattdessen einen neuen Export.","Der Exportauftrag konnte nicht abgebrochen werden. M\xF6glicherweise ist er bereits fertig. \xD6ffne diesen Abschnitt erneut, um seinen aktuellen Stand zu sehen.","Dieser Stapel konnte nicht laufen. Erteile auf der Berechtigungsseite von Aviary den Downloadzugriff und versuche es erneut.","Der Stapel hat diese Anweisung nicht angenommen. M\xF6glicherweise ist er bereits fertig. \xD6ffne diesen Abschnitt erneut, um seinen aktuellen Stand zu sehen.","Die eingereihten Downloads konnten nicht fortgesetzt werden. Erteile auf der Berechtigungsseite von Aviary den Downloadzugriff und versuche es erneut.","Die fehlgeschlagenen Downloads konnten nicht wiederholt werden. Erteile auf der Berechtigungsseite von Aviary den Downloadzugriff und versuche es erneut.","Die Zusammenfassung konnte nicht ge\xF6ffnet werden. Es ist nichts verloren gegangen, lade die Seite neu und versuche es erneut.","Nichts passt zu dieser Suche.","Versuche ein k\xFCrzeres Wort oder w\xE4hle links einen Bereich.","Behalten: Der Browser l\xF6scht diese Bibliothek nicht, um Speicherplatz freizugeben.","Bestm\xF6glich: Der Browser kann diese Bibliothek bei knappem Speicherplatz l\xF6schen. Bewahre ein Backup auf.","Der Browser hat nicht angegeben, ob er diese Bibliothek beh\xE4lt. Bewahre ein Backup auf.","Dieser Userscript-Manager gibt Aviary keinen Zugriff auf die Seite selbst.","Dieser Browser hat Aviarys Seitenskript nicht geladen.","Aviarys Seitenskript ist geladen, aber etwas anderes hat zuerst geantwortet, wahrscheinlich eine andere Erweiterung. Auf dieser Seite liegt der Werbeschutz auf Netzwerkebene nicht in Aviarys Hand.","In diesem Browser nicht verf\xFCgbar.","Selektor-Treffer","Erforderliche Oberfl\xE4chen fehlen","Optionale Oberfl\xE4chen fehlen","Ersatzselektoren in Verwendung","Betroffene Funktionen","Letzter Selektor\xFCbergang","Werbebeobachtungen","Anzahl der Werbemarker","Abweichung der Werbeerkennung","Beibehaltene Werbebeobachtungen","Nativ","Trend","Eigenwerbung","Video","Melde dich bei X an, bevor du den Vorgang ausf\xFChrst.","W\xE4hle mindestens eine Art von Aktivit\xE4t aus, um Ausf\xFChren zu aktivieren.","L\xF6schung wird gestartet\u2026","Long Animation Frame nicht verf\xFCgbar","Noch keine Apply-Messungen","Fehler","Fehler","Die Seite war auch mit allen Aviary-Funktionen aus noch falsch, also verursacht nichts an Aviary das Problem. Eine andere Erweiterung, ein Userscript oder X selbst ist der n\xE4chste Ort zum Nachsehen.","Es lief keine Aviary-Funktion, also gab es nichts zu durchsuchen.","Keine aktiven Downloads.","Durch den Nur-lokal-Modus blockiert","blockiert (Budget ist 0)","Keine Treffer (oder Integration deaktiviert).","\xD6ffne die Follower- oder Gefolgt-Liste eines Profils und nutze \u201EMomentaufnahme erfassen\u201C, um sie festzuhalten.","In diesem Format nicht vorhanden:","Keine erfassten Datens\xE4tze entsprechen \u201E{query}\u201C.","X unter der Haube","Lies Xs eigene monatliche Sichtbarkeits\xFCbersicht lokal. Sie zeigt aggregierte Labels, keine Produktions-Gewichte und keine vollst\xE4ndige Post-Pr\xFCfung.","X-Under-the-Hood-JSON importieren","Under-the-Hood-Bericht lokal gespeichert.","F\xFCr diesen Monat wurden keine Sichtbarkeits-Labels gemeldet.","Noch kein X-Bericht importiert.","Importiere einen weiteren Monat zum Vergleich.","Auswahl herunterladen","{selected} von {total} Dateien ausgew\xE4hlt. {unavailable} lassen sich nicht herunterladen.","Medienart","Alle Arten","Alle ausw\xE4hlen","Nicht verf\xFCgbar.","Diese Suche enth\xE4lt mehr als {limit} herunterladbare Dateien. Grenze sie zuerst ein.","Keine lokalen Sammlungen entsprechen dieser Suche.","Texttreffer und semantischer Treffer","Semantischer Treffer","Texttreffer","(kein Text)","Lokale Lesezeichen finden","Durchsuche gespeicherte Beitr\xE4ge nach Text, Handle, Tags, Ordner oder ID. Erfasste Lesezeichen enthalten nur Beitr\xE4ge, die X beim Vorbeiscrollen an die Seite gesendet hat.","Lokale Lesezeichen durchsuchen","Noch nichts gespeichert. Nutze \u201ELokal speichern\u201C an einem Beitrag, um hier eine Kopie zu behalten.","Keine lokalen Lesezeichen passen zu dieser Suche.","Notizen","Lesezeichen-Notizen","Entfernen","F\xFCge unten eine im Format Name: Notiz hinzu. Notizen erscheinen neben den Beitr\xE4gen dieses Kontos.","Schalte die Erfassung ein, scrolle durch eine Timeline und exportiere dann. Auftr\xE4ge und ihre Datens\xE4tze erscheinen hier.","WARC-Archiv wird erstellt\u2026","WACZ-Archiv wird erstellt\u2026","Das gespeicherte Schl\xFCsselpaar ist ung\xFCltig. Ersetze es, bevor du ein weiteres Archiv signierst.","Bei der ersten Verwendung wird eine lokale P-384-Identit\xE4t erstellt. Normale WACZ-Downloads bleiben unsigniert.","Neue Signieridentit\xE4t wird erstellt\u2026","Aviary-exklusiven WACZ-Nachweis erstellen\u2026","Signaturschl\xFCsselpaar wird vorbereitet\u2026","Downloadverlauf exportieren","Lokale Duplikatdaten als JSON und CSV f\xFCr einen Zeitraum exportieren. Quell-URLs der Medien werden nie eingef\xFCgt.","Startdatum des Verlaufs","Enddatum des Verlaufs","Zeitraum exportieren","Erfasstes Audio herunterladen","Audiospuren aus lokalen Erfassungen herunterladen. Es wird keine Metadatensuche ausgef\xFChrt.","Erfasste Untertitel herunterladen","Untertitelspuren aus lokalen Erfassungen herunterladen. Es wird keine Metadatensuche ausgef\xFChrt.","Zeile","Zuvor beobachtete Marker werden nicht mehr erkannt: {markers}.","Bereit zur Ausf\xFChrung f\xFCr @{handle}.","{feature}: {count} Aufrufe \xB7 {total} ms insgesamt \xB7 {max} ms maximal \xB7 {full} vollst\xE4ndig / {incremental} inkrementell","{observed} lange Frames \xB7 {correlated} korreliert","{count} Funktionen","X l\xE4uft auf {language}, einer Sprache, f\xFCr die Aviary keine Werbekennzeichnungen hat. Gesponserte Beitr\xE4ge werden hier nicht \xFCber die Kennzeichnung ausgeblendet.","{feature} hat diese Seite ver\xE4ndert. Es hat {rounds} Runden gedauert, das zu finden. Alle Funktionen laufen wieder, schalte diese also mit ihrer eigenen Einstellung ab, wenn sie aus bleiben soll.","Runde {round} von {total}. Alle {off} Funktionen sind aus.","Runde {round} von {total}. {off} der {suspect} noch verd\xE4chtigen Funktionen sind aus.","GID {gid} \xB7 {status}","{count} Eintr\xE4ge","{posts} Beitr\xE4ge \xB7 {likes} Likes \xB7 {messages} Direktnachrichten (nicht in der \xF6ffentlichen Suche) \xB7 {media} Medienverweise \xB7 {followers} Follower \xB7 {following} gefolgt \xB7 {lists} Listen","{archiveLinks} Archivlinks + {corpusLinks} erfasste Links aufgel\xF6st \xB7 {participants} Teilnehmer-IDs zugeordnet \xB7 {unresolved} als nicht zugeordnete IDs behalten \xB7 keine Anfragen gesendet","{status} \xB7 {filename} \xB7 {records} Datens\xE4tze \xB7 {files} Dateien \xB7 {warnings} Warnungen","{saved} gespeichert \xB7 {mirrored} gespiegelt \xB7 {due} f\xE4llig \xB7 {tags} Tags \xB7 {folders} Ordner","{public} \xF6ffentlich \xB7 {protected} gesch\xFCtzt \xB7 {unknown} unbekannt \xB7 {excluded} aus Freigabeexporten ausgeschlossen","{status} \xB7 {records} Datens\xE4tze \xB7 {surface}","Lokale Identit\xE4t {fingerprint}. Sie belegt die Kontinuit\xE4t dieses Schl\xFCssels, nicht die von X bereitgestellten Inhalte.","{count} in dieser Sitzung","{imported} Regeln gefunden. Ersetzen ist bereit. Hinzuf\xFCgen ist in Zeile {line} blockiert: {error}","{imported} Regeln gefunden. {added} hinzuf\xFCgen; {duplicates} bereits vorhanden. {replaced} durch {total} ersetzen.","Verwirft die gespeicherten Warnungen und Fehler. Hier werden nur Aviarys eigener Meldungstext, die Uhrzeit und die Namen seiner Detailfelder abgelegt.","L\xF6scht den begrenzten lokalen Markerverlauf und seine Abweichungswarnung. Beitragstexte, Handles, URLs oder Antwortinhalte werden hier nicht gespeichert.","Schaltet jede Aviary-Funktion aus und dann h\xE4lftig wieder an und fragt nach jeder Runde, ob die Seite noch falsch ist. In etwa f\xFCnf Runden ist die verantwortliche Funktion benannt. Nichts wird in deine Einstellungen geschrieben, ein Neuladen stellt also alles wieder her, egal was du tust, auch wenn du auf halbem Weg aufh\xF6rst. Das Control Center und seine Sprache bleiben durchgehend an und k\xF6nnen deshalb nicht benannt werden.","Von vorn beginnen, mit allen Funktionen aus.","Die Suche weglegen. Nichts \xE4ndert sich; alle Funktionen sind bereits wieder an.","Das Problem bleibt, obwohl diese Funktionen aus sind, es ist also eine der anderen.","Das Problem verschwand, als diese Funktionen aus waren, es ist also eine davon.","Alle Funktionen wieder anschalten und die Suche verwerfen. Es wird keine Antwort erfasst.","{filename} pausieren.","{filename} fortsetzen.","{filename} abbrechen.","{filename} erneut versuchen.","{jobId} pausieren.","{jobId} fortsetzen.","{jobId} abbrechen.","Strukturbeobachtung kopieren","Mutationsleistung","Leistungsmetriken zur\xFCcksetzen","Werbekennzeichnungen f\xFCr diese Sprache","Gespeicherte Warnungen","Gespeicherte Warnungen l\xF6schen","Werbebeobachtungen zur\xFCcksetzen","Aktives Profil","Profil wechseln","Alte Daten hier zuweisen","Neues Profil","Die Funktion finden, die diese Seite kaputt macht","Funktionssuche","Erneut suchen","Ergebnis l\xF6schen","Noch verd\xE4chtig","Die Seite ist immer noch falsch","Die Seite sieht jetzt richtig aus","Suche stoppen","Sicherungsversion","Sammlungen der Sicherung","\xC4nderungen an Sammlungen","Zugangsdaten","Warnungen der Sicherung","Wiederherstellung abbrechen","Wiederherstellung simulieren","Diese Bibliothekssicherung wiederherstellen","Noch keine Momentaufnahmen","Importierte Sammlungen","Lokale Archivreparaturen","Archivimport","Archivimport pausieren","Archivimport fortsetzen","Archivimport abbrechen","Archivimport erneut versuchen","Neuster Under-the-Hood-Bericht","Labels im neusten Bericht","Under-the-Hood-Berichte","Monatlicher Vergleich","Gespeicherte Under-the-Hood-Berichte exportieren","Lokale Lesezeichen","Lokale Lesezeichen exportieren","F\xFCr Lesezeichen-Manager exportieren","Lokale Lesezeichen l\xF6schen","Noch keine Kontonotizen","Zielgruppenabdeckung","Noch keine Exportauftr\xE4ge","Exportauftrag","Exportauftrag pausieren","Exportauftrag fortsetzen","Exportauftrag abbrechen","Erfasste Threads wiederherstellen","Aktiver Medienbatch","Duplikat-Treffer","Qualit\xE4tsnachweise","Letzter Duplikat-Treffer","Download-Verlauf l\xF6schen","Wartende Medien fortsetzen","Fehlgeschlagene Medien erneut versuchen","Umgeschriebene Playlists","Gesehene Beitr\xE4ge vergessen","Nicht lesbare Regeln","Abgelaufene Regeln","Abgelaufene Regeln erneuern","Verf\xFCgbare Beitr\xE4ge","R\xFCckblick \xF6ffnen","Pausieren","Fortsetzen","Stoppen","Schl\xFCsselpaar ersetzen","Alles in Ordnung. Jede \xC4nderung wurde gespeichert.","Kopiert, wie X diese Seite aufbaut (Elementanzahl, Verschachtelung und Layout), um die Testdaten von Aviary zu aktualisieren. Keine Beitragstexte, Namen, Benutzernamen, Links oder IDs.","Die Mutationszeit bleibt lokal und speichert nur Funktions-IDs und begrenzte Dauern.","Verschiebt nicht zugeordnete Einstellungen und Bibliotheksspeicher aus der Zeit vor den Profilen in das aktive Profil. Aus der aktuellen X-Route wird nichts abgeleitet.","Lege ein leeres Offline-Profil an, bevor du das Konto wechselst oder ein weiteres Archiv importierst.","Nichts aufgezeichnet.","Wird gemessen\u2026","Dieser Browser-Speicher l\xE4sst sich von hier aus nicht messen, deshalb nennt Aviary keine Gr\xF6\xDFe daf\xFCr.","Dieser Browser schl\xFCsselt seinen Speicherbericht nicht nach Art auf, deshalb wird nur Aviarys eigene Messung angezeigt.","L\xE4dt die normalisierten Berichte als lokales JSON herunter. Das sind Nutzerdaten von X; Aviary f\xFCgt keine Ranking-Gewichte hinzu und berechnet keinen Wert.","Lade JSON und CSV f\xFCr jedes Lesezeichen dieses Profils herunter. Der Spiegel enth\xE4lt nur, was X beim Vorbeiscrollen an die Seite gesendet hat.","L\xE4dt eine Browser-Lesezeichendatei herunter, die Karakeep, Linkwarden, linkding und jeder Browser importieren, dazu die CSV-Datei, die Raindrop.io importiert.","Entfernt alle gespeicherten lokalen Lesezeichen.","Erfasste Antworten werden in der Reihenfolge des \xFCbergeordneten Beitrags gelesen. Fehlende \xFCbergeordnete Beitr\xE4ge bleiben als lokale L\xFCcken sichtbar.","Setzt den lokalen Duplikat-Index zur\xFCck.","Stellt pausierte oder eingereihte Downloads aus einer fr\xFCheren Sitzung wieder her.","Wiederholt jeden fehlgeschlagenen oder abgebrochenen Medienauftrag in der dauerhaften Warteschlange.","Voreinstellungspakete stehen in diesem Build nicht zur Verf\xFCgung.","L\xF6scht die gespeicherten Beitrags-IDs, sodass alles wieder als ungesehen gilt.","Startet den Zeitraum jeder abgelaufenen Regel ab jetzt neu. Beim Ablauf wird nichts gel\xF6scht, eine Regel l\xE4sst sich also immer zur\xFCckholen.","Pr\xFCfe einen Zeitraum, filtere nach Beitragstyp, gruppiere nach Autor und \xF6ffne den Originalbeitrag. Es werden keine Anfragen gestellt.","Speicher f\xFCr ausgeblendete Beitr\xE4ge steht in diesem Build nicht zur Verf\xFCgung.","Bereit.","L\xF6schung abgeschlossen.","Das Aktionslimit wurde erreicht. Setze fort, um einen weiteren Durchgang zu starten.","L\xF6schung pausiert.","L\xF6schung gestoppt.","Die Vorschau l\xE4uft.","Die L\xF6schung l\xE4uft.","Das angemeldete Konto hat sich ge\xE4ndert. Es wurden keine weiteren Aktionen ausgef\xFChrt.","Ein anderer X-Tab f\xFChrt diese L\xF6schung bereits aus.","Dieser Tab f\xFChrt bereits eine L\xF6schung aus.","X hat eine Anmelde- oder Missbrauchspr\xFCfung angezeigt. Schlie\xDFe sie ab und setze dann fort.","W\xE4hle mindestens eine Kontokategorie aus.","Es gibt keine laufende L\xF6schung, die pausiert werden kann.","Es gibt keine pausierte L\xF6schung, die fortgesetzt werden kann.","Es gibt keine L\xF6schung, die gestoppt werden kann.","X-Aktivit\xE4t l\xF6schen wird noch geladen.","Setze diese L\xF6schung in dem X-Tab fort, in dem sie gestartet wurde.","X hat die Aktion nach f\xFCnf automatischen Neuladevorg\xE4ngen nicht \xFCbernommen. Setze fort, um es erneut zu versuchen.","Ein unerwarteter Fehler hat die L\xF6schung gestoppt.","Der L\xF6schbefehl konnte nicht ausgef\xFChrt werden.","Kontobereinigung pausiert.","Kontobereinigung gestoppt.","Protokoll der Kontobereinigung gel\xF6scht.","Diese Bereinigung l\xE4uft jetzt in einem anderen X-Tab.","{category} wird ge\xF6ffnet.","Vorschau f\xFCr {category}.","Bereinigung von {category} l\xE4uft.","Die ausgew\xE4hlten Bereinigungsdurchg\xE4nge sind abgeschlossen.","Weitere Eintr\xE4ge werden geladen: {category}.","{count} weitere Eintr\xE4ge geladen: {category}.","X l\xE4dt noch \xE4ltere Eintr\xE4ge: {category}.","Suche nach weiteren Eintr\xE4gen: {category} ({checks}/{limit}).","{category}: {count} gefunden.","{category}: {count} entfernt.","Pause von {seconds} Sekunden nach {count} Aktionen. Die L\xF6schung wird automatisch fortgesetzt.","Weiter mit {category}.","Ein Eintrag wurde \xFCbersprungen, weil das erwartete Bedienelement fehlte.","Eine Kontoaktion wurde nicht \xFCbernommen. Aviary versucht es erneut.","{category} wird von oben neu geladen, um zu pr\xFCfen, dass nichts \xFCbersehen wurde.","Die erneute Pr\xFCfung hat keine weiteren Eintr\xE4ge gefunden: {category}.","Keine weiteren Eintr\xE4ge gefunden: {category}.","Gef\xE4llt mir wird f\xFCr das n\xE4chste Limitfenster von X neu geladen.","X hat die Aktion zweimal nicht \xFCbernommen. Warte {seconds} Sekunden, bevor {category} neu geladen wird ({attempt}/{max}).","{category} wird jetzt neu geladen. Die L\xF6schung wird automatisch fortgesetzt.","Die Sperre der Kontobereinigung konnte nicht erneuert werden.","Melde dich bei X an und setze dann fort.","Ein unerwarteter Fehler hat die Kontobereinigung gestoppt.","Die Kontobereinigung ist blockiert und braucht deine Aufmerksamkeit.","Das Limit von X mit 500 Gef\xE4llt-mir-Aktionen wurde erreicht. Warte {seconds} Sekunden auf das n\xE4chste Fenster. Die L\xF6schung wird automatisch fortgesetzt.","Das Limit von X mit 500 Gef\xE4llt-mir-Aktionen wurde erreicht. Warte 1 Minute auf das n\xE4chste Fenster. Die L\xF6schung wird automatisch fortgesetzt.","Das Limit von X mit 500 Gef\xE4llt-mir-Aktionen wurde erreicht. Warte {minutes} Minuten auf das n\xE4chste Fenster. Die L\xF6schung wird automatisch fortgesetzt.","Aviarys KI-Befehlsmen\xFC \xF6ffnen","Mit Anbieter ausf\xFChren","l\xE4uft\u2026","Ergebnis in die Zwischenablage kopiert.","Das Ergebnis konnte nicht kopiert werden. Dein Browser hat den Zugriff auf die Zwischenablage blockiert.","der Anbieter hat nicht geantwortet","Pr\xFCfe Schl\xFCssel und Modell unter Integrationen.","Prompt in die Zwischenablage kopiert. F\xFCge ihn in deinen Assistenten ein.","Der Prompt konnte nicht kopiert werden. Dein Browser hat den Zugriff auf die Zwischenablage blockiert.","Externe KI-Anfrage pr\xFCfen","Es wird nichts gesendet, bis du Anfrage senden ausw\xE4hlst.","unbegrenzt","Aviary speichert nur Nutzungsz\xE4hler; die Aufbewahrung des Anbieters richtet sich nach dessen Richtlinie.","Das Budget hat diese Anfrage blockiert.","Anfrage senden","\xDCbersetzen","\xDCbersetzt den ausgew\xE4hlten Beitrag in deine aktive Sprache.","Zusammenfassen","Fasst einen Thread oder langen Beitrag in 3 Stichpunkten zusammen.","Erkl\xE4ren","Erkl\xE4rt Kontext, Fachjargon und Anspielungen im Beitrag.","Faktencheck-Prompt","Erzeugt einen Faktencheck-Prompt f\xFCr den Beitrag (ohne Schl\xFCssel keine Netzanfrage).","Textbausteine","Aviarys Textbausteine im Editor \xF6ffnen","Noch keine Textbausteine. Lege welche im Control Center \u2192 Bibliothek an.","Klicke erst in den Editor und w\xE4hle dann einen Textbaustein.","Aviary ist aktiv","Zwei Dinge sind von Anfang an aktiv. Alles andere bleibt aus, bis du es einschaltest.","Gesponserte Beitr\xE4ge, beworbene Trends und Pre-Rolls sind ausgeblendet.","Fotos und Videos erhalten eine Herunterladen-Schaltfl\xE4che, die erst auf deinen Klick hin etwas tut.","\xD6ffne Aviary \xFCber die letzte Zeile in X' linker Navigation, um daran etwas zu \xE4ndern.","Verstanden","Deine lokale Bibliothek liegt bereits \xFCber der Speichergrenze, die du gesetzt hast. Es wurde nichts gel\xF6scht.","Diese Aufnahme bringt deine lokale Bibliothek \xFCber die Speichergrenze, die du gesetzt hast. Es wurde nichts gel\xF6scht.","Originale","Zitate","Gefiltert","Alle","Kategorien der \xDCbersicht","R\xFCckblick","\xDCbersicht schlie\xDFen","Zeitraum","Sortieren","Neueste zuerst","\xC4lteste zuerst","Am wenigsten dichte zuerst","Nach Autor gruppieren","Ein ruhiger Zeitraum. Nichts Neues zu sichten.","Nichts in diesem Zeitraum.","Die \xDCbersicht enth\xE4lt nur Beitr\xE4ge, die Aviary bereits angezeigt hat. Sie fordert nichts weiter von X an.","Das war alles.","Unbekanntes Konto","Foto","Audio","Untertitel","Vorschaubild","Vorschau laden","Untertitel \xF6ffnen","Beitrag \xF6ffnen","Wichtigste Links","Beitrag, den Aviary in diesem Zeitraum gesehen hat","Beitr\xE4ge, die Aviary in diesem Zeitraum gesehen hat","Mal geteilt","Mal geteilt","Unter deiner Interaktionsschwelle","Ausgeblendet: dieser Beitrag enth\xE4lt ein Foto","Ausgeblendet: dieser Beitrag enth\xE4lt ein Video","Ausgeblendet: dieser Beitrag enth\xE4lt ein GIF","Ausgeblendet: dieser Beitrag stammt von einem verifizierten Konto","Ausgeblendet: dieser Beitrag zitiert einen anderen","Abgeblendet durch deine Regel","Ausgeblendet durch deine Regel","Abgeblendet durch dein Schl\xFCsselwort","Ausgeblendet durch dein Schl\xFCsselwort","Abgeblendet durch dein Muster","Ausgeblendet durch dein Muster","Diesen Beitrag ausblenden","Beitrag ausgeblendet","Der ausgeblendete Beitrag konnte nicht gespeichert werden. Der Speicher hat den Schreibvorgang abgelehnt.","R\xFCckg\xE4ngig","Dieser Beitrag konnte nicht wiederhergestellt werden.","Au\xDFerhalb deiner Lesezeit","Aviary deckt die Timeline bis zu deinem n\xE4chsten Zeitfenster ab. Nichts wird blockiert, und nichts hat dieses Ger\xE4t verlassen.","Lass mich f\xFCnf Minuten durch","Klicks auf die Zeile sind aus. Das Antwortsymbol \xF6ffnet den Beitrag.","Mehr Beitr\xE4ge anzeigen","Lesezeichen konnte nicht gespeichert werden.","Lokal speichern","Lokales Lesezeichen entfernen","Link kopieren","Link dieses Beitrags kopieren","Dieser Beitrag hat keinen Link, den Aviary kopieren kann.","Kopiert","Fehlgeschlagen","Die Zwischenablage hat diese Kopie abgelehnt.","Notiz","Markierung","beste direkte","Der Download-Zugriff wurde nicht erteilt. \xD6ffne die Aviary-Optionen, um Browser-Downloads zu aktivieren.","Medien-Download fehlgeschlagen. Versuche es erneut \xFCber die Schaltfl\xE4che am Beitrag.","Klicke zuerst mit der rechten Maustaste auf ein Bild oder Video und w\xE4hle dann den Aviary-Download.","Herunterladen \xB7 Bestes direktes MP4","Herunterladen","L\xE4dt die eigenen Medien dieses Beitrags herunter. Zitierte und Karten-Medien haben ihre eigene Herunterladen-Schaltfl\xE4che.","Alle Medien in diesem Beitrag herunterladen","Das direkte Video wird noch geladen. Versuche es gleich noch einmal.","Links kopieren","Die besten direkten Medienlinks dieses Posts kopieren","adaptiv","An yt-dlp senden","Das beobachtete adaptive Video an das lokale yt-dlp senden","yt-dlp-Befehl kopieren","Den yt-dlp-Befehl f\xFCr das beobachtete adaptive Video kopieren","Adaptives Video in h\xF6herer Qualit\xE4t","Wird gesendet\u2026","Abgelehnt","Der lokale yt-dlp-Helfer hat diesen Auftrag abgelehnt.","Der lokale yt-dlp-Helfer ist fehlgeschlagen.","Gespeichert","Adaptives Video von yt-dlp gespeichert.","Fehlt","Der yt-dlp-Auftrag ist nicht mehr verf\xFCgbar. Kopiere den Befehl f\xFCr einen neuen Versuch.","Der lokale yt-dlp-Helfer war nicht erreichbar.","yt-dlp-Befehl kopiert.","Der yt-dlp-Befehl konnte nicht kopiert werden.","Wird heruntergeladen\u2026","Erneut versuchen","Nicht verf\xFCgbar","Gestartet","Der Browser \xFCbertr\xE4gt diese Datei noch. Das Ergebnis steht in deinen Downloads.","Dein Browser hat die Datei ge\xF6ffnet statt gespeichert. Erteile Aviary die Download-Berechtigung f\xFCr ein echtes Speichern.","\xDCbersprungen, weil die heruntergeladenen Bytes einem Eintrag im Verlauf entsprechen.","\xDCbersprungen, weil das Bild einem Eintrag im Verlauf \xE4hnelt.","\xDCbersprungen, weil dies dasselbe X-Medium in einer anderen Gr\xF6\xDFe ist.","Aviary ben\xF6tigt die Download-Berechtigung des Browsers. Die Optionsseite wird ge\xF6ffnet.","Originalbild erneut versuchen","Bereits heruntergeladen","Originalqualit\xE4t","Ersatzqualit\xE4t. Klicken, um das Original erneut zu versuchen","Beste direkte Qualit\xE4t","Qualit\xE4t unbekannt","Dieses Bild steht nicht zum Download zur Verf\xFCgung.","Zulassen","Berechtigungen","Downloadzugriff","Aktiviere die Berechtigungen, die Aviary f\xFCr Videos und Bilder in bestm\xF6glicher Qualit\xE4t ben\xF6tigt. Nichts verl\xE4sst deinen Browser.","Downloadbereitschaft","erteilt","freiwillig","Alles ist optional. Du beh\xE4ltst die Kontrolle.","Videos und Bilder speichern","wird gepr\xFCft\u2026","Speichert das beste verf\xFCgbare Video oder Bild \xFCber deinen Browser und \xFCbernimmt deine Einstellungen f\xFCr Dateinamen und Duplikate.","Download-Zugriff erteilen","Widerrufen","Originalmedien direkt lesen","Erm\xF6glicht Aviary, Medien in voller Gr\xF6\xDFe direkt abzurufen. Die Download-Schaltfl\xE4chen funktionieren auch ohne diese Berechtigung.","Medien-Hosts erlauben","Lokalen yt-dlp-Helfer erreichen","Nur f\xFCr den optionalen yt-dlp-Helfer. Aviary spricht ihn aus der Erweiterung an, deshalb fragt Chrome nicht f\xFCr x.com nach Zugriff auf das lokale Netzwerk.","Helferzugriff erlauben","Downloads starten","Aktiviere das Speichern mit einem Klick \xFCber deinen Browser.","X \xF6ffnen","Aviary f\xFCgt Download automatisch zu Beitr\xE4gen mit Medien hinzu.","Download ausw\xE4hlen","Aviary w\xE4hlt die beste verf\xFCgbare Qualit\xE4t.","X zum Herunterladen \xF6ffnen","Standardm\xE4\xDFig privat","Nichts verl\xE4sst deinen Browser.","Einstellungen, Filter, Notizen und Archive liegen im Control Center auf x.com. Diese Seite verwaltet nur Browser-Berechtigungen.","Dieser Browser stellt die Berechtigungs-API nicht bereit.","Anfrage verworfen. Nichts ge\xE4ndert.","Widerrufen.","Nichts zu widerrufen.","nicht erteilt","Erteilt. Medien werden jetzt \xFCber den Browser gespeichert.","Erteilt. Aviary kann Medien jetzt in voller Gr\xF6\xDFe f\xFCr Exporte lesen.","Erteilt. Aviary erreicht den lokalen Helfer ohne Nachfrage des Browsers.","Aviary f\xFCr X","Lokale X/Twitter-Erweiterung mit umkehrbaren Steuerelementen und Datenschutz als Standard.","Medien mit Aviary herunterladen","Aviary-Archiv","Lokaler Archiv-Viewer. Remote-Referenzen werden niemals automatisch abgerufen.","Eintr\xE4ge durchsuchen","Medienstatus","Alle Medien","Erfasste Bytes","Remote-Referenz","Handle","Thread-Ansicht","Medien","Eintr\xE4ge","angezeigt","Keine passenden Eintr\xE4ge.","Quelle","Bytes","SHA-256","Quell-URL \xF6ffnen","Beitr\xE4ge","offline-fertig","Netzwerk eventuell erforderlich","Fehlender erfasster Beitrag","Dieser \xFCbergeordnete Beitrag wurde lokal nicht erfasst.","Unterhaltung","{count} Beitr\xE4ge von {author}","Einstieg","Kontobereinigung","Eintrag","Optionale Berechtigungen","Aktion fehlgeschlagen.","Steuerelemente an Beitr\xE4gen","Dateibenennung","Stapelverhalten","Warteschlangenstatus","In Warteschlange","Originalqualit\xE4t wird angewendet, wenn die Download-Steuerelemente aktiviert sind.","Liste speichern"],"ja":["Aviary\u306E\u8A2D\u5B9A","\u9759\u304B\u306AX\u3002\u30C7\u30FC\u30BF\u306F\u30ED\u30FC\u30AB\u30EB\u306B\u3002","\u9589\u3058\u308B","Aviary","\u5E83\u544A\u3001\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3001\u30D5\u30A3\u30EB\u30BF\u30FC\u306A\u3069\u3092\u691C\u7D22","\u8A2D\u5B9A\u3092\u691C\u7D22","\u5143\u306B\u623B\u3059","\u4FDD\u5B58","\u30B9\u30A4\u30C3\u30C1\u3068\u5165\u529B\u6B04\u306F\uFF3B\u4FDD\u5B58\uFF3D\u307E\u3067\u53CD\u6620\u3055\u308C\u307E\u305B\u3093\u3002\u30DC\u30BF\u30F3\u306F\u3059\u3050\u306B\u5B9F\u884C\u3055\u308C\u307E\u3059\u3002","\u30ED\u30FC\u30AB\u30EB\u306B\u4FDD\u5B58\u3057\u307E\u3057\u305F","\u8A2D\u5B9A\u306E\u30BB\u30AF\u30B7\u30E7\u30F3","\u3053\u3053\u304B\u3089\u958B\u59CB","\u30AF\u30A4\u30C3\u30AF\u8A2D\u5B9A","\u65E5\u5E38\u8A2D\u5B9A","\u5916\u89B3","\u30DA\u30FC\u30B8\u306E\u6574\u7406","\u30B3\u30F3\u30C6\u30F3\u30C4\u30D5\u30A3\u30EB\u30BF\u30FC","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","\u81EA\u5206\u306E\u30C7\u30FC\u30BF","\u4FDD\u5B58\u3057\u305F\u30DD\u30B9\u30C8","\u30A4\u30F3\u30DD\u30FC\u30C8\u3068\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8","X\u306E\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3\u3092\u524A\u9664","\u305D\u306E\u4ED6\u306E\u30C4\u30FC\u30EB","\u898B\u9003\u3057\u3092\u78BA\u8A8D","\u975E\u8868\u793A\u306E\u6295\u7A3F","\u52D5\u753B\u518D\u751F","X\u30A2\u30FC\u30AB\u30A4\u30D6","\u63A5\u7D9A","\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3068\u30EA\u30BB\u30C3\u30C8","\u30D7\u30E9\u30A4\u30D0\u30B7\u30FC\u3068\u8A3A\u65AD","\u4FDD\u5B58\u306E\u4ED5\u7D44\u307F","\u30B9\u30A4\u30C3\u30C1\u3068\u5165\u529B\u6B04\u306F\uFF3B\u4FDD\u5B58\uFF3D\u307E\u3067\u53CD\u6620\u3055\u308C\u307E\u305B\u3093\u3002\uFF3B\u9069\u7528\uFF3D\u3001\uFF3B\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\uFF3D\u3001\uFF3B\u30D7\u30EC\u30D3\u30E5\u30FC\uFF3D\u3001\uFF3B\u524A\u9664\uFF3D\u306A\u3069\u306E\u30DC\u30BF\u30F3\u306F\u3059\u3050\u306B\u5B9F\u884C\u3055\u308C\u307E\u3059\u3002","\u8A2D\u5B9A\u3092\u958B\u304F","X\u3092\u9759\u304B\u306B\u3059\u308B","\u5E83\u544A\u3001\u30C8\u30EC\u30F3\u30C9\u3001\u304A\u3059\u3059\u3081\u3001\u4F7F\u308F\u306A\u3044\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3059\u3002","\u4E0D\u8981\u306A\u30DD\u30B9\u30C8\u3092\u975E\u8868\u793A","\u5358\u8A9E\u3001\u30E1\u30C7\u30A3\u30A2\u3001\u30D0\u30C3\u30B8\u3001\u30DA\u30FC\u30B8\u3067\u30D5\u30A3\u30EB\u30BF\u30FC\u3057\u307E\u3059\u3002","\u5199\u771F\u3068\u52D5\u753B\u3092\u4FDD\u5B58","\u54C1\u8CEA\u3001\u30D5\u30A1\u30A4\u30EB\u540D\u3001\u91CD\u8907\u30C1\u30A7\u30C3\u30AF\u3001\u30AD\u30E5\u30FC\u306E\u52D5\u4F5C\u3092\u9078\u3073\u307E\u3059\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3\u3092\u524A\u9664","\u6295\u7A3F\u3001\u8FD4\u4FE1\u3001\u30EA\u30DD\u30B9\u30C8\u3001\u3044\u3044\u306D\u3001\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u524A\u9664\u3057\u307E\u3059\u3002","\u9759\u304B\u306A\u95B2\u89A7","\u30C8\u30EC\u30F3\u30C9\u30FB\u884C\u306E\u5883\u754C\u7DDA\u30FB\u30A8\u30F3\u30B2\u30FC\u30B8\u30E1\u30F3\u30C8\u6570\u3092\u96A0\u3057\u3001\u30D7\u30EC\u30DF\u30A2\u30E0\u6295\u7A3F\u3092\u6697\u304F\u3057\u3001t.co \u3092\u6574\u7406\u3059\u308B\u9AD8\u5BC6\u5EA6\u306E\u30C0\u30FC\u30AF\u30C6\u30FC\u30DE\u3002","\u53F3\u30B5\u30A4\u30C9\u30D0\u30FC\u3092\u975E\u8868\u793A","\u30AA\u30F3","\u30DB\u30D0\u30FC\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u6291\u5236","\u30A8\u30F3\u30B2\u30FC\u30B8\u30E1\u30F3\u30C8\u6570\u3092\u975E\u8868\u793A","\u30C6\u30FC\u30DE","\u30C7\u30A3\u30E0","\u9069\u7528","\u30E1\u30C7\u30A3\u30A2\u4FDD\u5B58","\u539F\u5BF8\u3067\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3001\u898F\u5247\u7684\u306A\u30D5\u30A1\u30A4\u30EB\u540D\u3001\u91CD\u8907\u3092\u9664\u304F\u5C65\u6B74\u3001\u7E26\u7A4D\u307F\u306E\u30E1\u30C7\u30A3\u30A2\u8868\u793A\u3002","\u30AA\u30EA\u30B8\u30CA\u30EB\u753B\u8CEA\u3092\u512A\u5148","\u30E1\u30C7\u30A3\u30A2\u306E\u30EC\u30A4\u30A2\u30A6\u30C8","\u7E26\u7A4D\u307F","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30DC\u30BF\u30F3\u3092\u8868\u793A","\u30AF\u30EA\u30A8\u30A4\u30BF\u30FC","\u30E9\u30A4\u30BF\u30FC\u30E2\u30FC\u30C9\u3001\u5B9A\u578B\u6587\u3001\u5171\u6709\u30DC\u30BF\u30F3\u306E\u6574\u7406\u3001\u30B5\u30A4\u30C9\u30D0\u30FC\u3068\u30C8\u30EC\u30F3\u30C9\u3092\u975E\u8868\u793A\u3002","\u30E9\u30A4\u30BF\u30FC\u30E2\u30FC\u30C9","\u30C8\u30EC\u30F3\u30C9\u3092\u975E\u8868\u793A","\u5747\u7B49\u30B0\u30EA\u30C3\u30C9","\u30EA\u30B5\u30FC\u30C1","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u7528\u30AD\u30E3\u30D7\u30C1\u30E3 \u30AA\u30F3\u3001JSON+CSV+HTML+MD \u5F62\u5F0F\u3001\u30AF\u30A8\u30EA ID \u306E\u81EA\u52D5\u691C\u51FA\u3001\u751F\u30C7\u30FC\u30BF\u3002","\u8868\u793A\u4E2D\u306E\u6295\u7A3F\u3092\u53CE\u96C6","\u751F\u306E\u30EC\u30B9\u30DD\u30F3\u30B9\u3092\u4FDD\u5B58","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u5F62\u5F0F","JSON, CSV, HTML, Markdown","\u30AF\u30E9\u30B7\u30C3\u30AF","Dim \u30C6\u30FC\u30DE\u306B\u623B\u3057\u3001\u30B5\u30A4\u30C9\u30D0\u30FC\u306F\u6B8B\u3057\u3001Grok \u306E\u307F\u975E\u8868\u793A\u3002\u30D7\u30EC\u30DF\u30A2\u30E0\u306E\u7D5E\u308A\u8FBC\u307F\u306A\u3057\u3002","\u9AD8\u5BC6\u5EA6\u30E2\u30FC\u30C9","\u7121\u52B9","Grok \u306E\u8981\u7D20\u3092\u975E\u8868\u793A","\u30DF\u30CB\u30DE\u30EB","\u6700\u5927\u9650\u306B\u7C21\u7D20\u5316\uFF1A\u30AB\u30A6\u30F3\u30C8\u306A\u3057\u3001\u5883\u754C\u7DDA\u306A\u3057\u3001\u30C8\u30EC\u30F3\u30C9\u306A\u3057\u3001\u5927\u304D\u306A\u6587\u5B57\u3067\u3082\u5D29\u308C\u306A\u3044\u4F59\u767D\u3002","\u30CE\u30EF\u30FC\u30EB","\u8A00\u8A9E","\u30D1\u30CD\u30EB\u3092\u7FFB\u8A33\u3057\u3001\u8AAD\u3080\u65B9\u5411\u3092\u8A2D\u5B9A\u3057\u307E\u3059\uFF08\u30A2\u30E9\u30D3\u30A2\u8A9E\u3068\u30D8\u30D6\u30E9\u30A4\u8A9E\u306F\u53F3\u304B\u3089\u5DE6\uFF09\u3002\u300C\u30D7\u30E9\u30A4\u30D0\u30B7\u30FC\u300D\u306B\u9078\u629E\u3057\u305F\u8A00\u8A9E\u306E\u7FFB\u8A33\u7387\u304C\u8868\u793A\u3055\u308C\u3001\u672A\u7FFB\u8A33\u306E\u9805\u76EE\u306F\u82F1\u8A9E\u306E\u307E\u307E\u306B\u306A\u308A\u307E\u3059\u3002","\u7528\u610F\u3055\u308C\u305F\u8A2D\u5B9A\u3092\u9078\u3076\u304B\u3001\u3088\u304F\u4F7F\u3046\u64CD\u4F5C\u3078\u76F4\u63A5\u79FB\u52D5\u3057\u307E\u3059\u3002","\u3088\u304F\u4F7F\u3046\u64CD\u4F5C","\u7528\u610F\u3055\u308C\u305F\u8A2D\u5B9A","\u8A00\u8A9E","Noir \u306F\u81EA\u52D5\u7684\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002X \u72EC\u81EA\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u4F7F\u3046\u306B\u306F\uFF3B\u30AA\u30D5\uFF3D\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30AA\u30D5\uFF08X \u672C\u6765\u306E\u30C6\u30FC\u30DE\uFF09","\u30E9\u30A4\u30C8\u30A2\u30A6\u30C8","\u30B0\u30E9\u30D5\u30A1\u30A4\u30C8","\u30D7\u30E9\u30E0","\u30DF\u30C3\u30C9\u30CA\u30A4\u30C8","\u30CE\u30EF\u30FC\u30EB\uFF08\u65E2\u5B9A\uFF09","\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u306E\u4F59\u767D\u3092\u8A70\u3081\u3066\u4E00\u89A7\u3057\u3084\u3059\u304F\u3057\u307E\u3059\u3002","\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u306E\u5E45","\u5E83\u3044\u3067\u306F\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u6A2A\u306E\u30B9\u30DA\u30FC\u30B9\u3092\u3059\u3079\u3066\u4F7F\u3044\u3001\u30B5\u30A4\u30C9\u30D0\u30FC\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3059\u3002\u3086\u3063\u305F\u308A\u3067\u306F\u30B5\u30A4\u30C9\u30D0\u30FC\u3092\u6B8B\u3057\u307E\u3059\u3002","\u65E2\u5B9A","\u3086\u3063\u305F\u308A","\u5E83\u3044\uFF08\u65E2\u5B9A\uFF09","Chirp \u30D5\u30A9\u30F3\u30C8\u3092\u5FA9\u5143","\u30B5\u30A4\u30C8\u304C\u30B7\u30B9\u30C6\u30E0\u30D5\u30A9\u30F3\u30C8\u306B\u623B\u3063\u3066\u3044\u308B\u7B87\u6240\u3067\u3001X \u672C\u6765\u306E Chirp \u66F8\u4F53\u3092\u9069\u7528\u3057\u307E\u3059\u3002","\u4E0B\u306E 4 \u3064\u306E\u6570\u5024\u3092\u307E\u3068\u3081\u3066\u5207\u308A\u66FF\u3048\u307E\u3059\u3002\u30DC\u30BF\u30F3\u306F\u5F15\u304D\u7D9A\u304D\u4F7F\u7528\u3067\u304D\u3001\u30B9\u30AF\u30EA\u30FC\u30F3\u30EA\u30FC\u30C0\u30FC\u3082\u5408\u8A08\u3092\u8AAD\u307F\u4E0A\u3052\u307E\u3059\u3002","\u8FD4\u4FE1\u6570\u3092\u975E\u8868\u793A","\u300C\u30A8\u30F3\u30B2\u30FC\u30B8\u30E1\u30F3\u30C8\u6570\u3092\u975E\u8868\u793A\u300D\u304C\u6709\u52B9\u306A\u9593\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002","\u30EA\u30DD\u30B9\u30C8\u6570\u3092\u975E\u8868\u793A","\u3044\u3044\u306D\u6570\u3092\u975E\u8868\u793A","\u8868\u793A\u56DE\u6570\u3092\u975E\u8868\u793A","\u300C\u30A8\u30F3\u30B2\u30FC\u30B8\u30E1\u30F3\u30C8\u6570\u3092\u975E\u8868\u793A\u300D\u304C\u6709\u52B9\u306A\u9593\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002\u8868\u793A\u56DE\u6570\u306E\u5408\u8A08\u306F\u30A2\u30AF\u30B7\u30E7\u30F3\u30DC\u30BF\u30F3\u3067\u306F\u306A\u304F\u3001\u30A2\u30CA\u30EA\u30C6\u30A3\u30AF\u30B9\u306E\u30EA\u30F3\u30AF\u5185\u306B\u3042\u308A\u307E\u3059\u3002","\u30BF\u30D6\u30BF\u30A4\u30C8\u30EB\u306E\u901A\u77E5\u6570\u3092\u975E\u8868\u793A","\u30D6\u30E9\u30A6\u30B6\u30FC\u306E\u30BF\u30D6\u30BF\u30A4\u30C8\u30EB\u304B\u3089 X \u306E\u672A\u8AAD\u6570\u3092\u53D6\u308A\u9664\u304D\u3001\u975E\u8868\u793A\u306B\u3057\u305F\u901A\u77E5\u30D0\u30C3\u30B8\u304C\u30BF\u30D6\u304B\u3089\u623B\u3089\u306A\u3044\u3088\u3046\u306B\u3057\u307E\u3059\u3002","\u7D76\u5BFE\u6642\u523B\u8868\u793A","X \u306E\u76F8\u5BFE\u8868\u8A18\u306E\u4EE3\u308F\u308A\u306B\u3001\u5404\u6295\u7A3F\u3078\u6B63\u78BA\u306A\u65E5\u4ED8\u3068\u6642\u523B\u3092\u8868\u793A\u3057\u307E\u3059\u3002","Aviary \u306E\u30BF\u30D6\u30A2\u30A4\u30B3\u30F3\u3092\u4F7F\u3046","X \u306E\u30D5\u30A1\u30D3\u30B3\u30F3\u3092 Aviary \u306E\u30DE\u30FC\u30AF\u306B\u7F6E\u304D\u63DB\u3048\u3001\u30BF\u30D6\u3092\u898B\u5206\u3051\u3084\u3059\u304F\u3057\u307E\u3059\u3002\u30AA\u30D5\u306B\u3059\u308B\u3068 X \u672C\u6765\u306E\u30A2\u30A4\u30B3\u30F3\u306B\u623B\u308A\u307E\u3059\u3002","\u884C\u306E\u5883\u754C\u7DDA\u3092\u975E\u8868\u793A","\u5404\u6295\u7A3F\u306E\u4E0B\u306B\u3042\u308B 1px \u306E\u533A\u5207\u308A\u7DDA\u3068\u3001\u30E1\u30A4\u30F3\u30AB\u30E9\u30E0\u306E\u5DE6\u53F3\u306E\u7F6B\u7DDA\u3092\u6D88\u3057\u307E\u3059\u3002","\u30CF\u30A4\u30B3\u30F3\u30C8\u30E9\u30B9\u30C8","\u5883\u754C\u7DDA\u3068\u6587\u5B57\u306E\u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u3092\u5F37\u3081\u307E\u3059\u3002","\u8996\u5DEE\u52B9\u679C\u3092\u6E1B\u3089\u3059","\u30B7\u30B9\u30C6\u30E0\u8A2D\u5B9A\u306B\u5F93\u3046","\u5E38\u306B\u6E1B\u3089\u3059","\u6E1B\u3089\u3055\u306A\u3044","\u30AB\u30B9\u30BF\u30E0 CSS","\u4E0B\u8A18\u306E\u7BC4\u56F2\u306B\u9069\u7528\u3059\u308B\u4EFB\u610F\u306E\u30ED\u30FC\u30AB\u30EB\u4E0A\u66F8\u304D\u3067\u3059\u3002CSS \u304C\u3053\u306E\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u306E\u5916\u3078\u51FA\u308B\u3053\u3068\u306F\u306A\u304F\u3001\u30D0\u30B0\u5831\u544A\u306E\u518D\u73FE\u5BFE\u8C61\u306B\u3082\u306A\u308A\u307E\u305B\u3093\u3002","\u6295\u7A3F CSS","\u8868\u793A\u3055\u308C\u305F\u6295\u7A3F\u3060\u3051\u306B\u9069\u7528\u3057\u307E\u3059\u3002\u4F8B: article { border-radius: 18px; }","\u30E1\u30C7\u30A3\u30A2\u64CD\u4F5C CSS","Aviary \u306E\u30E1\u30C7\u30A3\u30A2\u30DC\u30BF\u30F3\u3068\u305D\u306E\u5185\u5BB9\u3060\u3051\u306B\u9069\u7528\u3057\u307E\u3059\u3002","\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 CSS","X \u306E\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u30EC\u30FC\u30EB\u3060\u3051\u306B\u9069\u7528\u3057\u307E\u3059\u3002","\u30B5\u30A4\u30C9\u30D0\u30FC CSS","X \u306E\u63A2\u7D22\u30B5\u30A4\u30C9\u30D0\u30FC\u3060\u3051\u306B\u9069\u7528\u3057\u307E\u3059\u3002","\u4F5C\u6210\u753B\u9762 CSS","\u4F5C\u6210\u753B\u9762\u306E\u30C4\u30FC\u30EB\u30D0\u30FC\u3068\u30C6\u30AD\u30B9\u30C8\u9818\u57DF\u3060\u3051\u306B\u9069\u7528\u3057\u307E\u3059\u3002","\u8272\u3001\u9593\u9694\u3001\u6587\u5B57\u3001\u30DD\u30B9\u30C8\u306B\u8868\u793A\u3059\u308B\u6570\u5024\u3092\u5909\u66F4\u3057\u307E\u3059\u3002","\u5916\u89B3\u3068\u30EC\u30A4\u30A2\u30A6\u30C8","\u30DD\u30B9\u30C8\u306E\u8A73\u7D30","\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3","\u9AD8\u5EA6\u306A\u30B9\u30BF\u30A4\u30EB","\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u8AAD\u307F\u8FBC\u307F\u6642\u304B\u3089\u4FDD\u8B77\u3092\u958B\u59CB\u3057\u307E\u3059\u3002","\u5E83\u544A\u306A\u3057\u30E2\u30FC\u30C9","\u30B9\u30DD\u30F3\u30B5\u30FC\u6295\u7A3F\u3001\u6709\u6599\u30D1\u30FC\u30C8\u30CA\u30FC\u30B7\u30C3\u30D7\u3001\u30D7\u30ED\u30E2\u30FC\u30B7\u30E7\u30F3\u4E2D\u306E\u30C8\u30EC\u30F3\u30C9\u3001\u81EA\u793E\u30D7\u30ED\u30E2\u30FC\u30B7\u30E7\u30F3\u3001\u8868\u793A\u4E2D\u306E\u30D7\u30EC\u30ED\u30FC\u30EB\u5E83\u544A\u3092\u6298\u308A\u305F\u305F\u307F\u307E\u3059\u3002Aviary \u306F\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u914D\u4FE1\u3092\u59A8\u3052\u305A\u306B\u3001X \u306E\u30D7\u30ED\u30E2\u30FC\u30B7\u30E7\u30F3\u30B3\u30F3\u30C6\u30F3\u30C4\u7528\u306E\u5225\u500B\u306E\u8A18\u9332\u30EA\u30AF\u30A8\u30B9\u30C8\u3082\u62D2\u5426\u3057\u307E\u3059\u3002","X \u306E\u5E83\u544A\u30ED\u30B0\u9001\u4FE1\u3092\u62D2\u5426","\u5E83\u544A\u975E\u8868\u793A\u30E2\u30FC\u30C9\u304C\u6709\u52B9\u306A\u9593\u306E\u307F\u9069\u7528\u3055\u308C\u307E\u3059\u3002Aviary \u304C\u62D2\u5426\u3059\u308B\u306E\u306F X \u306E\u30D7\u30ED\u30E2\u30FC\u30B7\u30E7\u30F3\u30B3\u30F3\u30C6\u30F3\u30C4\u8A18\u9332\u30EA\u30AF\u30A8\u30B9\u30C8\u306E 1 \u4EF6\u3060\u3051\u3067\u3001X \u304C\u5E83\u544A\u30D6\u30ED\u30C3\u30AB\u30FC\u3092\u691C\u51FA\u3059\u308B\u305F\u3081\u306B\u4F7F\u3046\u78BA\u8A8D\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u542B\u3081\u3001\u307B\u304B\u306F\u4E00\u5207\u62D2\u5426\u3057\u307E\u305B\u3093\u3002\u305D\u308C\u3067\u3082 X \u304C\u8B66\u544A\u3092\u51FA\u3059\u5834\u5408\u306F\u3053\u308C\u3092\u30AA\u30D5\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30D7\u30ED\u30E2\u30FC\u30B7\u30E7\u30F3\u6295\u7A3F\u306F\u5F15\u304D\u7D9A\u304D\u975E\u8868\u793A\u306E\u307E\u307E\u3001Aviary \u306F\u3069\u306E\u30EA\u30AF\u30A8\u30B9\u30C8\u3082\u62D2\u5426\u3057\u306A\u304F\u306A\u308A\u307E\u3059\u3002","\u5E83\u544A\u4FDD\u8B77\u306E\u72B6\u614B","\u30C8\u30EC\u30F3\u30C9\u30FB\u304A\u3059\u3059\u3081\u30FB\u30D5\u30C3\u30BF\u30FC\u306E\u30CE\u30A4\u30BA\u3092\u6E1B\u3089\u3057\u307E\u3059\u3002","\u30C8\u30EC\u30F3\u30C9\u3068\u30CB\u30E5\u30FC\u30B9\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u6D88\u3057\u307E\u3059\u3002","\u304A\u3059\u3059\u3081\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u975E\u8868\u793A","\u30B5\u30A4\u30C9\u30D0\u30FC\u306E\u307B\u304B\u306E\u90E8\u5206\u306F\u6B8B\u3057\u305F\u307E\u307E\u3001\u300C\u304A\u3059\u3059\u3081\u30E6\u30FC\u30B6\u30FC\u300D\u30AB\u30FC\u30C9\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3059\u3002","\u30DB\u30FC\u30E0\u306E\u6295\u7A3F\u6B04\u3092\u975E\u8868\u793A","\u30DB\u30FC\u30E0\u306E\u30AF\u30A4\u30C3\u30AF\u6295\u7A3F\u6B04\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3059\u3002\u5FC5\u8981\u306A\u3068\u304D\u306F\u300C\u30DD\u30B9\u30C8\u300D\u30DC\u30BF\u30F3\u304B\u3089\u958B\u3051\u307E\u3059\u3002","\u30B9\u30EC\u30C3\u30C9\u306E\u304A\u3059\u3059\u3081\u3092\u975E\u8868\u793A","\u300C\u305D\u306E\u4ED6\u306E\u304A\u3059\u3059\u3081\u300D\u30D6\u30ED\u30C3\u30AF\u3068\u305D\u306E\u4E0B\u306E\u95A2\u9023\u6295\u7A3F\u3092\u6298\u308A\u305F\u305F\u307F\u3001\u4F1A\u8A71\u3092\u6700\u5F8C\u306E\u5B9F\u969B\u306E\u8FD4\u4FE1\u3067\u7D42\u4E86\u3057\u307E\u3059\u3002","Grok \u306E\u30C9\u30ED\u30EF\u30FC\u3068\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u30EA\u30F3\u30AF\u3001\u753B\u50CF\u751F\u6210\u306E\u5165\u53E3\u3001\u6295\u7A3F\u3054\u3068\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3059\u3002","\u540D\u524D\u3001\u30A2\u30D0\u30BF\u30FC\u3001\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u306B\u30DD\u30A4\u30F3\u30BF\u30FC\u3092\u7F6E\u3044\u305F\u3068\u304D\u306BX\u304C\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u30AB\u30FC\u30C9\u3084\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7\u3092\u958B\u304B\u306A\u3044\u3088\u3046\u306B\u3057\u307E\u3059\u3002\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u30E1\u30CB\u30E5\u30FC\u3001\u30E9\u30D9\u30EB\u3001\u30B9\u30AF\u30EA\u30FC\u30F3\u30EA\u30FC\u30C0\u30FC\u540D\u306F\u5909\u66F4\u3057\u307E\u305B\u3093\u3002","\u96C6\u4E2D\u30E2\u30FC\u30C9","\u4E0B\u8A18\u306E\u6642\u9593\u5E2F\u4EE5\u5916\u306F\u3001\u95B2\u89A7\u7528\u306E\u5217\u3092\u843D\u3061\u7740\u3044\u305F\u30ED\u30FC\u30AB\u30EB\u30D1\u30CD\u30EB\u3067\u8986\u3044\u307E\u3059\u3002\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306F\u305D\u306E\u307E\u307E\u4F7F\u3048\u30015 \u5206\u9593\u306E\u4E00\u6642\u89E3\u9664\u306F\u30EF\u30F3\u30AF\u30EA\u30C3\u30AF\u3067\u3059\u3002\u4F55\u3082\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u305A\u3001\u3053\u306E\u7AEF\u672B\u304B\u3089\u4F55\u3082\u9001\u4FE1\u3055\u308C\u307E\u305B\u3093\u3002","\u95B2\u89A7\u6642\u9593\u306E\u958B\u59CB","24 \u6642\u9593\u8868\u8A18\u306E\u6642\u523B\uFF08\u4F8B: 09:00\uFF09\u3002","\u95B2\u89A7\u6642\u9593\u306E\u7D42\u4E86","24 \u6642\u9593\u8868\u8A18\u306E\u6642\u523B\u3002\u7D42\u4E86\u304C\u958B\u59CB\u3088\u308A\u524D\u306E\u5834\u5408\u306F\u6DF1\u591C\u3092\u307E\u305F\u304E\u307E\u3059\u3002","\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u3092\u6B62\u3081\u308B\u4EF6\u6570","\u30D5\u30A3\u30FC\u30C9\u306E\u4F38\u3073\u3092\u6B62\u3081\u308B\u307E\u3067\u306B\u8868\u793A\u3059\u308B\u30DD\u30B9\u30C8\u6570\u3067\u3059\u3002\u7D9A\u304D\u3092\u8AAD\u3080\u305F\u3081\u306E\u30DC\u30BF\u30F3\u304C\u4ED8\u304D\u307E\u3059\u30020 \u306A\u3089 X \u306E\u7121\u9650\u30B9\u30AF\u30ED\u30FC\u30EB\u306F\u305D\u306E\u307E\u307E\u3067\u3059\u3002\u3059\u3067\u306B\u753B\u9762\u306B\u3042\u308B\u3082\u306E\u306F\u52D5\u304B\u305A\u3001\u30DC\u30BF\u30F3\u306F\u6700\u5F8C\u306E\u30DD\u30B9\u30C8\u306E\u4E0A\u3067\u306F\u306A\u304F\u4E0B\u306B\u73FE\u308C\u307E\u3059\u3002","\u9577\u3044\u30DD\u30B9\u30C8\u3092\u81EA\u52D5\u7684\u306B\u5C55\u958B","\u30B9\u30AF\u30ED\u30FC\u30EB\u304C\u6B62\u307E\u3063\u305F\u5F8C\u3001\u305D\u306E\u30DD\u30B9\u30C8\u5185\u306E\u300C\u3055\u3089\u306B\u8868\u793A\u300D\u3060\u3051\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u307E\u3059\u3002\u8FD4\u4FE1\u3001\u30B5\u30A4\u30C9\u30D0\u30FC\u3001\u5F15\u7528\u30DD\u30B9\u30C8\u3001\u307B\u304B\u306E\u300C\u3055\u3089\u306B\u8868\u793A\u300D\u30EA\u30F3\u30AF\u306B\u306F\u89E6\u308C\u307E\u305B\u3093\u3002","\u623B\u308B\u64CD\u4F5C\u5F8C\u306B\u4F4D\u7F6E\u3092\u5FA9\u5143","\u30DD\u30B9\u30C8\u307E\u305F\u306F\u5225\u306EX\u30DA\u30FC\u30B8\u3092\u958B\u3044\u3066\u30D6\u30E9\u30A6\u30B6\u306E\u623B\u308B\u30DC\u30BF\u30F3\u3092\u4F7F\u3063\u305F\u5F8C\u3001\u540C\u3058\u8868\u793A\u4E2D\u306E\u30DD\u30B9\u30C8\u306B\u623B\u308A\u307E\u3059\u3002\u30DB\u30A4\u30FC\u30EB\u3001\u30BF\u30C3\u30C1\u3001\u30DD\u30A4\u30F3\u30BF\u30FC\u3001\u307E\u305F\u306F\u30AD\u30FC\u30DC\u30FC\u30C9\u3067\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u3068\u3001\u5FA9\u5143\u306F\u3059\u3050\u306B\u4E2D\u6B62\u3055\u308C\u307E\u3059\u3002","\u65E2\u8AAD\u30DE\u30FC\u30AB\u30FC\u3092\u8868\u793A","\u30D5\u30A3\u30FC\u30C9\u3054\u3068\u306E\u4F4D\u7F6E\u3092\u30ED\u30FC\u30AB\u30EB\u306B\u4FDD\u5B58\u3057\u3001\u524D\u56DE\u306E\u78BA\u8A8D\u5F8C\u306B\u8FFD\u52A0\u3055\u308C\u305F\u6295\u7A3F\u306E\u7DDA\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u672A\u8AAD\u30D0\u30C3\u30B8\u306F\u8FFD\u52A0\u3057\u307E\u305B\u3093\u3002","\u65E2\u8AAD\u30DE\u30FC\u30AB\u30FC\u306E\u5BFE\u8C61","\u30ED\u30FC\u30AB\u30EB\u4F4D\u7F6E\u30DE\u30FC\u30AB\u30FC\u3068\u65B0\u7740\u6295\u7A3F\u306E\u533A\u5207\u308A\u3092\u8868\u793A\u3059\u308B\u5834\u6240\u3092\u9078\u3073\u307E\u3059\u3002","\u30DB\u30FC\u30E0","\u6295\u7A3F","\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB","\u691C\u7D22","\u901A\u77E5","\u30E1\u30C3\u30BB\u30FC\u30B8","\u6295\u7A3F\u6B04\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308B\u9593\u3001\u30B5\u30A4\u30C9\u30D0\u30FC\u3068\u80CC\u5F8C\u306E\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u3092\u8584\u304F\u3057\u307E\u3059\u3002\u5225\u306E\u5834\u6240\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308C\u3070\u3059\u3050\u5143\u306B\u623B\u308A\u307E\u3059\u3002","\u300C\u304A\u3059\u3059\u3081\u300D\u3067\u306F\u306A\u304F\u300C\u30D5\u30A9\u30ED\u30FC\u4E2D\u300D\u3092\u958B\u304F","\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u3092\u958B\u304F\u305F\u3073\u306B\u30DB\u30FC\u30E0\u306E2\u756A\u76EE\u306E\u30BF\u30D6\u3092\u9078\u3073\u307E\u3059\u3002\u300C\u304A\u3059\u3059\u3081\u300D\u306B\u623B\u3057\u305F\u5834\u5408\u306F\u3001\u30DA\u30FC\u30B8\u3092\u96E2\u308C\u308B\u307E\u3067\u305D\u306E\u307E\u307E\u3067\u3059\u3002","For you \u30BF\u30D6\u3092\u96A0\u3059","\u30D5\u30A9\u30ED\u30FC\u4E2D\u3092\u9078\u3073\u3001\u30DB\u30FC\u30E0\u306E\u6700\u521D\u306E\u30BF\u30D6\u3092\u6298\u308A\u305F\u305F\u307F\u307E\u3059\u3002\u30DB\u30FC\u30E0\u3060\u3051\u306B\u9069\u7528\u3055\u308C\u3001\u30AA\u30D5\u306B\u3059\u308B\u3068\u3059\u3050\u623B\u308A\u307E\u3059\u3002","\u6295\u7A3F\u3092\u8FD4\u4FE1\u30A2\u30A4\u30B3\u30F3\u304B\u3089\u306E\u307F\u958B\u304F","X\u306F\u884C\u5168\u4F53\u3092\u30EA\u30F3\u30AF\u306B\u3059\u308B\u305F\u3081\u3001\u672C\u6587\u3084\u30DC\u30BF\u30F3\u306E\u3059\u3050\u6A2A\u3092\u62BC\u3057\u305F\u3060\u3051\u3067\u3001\u9078\u3093\u3067\u3044\u306A\u3044\u6295\u7A3F\u304C\u958B\u304D\u307E\u3059\u3002\u3053\u306E\u8A2D\u5B9A\u306F\u884C\u304B\u3089\u30AF\u30EA\u30C3\u30AF\u9818\u57DF\u3092\u5916\u3057\u3001\u8FD4\u4FE1\u30A2\u30A4\u30B3\u30F3\u306B\u6E21\u3057\u307E\u3059\u3002\u8FD4\u4FE1\u30A2\u30A4\u30B3\u30F3\u306F\u8FD4\u4FE1\u30DC\u30C3\u30AF\u30B9\u3067\u306F\u306A\u304F\u6295\u7A3F\u3092\u958B\u304D\u307E\u3059\u3002\u30EA\u30F3\u30AF\u3001\u30DC\u30BF\u30F3\u3001\u30E1\u30C7\u30A3\u30A2\u3001\u5F15\u7528\u6295\u7A3F\u306F\u3053\u308C\u307E\u3067\u3069\u304A\u308A\u52D5\u4F5C\u3057\u307E\u3059\u3002","\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u9805\u76EE\u3092\u975E\u8868\u793A","1 \u884C\u306B\u3064\u304D X \u306E\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 ID \u3092 1 \u3064: home\u3001explore\u3001notifications\u3001follow\u3001chat\u3001messages\u3001grok\u3001history\u3001studio\u3001premium\u3001profile\u3001more\u3002","\u5E83\u544A\u3084\u4F7F\u308F\u306A\u3044X\u306E\u90E8\u5206\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3059\u3002","\u5E83\u544A\u4FDD\u8B77","\u30DA\u30FC\u30B8\u8981\u7D20","\u95B2\u89A7\u30D5\u30ED\u30FC","\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3","\u9078\u629E\u3057\u305F\u30EB\u30FC\u30C8\u3067\u30EB\u30FC\u30EB\u304C\u6709\u52B9\u3067\u3059\u3002","\u30D5\u30A3\u30EB\u30BF\u3092\u6709\u52B9\u306B\u3059\u308B","\u30AD\u30FC\u30EF\u30FC\u30C9\u30FB\u6B63\u898F\u8868\u73FE\u30FB\u30D7\u30EC\u30DF\u30A2\u30E0\u30FB\u30E1\u30C7\u30A3\u30A2\u306E\u5404\u30D5\u30A3\u30EB\u30BF\u3092\u307E\u3068\u3081\u3066\u5207\u308A\u66FF\u3048\u307E\u3059\u3002","\u30EB\u30FC\u30EB\u306E\u72B6\u614B","\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u6709\u52B9\u306B\u3059\u308B\u307E\u3067\u7121\u52B9\u3067\u3059\u3002\u6709\u52B9\u306B\u3059\u308B\u524D\u306B\u30EB\u30FC\u30EB\u3092\u7DE8\u96C6\u3067\u304D\u307E\u3059\u3002","\u65E2\u8AAD\u306E\u6295\u7A3F\u3092\u8584\u304F\u8868\u793A","\u6295\u7A3F\u304C2\u56DE\u76EE\u306B\u901A\u904E\u3057\u305F\u3089\u8584\u304F\u8868\u793A\u3057\u3001Aviary\u304C\u8868\u793A\u3057\u305F\u6295\u7A3F\u306E\u30ED\u30FC\u30AB\u30EB\u30B3\u30D4\u30FC\u3092\u4FDD\u5B58\u3057\u307E\u3059\u3002\u8584\u3044\u6295\u7A3F\u306B\u30AB\u30FC\u30BD\u30EB\u3092\u5408\u308F\u305B\u308B\u3068\u5143\u306B\u623B\u308A\u307E\u3059\u3002","\u65E2\u8AAD\u6295\u7A3F\u3092\u96A0\u3059\u5834\u6240","\u65E2\u306B\u898B\u305F\u6295\u7A3F\u3092\u8584\u304F\u8868\u793A\u3059\u308B\u30D5\u30A3\u30FC\u30C9\u3092\u9078\u3073\u307E\u3059\u3002","\u30D5\u30A3\u30EB\u30BF\u30FC\u30EB\u30FC\u30EB","1 \u884C\u306B 1 \u3064\u306E\u30EB\u30FC\u30EB\u3002\u30D5\u30A3\u30FC\u30EB\u30C9\u3001\u7701\u7565\u53EF\u80FD\u306A not\u3001\u6F14\u7B97\u5B50\u3001\u5024\u306E\u9806\u3067\u3059\u3002\u30D5\u30A3\u30FC\u30EB\u30C9\u306F text\u3001handle\u3001media\u3001verified\u3001link\u3001\u6F14\u7B97\u5B50\u306F contains\u3001is\u3001starts\u3001ends\u3001matches\u3002and / or \u3067\u3064\u306A\u304E\u3001dim: \u3092\u5148\u982D\u306B\u4ED8\u3051\u308B\u3068\u975E\u8868\u793A\u3067\u306F\u306A\u304F\u6DE1\u8272\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002\u884C\u982D\u3092 [\u30BF\u30A4\u30C8\u30EB] \u3067\u59CB\u3081\u308B\u3068\u30EB\u30FC\u30EB\u306B\u540D\u524D\u304C\u4ED8\u304D\u3001for 7d from <\u65E5\u6642> \u3067\u671F\u9650\u3092\u8A2D\u3051\u3089\u308C\u307E\u3059\u3002\u4F8B: [Weekend sales] dim for 7d from 2026-08-19T10:00:00.000Z: text contains sale and media is photo","\u30DD\u30FC\u30BF\u30D6\u30EB\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8","\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8\u3068\u3057\u3066\u66F8\u304D\u51FA\u3059\u304B\u3001\u30BB\u30C3\u30C8\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u8FFD\u52A0\u307E\u305F\u306F\u7F6E\u63DB\u306E\u5185\u5BB9\u3092\u4E8B\u524D\u306B\u78BA\u8A8D\u3057\u307E\u3059\u3002","\u3053\u3053\u306B\u30EB\u30FC\u30EB\u3092\u8CBC\u308A\u4ED8\u3051",".txt \u3092\u66F8\u304D\u51FA\u3059","\u30D7\u30EC\u30D3\u30E5\u30FC","\u30EB\u30FC\u30EB\u3092\u8FFD\u52A0","\u30EB\u30FC\u30EB\u3092\u7F6E\u63DB","\u30EB\u30FC\u30EB\u3092\u8CBC\u308A\u4ED8\u3051\u308B\u3068\u30012 \u3064\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u65B9\u6CD5\u3092\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002","\u30AD\u30FC\u30EF\u30FC\u30C9\u306E\u30EB\u30FC\u30EB","1 \u884C\u306B 1 \u3064\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u307E\u305F\u306F\u30D5\u30EC\u30FC\u30BA\u3002\u5927\u6587\u5B57\u5C0F\u6587\u5B57\u3092\u533A\u5225\u3057\u306A\u3044\u90E8\u5206\u4E00\u81F4\u3067\u3059\u3002","\u6B63\u898F\u8868\u73FE\u306E\u30EB\u30FC\u30EB","1 \u884C\u306B 1 \u3064\u306E\u30D1\u30BF\u30FC\u30F3\u3002/pattern/flags \u5F62\u5F0F\u304B\u3001\u305D\u306E\u307E\u307E\u306E\u30D1\u30BF\u30FC\u30F3\uFF08\u5927\u6587\u5B57\u5C0F\u6587\u5B57\u3092\u533A\u5225\u3057\u307E\u305B\u3093\uFF09\u3002","\u9664\u5916\u3059\u308B\u30A2\u30AB\u30A6\u30F3\u30C8","\u30D5\u30A3\u30EB\u30BF\u3057\u306A\u3044\u30A2\u30AB\u30A6\u30F3\u30C8\u540D\uFF081 \u884C\u306B 1 \u3064\u3001@ \u306A\u3057\uFF09\u3002","\u30D7\u30EC\u30DF\u30A2\u30E0\u30FB\u8A8D\u8A3C\u6E08\u307F\u306E\u6295\u7A3F","\u30AA\u30D5","\u975E\u8868\u793A","\u5F15\u7528\u30DD\u30B9\u30C8","\u4ED6\u306E\u30DD\u30B9\u30C8\u3092\u5F15\u7528\u3057\u3066\u3044\u308B\u30DD\u30B9\u30C8\u3002","\u753B\u50CF\u30FBGIF\u30FB\u52D5\u753B\u306E\u3042\u308B\u8FD4\u4FE1\u3092\u96A0\u3059","\u958B\u3044\u305F\u6295\u7A3F\u306E\u4E0B\u3067\u3001\u5199\u771F\u3001GIF\u3001\u52D5\u753B\u3092\u542B\u3080\u8FD4\u4FE1\u3092\u3059\u3079\u3066\u53D6\u308A\u9664\u304D\u307E\u3059\u3002\u6DFB\u3048\u3089\u308C\u305F\u6587\u7AE0\u306F\u95A2\u4FC2\u3042\u308A\u307E\u305B\u3093\u3002\u30DF\u30FC\u30E0\u306F\u305F\u3044\u3066\u3044\u6587\u7AE0\u4ED8\u304D\u3067\u6295\u7A3F\u3055\u308C\u308B\u304B\u3089\u3067\u3059\u3002\u6295\u7A3F\u305D\u306E\u3082\u306E\u3068\u3001\u305D\u306E\u4E0A\u306E\u30B9\u30EC\u30C3\u30C9\u306F\u305D\u306E\u307E\u307E\u6B8B\u308A\u307E\u3059\u3002\u753B\u50CF\u4ED8\u304D\u306E\u6295\u7A3F\u3092\u5F15\u7528\u3057\u305F\u3060\u3051\u306E\u8FD4\u4FE1\u3082\u6B8B\u308A\u307E\u3059\u3002\u4E0A\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u304C\u306A\u304F\u3066\u3082\u5358\u72EC\u3067\u52D5\u304D\u307E\u3059\u3002\u3042\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u4F1A\u8A71\u306B\u5411\u3051\u308B\u3068\u3001\u8AAD\u307F\u306B\u6765\u305F\u6295\u7A3F\u307E\u3067\u96A0\u308C\u3066\u3057\u307E\u3046\u304B\u3089\u3067\u3059\u3002","\u7D5E\u308A\u8FBC\u307E\u308C\u305F\u7406\u7531\u3092\u8868\u793A\u3059\u308B","\u9ED9\u3063\u3066\u96A0\u3059\u30D5\u30A3\u30EB\u30BF\u30FC\u306F\u4E0D\u5177\u5408\u3068\u898B\u5206\u3051\u304C\u3064\u304D\u307E\u305B\u3093\u3002\u6DE1\u8272\u8868\u793A\u306E\u30DD\u30B9\u30C8\u306A\u3089\u3001\u30EC\u30A4\u30A2\u30A6\u30C8\u3092\u5909\u3048\u305A\u306B\u7406\u7531\u3092\u793A\u305B\u307E\u3059\u30023 \u756A\u76EE\u306E\u8A2D\u5B9A\u3067\u306F\u3001\u975E\u8868\u793A\u306E\u30DD\u30B9\u30C8\u3082\u7406\u7531\u3092\u66F8\u3044\u305F 1 \u884C\u306E\u5E2F\u306B\u306A\u308A\u3001\u30AB\u30FC\u30BD\u30EB\u3092\u91CD\u306D\u308B\u304B\u30BF\u30D6\u3067\u79FB\u52D5\u3059\u308B\u3068\u958B\u304D\u307E\u3059\u3002","\u8868\u793A\u3057\u306A\u3044","\u6DE1\u8272\u8868\u793A\u306E\u30DD\u30B9\u30C8\u306B","\u6DE1\u8272\u8868\u793A\u3068\u975E\u8868\u793A\u306E\u30DD\u30B9\u30C8\u306B","\u53CD\u5FDC\u306E\u5C11\u306A\u3044\u30DD\u30B9\u30C8","\u4E0B\u306E\u6700\u5C0F\u5024\u3092\u4E0B\u56DE\u308B\u30DD\u30B9\u30C8\u3002Aviary \u304C\u6570\u3092\u8AAD\u307F\u53D6\u308C\u306A\u3044\u30DD\u30B9\u30C8\u306F\u3001\u3053\u306E\u6761\u4EF6\u3067\u7D5E\u308A\u8FBC\u307E\u308C\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u53CD\u5FDC\u306E\u57FA\u6E96","\u30DD\u30B9\u30C8\u306E\u4E0B\u306B\u4E26\u3076\u3069\u306E\u6570\u306B\u6700\u5C0F\u5024\u3092\u9069\u7528\u3059\u308B\u304B\u3002","\u8FD4\u4FE1","\u30EA\u30DD\u30B9\u30C8","\u3044\u3044\u306D","\u6700\u5C0F\u306E\u53CD\u5FDC\u6570","\u3053\u306E\u6570\u3092\u4E0B\u56DE\u308B\u30DD\u30B9\u30C8\u3092\u7D5E\u308A\u8FBC\u307F\u307E\u3059\u30020 \u3067\u306F\u3069\u306E\u30DD\u30B9\u30C8\u3082\u7D5E\u308A\u8FBC\u307F\u307E\u305B\u3093\u3002","\u5199\u771F\u4ED8\u304D\u306E\u6295\u7A3F\u3092\u975E\u8868\u793A","\u5199\u771F\u3092\u542B\u3080\u6295\u7A3F\u3092\u30D5\u30A3\u30EB\u30BF\u3057\u307E\u3059\u3002","\u52D5\u753B\u4ED8\u304D\u306E\u6295\u7A3F\u3092\u975E\u8868\u793A","\u52D5\u753B\u3092\u542B\u3080\u6295\u7A3F\u3092\u30D5\u30A3\u30EB\u30BF\u3057\u307E\u3059\u3002","GIF \u4ED8\u304D\u306E\u6295\u7A3F\u3092\u975E\u8868\u793A","GIF \u3092\u542B\u3080\u6295\u7A3F\u3092\u30D5\u30A3\u30EB\u30BF\u3057\u307E\u3059\u3002","\u9069\u7528\u3059\u308B\u30DA\u30FC\u30B8","\u30D5\u30A3\u30EB\u30BF\u3092\u5B9F\u884C\u3059\u308B\u30DA\u30FC\u30B8\u3002","\u30D6\u30ED\u30C3\u30AF\u6E08\u307F\u30A2\u30AB\u30A6\u30F3\u30C8\u30FB\u81EA\u5206\u306E\u30EA\u30DD\u30B9\u30C8","\u8A8D\u8A3C\u6E08\u307F\u306E\u30D5\u30A3\u30AF\u30B9\u30C1\u30E3\u5F85\u3061\u306E\u305F\u3081\u3001\u3053\u306E\u8A2D\u5B9A\u306F\u7121\u52B9\u306E\u307E\u307E\u3067\u3059\u3002","\u5358\u8A9E\u3001\u30E1\u30C7\u30A3\u30A2\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u30D0\u30C3\u30B8\u3001\u30DA\u30FC\u30B8\u306B\u5FDC\u3058\u3066\u30DD\u30B9\u30C8\u3092\u975E\u8868\u793A\u307E\u305F\u306F\u8584\u304F\u8868\u793A\u3057\u307E\u3059\u3002","\u30D5\u30A3\u30EB\u30BF\u30FC\u306E\u72B6\u614B","\u30EB\u30FC\u30EB","\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u7A2E\u985E","\u30EB\u30FC\u30C8","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u8A2D\u5B9A\u306F\u3059\u3079\u3066\u306E\u30E1\u30C7\u30A3\u30A2\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002","\u30E1\u30C7\u30A3\u30A2\u4ED8\u304D\u306E\u5404\u30DD\u30B9\u30C8\u306B\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u64CD\u4F5C\u3068\u30D5\u30A1\u30A4\u30EB\u3054\u3068\u306E\u64CD\u4F5C\u3092\u8FFD\u52A0\u3057\u307E\u3059\u3002\u30AA\u30D5\u306B\u3059\u308B\u3068\u300C\u30E1\u30C7\u30A3\u30A2\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC\u300D\u3082\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002","\u30E1\u30C7\u30A3\u30A2\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC\u3092\u8868\u793A","\u753B\u50CF\u3001GIF\u3001\u52D5\u753B\u3001\u97F3\u58F0\u3001\u5B57\u5E55\u306E\u6700\u9069\u306A\u76F4\u63A5URL\u30921\u884C\u305A\u3064\u30B3\u30D4\u30FC\u3059\u308B\u64CD\u4F5C\u3092\u30DD\u30B9\u30C8\u306B\u8FFD\u52A0\u3057\u307E\u3059\u3002\u305D\u306E\u30DD\u30B9\u30C8\u81EA\u8EAB\u306E\u30E1\u30C7\u30A3\u30A2\u3060\u3051\u3092\u30B3\u30D4\u30FC\u3057\u3001\u4E0A\u306E\u30E1\u30C7\u30A3\u30A2\u64CD\u4F5C\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u6700\u521D\u306B\u5143\u5F62\u5F0F\u306E name=orig \u3092\u8A66\u3057\u3001\u5931\u6557\u3057\u305F\u5834\u5408\u306F 4096x4096 \u3092\u8A66\u3057\u307E\u3059\u3002","\u30AA\u30EA\u30B8\u30CA\u30EB\u753B\u8CEA\u306E\u72B6\u614B","\u753B\u50CF\u3092\u30AA\u30EA\u30B8\u30CA\u30EB\u753B\u8CEA\u3067\u8868\u793A","\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u306E\u5199\u771F\u3092\u3001X \u304C\u67A0\u306B\u5408\u308F\u305B\u3066\u9078\u3093\u3060\u7248\u3067\u306F\u306A\u304F\u30D5\u30EB\u30B5\u30A4\u30BA\u3067\u8AAD\u307F\u8FBC\u307F\u307E\u3059\u3002\u3088\u308A\u9BAE\u660E\u3067\u3059\u304C\u3001\u901A\u4FE1\u91CF\u306F\u6570\u500D\u306B\u306A\u308A\u307E\u3059\u3002","\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30B0\u30EA\u30C3\u30C9","\u30D5\u30A1\u30A4\u30EB\u540D\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8","\u9805\u76EE: {handle}, {account}, {tweetId}, {mediaId}, {index}, {total}, {date}, {text}, {ext}\u3002{account} \u306F\u6295\u7A3F\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u5225\u540D\u3067\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u3054\u3068\u306E\u30D5\u30A9\u30EB\u30C0\u30FC\u3092\u4F5C\u6210\u3067\u304D\u307E\u3059\u3002","\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u30B5\u30A4\u30C9\u30AB\u30FC\u30D5\u30A1\u30A4\u30EB","\u30E1\u30C7\u30A3\u30A2\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u5B8C\u4E86\u5F8C\u306B\u3001\u30ED\u30FC\u30AB\u30EB\u306E\u30C6\u30AD\u30B9\u30C8\u307E\u305F\u306FJSON\u88DC\u52A9\u30D5\u30A1\u30A4\u30EB\u3092\u4FDD\u5B58\u3057\u307E\u3059\u3002","\u30C6\u30AD\u30B9\u30C8","JSON","\u898B\u305F\u76EE\u304C\u4F3C\u305F\u753B\u50CF\u3082\u691C\u51FA","256\u30D3\u30C3\u30C8\u306E\u8996\u899A\u7F72\u540D\u3082\u6BD4\u8F03\u3057\u307E\u3059\u3002\u5358\u7D14\u3067\u4F3C\u305F\u69CB\u56F3\u3092\u8AA4\u3063\u3066\u4E00\u81F4\u3068\u5224\u65AD\u3059\u308B\u5834\u5408\u304C\u3042\u308B\u305F\u3081\u3001\u65E2\u5B9A\u3067\u306F\u30AA\u30D5\u3067\u3059\u3002","\u91CD\u8907\u306E\u5C65\u6B74","\u5143\u306EURL\u3092\u4FDD\u5B58\u305B\u305A\u3001\u540C\u3058X\u30E1\u30C7\u30A3\u30A2\u307E\u305F\u306F\u5B8C\u5168\u306B\u540C\u3058\u753B\u50CF\u30C7\u30FC\u30BF\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3059\u3002","\u540C\u6642\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u6570","\u30D0\u30C3\u30C1\u4E2D\u306B\u540C\u6642\u5B9F\u884C\u3059\u308B\u30E1\u30C7\u30A3\u30A2\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306E\u6700\u5927\u6570\uFF081\uFF5E6\uFF09\u3002","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30DA\u30FC\u30B9","\u30D0\u30C3\u30C1\u30E1\u30C7\u30A3\u30A2\u30EA\u30AF\u30A8\u30B9\u30C8\u306E\u958B\u59CB\u30D0\u30FC\u30B9\u30C8\u3068\u7D99\u7D9A\u30DA\u30FC\u30B9\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4FDD\u5B88\u7684","\u30D0\u30E9\u30F3\u30B9","\u8868\u793A\u4E2D\u306E\u30E1\u30C7\u30A3\u30A2\u3092\u3059\u3079\u3066\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","\u3053\u306E\u30DA\u30FC\u30B8\u306B\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u5199\u771F\u3001\u52D5\u753B\u3001GIF\u3001\u30B5\u30E0\u30CD\u30A4\u30EB\u3001\u97F3\u58F0\u30C8\u30E9\u30C3\u30AF\u3001\u5B57\u5E55\u30C8\u30E9\u30C3\u30AF\u3092\u3059\u3079\u3066\u30AD\u30E5\u30FC\u306B\u8FFD\u52A0\u3057\u307E\u3059\u3002","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306E\u72B6\u614B","\u5C65\u6B74\u306E\u4EF6\u6570","\u30D1\u30CD\u30EB\u306E\u4ED6\u306E\u90E8\u5206\u306F\u52D5\u4F5C\u3057\u3066\u3044\u307E\u3059\u3002\u8A3A\u65AD\u306B\u5831\u544A\u3057\u307E\u3057\u305F\u3002","\u3053\u306E\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u63CF\u753B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30DC\u30BF\u30F3\u3001\u54C1\u8CEA\u3001\u30D5\u30A1\u30A4\u30EB\u540D\u3001\u30AD\u30E5\u30FC\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002","{count} \u4EF6\u306E\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3067\u5408\u8A08 {bytes}","\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u4FDD\u5B58\u5BB9\u91CF","\u5BB9\u91CF\u306E\u5927\u304D\u3044\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3","\u30D6\u30E9\u30A6\u30B6\u30FC\u306E\u4FDD\u5B58\u5BB9\u91CF\u30EC\u30DD\u30FC\u30C8","\u4FDD\u5B58\u5BB9\u91CF\u306E\u4E0A\u9650\u8B66\u544A","\u53D6\u308A\u8FBC\u307F\u306B\u3088\u3063\u3066\u30ED\u30FC\u30AB\u30EB\u30E9\u30A4\u30D6\u30E9\u30EA\u304C\u3053\u306E\u30E1\u30AC\u30D0\u30A4\u30C8\u6570\u3092\u8D85\u3048\u308B\u524D\u306B\u8B66\u544A\u3057\u307E\u3059\u30020 \u3067\u8B66\u544A\u3092\u5207\u308A\u307E\u3059\u3002Aviary \u304C\u4E0A\u9650\u3092\u5B88\u308B\u305F\u3081\u306B\u4F55\u304B\u3092\u524A\u9664\u3059\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u524A\u9664\u306F\u6574\u7406\u30D7\u30EC\u30D3\u30E5\u30FC\u3067\u9078\u3073\u307E\u3059\u3002","\u53D6\u308A\u8FBC\u3093\u3060\u753B\u50CF\u3092\u7E2E\u5C0F\u3059\u308B","\u3053\u308C\u4EE5\u964D\u306E\u53D6\u308A\u8FBC\u307F\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002\u4FDD\u5B58\u6E08\u307F\u306E\u3082\u306E\u306F\u5909\u308F\u3089\u305A\u3001\u7E2E\u5C0F\u3055\u308C\u305F\u8A18\u9332\u306B\u306F\u305D\u306E\u65E8\u304C\u6B8B\u308A\u307E\u3059\u3002","\u5143\u306E\u307E\u307E\u4FDD\u3064","4\u5206\u306E3","\u534A\u5206","4\u5206\u306E1","\u52D5\u753B\u306E\u30B5\u30E0\u30CD\u30A4\u30EB\u753B\u50CF\u306E\u307F","\u52D5\u753B\u305D\u306E\u3082\u306E\u3067\u306F\u306A\u304F\u3001X \u304C\u914D\u4FE1\u3059\u308B\u9759\u6B62\u753B\u3092\u4FDD\u5B58\u3057\u307E\u3059\u3002\u52D5\u753B\u304C\u542B\u307E\u308C\u3066\u3044\u306A\u3044\u3053\u3068\u304C\u8A18\u9332\u306B\u6B8B\u308B\u305F\u3081\u3001\u5F8C\u306E\u66F8\u304D\u51FA\u3057\u304C\u305D\u306E\u9759\u6B62\u753B\u3092\u6295\u7A3F\u5168\u4F53\u3068\u3057\u3066\u6271\u3046\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u3059\u3079\u3066\u306E\u30ED\u30FC\u30AB\u30EB\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u691C\u7D22","\u6295\u7A3F\u3001\u3044\u3044\u306D\u3001\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3001\u30E1\u30E2\u3001\u30AD\u30E3\u30D7\u30C1\u30E3\u3092\u691C\u7D22\u3057\u307E\u3059\u3002","\u30ED\u30FC\u30AB\u30EB\u30E9\u30A4\u30D6\u30E9\u30EA\u3092\u691C\u7D22","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u9806\u4F4D","\u30E1\u30C7\u30A3\u30A2\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","\u30E1\u30C7\u30A3\u30A2 {count} \u4EF6","source:bookmarks\u3001tag:reading\u3001has:media \u3092\u8A66\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u6295\u7A3F\u306B AI \u30DC\u30BF\u30F3\u3092\u8868\u793A\u3059\u308B","\u7FFB\u8A33\u30FB\u8981\u7D04\u30FB\u89E3\u8AAC\u30FB\u30D5\u30A1\u30AF\u30C8\u30C1\u30A7\u30C3\u30AF\u306E\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u7D44\u307F\u7ACB\u3066\u308B\u30DC\u30BF\u30F3\u3092\u5404\u6295\u7A3F\u306B\u8FFD\u52A0\u3057\u307E\u3059\u3002AI \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u8A2D\u5B9A\u3057\u3066\u3044\u306A\u3044\u5834\u5408\u306F\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3059\u308B\u3060\u3051\u3067\u3001\u3069\u3053\u306B\u3082\u9001\u4FE1\u3055\u308C\u307E\u305B\u3093\u3002","t.co \u30EA\u30F3\u30AF\u3092\u5C55\u958B","\u77ED\u7E2E\u3055\u308C\u305F \`t.co\` \u306E\u30EA\u30F3\u30AF\u3092\u3001aria-label \u3084 title \u306B\u3042\u308B\u5B9F\u969B\u306E URL \u306B\u7F6E\u304D\u63DB\u3048\u307E\u3059\u3002","\u30EA\u30F3\u30AF\u304B\u3089\u30C8\u30E9\u30C3\u30AD\u30F3\u30B0\u3092\u9664\u53BB","\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u306E\u30EA\u30F3\u30AF\u304B\u3089\u5171\u6709\u30C8\u30FC\u30AF\u30F3\u3068\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u7528\u30D1\u30E9\u30E1\u30FC\u30BF\uFF08utm_*\u3001fbclid\u3001X \u72EC\u81EA\u306E t/s\uFF09\u3092\u53D6\u308A\u9664\u304D\u3001\u30B3\u30D4\u30FC\u3057\u305F\u5185\u5BB9\u304C\u7D20\u306E\u30A2\u30C9\u30EC\u30B9\u306B\u306A\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002","\u6295\u7A3F\u30EA\u30F3\u30AF\u306E\u30B3\u30D4\u30FC\u5148","\u5404\u6295\u7A3F\u306B\u300C\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC\u300D\u30DC\u30BF\u30F3\u3092\u8FFD\u52A0\u3057\u3001\u9078\u3093\u3060\u30DB\u30B9\u30C8\u4E0A\u3067\u306E\u305D\u306E\u6295\u7A3F\u306E\u30A2\u30C9\u30EC\u30B9\u3092\u66F8\u304D\u8FBC\u307F\u307E\u3059\u3002X \u304C\u8868\u793A\u3057\u305F\u5185\u5BB9\u306F\u66F8\u304D\u63DB\u3048\u305A\u3001\u30DA\u30FC\u30B8\u9077\u79FB\u3082\u8EE2\u9001\u3057\u307E\u305B\u3093\u3002\u5909\u308F\u308B\u306E\u306F\u30B3\u30D4\u30FC\u3055\u308C\u308B\u6587\u5B57\u5217\u3060\u3051\u3067\u3059\u3002X \u306E\u307E\u307E\u306B\u3059\u308B\u3068\u30DC\u30BF\u30F3\u306F\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u8272","\u5F62\u5F0F: \u30E6\u30FC\u30B6\u30FC\u540D: \u8272\u30021 \u884C\u306B 1 \u4EF6\u3002\u8272\u306F amber\u3001rose\u3001violet\u3001sky\u3001green\u3001slate \u3067\u3059\u3002\u7A7A\u884C\u306B\u3059\u308B\u3068\u30BF\u30B0\u3092\u524A\u9664\u3057\u307E\u3059\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30E1\u30E2","\u5F62\u5F0F: \u30A2\u30AB\u30A6\u30F3\u30C8\u540D: \u30E1\u30E2\u30021 \u884C\u306B 1 \u3064\u3002\u30E1\u30E2\u3092\u7A7A\u306B\u3059\u308B\u3068\u524A\u9664\u3055\u308C\u307E\u3059\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30E1\u30E2\u3092\u3059\u3079\u3066\u6D88\u53BB","\u4FDD\u5B58\u3055\u308C\u3066\u3044\u308B\u30E1\u30E2\u3092\u3059\u3079\u3066\u524A\u9664\u3057\u307E\u3059\u3002","\u5B9A\u578B\u6587","1\u884C\u306B1\u3064\u3002\u4F5C\u6210\u753B\u9762\u306E\u30C4\u30FC\u30EB\u30D0\u30FC\u304B\u3089\u633F\u5165\u3067\u304D\u308B\u518D\u5229\u7528\u53EF\u80FD\u306A\u8FD4\u4FE1\u30FB\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3002","\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u30FC\u306B\u4FDD\u5B58\u3055\u308C\u305F\u30DD\u30B9\u30C8\u3092\u691C\u7D22\u3057\u3066\u7BA1\u7406\u3057\u307E\u3059\u3002","\u6295\u7A3F\u30C4\u30FC\u30EB","\u57F7\u7B46\u30C4\u30FC\u30EB","\u30B9\u30C8\u30EC\u30FC\u30B8\u3068\u30EC\u30DD\u30FC\u30C8","\u6B21\u56DE\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306B\u5099\u3048\u3066\u3001\u8868\u793A\u4E2D\u306E\u6295\u7A3F\u3092\u84C4\u7A4D\u3057\u307E\u3059\u3002","\u30AB\u30F3\u30DE\u533A\u5207\u308A\u3067\u6307\u5B9A\u3057\u307E\u3059\u3002\u5BFE\u5FDC\u5F62\u5F0F: json, csv, html, markdown, xlsx\u3002","X \u304C\u3053\u306E\u30BF\u30D6\u306B\u8FD4\u3059 GraphQL \u306E\u751F\u30EC\u30B9\u30DD\u30F3\u30B9\u3082\u4FDD\u5B58\u3057\u3001\u3042\u3068\u304B\u3089\u518D\u89E3\u6790\u3067\u304D\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002\u66F8\u304D\u8FBC\u3080\u524D\u306B\u30BB\u30C3\u30B7\u30E7\u30F3\u30C8\u30FC\u30AF\u30F3\u306F\u53D6\u308A\u9664\u304B\u308C\u307E\u3059\u3002","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3067\u30E1\u30C7\u30A3\u30A2\u306E\u30D0\u30A4\u30C8\u5217\u3092\u53D6\u5F97","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u4E2D\u306B\u30E1\u30C7\u30A3\u30A2\u3092\u53D6\u5F97\u3057\u3001\u6210\u529F\u3057\u305F\u30D0\u30A4\u30C8\u5217\u3092\u9577\u3055\u3068\u30C1\u30A7\u30C3\u30AF\u30B5\u30E0\u4ED8\u304D\u3067\u542B\u3081\u307E\u3059\u3002\u5931\u6557\u3057\u305F\u9805\u76EE\u306F\u518D\u8A66\u884C\u53EF\u80FD\u306A\u53C2\u7167\u3068\u3057\u3066\u6B8B\u308A\u307E\u3059\u3002","\u30AF\u30A8\u30EA ID \u3092\u81EA\u52D5\u691C\u51FA","\u8AAD\u307F\u8FBC\u307E\u308C\u305F\u30B9\u30AF\u30EA\u30D7\u30C8\u304B\u3089 X \u306E GraphQL \u64CD\u4F5C ID \u3092\u63A2\u3057\u3001\u30ED\u30FC\u30AB\u30EB\u306B\u4FDD\u5B58\u3057\u307E\u3059\u3002","\u4FDD\u8B77\u3055\u308C\u305F\u6295\u7A3F\u3092\u5171\u6709\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306B\u542B\u3081\u308B","\u660E\u793A\u7684\u306B\u6709\u52B9\u306B\u3059\u308B\u307E\u3067\u3001\u4FDD\u8B77\u3055\u308C\u305F\u6295\u7A3F\u306F HTML\u3001Markdown\u3001WARC\u3001WACZ\u3001\u9759\u7684\u30D3\u30E5\u30FC\u30A2\u30FC\u306E\u51FA\u529B\u304B\u3089\u9664\u5916\u3055\u308C\u307E\u3059\u3002JSON \u3068 CSV \u306F\u30A2\u30FC\u30AB\u30A4\u30D6\u7528\u3068\u3057\u3066\u6B8B\u308A\u3001\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u9805\u76EE\u3092\u4FDD\u6301\u3057\u307E\u3059\u3002","\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E0D\u660E\u306E\u6295\u7A3F\u3092\u5171\u6709\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306B\u542B\u3081\u308B","DOM \u306E\u307F\u306E\u8A18\u9332\u3001\u30A4\u30F3\u30DD\u30FC\u30C8\u3055\u308C\u305F\u8A18\u9332\u3001\u53E4\u3044\u8A18\u9332\u306F\u3001\u660E\u793A\u7684\u306B\u6709\u52B9\u306B\u3059\u308B\u307E\u3067\u5171\u6709\u5411\u3051\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u304B\u3089\u9664\u5916\u3055\u308C\u307E\u3059\u3002JSON \u3068 CSV \u306F\u30A2\u30FC\u30AB\u30A4\u30D6\u7528\u3068\u3057\u3066\u6B8B\u308A\u307E\u3059\u3002","\u4FDD\u5B58\u5148\u30D5\u30A9\u30EB\u30C0","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8 ZIP \u306E\u30EB\u30FC\u30C8\u304A\u3088\u3073\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u540D\u306E\u63A5\u982D\u8F9E\u306B\u4F7F\u3046\u30D5\u30A9\u30EB\u30C0\u540D\uFF08\u307E\u305F\u306F\u30D1\u30B9\uFF09\u3002","{jobs}\u4EF6\u306E\u30B8\u30E7\u30D6\u3092\u8FFD\u8DE1 \xB7 GraphQL ID {queries}\u4EF6\u3092\u30AD\u30E3\u30C3\u30B7\u30E5","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306E\u72B6\u614B","\u8868\u793A\u4E2D\u306E\u6295\u7A3F\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8","\u8868\u793A\u4E2D\u306E\u6295\u7A3F\u3092\u96C6\u3081\u3066 ZIP \u3067\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002","\u8A3A\u65AD\u60C5\u5831\u3092\u30B3\u30D4\u30FC","\u30B5\u30DD\u30FC\u30C8\u7528\u306E\u8A3A\u65AD\u60C5\u5831\uFF08\u30D0\u30FC\u30B8\u30E7\u30F3\u30FB\u30EB\u30FC\u30C8\u30FB\u76F4\u8FD1\u306E\u30ED\u30B0\uFF09\u3092\u30B3\u30D4\u30FC\u3057\u307E\u3059\u3002","\u672A\u52A0\u5DE5\u306E WARC \u307E\u305F\u306F\u518D\u751F\u53EF\u80FD\u306A WACZ \u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002WACZ \u3067\u306F\u30A2\u30FC\u30AB\u30A4\u30D6\u3068\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u5404\u30D5\u30A1\u30A4\u30EB\u3092\u5727\u7E2E\u305B\u305A\u306B\u4FDD\u5B58\u3057\u307E\u3059\u3002","WACZ \u306E\u63A8\u5B9A\u30B5\u30A4\u30BA: {records} \u4EF6\u3067 {size}\u3002","\u4FDD\u5B58\u7528\u30A2\u30FC\u30AB\u30A4\u30D6","\u4FDD\u5B58\u7528\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u64CD\u4F5C","WARC","WACZ","\u30AD\u30E3\u30F3\u30BB\u30EB","replayweb.page \u3092\u958B\u304F","Aviary\u5C02\u7528WACZ\u8A3C\u660E","Aviary\u5C02\u7528WACZ\u8A3C\u660E\u306E\u64CD\u4F5C","\u30AD\u30FC\u30DA\u30A2\u3092\u66F8\u304D\u51FA\u3059","Markdown \u3068\u3057\u3066\u30B3\u30D4\u30FC","\u30D7\u30EC\u30FC\u30F3\u306A Markdown \u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3057\u307E\u3059\u3002","Obsidian \u7528 Markdown \u3092\u4FDD\u5B58","YAML \u30D5\u30ED\u30F3\u30C8\u30DE\u30BF\u30FC\u3068 Aviary \u306E\u30BF\u30B0\u3092\u542B\u3080 Markdown\u3002","Notion \u7528 Markdown \u3092\u4FDD\u5B58","Notion \u304C\u304D\u308C\u3044\u306B\u53D6\u308A\u8FBC\u3081\u308B\u3001\u898B\u51FA\u3057\u4E2D\u5FC3\u306E Markdown\u3002","\u8A18\u9332\u3092 JSON \u3067\u4FDD\u5B58","ZIP \u306B\u307E\u3068\u3081\u306A\u3044\u3001\u751F\u306E ExportRecord[] JSON\u3002","ZIP \u3042\u305F\u308A\u306E\u4EF6\u6570","\u5927\u91CF\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3092 1 \u3064\u306E\u5DE8\u5927\u306A\u30D5\u30A1\u30A4\u30EB\u306B\u305B\u305A\u3001\u8907\u6570\u306E\u66F8\u5EAB\u306B\u5206\u5272\u3057\u307E\u3059\uFF0825\u301C1000\uFF09\u3002","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30B8\u30E7\u30D6\u306E\u4E0A\u9650","\u65B0\u3057\u3044\u30B8\u30E7\u30D6\u3092\u6B8B\u3057\u307E\u3059\u30020 \u3067\u7121\u5236\u9650\u3002","\u30B8\u30E7\u30D6\u3054\u3068\u306E\u8A18\u9332\u306E\u4E0A\u9650","\u5404\u30B8\u30E7\u30D6\u306E\u65B0\u3057\u3044\u8A18\u9332\u3092\u6B8B\u3057\u307E\u3059\u30020 \u3067\u7121\u5236\u9650\u3002","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306E\u4FDD\u6301\u65E5\u6570","\u8D77\u52D5\u6642\u306B\u53E4\u3044\u30B8\u30E7\u30D6\u3092\u524A\u9664\u3057\u307E\u3059\u30020 \u3067\u65E5\u6570\u306B\u3088\u308B\u524A\u9664\u3092\u7121\u52B9\u5316\u3002","\u30DA\u30FC\u30B8\u4E0A\u306E\u30DD\u30B9\u30C8\u3092\u53D6\u308A\u8FBC\u307F\u3001\u6301\u3061\u904B\u3079\u308B\u30B3\u30D4\u30FC\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002","\u30AD\u30E3\u30D7\u30C1\u30E3","\u30D1\u30C3\u30B1\u30FC\u30B8","\u4FDD\u5B58\u5148","\u30B8\u30E7\u30D6","\u4FDD\u5B58","\u524A\u9664\u3059\u308B\u9805\u76EE","\u9078\u629E\u3057\u305F\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3\u306F\u3001\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3001\u3044\u3044\u306D\u3001\u30EA\u30DD\u30B9\u30C8\u3001\u8FD4\u4FE1\u3001\u6295\u7A3F\u306E\u9806\u306B\u524A\u9664\u3055\u308C\u307E\u3059\u3002","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF","X \u306E\u5C65\u6B74\u304B\u3089\u4FDD\u5B58\u6E08\u307F\u30DD\u30B9\u30C8\u3092\u524A\u9664\u3057\u307E\u3059\u3002","X \u306E\u5C65\u6B74\u304B\u3089\u3044\u3044\u306D\u3092\u524A\u9664\u3057\u307E\u3059\u3002","\u30EA\u30DD\u30B9\u30C8\u30BF\u30D6\u304B\u3089\u30EA\u30DD\u30B9\u30C8\u3092\u53D6\u308A\u6D88\u3057\u307E\u3059\u3002","\u5143\u306E\u30DD\u30B9\u30C8\u306B\u306F\u89E6\u308C\u305A\u3001\u81EA\u5206\u306E\u8FD4\u4FE1\u3060\u3051\u3092\u524A\u9664\u3057\u307E\u3059\u3002","\u30DD\u30B9\u30C8","\u81EA\u5206\u306E\u30DD\u30B9\u30C8\u3068\u5F15\u7528\u30DD\u30B9\u30C8\u3092\u524A\u9664\u3057\u307E\u3059\u3002","\u30D7\u30EC\u30D3\u30E5\u30FC\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002X \u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30C7\u30FC\u30BF\u306F\u5909\u66F4\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002","\u524A\u9664\u3057\u305F\u6295\u7A3F\u3068\u8FD4\u4FE1\u306F\u5FA9\u5143\u3067\u304D\u307E\u305B\u3093\u3002\u53D6\u308A\u6D88\u3057\u305F\u3044\u3044\u306D\u3001\u30EA\u30DD\u30B9\u30C8\u3001\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3082 Aviary \u3067\u306F\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3002","\u5B9F\u884C","\u8A73\u7D30\u30AA\u30D7\u30B7\u30E7\u30F3","\u524A\u9664\u901F\u5EA6\u3092\u5909\u66F4\u3059\u308B\u304B\u3001\u6307\u5B9A\u3057\u305F\u64CD\u4F5C\u6570\u306E\u5F8C\u306B\u4E00\u6642\u505C\u6B62\u3057\u307E\u3059\u3002","\u901F\u5EA6","\u30A2\u30AB\u30A6\u30F3\u30C8\u64CD\u4F5C\u306E\u9593\u306B\u30E9\u30F3\u30C0\u30E0\u306A\u5F85\u6A5F\u6642\u9593\u3092\u5165\u308C\u3001\u5404\u30D0\u30C3\u30C1\u306E\u5F8C\u306B\u306F\u9577\u3081\u306B\u4F11\u6B62\u3057\u307E\u3059\u3002","\u614E\u91CD","\u9AD8\u901F","\u30D0\u30C3\u30C1\u3054\u3068\u306E\u64CD\u4F5C\u6570","\u3053\u306E\u4EF6\u6570\u3092\u51E6\u7406\u3057\u305F\u3089\u4E00\u6642\u505C\u6B62\u3057\u307E\u3059\u3002\u5236\u9650\u3057\u306A\u3044\u5834\u5408\u306F 0 \u306B\u3057\u307E\u3059\u3002\u518D\u958B\u3059\u308B\u3068\u65B0\u3057\u3044\u30D0\u30C3\u30C1\u304C\u59CB\u307E\u308A\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3\u3092\u9078\u629E\u3057\u3066\uFF3B\u5B9F\u884C\uFF3D\u3092\u62BC\u3057\u307E\u3059\u3002\u524A\u9664\u306F\u3059\u3050\u306B\u59CB\u307E\u308A\u307E\u3059\u3002","\u632F\u308A\u8FD4\u308A\u3092\u5229\u7528\u3067\u304D\u307E\u3059","\u30D5\u30A3\u30EB\u30BF\u30EA\u30F3\u30B0\u3067\u65E2\u306B\u898B\u305F\u6295\u7A3F\u3092\u8584\u304F\u8868\u793A\u3092\u30AA\u30F3\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u632F\u308A\u8FD4\u308A\u306FAviary\u304C\u8868\u793A\u3057\u305F\u884C\u3060\u3051\u3092\u4F7F\u3044\u307E\u3059\u3002","\u542B\u307E\u308C\u308B\u5185\u5BB9","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30D6\u30E9\u30A6\u30B6\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3067Aviary\u304C\u898B\u305F\u3059\u3079\u3066\u3067\u3059\u3002\u9664\u5916\u3055\u308C\u305F\u6295\u7A3F\u306B\u306F\u6709\u52B9\u306A\u30D5\u30A3\u30EB\u30BF\u30FC\u898F\u5247\u306E\u7406\u7531\u304C\u6B8B\u308A\u307E\u3059\u3002","X\u3078\u8FFD\u52A0\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u3089\u305A\u3001Aviary\u304C\u3059\u3067\u306B\u78BA\u8A8D\u3057\u305F\u30DD\u30B9\u30C8\u3092\u898B\u8FD4\u3057\u307E\u3059\u3002","\u975E\u8868\u793A\u30DC\u30BF\u30F3\u306F\u4E0A\u306E\u8A2D\u5B9A\u306B\u5F93\u3044\u307E\u3059\u3002","\u9589\u3058\u305F\u6295\u7A3F\u3092\u975E\u8868\u793A","\u975E\u8868\u793A\u306B\u3057\u305F\u6295\u7A3F\u3092\u6298\u308A\u305F\u305F\u3093\u3060\u307E\u307E\u306B\u3057\u3001\u6B21\u306E\u6295\u7A3F\u3092\u7E70\u308A\u4E0A\u3052\u307E\u3059\u3002","\u975E\u8868\u793A\u30DC\u30BF\u30F3\u3092\u8868\u793A","\u5404\u6295\u7A3F\u306E\u300C\u3082\u3063\u3068\u898B\u308B\u300D\u30E1\u30CB\u30E5\u30FC\u306E\u6A2A\u306B\u975E\u8868\u793A\u30DC\u30BF\u30F3\u3092\u8FFD\u52A0\u3057\u307E\u3059\u3002","\u975E\u8868\u793A\u30DC\u30BF\u30F3\u306E\u72B6\u614B","\u300C\u9589\u3058\u305F\u6295\u7A3F\u3092\u975E\u8868\u793A\u300D\u304C\u30AA\u30F3\u306B\u306A\u308B\u3068\u6709\u52B9\u306B\u306A\u308A\u307E\u3059\u3002","\u975E\u8868\u793A\u6A5F\u80FD\u3068\u975E\u8868\u793A\u30DC\u30BF\u30F3\u3092\u9069\u7528\u3059\u308B\u30DA\u30FC\u30B8\u3002","\u8A18\u61B6\u3059\u308B\u6295\u7A3F\u306E\u4E0A\u9650","\u3053\u306E\u4EF6\u6570\uFF08100\u301C50000\uFF09\u3092\u8D85\u3048\u308B\u3068\u53E4\u3044\u3082\u306E\u304B\u3089\u524A\u9664\u3055\u308C\u307E\u3059\u3002","\u4FDD\u5B58\u3055\u308C\u305F\u975E\u8868\u793A\u306E\u6295\u7A3F","\u76F4\u524D\u306E\u975E\u8868\u793A\u3092\u53D6\u308A\u6D88\u3059","\u6700\u5F8C\u306B\u975E\u8868\u793A\u306B\u3057\u305F\u6295\u7A3F\u3092\u5143\u306B\u623B\u3057\u307E\u3059\u3002","\u5143\u306B\u623B\u3059","\u975E\u8868\u793A\u306E\u6295\u7A3F\u3092\u6D88\u53BB","\u975E\u8868\u793A\u306B\u3057\u305F\u6295\u7A3F\u3092\u3059\u3079\u3066\u5FD8\u308C\u3001\u5143\u306B\u623B\u3057\u307E\u3059\u3002","\u975E\u8868\u793A\u306E\u30DD\u30B9\u30C8\u3092\u3069\u3053\u3067\u96A0\u3057\u7D9A\u3051\u308B\u304B\u9078\u3076\u304B\u3001\u518D\u8868\u793A\u3057\u307E\u3059\u3002","\u5BFE\u8C61\u7BC4\u56F2","\u4FDD\u6301","\u5FA9\u65E7","\u753B\u9762\u5916\u306B\u51FA\u305F\u52D5\u753B\u3092\u4E00\u6642\u505C\u6B62","\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u306E\u52D5\u753B\u304C\u753B\u9762\u5916\u306B\u51FA\u308B\u3068\u30C7\u30B3\u30FC\u30C9\u3092\u505C\u6B62\u3057\u3001\u623B\u308B\u3068\u518D\u958B\u3057\u307E\u3059\u3002\u81EA\u5206\u3067\u4E00\u6642\u505C\u6B62\u3057\u305F\u52D5\u753B\u306F\u305D\u306E\u307E\u307E\u3067\u3059\u3002","\u30BF\u30D6\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u3082\u52D5\u753B\u3092\u518D\u751F\u3057\u7D9A\u3051\u308B","X \u306F\u30BF\u30D6\u3092\u5207\u308A\u66FF\u3048\u308B\u3068\u518D\u751F\u4E2D\u306E\u52D5\u753B\u3092\u505C\u6B62\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u623B\u3063\u305F\u3068\u304D\u306B\u518D\u958B\u3057\u307E\u3059\u3002\u81EA\u5206\u3067\u4E00\u6642\u505C\u6B62\u3057\u305F\u52D5\u753B\u306F\u505C\u6B62\u3057\u305F\u307E\u307E\u3067\u3059\u3002","\u52D5\u753B\u3092\u30EB\u30FC\u30D7\u518D\u751F","\u52D5\u753B\u304C\u7D42\u308F\u3063\u305F\u3089\u505C\u6B62\u305B\u305A\u306B\u6700\u521D\u304B\u3089\u518D\u751F\u3057\u307E\u3059\u3002","\u52D5\u753B\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u3092\u6700\u9AD8\u753B\u8CEA\u306B\u56FA\u5B9A","\u8907\u6570\u306E\u753B\u8CEA\u3092\u542B\u3080\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u304C Aviary \u306B\u6E21\u3055\u308C\u305F\u5834\u5408\u3001\u6700\u3082\u9AD8\u3044\u753B\u8CEA\u3060\u3051\u3092\u6B8B\u3057\u307E\u3059\u3002\u9AD8\u901F\u56DE\u7DDA\u3067\u3082 X \u306F\u6700\u9AD8\u753B\u8CEA\u3088\u308A\u4F4E\u3044\u753B\u8CEA\u3092\u9078\u3076\u3053\u3068\u304C\u3088\u304F\u3042\u308A\u307E\u3059\u3002\u30C7\u30FC\u30BF\u4F7F\u7528\u91CF\u304C\u5897\u3048\u3001Aviary \u304C\u5B9F\u969B\u306B\u898B\u305F\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u306B\u3057\u304B\u4F5C\u7528\u3057\u307E\u305B\u3093\u3002","\u52D5\u753B\u304C\u753B\u9762\u5916\u306B\u51FA\u305F\u3089\u4E00\u6642\u505C\u6B62\u3057\u307E\u3059\u3002","\u518D\u751F","{count}\u4EF6 \xB7 \u6700\u65B0: {kind} {latestCount}\u4EF6 @ {at}","\u4FDD\u5B58\u3055\u308C\u305F\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8","\u3053\u306E\u753B\u9762\u304B\u3089\u30D5\u30A9\u30ED\u30EF\u30FC\u3092\u53D6\u5F97","\u73FE\u5728\u306E\u30DA\u30FC\u30B8\u306E UserCell \u884C\u3092\u8D70\u67FB\u3057\u307E\u3059\u3002\u5148\u306B /\u30A2\u30AB\u30A6\u30F3\u30C8\u540D/followers \u3092\u958B\u3044\u3066\u304F\u3060\u3055\u3044\u3002","\u3053\u306E\u753B\u9762\u304B\u3089\u30D5\u30A9\u30ED\u30FC\u4E2D\u3092\u53D6\u5F97","\u73FE\u5728\u306E\u30DA\u30FC\u30B8\u306E UserCell \u884C\u3092\u8D70\u67FB\u3057\u307E\u3059\u3002\u5148\u306B /\u30A2\u30AB\u30A6\u30F3\u30C8\u540D/following \u3092\u958B\u3044\u3066\u304F\u3060\u3055\u3044\u3002","\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u3059\u3079\u3066\u6D88\u53BB","\u4FDD\u5B58\u6E08\u307F\u306E\u30D5\u30A9\u30ED\u30EF\u30FC\u30FB\u30D5\u30A9\u30ED\u30FC\u4E2D\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u3059\u3079\u3066\u524A\u9664\u3057\u307E\u3059\u3002","\u516C\u5F0FX\u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u30A4\u30F3\u30DD\u30FC\u30C8","x.com\u304B\u3089\u66F8\u304D\u51FA\u3057\u305FZIP\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002STORE\u3068DEFLATE\u30A8\u30F3\u30C8\u30EA\u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u3059\u3002\u518D\u958B\u53EF\u80FD\u306A\u9593\u306F\u5143\u30C7\u30FC\u30BF\u3092\u30ED\u30FC\u30AB\u30EB\u306B\u4FDD\u6301\u3057\u307E\u3059\u3002","\u53D6\u5F97\u3057\u305F\u30EC\u30B3\u30FC\u30C9\u3092\u691C\u7D22","\u6700\u65B0\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u53CE\u96C6\u5B9F\u884C\u3092\u5168\u6587\u691C\u7D22\u3057\u307E\u3059\u3002","@\u30CF\u30F3\u30C9\u30EB\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u3001\u30D5\u30EC\u30FC\u30BA\u2026","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u5B9F\u884C\u3067\u53D6\u5F97\u3057\u305F\u30EC\u30B3\u30FC\u30C9\u3092\u691C\u7D22\u3059\u308B\u306B\u306F\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","Markdown \u30EC\u30DD\u30FC\u30C8\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","\u76E3\u67FB\u30ED\u30B0\u30FB\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306E\u5DEE\u5206\u30FB\u6574\u7406\u306E\u30D7\u30EC\u30D3\u30E5\u30FC\u3002","{total}\u4EF6 \xB7 \u30AD\u30E5\u30FC {queued} \xB7 \u627F\u8A8D\u6E08\u307F {approved} \xB7 \u30B9\u30AD\u30C3\u30D7 {skipped}","\u6574\u7406\u306E\u78BA\u8A8D\u30AD\u30E5\u30FC","\u7834\u58CA\u7684\u306A\u64CD\u4F5C","Aviary \u306F\u6295\u7A3F\u30FB\u3044\u3044\u306D\u30FB\u30D5\u30A9\u30ED\u30FC\u3092\u524A\u9664\u3057\u307E\u305B\u3093\u3002\u3053\u306E\u30AD\u30E5\u30FC\u306F\u78BA\u8A8D\u7528\u306E\u4E00\u89A7\u3067\u3001\u627F\u8A8D\u3084\u30B9\u30AD\u30C3\u30D7\u306F\u76E3\u67FB\u30ED\u30B0\u306B\u8A18\u9332\u3055\u308C\u308B\u3060\u3051\u3067\u3059\u3002","\u6574\u7406\u306E\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u30AD\u30E5\u30FC\u306B\u8FFD\u52A0","\u76F4\u8FD1\u306E\u6574\u7406\u30D7\u30EC\u30D3\u30E5\u30FC\u304B\u3089\u3001\u4FDD\u8B77\u3055\u308C\u3066\u3044\u306A\u3044\u5019\u88DC\u3092\u3059\u3079\u3066\u30AD\u30E5\u30FC\u306B\u8FFD\u52A0\u3057\u307E\u3059\uFF08\u7834\u58CA\u7684\u306A\u64CD\u4F5C\u306F\u884C\u3044\u307E\u305B\u3093\uFF09\u3002","\u6574\u7406\u30AD\u30E5\u30FC\u3092\u7A7A\u306B\u3059\u308B","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30C7\u30FC\u30BF\u306B\u89E6\u308C\u305A\u306B\u3001\u30AD\u30E5\u30FC\u306E\u9805\u76EE\u3092\u3059\u3079\u3066\u524A\u9664\u3057\u307E\u3059\u3002","X\u306E\u516C\u5F0F\u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3059\u308B\u304B\u3001\u30D5\u30A9\u30ED\u30EF\u30FC\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u6BD4\u8F03\u3057\u307E\u3059\u3002","\u30E9\u30A4\u30D6\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8","Aria2 \u3078\u306E\u53D7\u3051\u6E21\u3057","\u5927\u304D\u306A\u30E1\u30C7\u30A3\u30A2\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u3001\u81EA\u5206\u3067\u7528\u610F\u3057\u305F Aria2 \u306E JSON-RPC \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306B\u6E21\u3057\u307E\u3059\u3002","Aria2 \u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8","http://localhost:6800\uFF08\u672B\u5C3E\u306E\u30B9\u30E9\u30C3\u30B7\u30E5\u306F\u4E0D\u8981\uFF09","Aria2 \u306E RPC \u30B7\u30FC\u30AF\u30EC\u30C3\u30C8","token: \u8A8D\u8A3C\u306B\u4F7F\u3046\u5171\u6709\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\uFF08\u4EFB\u610F\uFF09\u3002","\u8868\u793A","\u3053\u306E\u5BB9\u91CF\u3092\u8D85\u3048\u305F\u3089\u5F15\u304D\u6E21\u3059 (MB)","\u3053\u308C\u3088\u308A\u5C0F\u3055\u3044\u30D5\u30A1\u30A4\u30EB\u306F\u30D6\u30E9\u30A6\u30B6\u30FC\u3067\u4FDD\u5B58\u3057\u307E\u3059\u3002Aviary \u306F\u307E\u305A\u5BB9\u91CF\u3092\u78BA\u8A8D\u3057\u3001\u30B5\u30FC\u30D0\u30FC\u304C\u5BB9\u91CF\u3092\u8FD4\u3055\u306A\u3044\u5834\u5408\u306F\u305D\u306E\u307E\u307E\u5F15\u304D\u6E21\u3057\u307E\u3059\u3002","Aria2 \u306E\u63A5\u7D9A\u3092\u78BA\u8A8D","\u7C21\u5358\u306A JSON-RPC \u547C\u3073\u51FA\u3057\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002","Aria2\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","\u66F4\u65B0\u3057\u3066\u9032\u884C\u4E2D\u306E\u8EE2\u9001\u3092\u4E00\u89A7\u8868\u793A\u3057\u307E\u3059\u3002\u300C\u30AD\u30E3\u30F3\u30BB\u30EB\u300D\u3067\u4E2D\u6B62\u3067\u304D\u307E\u3059\u3002","\u66F4\u65B0","\u30ED\u30FC\u30AB\u30EB yt-dlp \u3078\u306E\u53D7\u3051\u6E21\u3057","\u8A8D\u8A3C\u6E08\u307F\u306E\u30ED\u30FC\u30AB\u30EB\u30D8\u30EB\u30D1\u30FC\u304C\u52D5\u4F5C\u3057\u3066\u3044\u308B\u3068\u304D\u3001\u3088\u308A\u9AD8\u54C1\u8CEA\u306A\u30A2\u30C0\u30D7\u30C6\u30A3\u30D6\u4FDD\u5B58\u3092\u63D0\u793A\u3057\u307E\u3059\u3002","yt-dlp \u30D8\u30EB\u30D1\u30FC\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8","http://127.0.0.1:8787\uFF08\u30EB\u30FC\u30D7\u30D0\u30C3\u30AF\u306E\u307F\uFF09","yt-dlp \u30D8\u30EB\u30D1\u30FC\u306E\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8","\u30ED\u30FC\u30AB\u30EB\u30D7\u30ED\u30BB\u30B9\u3068\u5171\u6709\u3059\u308B AVIARY_YTDLP_TOKEN \u3067\u3059\u3002","Bluesky \u3078\u306E\u30AF\u30ED\u30B9\u30DD\u30B9\u30C8","\u6295\u7A3F\u6B04\u306E\u30C6\u30AD\u30B9\u30C8\u3092\u3001\u5FC5\u8981\u306A\u3068\u304D\u306B Bluesky \u3078\u6295\u7A3F\u3057\u307E\u3059\u3002","Bluesky \u306E\u30B5\u30FC\u30D3\u30B9 URL","\u65E2\u5B9A\u5024: https://bsky.social","Bluesky \u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u540D","\u81EA\u5206\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u540D\uFF08@ \u306A\u3057\u3001\u4F8B: you.bsky.social\uFF09","Bluesky \u306E\u30A2\u30D7\u30EA\u30D1\u30B9\u30EF\u30FC\u30C9","\u30A2\u30AB\u30A6\u30F3\u30C8\u8A2D\u5B9A\u3067\u767A\u884C\u3057\u305F\u30A2\u30D7\u30EA\u30D1\u30B9\u30EF\u30FC\u30C9\u3002\u30E1\u30A4\u30F3\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u4F7F\u308F\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002","Mastodon \u3078\u306E\u30AF\u30ED\u30B9\u30DD\u30B9\u30C8","\u6295\u7A3F\u6B04\u306E\u30C6\u30AD\u30B9\u30C8\u3092\u3001\u5FC5\u8981\u306A\u3068\u304D\u306B Mastodon \u3078\u6295\u7A3F\u3057\u307E\u3059\u3002","Mastodon \u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9","https://mastodon.social","Mastodon \u306E\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3","write:statuses \u30B9\u30B3\u30FC\u30D7\u3092\u6301\u3064\u30D9\u30A2\u30E9\u30FC\u30C8\u30FC\u30AF\u30F3\u3002","\u76F4\u8FD1\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u6DFB\u4ED8","\u30AF\u30ED\u30B9\u30DD\u30B9\u30C8\u306E\u6700\u521D\u306E\u6295\u7A3F\u306B\u3001Aviary \u3067\u6700\u5F8C\u306B\u6210\u529F\u3057\u305F\u30E1\u30C7\u30A3\u30A2\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u6DFB\u4ED8\u3057\u307E\u3059\u3002","\u30B9\u30EC\u30C3\u30C9\u3068\u3057\u3066\u30AF\u30ED\u30B9\u30DD\u30B9\u30C8","\u7A7A\u884C\u3067\u5206\u5272\u3057\u3001\u5404\u30BB\u30B0\u30E1\u30F3\u30C8\u3092\u524D\u306E\u6295\u7A3F\u3078\u306E\u8FD4\u4FE1\u3068\u3057\u3066\u9001\u4FE1\u3057\u307E\u3059\u3002","\u6295\u7A3F\u6B04\u3092 Bluesky \u3078","\u73FE\u5728\u306E\u6295\u7A3F\u6B04\u306E\u30C6\u30AD\u30B9\u30C8\u3092\u4F7F\u3044\u307E\u3059\u3002","\u6295\u7A3F\u6B04\u3092 Mastodon \u3078","AI \u30D7\u30ED\u30D0\u30A4\u30C0\u306E\u5B9F\u884C","AI \u30B3\u30DE\u30F3\u30C9\u30E1\u30CB\u30E5\u30FC\u304B\u3089\u3001\u8A2D\u5B9A\u3057\u305F\u30D7\u30ED\u30D0\u30A4\u30C0\u306B\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u9001\u4FE1\u3067\u304D\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002","AI \u30D7\u30ED\u30D0\u30A4\u30C0","Anthropic Messages API","OpenAI Chat Completions","OpenAI \u4E92\u63DB\uFF08LocalAI\u3001Ollama \u30D7\u30ED\u30AD\u30B7\u306A\u3069\uFF09","AI \u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08\u4EFB\u610F\uFF09","\u9078\u629E\u3057\u305F\u30D7\u30ED\u30D0\u30A4\u30C0\u306E\u65E2\u5B9A\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059\u3002","AI \u30E2\u30C7\u30EB","\u4F8B: claude-sonnet-4-6, gpt-4o, llama3.1:8b","AI \u306E API \u30AD\u30FC","\u30ED\u30FC\u30AB\u30EB\u306B\u306E\u307F\u4FDD\u5B58\u3055\u308C\u307E\u3059\u3002Aviary \u306F\u3001\u8A2D\u5B9A\u3057\u305F\u30D7\u30ED\u30D0\u30A4\u30C0\u3078\u306E\u8A8D\u8A3C\u30D8\u30C3\u30C0\u30FC\u4EE5\u5916\u306B\u3053\u308C\u3092\u9001\u4FE1\u3057\u307E\u305B\u3093\u3002","\u8A31\u53EF","\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u72B6\u614B","AI\u9001\u4FE1\u5148","AI\u30C7\u30FC\u30BF\u958B\u793A","\u9001\u4FE1\u524D\u306B\u3001Aviary\u306F\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3001\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u3001\u6587\u5B57\u6570/\u30C8\u30FC\u30AF\u30F3\u6570\u306E\u63A8\u5B9A\u3001\u4FDD\u6301\u3001\u4E88\u7B97\u72B6\u614B\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u4ECA\u65E5\u306EAI\u4F7F\u7528\u91CF","AI\u30EA\u30AF\u30A8\u30B9\u30C8\u306E\u6700\u5927\u30D0\u30A4\u30C8\u6570","UTF-8 \u672C\u6587\u304C\u3053\u306E\u30B5\u30A4\u30BA\u3092\u8D85\u3048\u308B AI \u30EA\u30AF\u30A8\u30B9\u30C8\u306F\u9001\u4FE1\u524D\u306B\u505C\u6B62\u3057\u307E\u3059\u30020 \u306B\u3059\u308B\u3068\u3059\u3079\u3066\u306E AI \u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u906E\u65AD\u3057\u307E\u3059\u3002","AI\u306E1\u65E5\u3042\u305F\u308A\u30EA\u30AF\u30A8\u30B9\u30C8\u30D0\u30A4\u30C8\u6570","\u30ED\u30FC\u30AB\u30EB\u65E5\u4ED8\u5185\u3067\u3053\u306E\u30D0\u30A4\u30C8\u6570\u306E UTF-8 \u30EA\u30AF\u30A8\u30B9\u30C8\u306B\u9054\u3057\u305F\u3089 AI \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u547C\u3073\u51FA\u3057\u3092\u505C\u6B62\u3057\u307E\u3059\u30020 \u306B\u3059\u308B\u3068\u3059\u3079\u3066\u306E AI \u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u906E\u65AD\u3057\u307E\u3059\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u691C\u7D22","\u985E\u4F3C\u691C\u7D22\u306E\u305F\u3081\u3001\u53D6\u5F97\u3057\u305F\u30EC\u30B3\u30FC\u30C9\u672C\u6587\u3092\u8A2D\u5B9A\u6E08\u307F\u306E\u57CB\u3081\u8FBC\u307F\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3078\u9001\u4FE1\u3057\u307E\u3059\u3002\u9001\u4FE1\u5148\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u3001\u4FDD\u6301\u3001\u30D0\u30A4\u30C8\u4E88\u7B97\u3092\u3053\u3053\u3067\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002","\u57CB\u3081\u8FBC\u307F\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8","{data: [{embedding: number[]}]} \u3092\u8FD4\u3059 POST \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8","\u57CB\u3081\u8FBC\u307F\u30E2\u30C7\u30EB","\u4F8B: text-embedding-3-small","\u57CB\u3081\u8FBC\u307F\u306E API \u30AD\u30FC","\u30ED\u30FC\u30AB\u30EB\u306B\u4FDD\u5B58\u3055\u308C\u3001Authorization \u30D8\u30C3\u30C0\u30FC\u3068\u3057\u3066\u306E\u307F\u4F7F\u308F\u308C\u307E\u3059\u3002","\u672A\u8A2D\u5B9A","\u57CB\u3081\u8FBC\u307F\u9001\u4FE1\u5148","\u57CB\u3081\u8FBC\u307F\u30C7\u30FC\u30BF\u958B\u793A","\u30EA\u30AF\u30A8\u30B9\u30C8\u306B\u306F\u30E2\u30C7\u30EB\u3068\u53D6\u5F97\u3057\u305F\u30EC\u30B3\u30FC\u30C9\u672C\u6587\u304C\u542B\u307E\u308C\u307E\u3059\u3002\u30D9\u30AF\u30C8\u30EB\u3068\u5236\u9650\u3055\u308C\u305F\u672C\u6587\u306FAviary\u306E\u30ED\u30FC\u30AB\u30EB\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u4FDD\u5B58\u3055\u308C\u3001\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u5074\u306E\u4FDD\u6301\u306F\u305D\u306E\u30DD\u30EA\u30B7\u30FC\u306B\u5F93\u3044\u307E\u3059\u3002","\u4ECA\u65E5\u306E\u57CB\u3081\u8FBC\u307F\u4F7F\u7528\u91CF","\u57CB\u3081\u8FBC\u307F\u30EC\u30B3\u30FC\u30C9\u306E\u6700\u5927\u30D0\u30A4\u30C8\u6570","UTF-8 \u672C\u6587\u304C\u3053\u306E\u30B5\u30A4\u30BA\u3092\u8D85\u3048\u308B\u30EC\u30B3\u30FC\u30C9\u306F\u9001\u4FE1\u524D\u306B\u505C\u6B62\u3057\u307E\u3059\u30020 \u306B\u3059\u308B\u3068\u3059\u3079\u3066\u306E\u57CB\u3081\u8FBC\u307F\u547C\u3073\u51FA\u3057\u3092\u906E\u65AD\u3057\u307E\u3059\u3002","\u57CB\u3081\u8FBC\u307F\u306E1\u65E5\u3042\u305F\u308A\u30EC\u30B3\u30FC\u30C9\u30D0\u30A4\u30C8\u6570","\u30ED\u30FC\u30AB\u30EB\u65E5\u4ED8\u5185\u3067\u3053\u306E\u30D0\u30A4\u30C8\u6570\u306E UTF-8 \u30EC\u30B3\u30FC\u30C9\u306B\u9054\u3057\u305F\u3089\u57CB\u3081\u8FBC\u307F\u547C\u3073\u51FA\u3057\u3092\u505C\u6B62\u3057\u307E\u3059\u30020 \u306B\u3059\u308B\u3068\u3059\u3079\u3066\u306E\u57CB\u3081\u8FBC\u307F\u547C\u3073\u51FA\u3057\u3092\u906E\u65AD\u3057\u307E\u3059\u3002","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3054\u3068\u306B\u81EA\u52D5\u3067\u57CB\u3081\u8FBC\u307F","\u6709\u52B9\u306B\u3059\u308B\u524D\u306B\u3001\u4E0A\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3001\u53D6\u5F97\u30EC\u30B3\u30FC\u30C9\u306E\u30D5\u30A3\u30FC\u30EB\u30C9\u3001\u30ED\u30FC\u30AB\u30EB\u4FDD\u6301\u30011\u65E5\u306E\u30D0\u30A4\u30C8\u4E88\u7B97\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5404\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u5F8C\u306B\u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9\u3067\u57CB\u3081\u8FBC\u307F\u307E\u3059\u3002\u65E2\u5B9A\u3067\u306F\u30AA\u30D5\u3067\u3059\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u7D22\u5F15\u3092\u518D\u69CB\u7BC9","\u53CE\u96C6\u3057\u305F\u3059\u3079\u3066\u306E\u8A18\u9332\u3092\u57CB\u3081\u8FBC\u307F\u307E\u3059\u3002\u30AD\u30E3\u30C3\u30B7\u30E5\u6E08\u307F\u306F\u98DB\u3070\u3059\u306E\u3067\u3001\u518D\u5B9F\u884C\u306E\u8CA0\u8377\u306F\u5C0F\u3055\u3044\u3067\u3059\u3002","\u53D6\u5F97\u3057\u305F\u30EC\u30B3\u30FC\u30C9\u306E\u30D9\u30AF\u30C8\u30EB\u985E\u4F3C\u5EA6\u3002\u57CB\u3081\u8FBC\u307F\u306F\u5FC5\u8981\u306A\u3068\u304D\u306B\u5B9F\u884C\u3055\u308C\u307E\u3059\u3002","\u63A2\u3057\u3066\u3044\u308B\u5185\u5BB9\u3092\u8AAC\u660E\u3057\u3066\u304F\u3060\u3055\u3044\u2026","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u7D22\u5F15\u3092\u6D88\u53BB","\u57CB\u3081\u8FBC\u307F\u6E08\u307F\u306E\u8A18\u9332\u3092\u3059\u3079\u3066\u5FD8\u308C\u307E\u3059\u3002","AI\u3068\u57CB\u3081\u8FBC\u307F\u306E\u4F7F\u7528\u91CF\u3092\u6D88\u53BB","\u30ED\u30FC\u30AB\u30EB\u306E\u30EA\u30AF\u30A8\u30B9\u30C8\u30AB\u30A6\u30F3\u30BF\u30FC\u3060\u3051\u3092\u6D88\u53BB\u3057\u307E\u3059\u3002\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3084\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u8A8D\u8A3C\u60C5\u5831\u306F\u524A\u9664\u3057\u307E\u305B\u3093\u3002","\u30AA\u30F3","\u30AA\u30D5","\u8A2D\u5B9A\u6E08\u307F","\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u672A\u8A2D\u5B9A","\u8A8D\u8A3C\u60C5\u5831\u672A\u8A2D\u5B9A","\u30AD\u30FC/\u30E2\u30C7\u30EB\u672A\u8A2D\u5B9A","\u4EF6\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316","{name}: {state} \xB7 {config}","{name}: {state} \xB7 {count} {indexed}","\u9023\u643A\u306E\u72B6\u614B","\u6700\u8FD1\u306E\u7D71\u5408\u30A8\u30E9\u30FC","\u76E3\u67FB\u30ED\u30B0\u304B\u3089\u8868\u793A\u3002\u5931\u6557\u3057\u305F\u7D71\u5408\u547C\u3073\u51FA\u3057\u306E\u307F\u8868\u793A\u3057\u307E\u3059\u3002","\u4EFB\u610F\u306E\u30ED\u30FC\u30AB\u30EB\u30B5\u30FC\u30D3\u30B9\u3068AI\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30C6\u30EA\u30B8\u30A7\u30F3\u30B9","\u4F0F\u305B\u5B57\u3067\u3059\u3002\u4FDD\u5B58\u6E08\u307F\u306E\u8A8D\u8A3C\u60C5\u5831\u306F\u7DAD\u6301\u3055\u308C\u307E\u3059\u3002","\u73FE\u5728\u306E\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u306E\u5F8C\u3067\u505C\u6B62\u3057\u3001\u66F8\u304D\u8FBC\u307F\u6E08\u307F\u306E\u5185\u5BB9\u3092\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u3057\u307E\u3059\u3002","\u30ED\u30FC\u30AB\u30EB\u30C7\u30FC\u30BF\u3092\u66F8\u304D\u8FBC\u3093\u3060\u308A\u524A\u9664\u3057\u305F\u308A\u305B\u305A\u306B\u3001\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u691C\u8A3C\u3057\u3066\u540C\u3058\u7AF6\u5408\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u9078\u629E\u3057\u305F\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u306E\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u9069\u7528\u3057\u307E\u3059\u3002\u66F8\u304D\u8FBC\u307F\u306B\u5931\u6557\u3057\u305F\u5834\u5408\u306F\u3001\u5909\u66F4\u6E08\u307F\u306E\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u3057\u307E\u3059\u3002","\u8A8D\u8A3C\u60C5\u5831\u306F\u4F0F\u305B\u5B57\u3067\u3059\u3002\u3053\u306E\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u306B\u4FDD\u5B58\u6E08\u307F\u306E\u5024\u306F\u7DAD\u6301\u3055\u308C\u307E\u3059\u3002","\u3059\u3079\u3066\u306E\u8A2D\u5B9A\u3092\u30EA\u30BB\u30C3\u30C8","Aviary \u306E\u65E2\u5B9A\u5024\u306B\u623B\u3057\u307E\u3059\u3002\u5E83\u544A\u306A\u3057\u30E2\u30FC\u30C9\u306F\u30AA\u30F3\u306E\u307E\u307E\u3001\u305D\u306E\u4ED6\u306E\u8868\u793A\u30FB\u52D5\u4F5C\u8A2D\u5B9A\u306F\u3059\u3079\u3066\u30AA\u30D5\u306B\u623B\u308A\u307E\u3059\u3002\u4FDD\u5B58\u3057\u305F\u6295\u7A3F\u3001\u30E1\u30E2\u3001\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3001\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u5C65\u6B74\u306F\u4FDD\u6301\u3055\u308C\u307E\u3059\u3002","\u8A2D\u5B9A\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8","\u8A2D\u5B9A\u3092 JSON \u3067\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002API \u30AD\u30FC\u3068\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u306B\u7F6E\u304D\u63DB\u308F\u308B\u305F\u3081\u5171\u6709\u3057\u3066\u3082\u5B89\u5168\u3067\u3059\u3002\u3053\u3053\u3067\u8AAD\u307F\u8FBC\u3080\u5834\u5408\u3001\u3053\u306E\u7AEF\u672B\u306B\u4FDD\u5B58\u6E08\u307F\u306E\u8A8D\u8A3C\u60C5\u5831\u306F\u305D\u306E\u307E\u307E\u7DAD\u6301\u3055\u308C\u307E\u3059\u3002","\u8A2D\u5B9A\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\uFF08JSON\uFF09","Aviary \u304B\u3089\u66F8\u304D\u51FA\u3057\u305F\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u300C\u30A4\u30F3\u30DD\u30FC\u30C8\u300D\u3092\u9078\u3073\u307E\u3059\u3002\u4F0F\u305B\u5B57\u306E\u8A8D\u8A3C\u60C5\u5831\u306F\u3001\u3053\u3053\u306B\u4FDD\u5B58\u6E08\u307F\u306E\u5024\u304C\u4FDD\u305F\u308C\u307E\u3059\u3002","\u30A4\u30F3\u30DD\u30FC\u30C8","\u30E9\u30A4\u30D6\u30E9\u30EA\u5168\u4F53\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8","\u958B\u3044\u3066\u3044\u308B\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3060\u3051\u3067\u306A\u304F\u3001\u3053\u306E\u30DE\u30B7\u30F3\u4E0A\u306E\u3059\u3079\u3066\u306E\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3092\u542B\u3080\u30D0\u30FC\u30B8\u30E7\u30F3\u4ED8\u304D JSON \u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002\u8CC7\u683C\u60C5\u5831\u306F\u65E2\u5B9A\u3067\u542B\u307E\u308C\u307E\u305B\u3093\u3002\u5FA9\u5143\u3057\u3066\u3082\u3053\u3053\u306B\u4FDD\u5B58\u6E08\u307F\u306E\u8CC7\u683C\u60C5\u5831\u306F\u305D\u306E\u307E\u307E\u6B8B\u308A\u307E\u3059\u3002","\u8A8D\u8A3C\u60C5\u5831\u3092\u542B\u3081\u3066\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8","\u540C\u3058\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306B\u3001\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u30FC\u306B\u4FDD\u5B58\u3055\u308C\u305FAPI\u30AD\u30FC\u3068WACZ\u7F72\u540DID\u3092\u542B\u3081\u307E\u3059\u3002\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u3051\u308B\u4EBA\u306F\u4F7F\u7528\u3067\u304D\u308B\u305F\u3081\u3001\u30D1\u30B9\u30EF\u30FC\u30C9\u3068\u540C\u3058\u3088\u3046\u306B\u4FDD\u7BA1\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u9078\u629E","JSON\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u9078\u629E\u3057\u3001\u30ED\u30FC\u30AB\u30EB\u30C7\u30FC\u30BF\u3092\u5909\u66F4\u3059\u308B\u524D\u306B\u30D0\u30FC\u30B8\u30E7\u30F3\u3001\u4EF6\u6570\u3001\u7AF6\u5408\u3001\u30C1\u30A7\u30C3\u30AF\u30B5\u30E0\u3092\u78BA\u8A8D\u3057\u307E\u3059\u3002","\u30ED\u30FC\u30AB\u30EB\u306E\u64CD\u4F5C\u30ED\u30B0\u3092\u6B8B\u3059","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30FB\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30FB\u8A2D\u5B9A\u5909\u66F4\u3092\u3053\u306E\u7AEF\u672B\u306B\u8A18\u9332\u3057\u3001Aviary \u306E\u52D5\u4F5C\u3092\u3042\u3068\u304B\u3089\u78BA\u8A8D\u3067\u304D\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002\u3069\u3053\u306B\u3082\u9001\u4FE1\u3055\u308C\u307E\u305B\u3093\u3002\u30AA\u30D5\u306B\u3059\u308B\u3068\u65B0\u3057\u3044\u8A18\u9332\u306F\u76F4\u3061\u306B\u505C\u6B62\u3057\u3001\u65E2\u5B58\u306E\u8A18\u9332\u306F\u6D88\u53BB\u3059\u308B\u307E\u3067\u6B8B\u308A\u307E\u3059\u3002","\u76E3\u67FB\u30ED\u30B0\u306E\u4EF6\u6570","\u76E3\u67FB\u30ED\u30B0\u3092\u6D88\u53BB","\u30ED\u30FC\u30AB\u30EB\u306E\u64CD\u4F5C\u30ED\u30B0\u3092\u524A\u9664\u3057\u307E\u3059\u3002","\u30ED\u30FC\u30AB\u30EB\u30C7\u30FC\u30BF\u3092\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3001\u5FA9\u5143\u3001\u307E\u305F\u306FAviary\u3092\u30EA\u30BB\u30C3\u30C8\u3057\u307E\u3059\u3002","\u8A2D\u5B9A","\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7","\u76E3\u67FB\u5C65\u6B74","\u4FDD\u5B58\u5834\u6240","\u8A2D\u5B9A\u306F\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u5185\u306B\u7559\u307E\u308A\u307E\u3059\u3002","\u30AB\u30B9\u30BF\u30E0 CSS \u306E\u5B89\u5168\u6027","\u30AB\u30B9\u30BF\u30E0 CSS \u306F\u30ED\u30FC\u30AB\u30EB\u306B\u4FDD\u5B58\u3055\u308C\u3001\u6307\u5B9A\u3057\u305F\u7BC4\u56F2\u3060\u3051\u306B\u9069\u7528\u3055\u308C\u3001\u8A3A\u65AD\u60C5\u5831\u3068\u4E00\u7DD2\u306B\u9001\u4FE1\u3055\u308C\u307E\u305B\u3093\u3002\u4E0A\u7D1A\u8005\u5411\u3051\u306E\u4E0A\u66F8\u304D\u306E\u305F\u3081\u3001\u30B5\u30DD\u30FC\u30C8\u3067\u306F\u898B\u305F\u76EE\u3092\u518D\u73FE\u3067\u304D\u307E\u305B\u3093\u3002","\u30ED\u30FC\u30AB\u30EB\u9650\u5B9A\u30E2\u30FC\u30C9","\u8A2D\u5B9A\u3057\u305F\u9023\u643A\u3078\u306E\u901A\u4FE1\u3092\u3059\u3079\u3066\u30D6\u30ED\u30C3\u30AF\u3057\u307E\u3059\u3002\u5BFE\u8C61\u306F Aria2\u3001\u30AF\u30ED\u30B9\u6295\u7A3F\u3001AI \u3078\u306E\u30EA\u30AF\u30A8\u30B9\u30C8\u3001\u57CB\u3081\u8FBC\u307F\u3067\u3059\u3002\u30E1\u30C7\u30A3\u30A2\u306E\u4FDD\u5B58\u306F\u5F15\u304D\u7D9A\u304D X \u306E\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u53D6\u5F97\u3057\u307E\u3059\u3002\u30DA\u30FC\u30B8\u304C\u3082\u3068\u3082\u3068\u8AAD\u307F\u8FBC\u3093\u3060\u5834\u6240\u3068\u540C\u3058\u3067\u3059\u3002\u65E2\u5B9A\u3067\u30AA\u30F3\u3067\u3001\u9023\u643A\u3092\u30AA\u30F3\u306B\u3059\u308B\u3068\u3053\u308C\u304C\u30AA\u30D5\u306B\u306A\u308A\u307E\u3059\u3002","X \u306E\u89E3\u6790\u30D3\u30FC\u30B3\u30F3\u3092\u62D2\u5426\u3059\u308B","\u30B9\u30AF\u30ED\u30FC\u30EB\u30FB\u30AF\u30EA\u30C3\u30AF\u30FB\u4E00\u6642\u505C\u6B62\u306E\u305F\u3073\u306B X \u304C\u9001\u4FE1\u3059\u308B\u8FFD\u8DE1\u7528\u306E\u901A\u4FE1\u3092\u6B62\u3081\u307E\u3059\u3002\u62D2\u5426\u3055\u308C\u308B\u306E\u306F\u89E3\u6790\u7528\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3060\u3051\u3067\u3001\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u30FB\u30E1\u30C7\u30A3\u30A2\u30FB\u30ED\u30B0\u30A4\u30F3\u306E\u901A\u4FE1\u306B\u306F\u624B\u3092\u89E6\u308C\u307E\u305B\u3093\u3002","\u30BB\u30EC\u30AF\u30BF\u30FC\u72B6\u614B\u3092\u76E3\u8996","\u73FE\u5728\u306EX\u753B\u9762\u3067\u5FC5\u9808\u30A2\u30F3\u30AB\u30FC\u3068\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u30A2\u30F3\u30AB\u30FC\u3092\u78BA\u8A8D\u3057\u307E\u3059\u3002\u30BB\u30EC\u30AF\u30BF\u30FC\u8A3A\u65AD\u304C\u4E0D\u8981\u306A\u5834\u5408\u306F\u30AA\u30D5\u306B\u3057\u307E\u3059\u3002","\u30DA\u30FC\u30B8\u306B\u63A5\u7D9A\u6E08\u307F","\u30DA\u30FC\u30B8\u3078\u306E\u30A2\u30AF\u30BB\u30B9","\u62D2\u5426\u3057\u305F\u30D3\u30FC\u30B3\u30F3","\u4E00\u90E8\u306E\u5909\u66F4\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30D6\u30E9\u30A6\u30B6\u306E\u4FDD\u5B58\u9818\u57DF\u304C\u3044\u3063\u3071\u3044\u306E\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002","\u4FDD\u5B58","\u30C6\u30EC\u30E1\u30C8\u30EA","\u30D1\u30CD\u30EB\u306E\u8A00\u8A9E","\u76E3\u8996\u4E2D","\u30BB\u30EC\u30AF\u30BF\u306E\u72B6\u614B","\u4F55\u304C\u30ED\u30FC\u30AB\u30EB\u306B\u6B8B\u308B\u304B\u3092\u78BA\u8A8D\u3057\u3001Aviary\u304CX\u3067\u5F15\u304D\u7D9A\u304D\u52D5\u4F5C\u3059\u308B\u304B\u8ABF\u3079\u307E\u3059\u3002","\u30D7\u30E9\u30A4\u30D0\u30B7\u30FC\u5883\u754C","\u30DA\u30FC\u30B8\u30D5\u30C3\u30AF","\u30ED\u30FC\u30AB\u30EB\u30C7\u30FC\u30BF","\u4E92\u63DB\u6027","\u672A\u4FDD\u5B58\u306E\u5909\u66F4","\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002","\u3053\u306E\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u96E2\u308C\u308B\u524D\u306B\u3001\u5909\u66F4\u3092\u4FDD\u5B58\u3059\u308B\u304B\u5143\u306B\u623B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u4FDD\u5B58\u4E2D...","\u305D\u306E\u5909\u66F4\u306F\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3082\u3046\u4E00\u5EA6\u884C\u3063\u3066\u304B\u3089\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u4FDD\u5B58\u3059\u308B\u524D\u306B\u7121\u52B9\u306A\u5024\u3092\u4FEE\u6B63\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u8A3A\u65AD\u60C5\u5831\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F\u3002","\u524A\u9664\u72B6\u614B\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F\u3002","\u524A\u9664\u30B3\u30DE\u30F3\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","\u30ED\u30FC\u30AB\u30EB\u9650\u5B9A\u30E2\u30FC\u30C9 \u30AA\u30F3\u3002","\u30ED\u30FC\u30AB\u30EB\u9650\u5B9A\u30E2\u30FC\u30C9 \u30AA\u30D5\u3002","\u89E3\u6790\u30D3\u30FC\u30B3\u30F3\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002","\u89E3\u6790\u30D3\u30FC\u30B3\u30F3\u3092\u8A31\u53EF\u3057\u307E\u3057\u305F\u3002","\u30BB\u30EC\u30AF\u30BF\u30FC\u72B6\u614B\u306E\u76E3\u8996\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","\u30BB\u30EC\u30AF\u30BF\u30FC\u72B6\u614B\u306E\u76E3\u8996\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u69CB\u9020\u306E\u89B3\u6E2C\u7D50\u679C\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F\u3002","\u69CB\u9020\u306E\u89B3\u6E2C\u7D50\u679C\u3092\u30B3\u30D4\u30FC\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u6307\u6A19\u3092\u30EA\u30BB\u30C3\u30C8\u3057\u307E\u3057\u305F\u3002","\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u6307\u6A19\u3092\u30EA\u30BB\u30C3\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u4FDD\u5B58\u3055\u308C\u305F\u8B66\u544A\u3092\u6D88\u53BB\u3057\u307E\u3057\u305F\u3002","\u4FDD\u5B58\u3055\u308C\u305F\u8B66\u544A\u3092\u6D88\u53BB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u5E83\u544A\u89B3\u6E2C\u3092\u30EA\u30BB\u30C3\u30C8\u3057\u307E\u3057\u305F\u3002","\u5E83\u544A\u89B3\u6E2C\u3092\u30EA\u30BB\u30C3\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3092\u5207\u308A\u66FF\u3048\u307E\u3057\u305F\u3002\u518D\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026","\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u306E\u5207\u308A\u66FF\u3048\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","{moved} \u4EF6\u3092\u5272\u308A\u5F53\u3066\u3001\u518D\u8A66\u884C\u5F8C\u306B {completedAfterRetry} \u4EF6\u3092\u5B8C\u4E86\u3001\u65E2\u5B58 {skipped} \u4EF6\u3001\u7AF6\u5408 {conflicted} \u4EF6\u3001\u5931\u6557 {failed} \u4EF6\u3002","\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3092\u4F5C\u6210\u3057\u307E\u3057\u305F\u3002\u518D\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026","\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","\u56DE\u7B54\u3092\u8A18\u9332\u3057\u307E\u3057\u305F\u3002","\u3059\u3079\u3066\u306E\u6A5F\u80FD\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002\u30DA\u30FC\u30B8\u306F\u307E\u3060\u304A\u304B\u3057\u3044\u3067\u3059\u304B\uFF1F","\u6A5F\u80FD\u306E\u7D5E\u308A\u8FBC\u307F\u3092\u6D88\u53BB\u3057\u307E\u3057\u305F\u3002","\u6A5F\u80FD\u306E\u7D5E\u308A\u8FBC\u307F\u3092\u4E2D\u6B62\u3057\u307E\u3057\u305F\u3002\u3059\u3079\u3066\u306E\u6A5F\u80FD\u304C\u5143\u306B\u623B\u3063\u3066\u3044\u307E\u3059\u3002","Aria2 \u3078\u306E\u5F15\u304D\u6E21\u3057 \u30AA\u30F3\u3002","Aria2 \u3078\u306E\u5F15\u304D\u6E21\u3057 \u30AA\u30D5\u3002","Aria2 \u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","Aria2 \u306E\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","Aria2 \u306E\u3057\u304D\u3044\u5024\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","Aria2 \u306B\u63A5\u7D9A\u3067\u304D\u307E\u3057\u305F\u3002","Aria2\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093: {error}","Aria2 \u63A5\u7D9A\u30C6\u30B9\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","{gid}\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F\u3002","Aria2\u306E\u30AD\u30E3\u30F3\u30BB\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {error}","Aria2\u306E\u30AD\u30E3\u30F3\u30BB\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","Aria2 \u306E\u4E00\u89A7\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","yt-dlp \u3078\u306E\u53D7\u3051\u6E21\u3057\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","yt-dlp \u3078\u306E\u53D7\u3051\u6E21\u3057\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","yt-dlp \u30D8\u30EB\u30D1\u30FC\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","yt-dlp \u30D8\u30EB\u30D1\u30FC\u306E\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","Bluesky \u30AA\u30F3\u3002","Bluesky \u30AA\u30D5\u3002","Bluesky \u306E\u30B5\u30FC\u30D3\u30B9\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","Bluesky \u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u540D\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","Bluesky \u306E\u30A2\u30D7\u30EA\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","Mastodon \u30AA\u30F3\u3002","Mastodon \u30AA\u30D5\u3002","Mastodon \u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","Mastodon \u306E\u30C8\u30FC\u30AF\u30F3\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30AF\u30ED\u30B9\u30DD\u30B9\u30C8\u306E\u6DFB\u4ED8 \u30AA\u30F3\u3002","\u30AF\u30ED\u30B9\u30DD\u30B9\u30C8\u306E\u6DFB\u4ED8 \u30AA\u30D5\u3002","Bluesky\u306B{posts}\u4EF6\u6295\u7A3F\u3057\u307E\u3057\u305F\u3002{url}","Bluesky\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {error}","Bluesky \u3078\u306E\u30AF\u30ED\u30B9\u30DD\u30B9\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","Mastodon\u306B{posts}\u4EF6\u6295\u7A3F\u3057\u307E\u3057\u305F\u3002{url}","Mastodon\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {error}","Mastodon \u3078\u306E\u30AF\u30ED\u30B9\u30DD\u30B9\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","AI \u5B9F\u884C \u30AA\u30F3\u3002","AI \u5B9F\u884C \u30AA\u30D5\u3002","AI \u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","AI \u30E2\u30C7\u30EB\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","AI \u306E API \u30AD\u30FC\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","AI\u30EA\u30AF\u30A8\u30B9\u30C8\u4E88\u7B97\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","AI\u306E1\u65E5\u4E88\u7B97\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u691C\u7D22 \u30AA\u30F3\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u691C\u7D22 \u30AA\u30D5\u3002","\u57CB\u3081\u8FBC\u307F\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u57CB\u3081\u8FBC\u307F\u30E2\u30C7\u30EB\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u57CB\u3081\u8FBC\u307F\u306E API \u30AD\u30FC\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u57CB\u3081\u8FBC\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u4E88\u7B97\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u57CB\u3081\u8FBC\u307F\u306E1\u65E5\u4E88\u7B97\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u81EA\u52D5\u57CB\u3081\u8FBC\u307F \u30AA\u30F3\u3002","\u81EA\u52D5\u57CB\u3081\u8FBC\u307F \u30AA\u30D5\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u7D22\u5F15\u3092\u518D\u69CB\u7BC9\u4E2D\u2026","\u4E88\u7B97\u306B\u9054\u3057\u305F\u305F\u3081\u57CB\u3081\u8FBC\u307F\u3092\u505C\u6B62\u3057\u307E\u3057\u305F\uFF08{blocked}\u4EF6\u306E\u30EC\u30B3\u30FC\u30C9\u306F\u9001\u4FE1\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF09\u3002","\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9: \u65B0\u898F +{added}\u4EF6 \xB7 \u30B9\u30AD\u30C3\u30D7 {skipped}\u4EF6 \xB7 \u30A8\u30E9\u30FC {errors}\u4EF6 \xB7 \u5408\u8A08 {total}\u4EF6{trimmed}\u3002","\u57CB\u3081\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u7D22\u5F15\u3092\u6D88\u53BB\u3057\u307E\u3057\u305F\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u6D88\u53BB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","AI\u3068\u57CB\u3081\u8FBC\u307F\u306E\u4F7F\u7528\u91CF\u3092\u6D88\u53BB\u3057\u307E\u3057\u305F\u3002","AI\u3068\u57CB\u3081\u8FBC\u307F\u306E\u4F7F\u7528\u91CF\u3092\u6D88\u53BB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u8A2D\u5B9A\u3092\u30EA\u30BB\u30C3\u30C8\u3057\u307E\u3057\u305F\u3002\u5E83\u544A\u306A\u3057\u30E2\u30FC\u30C9\u306F\u30AA\u30F3\u3067\u3059\u3002","\u8A2D\u5B9A\u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u8A2D\u5B9A\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u307E\u3057\u305F\u3002","\u8A2D\u5B9A\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u8A2D\u5B9A\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u307E\u3057\u305F\u3002{warning}","\u30A4\u30F3\u30DD\u30FC\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {errors}","\u8A2D\u5B9A\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F: {filename}\uFF08{collections} \u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3001{bytes}\uFF09\u3002","\u30E9\u30A4\u30D6\u30E9\u30EA\u5168\u4F53\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u8A8D\u8A3C\u60C5\u5831\u4ED8\u304D\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F: {filename}\uFF08{collections} \u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3001{bytes}\uFF09\u3002","\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026","\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u8AAD\u307F\u8FBC\u307F\u307E\u3057\u305F: {collections} \u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3001{conflicts} \u4EF6\u306E\u5909\u66F4\u3002","\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u5FA9\u5143\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026","\u30C9\u30E9\u30A4\u30E9\u30F3\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002\u30ED\u30FC\u30AB\u30EB\u30C7\u30FC\u30BF\u306F\u5909\u66F4\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002","\u30C9\u30E9\u30A4\u30E9\u30F3\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {errors}","\u30E9\u30A4\u30D6\u30E9\u30EA\u5FA9\u5143\u306E\u30C9\u30E9\u30A4\u30E9\u30F3\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u5FA9\u5143\u3057\u307E\u3057\u305F\uFF08{collections} \u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\uFF09\u3002\u518D\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026","\u5FA9\u5143\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F\u3002\u30ED\u30FC\u30AB\u30EB\u30C7\u30FC\u30BF\u306F\u30ED\u30FC\u30EB\u30D0\u30C3\u30AF\u3055\u308C\u307E\u3057\u305F\u3002","\u5FA9\u5143\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F\u3002","\u5FA9\u5143\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {errors}","\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u5FA9\u5143\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u64CD\u4F5C\u30ED\u30B0 \u30AA\u30F3\u3002","\u64CD\u4F5C\u30ED\u30B0 \u30AA\u30D5\u3002","\u76E3\u67FB\u30ED\u30B0\u3092\u6D88\u53BB\u3057\u307E\u3057\u305F\u3002","\u76E3\u67FB\u30ED\u30B0\u3092\u6D88\u53BB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","@{handle} \u306E\u30D5\u30A9\u30ED\u30EF\u30FC\u3092 {count} \u4EF6\u53D6\u5F97\u3057\u307E\u3057\u305F\u3002\u30EA\u30B9\u30C8\u306F\u8AAD\u307F\u8FBC\u307F\u304C\u5B8C\u4E86\u3057\u3066\u3044\u305F\u306E\u3067\u3001\u3053\u308C\u3067\u5168\u54E1\u3067\u3059\u3002","@{handle} \u306E\u30D5\u30A9\u30ED\u30EF\u30FC\u3092 {count} \u4EF6\u53D6\u5F97\u3057\u307E\u3057\u305F\u3002\u30EA\u30B9\u30C8\u306F\u307E\u3060\u8AAD\u307F\u8FBC\u307F\u4E2D\u3060\u3063\u305F\u306E\u3067\u3001\u753B\u9762\u306B\u8868\u793A\u3055\u308C\u3066\u3044\u305F\u5206\u3060\u3051\u3067\u3059\u3002\u6700\u5F8C\u307E\u3067\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u3066\u304B\u3089\u53D6\u5F97\u3057\u76F4\u3059\u3068\u5168\u4EF6\u305D\u308D\u3044\u307E\u3059\u3002","UserCell \u306E\u884C\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002","\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","@{handle} \u306E\u30D5\u30A9\u30ED\u30FC\u4E2D\u30A2\u30AB\u30A6\u30F3\u30C8\u3092 {count} \u4EF6\u53D6\u5F97\u3057\u307E\u3057\u305F\u3002\u30EA\u30B9\u30C8\u306F\u8AAD\u307F\u8FBC\u307F\u304C\u5B8C\u4E86\u3057\u3066\u3044\u305F\u306E\u3067\u3001\u3053\u308C\u3067\u5168\u4EF6\u3067\u3059\u3002","@{handle} \u306E\u30D5\u30A9\u30ED\u30FC\u4E2D\u30A2\u30AB\u30A6\u30F3\u30C8\u3092 {count} \u4EF6\u53D6\u5F97\u3057\u307E\u3057\u305F\u3002\u30EA\u30B9\u30C8\u306F\u307E\u3060\u8AAD\u307F\u8FBC\u307F\u4E2D\u3060\u3063\u305F\u306E\u3067\u3001\u753B\u9762\u306B\u8868\u793A\u3055\u308C\u3066\u3044\u305F\u5206\u3060\u3051\u3067\u3059\u3002\u6700\u5F8C\u307E\u3067\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u3066\u304B\u3089\u53D6\u5F97\u3057\u76F4\u3059\u3068\u5168\u4EF6\u305D\u308D\u3044\u307E\u3059\u3002","\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u6D88\u53BB\u3057\u307E\u3057\u305F\u3002","\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u6D88\u53BB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u4E00\u6642\u505C\u6B62\u3057\u307E\u3057\u305F\u3002","\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u518D\u958B\u3057\u307E\u3057\u305F\u3002","\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F\u3002","\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u518D\u8A66\u884C\u3092\u958B\u59CB\u3057\u307E\u3057\u305F\u3002","\u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D\u3001\u5927\u304D\u306A\u30D5\u30A1\u30A4\u30EB\u306F\u5C11\u3057\u6642\u9593\u304C\u304B\u304B\u308A\u307E\u3059\u2026","{layout} \u5F62\u5F0F\u306E\u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u8AAD\u307F\u53D6\u308A\u307E\u3057\u305F\u3002{records} \u4EF6\u306E\u8A18\u9332\u3092\u53D6\u308A\u8FBC\u307F\u307E\u3057\u305F\u3002\u4FEE\u5FA9: \u30A2\u30FC\u30AB\u30A4\u30D6\u5185\u30EA\u30F3\u30AF {archiveLinks} \u4EF6\u3001\u53D6\u5F97\u6E08\u307F\u30EA\u30F3\u30AF {corpusLinks} \u4EF6\u3001\u53C2\u52A0\u8005 ID \u3092 {participants} \u4EF6\u89E3\u6C7A\u3001{unresolved} \u4EF6\u306F\u672A\u89E3\u6C7A\u306E\u307E\u307E\u3002\u8B66\u544A {warnings} \u4EF6\u3001\u30A8\u30E9\u30FC {errors} \u4EF6\u3002\u30D5\u30A1\u30A4\u30EB: \u8A8D\u8B58 {recognized} \u4EF6\u3001\u30B9\u30AD\u30C3\u30D7 {skipped} \u4EF6\u3001\u4E0D\u6B63 {malformed} \u4EF6\u3002{absent}","\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","\u30EC\u30DD\u30FC\u30C8\u3092\u4F5C\u6210\u4E2D\u2026","\u30EC\u30DD\u30FC\u30C8\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F\u3002","\u30EC\u30DD\u30FC\u30C8\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u6574\u7406\u306E\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u4F5C\u6210\u4E2D\u2026","{added}\u4EF6\u3092\u30AD\u30E5\u30FC\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F\uFF08\u4FDD\u8B77\u5BFE\u8C61{protected}\u4EF6\u306F\u30B9\u30AD\u30C3\u30D7\uFF09\u3002","\u6574\u7406\u3092\u30AD\u30E5\u30FC\u306B\u8FFD\u52A0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u6574\u7406\u30AD\u30E5\u30FC\u3092\u7A7A\u306B\u3057\u307E\u3057\u305F\u3002","\u30AD\u30E5\u30FC\u3092\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u4FDD\u5B58\u5BB9\u91CF\u306E\u4E0A\u9650\u8B66\u544A\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u4FDD\u5B58\u5BB9\u91CF\u306E\u4E0A\u9650\u8B66\u544A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u53D6\u308A\u8FBC\u3093\u3060\u753B\u50CF\u306F\u5143\u306E\u30B5\u30A4\u30BA\u306E\u307E\u307E\u3067\u3059\u3002","\u53D6\u308A\u8FBC\u3093\u3060\u753B\u50CF\u3092\u7E2E\u5C0F\u3057\u307E\u3059\u3002","\u52D5\u753B\u306F\u30B5\u30E0\u30CD\u30A4\u30EB\u753B\u50CF\u3068\u3057\u3066\u53D6\u308A\u8FBC\u307F\u307E\u3059\u3002","\u52D5\u753B\u3092\u305D\u306E\u307E\u307E\u53D6\u308A\u8FBC\u307F\u307E\u3059\u3002","X\u306E\u5185\u90E8\u30EC\u30DD\u30FC\u30C8\u3092\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059\u2026","X\u306E\u5185\u90E8\u30EC\u30DD\u30FC\u30C8\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002","X\u306E\u5185\u90E8\u30EC\u30DD\u30FC\u30C8\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u9078\u629E\u3057\u305F {count} \u4EF6\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3066\u3044\u307E\u3059\u3002","\u30AD\u30E3\u30D7\u30C1\u30E3\u6E08\u307F\u30E1\u30C7\u30A3\u30A2\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u691C\u7D22\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u9023\u643A\u8A2D\u5B9A\u3067\u57CB\u3081\u8FBC\u307F\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3068\u30AD\u30FC\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F\u3002","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u66F4\u65B0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u524A\u9664\u3057\u307E\u3057\u305F\u3002","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306F\u3059\u3067\u306B\u524A\u9664\u3055\u308C\u3066\u3044\u307E\u3059\u3002","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u307E\u3057\u305F\u3002{records} \u4EF6\u3092 {files} \u30D5\u30A1\u30A4\u30EB\u306B\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u3059\u3079\u3066\u524A\u9664\u3057\u307E\u3057\u305F\u3002","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","AI \u30DC\u30BF\u30F3\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","AI \u30DC\u30BF\u30F3\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u77ED\u7E2E\u30EA\u30F3\u30AF\u306E\u5C55\u958B \u30AA\u30F3\u3002","\u77ED\u7E2E\u30EA\u30F3\u30AF\u306E\u5C55\u958B \u30AA\u30D5\u3002","\u30EA\u30F3\u30AF\u306E\u30AF\u30EA\u30FC\u30CB\u30F3\u30B0 \u30AA\u30F3\u3002","\u30EA\u30F3\u30AF\u306E\u30AF\u30EA\u30FC\u30CB\u30F3\u30B0 \u30AA\u30D5\u3002","\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC\u3059\u308B\u30DC\u30BF\u30F3\u3092\u30AA\u30D5\u3002","\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC\u3059\u308B\u30DC\u30BF\u30F3\u3092\u30AA\u30F3\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u8272\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30E1\u30E2\u3092\u6D88\u53BB\u3057\u307E\u3057\u305F\u3002","\u30E1\u30E2\u3092\u6D88\u53BB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u7528\u30AD\u30E3\u30D7\u30C1\u30E3 \u30AA\u30F3\u3002","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u7528\u30AD\u30E3\u30D7\u30C1\u30E3 \u30AA\u30D5\u3002","\u751F\u30EC\u30B9\u30DD\u30F3\u30B9\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30E1\u30C7\u30A3\u30A2\u306E\u30D0\u30A4\u30C8\u53D6\u5F97\u3092\u30AA\u30F3\u3002","\u30E1\u30C7\u30A3\u30A2\u306E\u30D0\u30A4\u30C8\u53D6\u5F97\u3092\u30AA\u30D5\u3002","\u30AF\u30A8\u30EA\u691C\u51FA\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u4FDD\u8B77\u3055\u308C\u305F\u6295\u7A3F\u306E\u5171\u6709\u3092\u6709\u52B9\u306B\u3057\u307E\u3057\u305F\u3002","\u4FDD\u8B77\u3055\u308C\u305F\u6295\u7A3F\u3092\u5171\u6709\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u304B\u3089\u9664\u5916\u3057\u307E\u3057\u305F\u3002","\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E0D\u660E\u306E\u6295\u7A3F\u306E\u5171\u6709\u3092\u6709\u52B9\u306B\u3057\u307E\u3057\u305F\u3002","\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E0D\u660E\u306E\u6295\u7A3F\u3092\u5171\u6709\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u304B\u3089\u9664\u5916\u3057\u307E\u3057\u305F\u3002","\u4FDD\u5B58\u5148\u30D5\u30A9\u30EB\u30C0\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30B8\u30E7\u30D6\u3092\u4E00\u6642\u505C\u6B62\u3057\u307E\u3057\u305F\u3002","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30B8\u30E7\u30D6\u3092\u518D\u958B\u3057\u307E\u3057\u305F\u3002","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30B8\u30E7\u30D6\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F\u3002","\u8868\u793A\u4E2D\u306E\u6295\u7A3F\u3092\u53CE\u96C6\u4E2D\u2026","\u3053\u306E\u30D3\u30E5\u30FC\u3067\u306F\u6295\u7A3F\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u3092\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u3066\u8AAD\u307F\u8FBC\u3093\u3067\u304B\u3089\u3001\u3082\u3046\u4E00\u5EA6\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u3066\u304F\u3060\u3055\u3044\u3002","{records}\u4EF6\u3092{files}\u500B\u306EZIP\u306B\u66F8\u304D\u51FA\u3057\u307E\u3057\u305F \u2192 {filename}","{records}\u4EF6\u3092\u66F8\u304D\u51FA\u3057\u307E\u3057\u305F \u2192 {filename}","{records}\u4EF6\u3092\u66F8\u304D\u51FA\u3057\u307E\u3057\u305F \u2192 {filename}","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u8A3A\u65AD\u60C5\u5831\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30B9\u30EC\u30C3\u30C9\u60C5\u5831\u3092\u6301\u3064\u30AD\u30E3\u30D7\u30C1\u30E3\u6E08\u307F\u6295\u7A3F\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002","\u30AD\u30E3\u30D7\u30C1\u30E3\u3057\u305F\u30B9\u30EC\u30C3\u30C9\u30EA\u30FC\u30C0\u30FC\u3092\u66F8\u304D\u51FA\u3057\u307E\u3057\u305F\u3002","\u30B9\u30EC\u30C3\u30C9\u306E\u518D\u69CB\u7BC9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u8A3A\u65AD\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u8A3A\u65AD\u60C5\u5831\u3092\u30B3\u30D4\u30FC\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","{records}\u4EF6\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F\u3002","{records}\u4EF6\u3092{target}\u306B\u66F8\u304D\u51FA\u3057\u307E\u3057\u305F\u3002","\u5916\u90E8\u3078\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","ZIP \u3042\u305F\u308A\u306E\u4EF6\u6570\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30B8\u30E7\u30D6\u306E\u4FDD\u6301\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u8A18\u9332\u306E\u4FDD\u6301\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u65E5\u6570\u306B\u3088\u308B\u4FDD\u6301\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","WARC\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F\uFF08{records}\u4EF6\uFF09\u3002","WARC \u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","WACZ \u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F\uFF08{records} \u4EF6\u3001{size}\uFF09\u3002","WACZ \u306E\u66F8\u304D\u51FA\u3057\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30C7\u30A3\u30B9\u30AF\u306E\u7A7A\u304D\u5BB9\u91CF\u3092\u5897\u3084\u3059\u304B\u3001\u66F8\u304D\u51FA\u3059\u4EF6\u6570\u3092\u6E1B\u3089\u3057\u3066\u304B\u3089\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002","\u7F72\u540D ID \u3092\u7F6E\u304D\u63DB\u3048\u307E\u3057\u305F\u3002","\u7F72\u540D ID \u3092\u7F6E\u304D\u63DB\u3048\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002","Aviary\u5C02\u7528WACZ\u8A3C\u660E\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F\uFF08{records}\u4EF6\u3001{size}\uFF09\u3002","Aviary\u5C02\u7528WACZ\u8A3C\u660E\u306E\u66F8\u304D\u51FA\u3057\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","\u7F72\u540D\u30AD\u30FC\u30DA\u30A2\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F: {filename}\u3002","\u7F72\u540D\u30AD\u30FC\u30DA\u30A2\u306E\u66F8\u304D\u51FA\u3057\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","\u30E1\u30C7\u30A3\u30A2\u30DC\u30BF\u30F3 \u30AA\u30F3\u3002","\u30E1\u30C7\u30A3\u30A2\u30DC\u30BF\u30F3 \u30AA\u30D5\u3002","\u30E1\u30C7\u30A3\u30A2\u30EA\u30F3\u30AF\u306E\u30B3\u30D4\u30FC\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","\u30E1\u30C7\u30A3\u30A2\u30EA\u30F3\u30AF\u306E\u30B3\u30D4\u30FC\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u30AA\u30EA\u30B8\u30CA\u30EB\u753B\u8CEA\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30D5\u30EB\u30B5\u30A4\u30BA\u753B\u50CF \u30AA\u30F3\u3002","\u30D5\u30EB\u30B5\u30A4\u30BA\u753B\u50CF \u30AA\u30D5\u3002","\u30E1\u30C7\u30A3\u30A2\u306E\u30EC\u30A4\u30A2\u30A6\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30D5\u30A1\u30A4\u30EB\u540D\u306E\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30B5\u30A4\u30C9\u30AB\u30FC\u30D5\u30A1\u30A4\u30EB\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u8996\u899A\u7684\u306A\u91CD\u8907\u691C\u51FA\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","\u8996\u899A\u7684\u306A\u91CD\u8907\u691C\u51FA\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u91CD\u8907\u5C65\u6B74 \u30AA\u30F3\u3002","\u91CD\u8907\u5C65\u6B74 \u30AA\u30D5\u3002","\u540C\u6642\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u4E0A\u9650\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30DA\u30FC\u30B9\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u3053\u306E\u753B\u9762\u306E\u30E1\u30C7\u30A3\u30A2\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u4E2D\u2026","\u4E00\u62EC\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","\u5C65\u6B74\u3092\u6D88\u53BB\u3057\u307E\u3057\u305F\u3002","\u5C65\u6B74\u3092\u6D88\u53BB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u5C65\u6B74\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u307E\u3057\u305F: {records} \u4EF6\u3001{files} \u30D5\u30A1\u30A4\u30EB\u3002","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u5C65\u6B74\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30AD\u30E3\u30D7\u30C1\u30E3\u3057\u305F\u30E1\u30C7\u30A3\u30A2: {downloaded} \u4EF6\u4FDD\u5B58 / {duplicate} \u4EF6\u91CD\u8907 / {failed} \u4EF6\u5931\u6557\u3002","\u518D\u8A66\u884C\u3067\u304D\u308B\u5931\u6557\u3057\u305F\u30E1\u30C7\u30A3\u30A2\u30B8\u30E7\u30D6\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u30D7\u30EA\u30BB\u30C3\u30C8\u3092\u9069\u7528\u3057\u307E\u3057\u305F: {preset}\uFF08{changes}\u4EF6\uFF09","\u30D7\u30EA\u30BB\u30C3\u30C8\u306F\u9069\u7528\u6E08\u307F\u3067\u3059: {preset}","\u30D7\u30EA\u30BB\u30C3\u30C8\u3092\u9069\u7528\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u305D\u306E\u30C6\u30FC\u30DE\u306B\u306F\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093\u3002","\u30C6\u30FC\u30DE\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F\u3002","\u8868\u793A\u5BC6\u5EA6\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F\u3002","\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u306E\u5E45\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F\u3002","Chirp \u30D5\u30A9\u30F3\u30C8 \u30AA\u30F3\u3002","Chirp \u30D5\u30A9\u30F3\u30C8 \u30AA\u30D5\u3002","\u30A8\u30F3\u30B2\u30FC\u30B8\u30E1\u30F3\u30C8\u6570\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3057\u305F\u3002","\u30A8\u30F3\u30B2\u30FC\u30B8\u30E1\u30F3\u30C8\u6570\u3092\u8868\u793A\u3057\u307E\u3057\u305F\u3002","\u30AB\u30A6\u30F3\u30C8\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30BF\u30D6\u306E\u901A\u77E5\u6570\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3057\u305F\u3002","\u30BF\u30D6\u306E\u901A\u77E5\u6570\u3092\u8868\u793A\u3057\u307E\u3057\u305F\u3002","\u7D76\u5BFE\u6642\u523B\u8868\u793A\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","\u7D76\u5BFE\u6642\u523B\u8868\u793A\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","Aviary \u306E\u30BF\u30D6\u30A2\u30A4\u30B3\u30F3\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","X \u306E\u30BF\u30D6\u30A2\u30A4\u30B3\u30F3\u3092\u5FA9\u5143\u3057\u307E\u3057\u305F\u3002","\u884C\u306E\u5883\u754C\u7DDA\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3057\u305F\u3002","\u884C\u306E\u5883\u754C\u7DDA\u3092\u623B\u3057\u307E\u3057\u305F\u3002","\u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30E2\u30FC\u30B7\u30E7\u30F3\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u5E83\u544A\u306A\u3057\u30E2\u30FC\u30C9\uFF1A\u30AA\u30F3\u3002","\u5E83\u544A\u306A\u3057\u30E2\u30FC\u30C9\uFF1A\u30AA\u30D5\u3002","\u5E83\u544A\u30ED\u30B0\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002","\u5E83\u544A\u30ED\u30B0\u3092\u8A31\u53EF\u3057\u307E\u3057\u305F\u3002","\u30B5\u30A4\u30C9\u30D0\u30FC\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30C8\u30EC\u30F3\u30C9\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30EC\u30A4\u30A2\u30A6\u30C8\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","Grok \u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30DB\u30D0\u30FC\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u96C6\u4E2D\u30E2\u30FC\u30C9\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","\u96C6\u4E2D\u30E2\u30FC\u30C9\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u95B2\u89A7\u6642\u9593\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u306F\u6B62\u307E\u3089\u305A\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u3059\u3002","\u9577\u3044\u30DD\u30B9\u30C8\u3092\u81EA\u52D5\u7684\u306B\u5C55\u958B\u3057\u307E\u3059\u3002","\u9577\u3044\u30DD\u30B9\u30C8\u306F\u6298\u308A\u305F\u305F\u3093\u3060\u307E\u307E\u306B\u3057\u307E\u3059\u3002","\u623B\u308B\u64CD\u4F5C\u3067\u5143\u306E\u4F4D\u7F6E\u3092\u5FA9\u5143\u3057\u307E\u3059\u3002","\u623B\u308B\u64CD\u4F5C\u3067\u306FX\u306E\u4F4D\u7F6E\u3092\u4F7F\u3044\u307E\u3059\u3002","\u65E2\u8AAD\u30DE\u30FC\u30AB\u30FC\u3092\u30AA\u30F3\u3002","\u65E2\u8AAD\u30DE\u30FC\u30AB\u30FC\u3092\u30AA\u30D5\u3002","\u65E2\u8AAD\u30DE\u30FC\u30AB\u30FC\u306E\u5BFE\u8C61\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30E9\u30A4\u30BF\u30FC\u30E2\u30FC\u30C9 \u30AA\u30F3\u3002","\u30E9\u30A4\u30BF\u30FC\u30E2\u30FC\u30C9 \u30AA\u30D5\u3002","\u300C\u30D5\u30A9\u30ED\u30FC\u4E2D\u300D\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3 \u30AA\u30F3\u3002","\u300C\u30D5\u30A9\u30ED\u30FC\u4E2D\u300D\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3 \u30AA\u30D5\u3002","For you \u30BF\u30D6\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3057\u305F\u3002","For you \u30BF\u30D6\u3092\u5FA9\u5143\u3057\u307E\u3057\u305F\u3002","\u6295\u7A3F\u306F\u8FD4\u4FE1\u30A2\u30A4\u30B3\u30F3\u304B\u3089\u958B\u304D\u307E\u3059\u3002","\u6295\u7A3F\u306F\u518D\u3073\u884C\u5168\u4F53\u304B\u3089\u958B\u304D\u307E\u3059\u3002","\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u8868\u793A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u753B\u9762\u5916\u306E\u52D5\u753B\u3092\u4E00\u6642\u505C\u6B62\u3057\u307E\u3057\u305F\u3002","\u753B\u9762\u5916\u306E\u52D5\u753B\u306F\u518D\u751F\u3057\u305F\u307E\u307E\u306B\u3057\u307E\u3059\u3002","\u52D5\u753B\u306E\u518D\u751F\u3092\u7D99\u7D9A\u3057\u307E\u3059\u3002","\u30BF\u30D6\u306B\u5408\u308F\u305B\u3066\u52D5\u753B\u3092\u4E00\u6642\u505C\u6B62\u3057\u307E\u3059\u3002","\u52D5\u753B\u306E\u30EB\u30FC\u30D7\u518D\u751F\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","\u52D5\u753B\u306E\u30EB\u30FC\u30D7\u518D\u751F\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u56FA\u5B9A\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u56FA\u5B9A\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u6709\u52B9\u306B\u3057\u307E\u3057\u305F\u3002","\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u7121\u52B9\u306B\u3057\u307E\u3057\u305F\u3002","\u65E2\u8AAD\u6295\u7A3F\u306E\u6E1B\u5149\u3092\u30AA\u30F3\u306B\u3057\u307E\u3057\u305F\u3002","\u65E2\u8AAD\u6295\u7A3F\u306E\u6E1B\u5149\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u65E2\u8AAD\u6295\u7A3F\u306E\u5BFE\u8C61\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u65E2\u8AAD\u306E\u6295\u7A3F\u3092\u5FD8\u308C\u307E\u3057\u305F\u3002","\u65E2\u8AAD\u306E\u6295\u7A3F\u3092\u6D88\u53BB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30D5\u30A3\u30EB\u30BF\u30FC\u30EB\u30FC\u30EB\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","{count} \u4EF6\u306E\u30EB\u30FC\u30EB\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F\u3002","{count} \u4EF6\u306E\u30EB\u30FC\u30EB\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F\u3002","\u671F\u9650\u5207\u308C\u306E\u30EB\u30FC\u30EB\u3092\u66F4\u65B0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30D7\u30EC\u30DF\u30A2\u30E0\u30D5\u30A3\u30EB\u30BF\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u5F15\u7528\u30DD\u30B9\u30C8\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u30E1\u30C7\u30A3\u30A2\u4ED8\u304D\u306E\u8FD4\u4FE1\u3092\u96A0\u3057\u307E\u3057\u305F\u3002","\u30E1\u30C7\u30A3\u30A2\u4ED8\u304D\u306E\u8FD4\u4FE1\u3092\u518D\u3073\u8868\u793A\u3057\u307E\u3059\u3002","\u30D5\u30A3\u30EB\u30BF\u30FC\u7406\u7531\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u53CD\u5FDC\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u53CD\u5FDC\u306E\u57FA\u6E96\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u3059\u3079\u3066\u306E\u30EB\u30FC\u30C8\u3067\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8\u3092\u66F8\u304D\u51FA\u3057\u307E\u3057\u305F: {filename}\uFF08{count} \u884C\uFF09\u3002","\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8\u3092\u66F8\u304D\u51FA\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8\u306E\u30D7\u30EC\u30D3\u30E5\u30FC\u304C\u3067\u304D\u307E\u3057\u305F\u3002","\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8\u3092\u30D7\u30EC\u30D3\u30E5\u30FC\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","{count} \u4EF6\u306E\u30EB\u30FC\u30EB\u3092\u8FFD\u52A0\u3057\u307E\u3057\u305F\u3002","\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8\u3092 {count} \u4EF6\u306E\u30EB\u30FC\u30EB\u3067\u7F6E\u63DB\u3057\u307E\u3057\u305F\u3002","\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u975E\u8868\u793A\u306E\u6295\u7A3F\u3092\u9069\u7528\u3057\u307E\u3057\u305F\u3002","\u975E\u8868\u793A\u306E\u6295\u7A3F\u3092\u518D\u8868\u793A\u3057\u307E\u3057\u305F\u3002","\u975E\u8868\u793A\u30DC\u30BF\u30F3 \u30AA\u30F3\u3002","\u975E\u8868\u793A\u30DC\u30BF\u30F3 \u30AA\u30D5\u3002","\u3059\u3079\u3066\u306E\u30EB\u30FC\u30C8\u3067\u975E\u8868\u793A\u3092\u30AA\u30D5\u306B\u3057\u307E\u3057\u305F\u3002","\u5FA9\u5143\u3067\u304D\u308B\u3082\u306E\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u76F4\u524D\u306E\u975E\u8868\u793A\u3092\u53D6\u308A\u6D88\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u6295\u7A3F\u3092\u5FA9\u5143\u3057\u307E\u3057\u305F\u3002","\u305D\u306E\u6295\u7A3F\u306F\u3059\u3067\u306B\u5FA9\u5143\u3055\u308C\u3066\u3044\u307E\u3059\u3002","\u6295\u7A3F\u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u975E\u8868\u793A\u306E\u6295\u7A3F\u3092{removed}\u4EF6\u524A\u9664\u3057\u307E\u3057\u305F\u3002","\u975E\u8868\u793A\u306E\u6295\u7A3F\u3092{removed}\u4EF6\u524A\u9664\u3057\u307E\u3057\u305F\u3002","\u975E\u8868\u793A\u306E\u6295\u7A3F\u3092\u6D88\u53BB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u4EE5\u524D\u306E\u30C7\u30FC\u30BF\u3092\u5272\u308A\u5F53\u3066\u3089\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4F55\u3082\u79FB\u52D5\u3057\u3066\u3044\u306A\u3044\u306E\u3067\u5143\u306E\u5834\u6240\u306E\u307E\u307E\u3067\u3059\u3002\u3053\u306E\u30DA\u30FC\u30B8\u3092\u958B\u304D\u76F4\u3057\u3066\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002","\u6A5F\u80FD\u306E\u7D5E\u308A\u8FBC\u307F\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u6A5F\u80FD\u306E\u7D5E\u308A\u8FBC\u307F\u3092\u6D88\u53BB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u305D\u306E\u56DE\u7B54\u3092\u8A18\u9332\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u7D5E\u308A\u8FBC\u307F\u306F\u5143\u306E\u72B6\u614B\u306E\u307E\u307E\u306A\u306E\u3067\u3001\u540C\u3058\u30DC\u30BF\u30F3\u3092\u3082\u3046\u4E00\u5EA6\u62BC\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u6A5F\u80FD\u306E\u7D5E\u308A\u8FBC\u307F\u3092\u505C\u6B62\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u5FA9\u5143\u3092\u53D6\u308A\u6D88\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u73FE\u5728\u306E\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u304C\u7D42\u308F\u3063\u305F\u6642\u70B9\u3067\u81EA\u52D5\u7684\u306B\u505C\u6B62\u3057\u307E\u3059\u3002","\u53D6\u308A\u8FBC\u307F\u3092\u4E00\u6642\u505C\u6B62\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3059\u3067\u306B\u5B8C\u4E86\u3057\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u958B\u304D\u76F4\u3057\u3066\u3001\u3069\u3053\u307E\u3067\u9032\u3093\u3060\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u53D6\u308A\u8FBC\u307F\u3092\u518D\u958B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u4FDD\u5B58\u3055\u308C\u305F\u5143\u30C7\u30FC\u30BF\u304C\u6D88\u3048\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u3082\u3046\u4E00\u5EA6\u5B9F\u884C\u3057\u3066\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u958B\u59CB\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u53D6\u308A\u8FBC\u307F\u3092\u53D6\u308A\u6D88\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3059\u3067\u306B\u5B8C\u4E86\u3057\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u958B\u304D\u76F4\u3057\u3066\u3001\u3069\u3053\u307E\u3067\u9032\u3093\u3060\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u53D6\u308A\u8FBC\u307F\u3092\u3084\u308A\u76F4\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30A2\u30FC\u30AB\u30A4\u30D6\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u3073\u76F4\u3057\u3066\u3001\u65B0\u3057\u304F\u53D6\u308A\u8FBC\u307F\u3092\u59CB\u3081\u3066\u304F\u3060\u3055\u3044\u3002","\u66F8\u304D\u51FA\u3057\u30B8\u30E7\u30D6\u3092\u4E00\u6642\u505C\u6B62\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3059\u3067\u306B\u5B8C\u4E86\u3057\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u958B\u304D\u76F4\u3057\u3066\u73FE\u5728\u306E\u72B6\u614B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u66F8\u304D\u51FA\u3057\u30B8\u30E7\u30D6\u3092\u518D\u958B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30C1\u30A7\u30C3\u30AF\u30DD\u30A4\u30F3\u30C8\u304C\u6D88\u3048\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u65B0\u3057\u304F\u66F8\u304D\u51FA\u3057\u3092\u59CB\u3081\u3066\u304F\u3060\u3055\u3044\u3002","\u66F8\u304D\u51FA\u3057\u30B8\u30E7\u30D6\u3092\u53D6\u308A\u6D88\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3059\u3067\u306B\u5B8C\u4E86\u3057\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u958B\u304D\u76F4\u3057\u3066\u73FE\u5728\u306E\u72B6\u614B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u305D\u306E\u4E00\u62EC\u51E6\u7406\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002Aviary \u306E\u6A29\u9650\u30DA\u30FC\u30B8\u3067\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u8A31\u53EF\u3057\u3066\u304B\u3089\u3001\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002","\u4E00\u62EC\u51E6\u7406\u304C\u305D\u306E\u6307\u793A\u3092\u53D7\u3051\u4ED8\u3051\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3059\u3067\u306B\u5B8C\u4E86\u3057\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u958B\u304D\u76F4\u3057\u3066\u73FE\u5728\u306E\u72B6\u614B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u5F85\u6A5F\u4E2D\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u518D\u958B\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002Aviary \u306E\u6A29\u9650\u30DA\u30FC\u30B8\u3067\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u8A31\u53EF\u3057\u3066\u304B\u3089\u3001\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002","\u5931\u6557\u3057\u305F\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u3084\u308A\u76F4\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002Aviary \u306E\u6A29\u9650\u30DA\u30FC\u30B8\u3067\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u8A31\u53EF\u3057\u3066\u304B\u3089\u3001\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002","\u307E\u3068\u3081\u3092\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30C7\u30FC\u30BF\u306F\u5931\u308F\u308C\u3066\u3044\u306A\u3044\u306E\u3067\u3001\u30DA\u30FC\u30B8\u3092\u518D\u8AAD\u307F\u8FBC\u307F\u3057\u3066\u304B\u3089\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002","\u305D\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u3082\u306E\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u77ED\u3044\u8A9E\u3067\u8A66\u3059\u304B\u3001\u5DE6\u306E\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\u3002","\u4FDD\u6301: \u5BB9\u91CF\u78BA\u4FDD\u306E\u305F\u3081\u306B\u30D6\u30E9\u30A6\u30B6\u30FC\u304C\u3053\u306E\u30E9\u30A4\u30D6\u30E9\u30EA\u3092\u6D88\u53BB\u3059\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u30D9\u30B9\u30C8\u30A8\u30D5\u30A9\u30FC\u30C8: \u7A7A\u304D\u5BB9\u91CF\u304C\u5C11\u306A\u304F\u306A\u308B\u3068\u30D6\u30E9\u30A6\u30B6\u30FC\u304C\u3053\u306E\u30E9\u30A4\u30D6\u30E9\u30EA\u3092\u6D88\u53BB\u3059\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\u3002\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u4FDD\u7BA1\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u3053\u306E\u30E9\u30A4\u30D6\u30E9\u30EA\u304C\u4FDD\u6301\u3055\u308C\u308B\u304B\u30D6\u30E9\u30A6\u30B6\u30FC\u306F\u793A\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u4FDD\u7BA1\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u3053\u306E\u30E6\u30FC\u30B6\u30FC\u30B9\u30AF\u30EA\u30D7\u30C8\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u306F\u3001\u30DA\u30FC\u30B8\u81EA\u4F53\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092 Aviary \u306B\u4E0E\u3048\u3066\u3044\u307E\u305B\u3093\u3002","\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u30FC\u306F Aviary \u306E\u30DA\u30FC\u30B8\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u8AAD\u307F\u8FBC\u307F\u307E\u305B\u3093\u3067\u3057\u305F\u3002","Aviary \u306E\u30DA\u30FC\u30B8\u30B9\u30AF\u30EA\u30D7\u30C8\u306F\u8AAD\u307F\u8FBC\u307E\u308C\u3066\u3044\u307E\u3059\u304C\u3001\u5225\u306E\u3082\u306E\uFF08\u304A\u305D\u3089\u304F\u4ED6\u306E\u62E1\u5F35\u6A5F\u80FD\uFF09\u304C\u5148\u306B\u5FDC\u7B54\u3057\u307E\u3057\u305F\u3002\u3053\u306E\u30DA\u30FC\u30B8\u3067\u306F\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30EC\u30D9\u30EB\u306E\u5E83\u544A\u4FDD\u8B77\u306F Aviary \u306E\u7BA1\u7406\u4E0B\u306B\u3042\u308A\u307E\u305B\u3093\u3002","\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u30FC\u3067\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002","\u30BB\u30EC\u30AF\u30BF\u30FC\u306E\u4E00\u81F4","\u5FC5\u9808\u30B5\u30FC\u30D5\u30A7\u30B9\u304C\u3042\u308A\u307E\u305B\u3093","\u4EFB\u610F\u30B5\u30FC\u30D5\u30A7\u30B9\u304C\u3042\u308A\u307E\u305B\u3093","\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u30BB\u30EC\u30AF\u30BF\u30FC\u3092\u4F7F\u7528\u4E2D","\u5F71\u97FF\u3092\u53D7\u3051\u308B\u6A5F\u80FD","\u6700\u5F8C\u306E\u30BB\u30EC\u30AF\u30BF\u30FC\u9077\u79FB","\u5E83\u544A\u89B3\u6E2C","\u5E83\u544A\u30DE\u30FC\u30AB\u30FC\u6570","\u5E83\u544A\u30B3\u30F3\u30C8\u30E9\u30AF\u30C8\u306E\u5909\u5316","\u4FDD\u6301\u4E2D\u306E\u5E83\u544A\u89B3\u6E2C","\u30CD\u30A4\u30C6\u30A3\u30D6","\u30C8\u30EC\u30F3\u30C9","\u81EA\u793E\u30D7\u30ED\u30E2","\u52D5\u753B","\u5B9F\u884C\u3059\u308B\u524D\u306B X \u306B\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\uFF3B\u5B9F\u884C\uFF3D\u3092\u6709\u52B9\u306B\u3059\u308B\u306B\u306F\u3001\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3\u30921\u7A2E\u985E\u4EE5\u4E0A\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u524A\u9664\u3092\u958B\u59CB\u3057\u3066\u3044\u307E\u3059\u2026","Long Animation Frame \u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093","\u9069\u7528\u30B5\u30F3\u30D7\u30EB\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093","\u4EF6\u306E\u30A8\u30E9\u30FC","\u4EF6\u306E\u30A8\u30E9\u30FC","Aviary \u306E\u3059\u3079\u3066\u306E\u6A5F\u80FD\u3092\u30AA\u30D5\u306B\u3057\u3066\u3082\u30DA\u30FC\u30B8\u306F\u304A\u304B\u3057\u3044\u307E\u307E\u3067\u3057\u305F\u3002\u3064\u307E\u308A\u539F\u56E0\u306F Aviary \u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u6B21\u306F\u5225\u306E\u62E1\u5F35\u6A5F\u80FD\u3001\u30E6\u30FC\u30B6\u30FC\u30B9\u30AF\u30EA\u30D7\u30C8\u3001\u307E\u305F\u306F X \u81EA\u4F53\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u52D5\u4F5C\u4E2D\u306E Aviary \u306E\u6A5F\u80FD\u304C\u306A\u304B\u3063\u305F\u305F\u3081\u3001\u7D5E\u308A\u8FBC\u3080\u5BFE\u8C61\u304C\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u30ED\u30FC\u30AB\u30EB\u306E\u307F\u30E2\u30FC\u30C9\u3067\u30D6\u30ED\u30C3\u30AF","\u906E\u65AD\uFF08\u4E88\u7B97\u304C 0\uFF09","\u4E00\u81F4\u3059\u308B\u7D50\u679C\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u7D71\u5408\u304C\u7121\u52B9\u306B\u306A\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF09\u3002","\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u306E\u30D5\u30A9\u30ED\u30EF\u30FC\u307E\u305F\u306F\u30D5\u30A9\u30ED\u30FC\u4E2D\u306E\u4E00\u89A7\u3092\u958B\u304D\u3001\u300C\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u53D6\u5F97\u300D\u3067\u8A18\u9332\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u3053\u306E\u5F62\u5F0F\u306B\u306F\u5B58\u5728\u3057\u307E\u305B\u3093:","\u300C{query}\u300D\u306B\u4E00\u81F4\u3059\u308B\u53D6\u5F97\u6E08\u307F\u30EC\u30B3\u30FC\u30C9\u306F\u3042\u308A\u307E\u305B\u3093\u3002","X\u306E\u5185\u90E8\u30EC\u30DD\u30FC\u30C8","X\u81EA\u8EAB\u306E\u6708\u6B21\u8868\u793A\u30B5\u30DE\u30EA\u30FC\u3092\u30ED\u30FC\u30AB\u30EB\u3067\u8AAD\u307F\u8FBC\u307F\u307E\u3059\u3002\u96C6\u8A08\u30E9\u30D9\u30EB\u3092\u793A\u3059\u3082\u306E\u3067\u3001\u672C\u756A\u306E\u30E9\u30F3\u30AD\u30F3\u30B0\u91CD\u307F\u3084\u5B8C\u5168\u306A\u6295\u7A3F\u76E3\u67FB\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002","X\u306E\u5185\u90E8\u30EC\u30DD\u30FC\u30C8JSON\u3092\u8AAD\u307F\u8FBC\u3080","X\u306E\u5185\u90E8\u30EC\u30DD\u30FC\u30C8\u3092\u30ED\u30FC\u30AB\u30EB\u306B\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u4ECA\u6708\u306F\u8868\u793A\u30E9\u30D9\u30EB\u304C\u5831\u544A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002","X\u306E\u30EC\u30DD\u30FC\u30C8\u306F\u307E\u3060\u8AAD\u307F\u8FBC\u307E\u308C\u3066\u3044\u307E\u305B\u3093\u3002","\u5225\u306E\u6708\u3092\u8AAD\u307F\u8FBC\u3080\u3068\u30EC\u30DD\u30FC\u30C8\u3092\u6BD4\u8F03\u3067\u304D\u307E\u3059\u3002","\u9078\u629E\u3057\u305F\u3082\u306E\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","{total} \u4EF6\u4E2D {selected} \u4EF6\u3092\u9078\u629E\u3057\u307E\u3057\u305F\u3002{unavailable} \u4EF6\u306F\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3067\u304D\u307E\u305B\u3093\u3002","\u30E1\u30C7\u30A3\u30A2\u306E\u7A2E\u985E","\u3059\u3079\u3066\u306E\u7A2E\u985E","\u3059\u3079\u3066\u9078\u629E","\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002","\u3053\u306E\u691C\u7D22\u306B\u306F\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u53EF\u80FD\u306A\u30D5\u30A1\u30A4\u30EB\u304C {limit} \u4EF6\u3092\u8D85\u3048\u3066\u542B\u307E\u308C\u307E\u3059\u3002\u5148\u306B\u7D5E\u308A\u8FBC\u3093\u3067\u304F\u3060\u3055\u3044\u3002","\u4E00\u81F4\u3059\u308B\u30ED\u30FC\u30AB\u30EB\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u30C6\u30AD\u30B9\u30C8\u3068\u610F\u5473\u306E\u4E00\u81F4","\u610F\u5473\u4E00\u81F4","\u30C6\u30AD\u30B9\u30C8\u4E00\u81F4","(\u30C6\u30AD\u30B9\u30C8\u306A\u3057)","\u30ED\u30FC\u30AB\u30EB\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u63A2\u3059","\u30C6\u30AD\u30B9\u30C8\u3001\u30CF\u30F3\u30C9\u30EB\u3001\u30BF\u30B0\u3001\u30D5\u30A9\u30EB\u30C0\u30FC\u3001ID \u3067\u4FDD\u5B58\u6E08\u307F\u6295\u7A3F\u3092\u691C\u7D22\u3057\u307E\u3059\u3002\u53D6\u5F97\u3055\u308C\u308B\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306F\u3001\u30B9\u30AF\u30ED\u30FC\u30EB\u4E2D\u306B X \u304C\u30DA\u30FC\u30B8\u3078\u9001\u3063\u305F\u6295\u7A3F\u3060\u3051\u3067\u3059\u3002","\u30ED\u30FC\u30AB\u30EB\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u691C\u7D22","\u307E\u3060\u4F55\u3082\u4FDD\u5B58\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u4EFB\u610F\u306E\u6295\u7A3F\u3067\u300C\u30ED\u30FC\u30AB\u30EB\u306B\u4FDD\u5B58\u300D\u3092\u4F7F\u3046\u3068\u3001\u3053\u3053\u306B\u63A7\u3048\u304C\u6B8B\u308A\u307E\u3059\u3002","\u3053\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u30ED\u30FC\u30AB\u30EB\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u30E1\u30E2","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306E\u30E1\u30E2","\u524A\u9664","\u4E0B\u306B\u300C\u30E6\u30FC\u30B6\u30FC\u540D: \u30E1\u30E2\u300D\u306E\u5F62\u5F0F\u3067\u8FFD\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30E1\u30E2\u306F\u305D\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u6295\u7A3F\u306E\u6A2A\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AD\u30E3\u30D7\u30C1\u30E3\u3092\u30AA\u30F3\u306B\u3057\u3066\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u3092\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u3001\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30B8\u30E7\u30D6\u3068\u305D\u306E\u8A18\u9332\u304C\u3053\u3053\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","WARC \u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u4F5C\u6210\u4E2D\u2026","WACZ \u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u4F5C\u6210\u4E2D\u2026","\u4FDD\u5B58\u3055\u308C\u305F\u30AD\u30FC\u30DA\u30A2\u306F\u7121\u52B9\u3067\u3059\u3002\u5225\u306E\u30A2\u30FC\u30AB\u30A4\u30D6\u306B\u7F72\u540D\u3059\u308B\u524D\u306B\u7F6E\u304D\u63DB\u3048\u3066\u304F\u3060\u3055\u3044\u3002","\u521D\u56DE\u4F7F\u7528\u6642\u306B\u30ED\u30FC\u30AB\u30EB\u306E P-384 ID \u3092\u4F5C\u6210\u3057\u307E\u3059\u3002\u901A\u5E38\u306E WACZ \u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3067\u306F\u7F72\u540D\u3057\u307E\u305B\u3093\u3002","\u65B0\u3057\u3044\u7F72\u540D ID \u3092\u4F5C\u6210\u3057\u3066\u3044\u307E\u3059\u2026","Aviary\u5C02\u7528WACZ\u8A3C\u660E\u3092\u4F5C\u6210\u4E2D\u2026","\u7F72\u540D\u30AD\u30FC\u30DA\u30A2\u3092\u6E96\u5099\u3057\u3066\u3044\u307E\u3059\u2026","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u5C65\u6B74\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8","\u6307\u5B9A\u3057\u305F\u671F\u9593\u306E\u91CD\u8907\u6392\u9664\u8A18\u9332\u3092 JSON \u3068 CSV \u3067\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u307E\u3059\u3002\u5143\u306E\u30E1\u30C7\u30A3\u30A2 URL \u306F\u542B\u307E\u308C\u307E\u305B\u3093\u3002","\u5C65\u6B74\u306E\u958B\u59CB\u65E5","\u5C65\u6B74\u306E\u7D42\u4E86\u65E5","\u671F\u9593\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8","\u30AD\u30E3\u30D7\u30C1\u30E3\u3057\u305F\u97F3\u58F0\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","\u30ED\u30FC\u30AB\u30EB\u30AD\u30E3\u30D7\u30C1\u30E3\u306B\u65E2\u306B\u3042\u308B\u97F3\u58F0\u30C8\u30E9\u30C3\u30AF\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u691C\u7D22\u306F\u884C\u3044\u307E\u305B\u3093\u3002","\u30AD\u30E3\u30D7\u30C1\u30E3\u3057\u305F\u5B57\u5E55\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","\u30ED\u30FC\u30AB\u30EB\u30AD\u30E3\u30D7\u30C1\u30E3\u306B\u65E2\u306B\u3042\u308B\u5B57\u5E55\u30C8\u30E9\u30C3\u30AF\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u691C\u7D22\u306F\u884C\u3044\u307E\u305B\u3093\u3002","\u884C","\u4EE5\u524D\u306B\u89B3\u6E2C\u3055\u308C\u305F\u30DE\u30FC\u30AB\u30FC\u304C\u691C\u51FA\u3055\u308C\u306A\u304F\u306A\u308A\u307E\u3057\u305F: {markers}\u3002","@{handle} \u3067\u5B9F\u884C\u3059\u308B\u6E96\u5099\u304C\u3067\u304D\u307E\u3057\u305F\u3002","{feature}: {count} \u56DE \xB7 \u5408\u8A08 {total} ms \xB7 \u6700\u5927 {max} ms \xB7 \u5B8C\u5168 {full} / \u5897\u5206 {incremental}","{observed} \u4EF6\u306E\u9577\u3044\u30D5\u30EC\u30FC\u30E0 \xB7 \u76F8\u95A2 {correlated} \u4EF6","{count} \u4EF6\u306E\u6A5F\u80FD","X \u306E\u8868\u793A\u8A00\u8A9E\u306F {language} \u3067\u3001Aviary \u306F\u3053\u306E\u8A00\u8A9E\u306E\u5E83\u544A\u30E9\u30D9\u30EB\u3092\u6301\u3063\u3066\u3044\u307E\u305B\u3093\u3002\u3053\u3053\u3067\u306F\u30B9\u30DD\u30F3\u30B5\u30FC\u6295\u7A3F\u304C\u30E9\u30D9\u30EB\u306B\u3088\u3063\u3066\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u305B\u3093\u3002","\u3053\u306E\u30DA\u30FC\u30B8\u3092\u5909\u3048\u3066\u3044\u305F\u306E\u306F {feature} \u3067\u3059\u3002\u7279\u5B9A\u307E\u3067\u306B {rounds} \u30E9\u30A6\u30F3\u30C9\u304B\u304B\u308A\u307E\u3057\u305F\u3002\u3059\u3079\u3066\u306E\u6A5F\u80FD\u306F\u518D\u3073\u52D5\u3044\u3066\u3044\u308B\u306E\u3067\u3001\u30AA\u30D5\u306E\u307E\u307E\u306B\u3057\u305F\u3044\u5834\u5408\u306F\u305D\u306E\u6A5F\u80FD\u81EA\u8EAB\u306E\u8A2D\u5B9A\u3067\u30AA\u30D5\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","{total} \u56DE\u4E2D {round} \u56DE\u76EE\u3002{off} \u500B\u3059\u3079\u3066\u306E\u6A5F\u80FD\u304C\u30AA\u30D5\u3067\u3059\u3002","{total} \u56DE\u4E2D {round} \u56DE\u76EE\u3002\u307E\u3060\u7591\u308F\u308C\u3066\u3044\u308B {suspect} \u500B\u306E\u3046\u3061 {off} \u500B\u304C\u30AA\u30D5\u3067\u3059\u3002","\u8B58\u5225\u5B50 {gid} \xB7 {status}","{count}\u4EF6","\u6295\u7A3F{posts}\u4EF6 \xB7 \u3044\u3044\u306D{likes}\u4EF6 \xB7 \u30C0\u30A4\u30EC\u30AF\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8{messages}\u4EF6\uFF08\u516C\u958B\u691C\u7D22\u5BFE\u8C61\u5916\uFF09 \xB7 \u30E1\u30C7\u30A3\u30A2\u53C2\u7167{media}\u4EF6 \xB7 \u30D5\u30A9\u30ED\u30EF\u30FC{followers}\u4EF6 \xB7 \u30D5\u30A9\u30ED\u30FC\u4E2D{following}\u4EF6 \xB7 \u30EA\u30B9\u30C8{lists}\u4EF6","\u30A2\u30FC\u30AB\u30A4\u30D6\u5185\u30EA\u30F3\u30AF {archiveLinks} \u4EF6 + \u30AD\u30E3\u30D7\u30C1\u30E3\u6E08\u307F\u30EA\u30F3\u30AF {corpusLinks} \u4EF6\u3092\u5C55\u958B \xB7 \u53C2\u52A0\u8005 ID {participants} \u4EF6\u3092\u89E3\u6C7A \xB7 {unresolved} \u4EF6\u306F\u672A\u89E3\u6C7A ID \u306E\u307E\u307E\u4FDD\u6301 \xB7 \u30EA\u30AF\u30A8\u30B9\u30C8\u9001\u4FE1\u306A\u3057","{status} \xB7 {filename} \xB7 {records}\u4EF6 \xB7 {files}\u30D5\u30A1\u30A4\u30EB \xB7 \u8B66\u544A{warnings}\u4EF6","{saved} \u4EF6\u4FDD\u5B58 \xB7 {mirrored} \u4EF6\u30DF\u30E9\u30FC \xB7 \u671F\u9650 {due} \u4EF6 \xB7 \u30BF\u30B0 {tags} \u4EF6 \xB7 \u30D5\u30A9\u30EB\u30C0\u30FC {folders} \u4EF6","\u516C\u958B {public} \u4EF6 \xB7 \u4FDD\u8B77 {protected} \u4EF6 \xB7 \u4E0D\u660E {unknown} \u4EF6 \xB7 \u5171\u6709\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u304B\u3089\u9664\u5916 {excluded} \u4EF6","{status} \xB7 {records}\u4EF6 \xB7 {surface}","\u30ED\u30FC\u30AB\u30EB ID {fingerprint}\u3002\u3053\u306E\u30AD\u30FC\u304C\u7D99\u7D9A\u3057\u3066\u4F7F\u308F\u308C\u3066\u3044\u308B\u3053\u3068\u3092\u793A\u3057\u307E\u3059\u304C\u3001X \u304C\u914D\u4FE1\u3057\u305F\u5185\u5BB9\u3092\u8A3C\u660E\u3059\u308B\u3082\u306E\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u3067 {count} \u4EF6","{imported} \u4EF6\u306E\u30EB\u30FC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F\u3002\u7F6E\u63DB\u3067\u304D\u307E\u3059\u3002\u8FFD\u52A0\u306F {line} \u884C\u76EE\u3067\u505C\u6B62\u3057\u307E\u3057\u305F: {error}","{imported} \u4EF6\u306E\u30EB\u30FC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F\u3002{added} \u4EF6\u3092\u8FFD\u52A0\u3057\u3001{duplicates} \u4EF6\u306F\u767B\u9332\u6E08\u307F\u3067\u3059\u3002\u7F6E\u63DB\u3067\u306F {replaced} \u4EF6\u304C {total} \u4EF6\u306B\u306A\u308A\u307E\u3059\u3002","\u4FDD\u5B58\u3055\u308C\u305F\u8B66\u544A\u3068\u30A8\u30E9\u30FC\u3092\u7834\u68C4\u3057\u307E\u3059\u3002\u3053\u3053\u306B\u66F8\u304D\u8FBC\u307E\u308C\u308B\u306E\u306F Aviary \u81EA\u8EAB\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u6587\u3001\u6642\u523B\u3001\u8A73\u7D30\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u540D\u524D\u3060\u3051\u3067\u3059\u3002","\u4E0A\u9650\u4ED8\u304D\u306E\u30ED\u30FC\u30AB\u30EB\u306A\u30DE\u30FC\u30AB\u30FC\u5C65\u6B74\u3068\u5909\u5316\u8B66\u544A\u3092\u6D88\u53BB\u3057\u307E\u3059\u3002\u6295\u7A3F\u672C\u6587\u3001\u30CF\u30F3\u30C9\u30EB\u540D\u3001URL\u3001\u30EC\u30B9\u30DD\u30F3\u30B9\u672C\u6587\u306F\u3053\u3053\u306B\u306F\u4FDD\u5B58\u3055\u308C\u307E\u305B\u3093\u3002","Aviary \u306E\u3059\u3079\u3066\u306E\u6A5F\u80FD\u3092\u3044\u3063\u305F\u3093\u30AA\u30D5\u306B\u3057\u3001\u534A\u5206\u305A\u3064\u623B\u3057\u306A\u304C\u3089\u3001\u5404\u56DE\u3054\u3068\u306B\u30DA\u30FC\u30B8\u304C\u307E\u3060\u304A\u304B\u3057\u3044\u304B\u3092\u5C0B\u306D\u307E\u3059\u3002\u7D04 5 \u56DE\u3067\u539F\u56E0\u306E\u6A5F\u80FD\u3092\u7279\u5B9A\u3057\u307E\u3059\u3002\u8A2D\u5B9A\u306B\u306F\u4F55\u3082\u66F8\u304D\u8FBC\u307E\u306A\u3044\u305F\u3081\u3001\u9014\u4E2D\u3067\u3084\u3081\u3066\u3082\u518D\u8AAD\u307F\u8FBC\u307F\u3067\u3059\u3079\u3066\u5143\u306B\u623B\u308A\u307E\u3059\u3002\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u30BB\u30F3\u30BF\u30FC\u3068\u305D\u306E\u8A00\u8A9E\u306F\u5E38\u306B\u30AA\u30F3\u306E\u307E\u307E\u306A\u306E\u3067\u3001\u3069\u3061\u3089\u3082\u539F\u56E0\u3068\u3057\u3066\u6319\u304C\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u3059\u3079\u3066\u306E\u6A5F\u80FD\u3092\u30AA\u30D5\u306B\u3057\u305F\u72B6\u614B\u304B\u3089\u3084\u308A\u76F4\u3057\u307E\u3059\u3002","\u7D5E\u308A\u8FBC\u307F\u3092\u9589\u3058\u307E\u3059\u3002\u4F55\u3082\u5909\u308F\u308A\u307E\u305B\u3093\u3002\u3059\u3079\u3066\u306E\u6A5F\u80FD\u306F\u3059\u3067\u306B\u30AA\u30F3\u3067\u3059\u3002","\u3053\u308C\u3089\u306E\u6A5F\u80FD\u3092\u30AA\u30D5\u306B\u3057\u3066\u3082\u554F\u984C\u304C\u6B8B\u308B\u306E\u3067\u3001\u539F\u56E0\u306F\u6B8B\u308A\u306E\u3069\u308C\u304B\u3067\u3059\u3002","\u3053\u308C\u3089\u306E\u6A5F\u80FD\u3092\u30AA\u30D5\u306B\u3057\u305F\u3089\u554F\u984C\u304C\u6D88\u3048\u305F\u306E\u3067\u3001\u539F\u56E0\u306F\u3053\u306E\u4E2D\u306E\u3069\u308C\u304B\u3067\u3059\u3002","\u3059\u3079\u3066\u306E\u6A5F\u80FD\u3092\u5143\u306B\u623B\u3057\u3001\u7D5E\u308A\u8FBC\u307F\u3092\u7834\u68C4\u3057\u307E\u3059\u3002\u56DE\u7B54\u306F\u8A18\u9332\u3055\u308C\u307E\u305B\u3093\u3002","{filename}\u3092\u4E00\u6642\u505C\u6B62\u3002","{filename}\u3092\u518D\u958B\u3002","{filename}\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3002","{filename}\u3092\u518D\u8A66\u884C\u3002","{jobId}\u3092\u4E00\u6642\u505C\u6B62\u3002","{jobId}\u3092\u518D\u958B\u3002","{jobId}\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3002","\u69CB\u9020\u306E\u89B3\u6E2C\u7D50\u679C\u3092\u30B3\u30D4\u30FC","\u30DF\u30E5\u30FC\u30C6\u30FC\u30B7\u30E7\u30F3\u306E\u6027\u80FD","\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u6307\u6A19\u3092\u30EA\u30BB\u30C3\u30C8","\u3053\u306E\u8A00\u8A9E\u306E\u5E83\u544A\u30E9\u30D9\u30EB","\u4FDD\u5B58\u3055\u308C\u305F\u8B66\u544A","\u4FDD\u5B58\u3055\u308C\u305F\u8B66\u544A\u3092\u6D88\u53BB","\u5E83\u544A\u89B3\u6E2C\u3092\u30EA\u30BB\u30C3\u30C8","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB","\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u3092\u5207\u308A\u66FF\u3048","\u3053\u3053\u306B\u65E7\u30C7\u30FC\u30BF\u3092\u5272\u308A\u5F53\u3066","\u65B0\u3057\u3044\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB","\u3053\u306E\u30DA\u30FC\u30B8\u3092\u58CA\u3057\u3066\u3044\u308B\u6A5F\u80FD\u3092\u898B\u3064\u3051\u308B","\u6A5F\u80FD\u306E\u7D5E\u308A\u8FBC\u307F","\u3082\u3046\u4E00\u5EA6\u8ABF\u3079\u308B","\u7D50\u679C\u3092\u6D88\u53BB","\u307E\u3060\u7591\u308F\u3057\u3044\u6A5F\u80FD","\u30DA\u30FC\u30B8\u306F\u307E\u3060\u304A\u304B\u3057\u3044","\u30DA\u30FC\u30B8\u306F\u6B63\u5E38\u306B\u898B\u3048\u308B","\u7D5E\u308A\u8FBC\u307F\u3092\u4E2D\u6B62","\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306E\u30D0\u30FC\u30B8\u30E7\u30F3","\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306E\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3","\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u306E\u5909\u66F4","\u8A8D\u8A3C\u60C5\u5831","\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306E\u8B66\u544A","\u5FA9\u5143\u3092\u30AD\u30E3\u30F3\u30BB\u30EB","\u5FA9\u5143\u3092\u30C9\u30E9\u30A4\u30E9\u30F3","\u3053\u306E\u30E9\u30A4\u30D6\u30E9\u30EA\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u5FA9\u5143","\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093","\u30A4\u30F3\u30DD\u30FC\u30C8\u6E08\u307F\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3","\u30ED\u30FC\u30AB\u30EB\u3067\u306E\u30A2\u30FC\u30AB\u30A4\u30D6\u4FEE\u5FA9","\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u30A4\u30F3\u30DD\u30FC\u30C8","\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u4E00\u6642\u505C\u6B62","\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u518D\u958B","\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u30AD\u30E3\u30F3\u30BB\u30EB","\u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u518D\u8A66\u884C","\u6700\u65B0\u306EX\u5185\u90E8\u30EC\u30DD\u30FC\u30C8","\u6700\u65B0\u30EC\u30DD\u30FC\u30C8\u306E\u30E9\u30D9\u30EB","X\u5185\u90E8\u30EC\u30DD\u30FC\u30C8","\u6708\u3054\u3068\u306E\u6BD4\u8F03","\u4FDD\u5B58\u3057\u305FX\u5185\u90E8\u30EC\u30DD\u30FC\u30C8\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8","\u30ED\u30FC\u30AB\u30EB\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF","\u30ED\u30FC\u30AB\u30EB\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u7BA1\u7406\u30C4\u30FC\u30EB\u5411\u3051\u306B\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8","\u30ED\u30FC\u30AB\u30EB\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u524A\u9664","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30E1\u30E2\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093","\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u306E\u5BFE\u8C61\u7BC4\u56F2","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30B8\u30E7\u30D6\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30B8\u30E7\u30D6","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30B8\u30E7\u30D6\u3092\u4E00\u6642\u505C\u6B62","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30B8\u30E7\u30D6\u3092\u518D\u958B","\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30B8\u30E7\u30D6\u3092\u30AD\u30E3\u30F3\u30BB\u30EB","\u30AD\u30E3\u30D7\u30C1\u30E3\u3057\u305F\u30B9\u30EC\u30C3\u30C9\u3092\u518D\u69CB\u7BC9","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30E1\u30C7\u30A3\u30A2\u30D0\u30C3\u30C1","\u91CD\u8907\u306E\u4E00\u81F4\u6570","\u54C1\u8CEA\u30EC\u30B7\u30FC\u30C8","\u6700\u5F8C\u306E\u91CD\u8907\u4E00\u81F4","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u5C65\u6B74\u3092\u6D88\u53BB","\u30AD\u30E5\u30FC\u5185\u306E\u30E1\u30C7\u30A3\u30A2\u3092\u518D\u958B","\u5931\u6557\u3057\u305F\u30E1\u30C7\u30A3\u30A2\u3092\u518D\u8A66\u884C","\u66F8\u304D\u63DB\u3048\u305F\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8","\u65E2\u8AAD\u306E\u6295\u7A3F\u3092\u5FD8\u308C\u308B","\u8AAD\u307F\u53D6\u308C\u306A\u304B\u3063\u305F\u30EB\u30FC\u30EB","\u671F\u9650\u5207\u308C\u306E\u30EB\u30FC\u30EB","\u671F\u9650\u5207\u308C\u306E\u30EB\u30FC\u30EB\u3092\u66F4\u65B0","\u5229\u7528\u3067\u304D\u308B\u6295\u7A3F","\u632F\u308A\u8FD4\u308A\u3092\u958B\u304F","\u4E00\u6642\u505C\u6B62","\u518D\u958B","\u505C\u6B62","\u9375\u30DA\u30A2\u3092\u7F6E\u304D\u63DB\u3048\u308B","\u6B63\u5E38\u3067\u3059\u3002\u3059\u3079\u3066\u306E\u5909\u66F4\u304C\u4FDD\u5B58\u3055\u308C\u3066\u3044\u307E\u3059\u3002","Aviary \u306E\u30C6\u30B9\u30C8\u7528\u30C7\u30FC\u30BF\u3092\u66F4\u65B0\u3059\u308B\u305F\u3081\u3001X \u304C\u3053\u306E\u30DA\u30FC\u30B8\u3092\u3069\u3046\u69CB\u6210\u3057\u3066\u3044\u308B\u304B\uFF08\u8981\u7D20\u6570\u3001\u5165\u308C\u5B50\u3001\u30EC\u30A4\u30A2\u30A6\u30C8\uFF09\u3092\u30B3\u30D4\u30FC\u3057\u307E\u3059\u3002\u6295\u7A3F\u672C\u6587\u3001\u540D\u524D\u3001\u30E6\u30FC\u30B6\u30FC\u540D\u3001\u30EA\u30F3\u30AF\u3001ID \u306F\u542B\u307E\u308C\u307E\u305B\u3093\u3002","\u30DF\u30E5\u30FC\u30C6\u30FC\u30B7\u30E7\u30F3\u306E\u8A08\u6E2C\u306F\u30ED\u30FC\u30AB\u30EB\u306B\u7559\u307E\u308A\u3001\u6A5F\u80FD ID \u3068\u4E0A\u9650\u4ED8\u304D\u306E\u6642\u9593\u3060\u3051\u3092\u4FDD\u5B58\u3057\u307E\u3059\u3002","\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u6A5F\u80FD\u3088\u308A\u524D\u306E\u3001\u3069\u3053\u306B\u3082\u5272\u308A\u5F53\u3066\u3089\u308C\u3066\u3044\u306A\u3044\u8A2D\u5B9A\u3068\u30E9\u30A4\u30D6\u30E9\u30EA\u306E\u30C7\u30FC\u30BF\u3092\u3001\u73FE\u5728\u306E\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u306B\u79FB\u3057\u307E\u3059\u3002\u73FE\u5728\u306E X \u306E\u30EB\u30FC\u30C8\u304B\u3089\u63A8\u6E2C\u3059\u308B\u3053\u3068\u306F\u4E00\u5207\u3042\u308A\u307E\u305B\u3093\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u5207\u308A\u66FF\u3048\u308B\u524D\u3001\u307E\u305F\u306F\u5225\u306E\u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u53D6\u308A\u8FBC\u3080\u524D\u306B\u3001\u7A7A\u306E\u30AA\u30D5\u30E9\u30A4\u30F3\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u3092\u4F5C\u6210\u3057\u307E\u3059\u3002","\u8A18\u9332\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u8A08\u6E2C\u4E2D\u2026","\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u30FC\u306E\u4FDD\u5B58\u9818\u57DF\u306F\u3053\u3053\u304B\u3089\u8A08\u6E2C\u3067\u304D\u306A\u3044\u305F\u3081\u3001Aviary \u306F\u30B5\u30A4\u30BA\u3092\u8868\u793A\u3057\u307E\u305B\u3093\u3002","\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u30FC\u306F\u4FDD\u5B58\u5BB9\u91CF\u30EC\u30DD\u30FC\u30C8\u3092\u7A2E\u985E\u5225\u306B\u5206\u3051\u306A\u3044\u305F\u3081\u3001Aviary \u81EA\u8EAB\u306E\u8A08\u6E2C\u306E\u307F\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u6B63\u898F\u5316\u3057\u305F\u30EC\u30DD\u30FC\u30C8\u3092\u30ED\u30FC\u30AB\u30EBJSON\u3068\u3057\u3066\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002X\u304B\u3089\u306E\u30E6\u30FC\u30B6\u30FC\u30C7\u30FC\u30BF\u3067\u3042\u308A\u3001Aviary\u304C\u30E9\u30F3\u30AD\u30F3\u30B0\u91CD\u307F\u3092\u8FFD\u52A0\u3057\u305F\u308A\u30B9\u30B3\u30A2\u3092\u63A8\u6E2C\u3057\u305F\u308A\u3059\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u3053\u306E\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u306E\u3059\u3079\u3066\u306E\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092 JSON \u3068 CSV \u3067\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002\u30DF\u30E9\u30FC\u306B\u4FDD\u5B58\u3055\u308C\u308B\u306E\u306F\u3001\u30B9\u30AF\u30ED\u30FC\u30EB\u4E2D\u306B X \u304C\u30DA\u30FC\u30B8\u3078\u9001\u3063\u305F\u5185\u5BB9\u3060\u3051\u3067\u3059\u3002","Karakeep\u3001Linkwarden\u3001linkding\u3001\u5404\u30D6\u30E9\u30A6\u30B6\u3067\u8AAD\u307F\u8FBC\u3081\u308B\u30D6\u30E9\u30A6\u30B6\u7528\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u30D5\u30A1\u30A4\u30EB\u3068\u3001Raindrop.io \u3067\u8AAD\u307F\u8FBC\u3081\u308B CSV \u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002","\u4FDD\u5B58\u6E08\u307F\u306E\u30ED\u30FC\u30AB\u30EB\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u3059\u3079\u3066\u524A\u9664\u3057\u307E\u3059\u3002","\u30AD\u30E3\u30D7\u30C1\u30E3\u3057\u305F\u8FD4\u4FE1\u3092\u89AA\u6295\u7A3F\u304B\u3089\u9806\u306B\u8AAD\u307F\u307E\u3059\u3002\u898B\u3064\u304B\u3089\u306A\u3044\u89AA\u6295\u7A3F\u306F\u30ED\u30FC\u30AB\u30EB\u306E\u7A7A\u767D\u3068\u3057\u3066\u8868\u793A\u3057\u307E\u3059\u3002","\u30ED\u30FC\u30AB\u30EB\u306E\u91CD\u8907\u5224\u5B9A\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002","\u524D\u56DE\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u3067\u4E00\u6642\u505C\u6B62\u307E\u305F\u306F\u5F85\u6A5F\u4E2D\u3060\u3063\u305F\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u5FA9\u5143\u3057\u307E\u3059\u3002","\u6C38\u7D9A\u30AD\u30E5\u30FC\u5185\u306E\u5931\u6557\u307E\u305F\u306F\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u305F\u30E1\u30C7\u30A3\u30A2\u51E6\u7406\u3092\u3059\u3079\u3066\u518D\u8A66\u884C\u3057\u307E\u3059\u3002","\u3053\u306E\u30D3\u30EB\u30C9\u3067\u306F\u30D7\u30EA\u30BB\u30C3\u30C8\u3092\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002","\u4FDD\u5B58\u3055\u308C\u3066\u3044\u308B\u30DD\u30B9\u30C8 ID \u3092\u6D88\u53BB\u3057\u3001\u3059\u3079\u3066\u3092\u672A\u8AAD\u306E\u6271\u3044\u306B\u623B\u3057\u307E\u3059\u3002","\u671F\u9650\u5207\u308C\u306E\u5404\u30EB\u30FC\u30EB\u306E\u671F\u9593\u3092\u3001\u4ECA\u304B\u3089\u6570\u3048\u76F4\u3057\u307E\u3059\u3002\u671F\u9650\u5207\u308C\u306B\u306A\u3063\u3066\u3082\u524A\u9664\u306F\u3055\u308C\u306A\u3044\u306E\u3067\u3001\u30EB\u30FC\u30EB\u306F\u3044\u3064\u3067\u3082\u623B\u305B\u307E\u3059\u3002","\u671F\u9593\u3092\u9078\u3073\u3001\u6295\u7A3F\u306E\u7A2E\u985E\u3067\u7D5E\u308A\u3001\u4F5C\u8005\u3054\u3068\u306B\u307E\u3068\u3081\u3066\u3001\u5143\u306E\u6295\u7A3F\u3092\u958B\u3051\u307E\u3059\u3002\u30EA\u30AF\u30A8\u30B9\u30C8\u306F\u767A\u751F\u3057\u307E\u305B\u3093\u3002","\u3053\u306E\u30D3\u30EB\u30C9\u3067\u306F\u975E\u8868\u793A\u6295\u7A3F\u306E\u4FDD\u5B58\u6A5F\u80FD\u3092\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002","\u6E96\u5099\u5B8C\u4E86\u3002","\u524A\u9664\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002","\u30A2\u30AF\u30B7\u30E7\u30F3\u6570\u306E\u4E0A\u9650\u306B\u9054\u3057\u307E\u3057\u305F\u3002\u518D\u958B\u3059\u308B\u3068\u6B21\u306E\u30D0\u30C3\u30C1\u3092\u5B9F\u884C\u3057\u307E\u3059\u3002","\u524A\u9664\u3092\u4E00\u6642\u505C\u6B62\u3057\u307E\u3057\u305F\u3002","\u524A\u9664\u3092\u505C\u6B62\u3057\u307E\u3057\u305F\u3002","\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u5B9F\u884C\u4E2D\u3067\u3059\u3002","\u524A\u9664\u3092\u5B9F\u884C\u4E2D\u3067\u3059\u3002","\u30ED\u30B0\u30A4\u30F3\u4E2D\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u5909\u308F\u308A\u307E\u3057\u305F\u3002\u3053\u308C\u4EE5\u4E0A\u306E\u64CD\u4F5C\u306F\u884C\u3063\u3066\u3044\u307E\u305B\u3093\u3002","\u5225\u306E X \u30BF\u30D6\u304C\u3053\u306E\u524A\u9664\u3092\u5B9F\u884C\u4E2D\u3067\u3059\u3002","\u3053\u306E\u30BF\u30D6\u306F\u3059\u3067\u306B\u524A\u9664\u3092\u5B9F\u884C\u4E2D\u3067\u3059\u3002","X \u304C\u30ED\u30B0\u30A4\u30F3\u307E\u305F\u306F\u4E0D\u6B63\u5229\u7528\u9632\u6B62\u306E\u78BA\u8A8D\u3092\u8868\u793A\u3057\u307E\u3057\u305F\u3002\u5B8C\u4E86\u3057\u3066\u304B\u3089\u518D\u958B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30AB\u30C6\u30B4\u30EA\u30921\u3064\u4EE5\u4E0A\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u4E00\u6642\u505C\u6B62\u3067\u304D\u308B\u5B9F\u884C\u4E2D\u306E\u524A\u9664\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u518D\u958B\u3067\u304D\u308B\u4E00\u6642\u505C\u6B62\u4E2D\u306E\u524A\u9664\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u505C\u6B62\u3067\u304D\u308B\u524A\u9664\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u300CX\u306E\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3\u3092\u524A\u9664\u300D\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D\u3067\u3059\u3002","\u3053\u306E\u524A\u9664\u306F\u3001\u958B\u59CB\u3057\u305F X \u30BF\u30D6\u304B\u3089\u518D\u958B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30DA\u30FC\u30B8\u30925\u56DE\u81EA\u52D5\u3067\u518D\u8AAD\u307F\u8FBC\u307F\u3057\u3066\u3082 X \u304C\u64CD\u4F5C\u3092\u53CD\u6620\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u518D\u958B\u3057\u3066\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002","\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC\u3067\u524A\u9664\u304C\u505C\u6B62\u3057\u307E\u3057\u305F\u3002","\u524A\u9664\u30B3\u30DE\u30F3\u30C9\u3092\u5B8C\u4E86\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u6574\u7406\u3092\u4E00\u6642\u505C\u6B62\u3057\u307E\u3057\u305F\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u6574\u7406\u3092\u505C\u6B62\u3057\u307E\u3057\u305F\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u6574\u7406\u306E\u8A18\u9332\u3092\u6D88\u53BB\u3057\u307E\u3057\u305F\u3002","\u3053\u306E\u6574\u7406\u306F\u5225\u306E X \u30BF\u30D6\u306B\u79FB\u308A\u307E\u3057\u305F\u3002","{category}\u3092\u958B\u3044\u3066\u3044\u307E\u3059\u3002","{category}\u3092\u30D7\u30EC\u30D3\u30E5\u30FC\u4E2D\u3067\u3059\u3002","{category}\u3092\u6574\u7406\u4E2D\u3067\u3059\u3002","\u9078\u629E\u3057\u305F\u6574\u7406\u304C\u3059\u3079\u3066\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002","{category}\u3092\u3055\u3089\u306B\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059\u3002","{category}\u3092\u3055\u3089\u306B{count}\u4EF6\u8AAD\u307F\u8FBC\u307F\u307E\u3057\u305F\u3002","X \u304C\u307E\u3060\u53E4\u3044{category}\u3092\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059\u3002","{category}\u304C\u307B\u304B\u306B\u306A\u3044\u304B\u78BA\u8A8D\u3057\u3066\u3044\u307E\u3059\uFF08{checks}/{limit}\uFF09\u3002","{category}\uFF1A{count}\u4EF6\u898B\u3064\u304B\u308A\u307E\u3057\u305F\u3002","{category}\uFF1A{count}\u4EF6\u524A\u9664\u3057\u307E\u3057\u305F\u3002","{count}\u4EF6\u306E\u64CD\u4F5C\u306E\u3042\u3068{seconds}\u79D2\u4F11\u61A9\u3057\u3066\u3044\u307E\u3059\u3002\u524A\u9664\u306F\u81EA\u52D5\u3067\u7D9A\u304D\u307E\u3059\u3002","{category}\u3092\u7D9A\u884C\u3057\u307E\u3059\u3002","\u60F3\u5B9A\u3057\u305F\u30DC\u30BF\u30F3\u304C\u898B\u3064\u304B\u3089\u306A\u304B\u3063\u305F\u305F\u3081\u30011\u4EF6\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u64CD\u4F5C\u304C\u53CD\u6620\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002Aviary \u304C\u3082\u3046\u4E00\u5EA6\u8A66\u3057\u307E\u3059\u3002","\u898B\u843D\u3068\u3057\u304C\u306A\u3044\u304B\u78BA\u8A8D\u3059\u308B\u305F\u3081\u3001{category}\u3092\u5148\u982D\u304B\u3089\u518D\u8AAD\u307F\u8FBC\u307F\u3057\u3066\u3044\u307E\u3059\u3002","\u6700\u521D\u304B\u3089\u306E\u518D\u78BA\u8A8D\u3067\u3001{category}\u306F\u3053\u308C\u4EE5\u4E0A\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002","{category}\u306F\u3053\u308C\u4EE5\u4E0A\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002","X \u306E\u6B21\u306E\u5236\u9650\u6642\u9593\u67A0\u306B\u5408\u308F\u305B\u3066\u3001\u3044\u3044\u306D\u3092\u518D\u8AAD\u307F\u8FBC\u307F\u3057\u3066\u3044\u307E\u3059\u3002","X \u304C\u64CD\u4F5C\u30922\u56DE\u53CD\u6620\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002{seconds}\u79D2\u5F85\u3063\u3066\u304B\u3089{category}\u3092\u518D\u8AAD\u307F\u8FBC\u307F\u3057\u307E\u3059\uFF08{attempt}/{max}\uFF09\u3002","{category}\u3092\u518D\u8AAD\u307F\u8FBC\u307F\u3057\u3066\u3044\u307E\u3059\u3002\u524A\u9664\u306F\u81EA\u52D5\u3067\u7D9A\u304D\u307E\u3059\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u6574\u7406\u306E\u30ED\u30C3\u30AF\u3092\u66F4\u65B0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","X \u306B\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304B\u3089\u518D\u958B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC\u3067\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u6574\u7406\u304C\u505C\u6B62\u3057\u307E\u3057\u305F\u3002","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u6574\u7406\u304C\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u78BA\u8A8D\u304C\u5FC5\u8981\u3067\u3059\u3002","X \u306E\u3044\u3044\u306D\u64CD\u4F5C\u306E\u4E0A\u9650\uFF08500\u4EF6\uFF09\u306B\u9054\u3057\u307E\u3057\u305F\u3002\u6B21\u306E\u67A0\u307E\u3067{seconds}\u79D2\u5F85\u6A5F\u3057\u307E\u3059\u3002\u524A\u9664\u306F\u81EA\u52D5\u3067\u7D9A\u304D\u307E\u3059\u3002","X \u306E\u3044\u3044\u306D\u64CD\u4F5C\u306E\u4E0A\u9650\uFF08500\u4EF6\uFF09\u306B\u9054\u3057\u307E\u3057\u305F\u3002\u6B21\u306E\u67A0\u307E\u30671\u5206\u5F85\u6A5F\u3057\u307E\u3059\u3002\u524A\u9664\u306F\u81EA\u52D5\u3067\u7D9A\u304D\u307E\u3059\u3002","X \u306E\u3044\u3044\u306D\u64CD\u4F5C\u306E\u4E0A\u9650\uFF08500\u4EF6\uFF09\u306B\u9054\u3057\u307E\u3057\u305F\u3002\u6B21\u306E\u67A0\u307E\u3067{minutes}\u5206\u5F85\u6A5F\u3057\u307E\u3059\u3002\u524A\u9664\u306F\u81EA\u52D5\u3067\u7D9A\u304D\u307E\u3059\u3002","Aviary \u306E AI \u30B3\u30DE\u30F3\u30C9\u30E1\u30CB\u30E5\u30FC\u3092\u958B\u304F","\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3067\u5B9F\u884C","\u5B9F\u884C\u4E2D\u2026","\u7D50\u679C\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F\u3002","\u7D50\u679C\u3092\u30B3\u30D4\u30FC\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30D6\u30E9\u30A6\u30B6\u30FC\u304C\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002","\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304B\u3089\u5FDC\u7B54\u304C\u3042\u308A\u307E\u305B\u3093","\u300C\u9023\u643A\u300D\u3067\u30AD\u30FC\u3068\u30E2\u30C7\u30EB\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F\u3002\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u306B\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002","\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u30B3\u30D4\u30FC\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30D6\u30E9\u30A6\u30B6\u30FC\u304C\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002","\u5916\u90E8AI\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u78BA\u8A8D","\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3092\u9078\u3076\u307E\u3067\u4F55\u3082\u9001\u4FE1\u3055\u308C\u307E\u305B\u3093\u3002","\u7121\u5236\u9650","Aviary \u304C\u4FDD\u5B58\u3059\u308B\u306E\u306F\u4F7F\u7528\u91CF\u30AB\u30A6\u30F3\u30BF\u30FC\u3060\u3051\u3067\u3059\u3002\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u306E\u4FDD\u6301\u671F\u9593\u306F\u5404\u793E\u306E\u30DD\u30EA\u30B7\u30FC\u306B\u5F93\u3044\u307E\u3059\u3002","\u4E88\u7B97\u306B\u3088\u308A\u3053\u306E\u30EA\u30AF\u30A8\u30B9\u30C8\u306F\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3057\u305F\u3002","\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1","\u7FFB\u8A33","\u9078\u629E\u3057\u305F\u6295\u7A3F\u3092\u73FE\u5728\u306E\u8A00\u8A9E\u306B\u7FFB\u8A33\u3057\u307E\u3059\u3002","\u8981\u7D04","\u30B9\u30EC\u30C3\u30C9\u3084\u9577\u3044\u6295\u7A3F\u3092 3 \u3064\u306E\u7B87\u6761\u66F8\u304D\u306B\u307E\u3068\u3081\u307E\u3059\u3002","\u89E3\u8AAC","\u6295\u7A3F\u306E\u80CC\u666F\u3001\u5C02\u9580\u7528\u8A9E\u3001\u5F15\u7528\u5143\u3092\u8AAC\u660E\u3057\u307E\u3059\u3002","\u30D5\u30A1\u30AF\u30C8\u30C1\u30A7\u30C3\u30AF\u7528\u30D7\u30ED\u30F3\u30D7\u30C8","\u6295\u7A3F\u306E\u30D5\u30A1\u30AF\u30C8\u30C1\u30A7\u30C3\u30AF\u7528\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u4F5C\u6210\u3057\u307E\u3059\uFF08\u30AD\u30FC\u304C\u306A\u3051\u308C\u3070\u901A\u4FE1\u3057\u307E\u305B\u3093\uFF09\u3002","\u5B9A\u578B\u6587","Aviary \u306E\u5B9A\u578B\u6587\u3092\u958B\u304F","\u5B9A\u578B\u6587\u304C\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u30BB\u30F3\u30BF\u30FC \u2192 \u30E9\u30A4\u30D6\u30E9\u30EA\u3067\u8FFD\u52A0\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u5148\u306B\u5165\u529B\u6B04\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304B\u3089\u5B9A\u578B\u6587\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\u3002","Aviary \u306F\u6709\u52B9\u3067\u3059","\u6700\u521D\u304B\u3089 2 \u3064\u306E\u6A5F\u80FD\u304C\u6709\u52B9\u306B\u306A\u3063\u3066\u3044\u307E\u3059\u3002\u305D\u308C\u4EE5\u5916\u306F\u3059\u3079\u3066\u3001\u3042\u306A\u305F\u304C\u6709\u52B9\u306B\u3059\u308B\u307E\u3067\u30AA\u30D5\u306E\u307E\u307E\u3067\u3059\u3002","\u30B9\u30DD\u30F3\u30B5\u30FC\u6295\u7A3F\u3001\u30D7\u30ED\u30E2\u30FC\u30B7\u30E7\u30F3\u30C8\u30EC\u30F3\u30C9\u3001\u30D7\u30EA\u30ED\u30FC\u30EB\u5E83\u544A\u306F\u975E\u8868\u793A\u3067\u3059\u3002","\u5199\u771F\u3068\u52D5\u753B\u306B\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30DC\u30BF\u30F3\u304C\u8FFD\u52A0\u3055\u308C\u307E\u3059\u3002\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u3068\u304D\u3060\u3051\u52D5\u4F5C\u3057\u307E\u3059\u3002","\u8A2D\u5B9A\u3092\u5909\u66F4\u3059\u308B\u306B\u306F\u3001X \u306E\u5DE6\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u6700\u4E0B\u90E8\u306E\u884C\u304B\u3089 Aviary \u3092\u958B\u3044\u3066\u304F\u3060\u3055\u3044\u3002","\u4E86\u89E3","\u30ED\u30FC\u30AB\u30EB\u30E9\u30A4\u30D6\u30E9\u30EA\u306F\u3059\u3067\u306B\u8A2D\u5B9A\u3057\u305F\u4FDD\u5B58\u5BB9\u91CF\u306E\u4E0A\u9650\u3092\u8D85\u3048\u3066\u3044\u307E\u3059\u3002\u4F55\u3082\u524A\u9664\u3057\u3066\u3044\u307E\u305B\u3093\u3002","\u3053\u306E\u53D6\u308A\u8FBC\u307F\u3067\u30ED\u30FC\u30AB\u30EB\u30E9\u30A4\u30D6\u30E9\u30EA\u304C\u8A2D\u5B9A\u3057\u305F\u4FDD\u5B58\u5BB9\u91CF\u306E\u4E0A\u9650\u3092\u8D85\u3048\u307E\u3059\u3002\u4F55\u3082\u524A\u9664\u3057\u3066\u3044\u307E\u305B\u3093\u3002","\u30AA\u30EA\u30B8\u30CA\u30EB","\u5F15\u7528","\u30D5\u30A3\u30EB\u30BF\u6E08\u307F","\u3059\u3079\u3066","\u30AD\u30E3\u30C3\u30C1\u30A2\u30C3\u30D7\u306E\u30AB\u30C6\u30B4\u30EA","\u632F\u308A\u8FD4\u308A","\u30AD\u30E3\u30C3\u30C1\u30A2\u30C3\u30D7\u3092\u9589\u3058\u308B","\u671F\u9593","\u4E26\u3079\u66FF\u3048","\u65B0\u3057\u3044\u9806","\u53E4\u3044\u9806","\u5BC6\u5EA6\u306E\u4F4E\u3044\u9806","\u6295\u7A3F\u8005\u3054\u3068\u306B\u307E\u3068\u3081\u308B","\u9759\u304B\u306A\u671F\u9593\u3067\u3059\u3002\u65B0\u3057\u304F\u78BA\u8A8D\u3059\u308B\u3082\u306E\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u3053\u306E\u671F\u9593\u306B\u306F\u4F55\u3082\u3042\u308A\u307E\u305B\u3093\u3002","\u30AD\u30E3\u30C3\u30C1\u30A2\u30C3\u30D7\u306B\u542B\u307E\u308C\u308B\u306E\u306F Aviary \u304C\u3059\u3067\u306B\u8868\u793A\u3057\u305F\u6295\u7A3F\u3060\u3051\u3067\u3059\u3002X \u306B\u8FFD\u52A0\u306E\u8981\u6C42\u306F\u884C\u3044\u307E\u305B\u3093\u3002","\u4EE5\u4E0A\u3067\u3059\u3002","\u4E0D\u660E\u306A\u30A2\u30AB\u30A6\u30F3\u30C8","\u5199\u771F","\u97F3\u58F0","\u5B57\u5E55","\u30B5\u30E0\u30CD\u30A4\u30EB","\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u8AAD\u307F\u8FBC\u3080","\u5B57\u5E55\u3092\u958B\u304F","\u6295\u7A3F\u3092\u958B\u304F","\u4E3B\u306A\u30EA\u30F3\u30AF","\u4EF6\u306E\u6295\u7A3F\u3092 Aviary \u306F\u3053\u306E\u671F\u9593\u306B\u898B\u307E\u3057\u305F","\u4EF6\u306E\u6295\u7A3F\u3092 Aviary \u306F\u3053\u306E\u671F\u9593\u306B\u898B\u307E\u3057\u305F","\u4EF6\u306E\u5171\u6709","\u4EF6\u306E\u5171\u6709","\u53CD\u5FDC\u6570\u306E\u4E0B\u9650\u672A\u6E80","\u975E\u8868\u793A: \u5199\u771F\u3092\u542B\u3080\u30DD\u30B9\u30C8\u3067\u3059","\u975E\u8868\u793A: \u52D5\u753B\u3092\u542B\u3080\u30DD\u30B9\u30C8\u3067\u3059","\u975E\u8868\u793A: GIF \u3092\u542B\u3080\u30DD\u30B9\u30C8\u3067\u3059","\u975E\u8868\u793A: \u8A8D\u8A3C\u6E08\u307F\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30DD\u30B9\u30C8\u3067\u3059","\u975E\u8868\u793A: \u4ED6\u306E\u30DD\u30B9\u30C8\u3092\u5F15\u7528\u3057\u3066\u3044\u307E\u3059","\u30EB\u30FC\u30EB\u306B\u3088\u308A\u8584\u304F\u8868\u793A","\u30EB\u30FC\u30EB\u306B\u3088\u308A\u975E\u8868\u793A","\u30AD\u30FC\u30EF\u30FC\u30C9\u306B\u3088\u308A\u8584\u304F\u8868\u793A","\u30AD\u30FC\u30EF\u30FC\u30C9\u306B\u3088\u308A\u975E\u8868\u793A","\u30D1\u30BF\u30FC\u30F3\u306B\u3088\u308A\u8584\u304F\u8868\u793A","\u30D1\u30BF\u30FC\u30F3\u306B\u3088\u308A\u975E\u8868\u793A","\u3053\u306E\u6295\u7A3F\u3092\u975E\u8868\u793A","\u6295\u7A3F\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3057\u305F","\u975E\u8868\u793A\u306E\u6295\u7A3F\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30B9\u30C8\u30EC\u30FC\u30B8\u304C\u66F8\u304D\u8FBC\u307F\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002","\u5143\u306B\u623B\u3059","\u305D\u306E\u6295\u7A3F\u3092\u5FA9\u5143\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u95B2\u89A7\u6642\u9593\u5916\u3067\u3059","\u6B21\u306E\u6642\u9593\u5E2F\u307E\u3067 Aviary \u304C\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u3092\u8986\u3063\u3066\u3044\u307E\u3059\u3002\u4F55\u3082\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u3066\u304A\u3089\u305A\u3001\u3053\u306E\u7AEF\u672B\u304B\u3089\u4F55\u3082\u9001\u4FE1\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002","5 \u5206\u3060\u3051\u8868\u793A\u3059\u308B","\u884C\u306E\u30AF\u30EA\u30C3\u30AF\u306F\u7121\u52B9\u3067\u3059\u3002\u8FD4\u4FE1\u30A2\u30A4\u30B3\u30F3\u304C\u6295\u7A3F\u3092\u958B\u304D\u307E\u3059\u3002","\u30DD\u30B9\u30C8\u3092\u3082\u3063\u3068\u8868\u793A","\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","\u30ED\u30FC\u30AB\u30EB\u306B\u4FDD\u5B58","\u30ED\u30FC\u30AB\u30EB\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u3092\u524A\u9664","\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC","\u3053\u306E\u6295\u7A3F\u306E\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC","\u3053\u306E\u6295\u7A3F\u306B\u306F Aviary \u304C\u30B3\u30D4\u30FC\u3067\u304D\u308B\u30EA\u30F3\u30AF\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F","\u5931\u6557","\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u304C\u3053\u306E\u30B3\u30D4\u30FC\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002","\u30E1\u30E2","\u30BF\u30B0","\u6700\u9AD8\u306E\u76F4\u63A5\u53D6\u5F97","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306E\u30A2\u30AF\u30BB\u30B9\u304C\u8A31\u53EF\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002Aviary \u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u958B\u3044\u3066\u30D6\u30E9\u30A6\u30B6\u30FC\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u6709\u52B9\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30E1\u30C7\u30A3\u30A2\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u6295\u7A3F\u4E0A\u306E\u30DC\u30BF\u30F3\u304B\u3089\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002","\u5148\u306B\u753B\u50CF\u307E\u305F\u306F\u52D5\u753B\u3092\u53F3\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304B\u3089\u3001Aviary \u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9 \xB7 \u6700\u826F\u306E\u76F4\u63A5 MP4","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","\u3053\u306E\u6295\u7A3F\u81EA\u8EAB\u306E\u30E1\u30C7\u30A3\u30A2\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002\u5F15\u7528\u5143\u3084\u30AB\u30FC\u30C9\u306E\u30E1\u30C7\u30A3\u30A2\u306B\u306F\u5C02\u7528\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30DC\u30BF\u30F3\u304C\u3042\u308A\u307E\u3059\u3002","\u3053\u306E\u30DD\u30B9\u30C8\u306E\u30E1\u30C7\u30A3\u30A2\u3092\u3059\u3079\u3066\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","\u76F4\u63A5\u52D5\u753B\u3092\u307E\u3060\u8AAD\u307F\u8FBC\u307F\u4E2D\u3067\u3059\u3002\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002","\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC","\u3053\u306E\u30DD\u30B9\u30C8\u306E\u6700\u9069\u306A\u76F4\u63A5\u30E1\u30C7\u30A3\u30A2\u30EA\u30F3\u30AF\u3092\u30B3\u30D4\u30FC","\u30A2\u30C0\u30D7\u30C6\u30A3\u30D6","yt-dlp \u306B\u9001\u308B","\u89B3\u6E2C\u3057\u305F\u30A2\u30C0\u30D7\u30C6\u30A3\u30D6\u52D5\u753B\u3092\u30ED\u30FC\u30AB\u30EB\u306E yt-dlp \u306B\u9001\u308B","yt-dlp \u30B3\u30DE\u30F3\u30C9\u3092\u30B3\u30D4\u30FC","\u89B3\u6E2C\u3057\u305F\u30A2\u30C0\u30D7\u30C6\u30A3\u30D6\u52D5\u753B\u306E yt-dlp \u30B3\u30DE\u30F3\u30C9\u3092\u30B3\u30D4\u30FC","\u3088\u308A\u9AD8\u54C1\u8CEA\u306A\u30A2\u30C0\u30D7\u30C6\u30A3\u30D6\u52D5\u753B","\u9001\u4FE1\u4E2D\u2026","\u62D2\u5426\u3055\u308C\u307E\u3057\u305F","\u30ED\u30FC\u30AB\u30EB\u306E yt-dlp \u30D8\u30EB\u30D1\u30FC\u304C\u3053\u306E\u30B8\u30E7\u30D6\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002","\u30ED\u30FC\u30AB\u30EB\u306E yt-dlp \u30D8\u30EB\u30D1\u30FC\u304C\u5931\u6557\u3057\u307E\u3057\u305F\u3002","\u4FDD\u5B58\u3057\u307E\u3057\u305F","yt-dlp \u304C\u30A2\u30C0\u30D7\u30C6\u30A3\u30D6\u52D5\u753B\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002","\u6B20\u843D","\u305D\u306E yt-dlp \u30B8\u30E7\u30D6\u306F\u3082\u3046\u3042\u308A\u307E\u305B\u3093\u3002\u30B3\u30DE\u30F3\u30C9\u3092\u30B3\u30D4\u30FC\u3057\u3066\u3084\u308A\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30ED\u30FC\u30AB\u30EB\u306E yt-dlp \u30D8\u30EB\u30D1\u30FC\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","yt-dlp \u30B3\u30DE\u30F3\u30C9\u3092\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F\u3002","yt-dlp \u30B3\u30DE\u30F3\u30C9\u3092\u30B3\u30D4\u30FC\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u4E2D\u2026","\u518D\u8A66\u884C","\u5229\u7528\u3067\u304D\u307E\u305B\u3093","\u958B\u59CB","\u30D6\u30E9\u30A6\u30B6\u30FC\u306F\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u307E\u3060\u8EE2\u9001\u4E2D\u3067\u3059\u3002\u7D50\u679C\u306F\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u4E00\u89A7\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30D6\u30E9\u30A6\u30B6\u30FC\u304C\u30D5\u30A1\u30A4\u30EB\u3092\u4FDD\u5B58\u305B\u305A\u306B\u958B\u304D\u307E\u3057\u305F\u3002\u78BA\u5B9F\u306B\u4FDD\u5B58\u3059\u308B\u306B\u306F Aviary \u306B\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u6A29\u9650\u3092\u8A31\u53EF\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u305F\u30C7\u30FC\u30BF\u304C\u5C65\u6B74\u5185\u306E\u9805\u76EE\u3068\u4E00\u81F4\u3059\u308B\u305F\u3081\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F\u3002","\u753B\u50CF\u304C\u5C65\u6B74\u5185\u306E\u9805\u76EE\u3068\u4F3C\u3066\u3044\u308B\u305F\u3081\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F\u3002","\u540C\u3058X\u30E1\u30C7\u30A3\u30A2\u306E\u5225\u30B5\u30A4\u30BA\u3067\u3042\u308B\u305F\u3081\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F\u3002","Aviary \u306B\u306F\u30D6\u30E9\u30A6\u30B6\u30FC\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059\u3002\u30AA\u30D7\u30B7\u30E7\u30F3\u30DA\u30FC\u30B8\u3092\u958B\u304D\u307E\u3059\u3002","\u5143\u306E\u753B\u50CF\u3092\u518D\u8A66\u884C","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u6E08\u307F","\u5143\u306E\u54C1\u8CEA","\u4EE3\u66FF\u54C1\u8CEA\u3002\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u5143\u306E\u753B\u50CF\u3092\u518D\u8A66\u884C","\u6700\u9AD8\u306E\u76F4\u63A5\u54C1\u8CEA","\u54C1\u8CEA\u4E0D\u660E","\u3053\u306E\u753B\u50CF\u306F\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3067\u304D\u307E\u305B\u3093\u3002","\u8A31\u53EF","\u6A29\u9650","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3078\u306E\u30A2\u30AF\u30BB\u30B9","\u6700\u9AD8\u753B\u8CEA\u306E\u52D5\u753B\u3084\u753B\u50CF\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3059\u308B\u305F\u3081\u306B\u5FC5\u8981\u306A\u6A29\u9650\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002\u30C7\u30FC\u30BF\u304C\u30D6\u30E9\u30A6\u30B6\u30FC\u306E\u5916\u306B\u9001\u4FE1\u3055\u308C\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306E\u6E96\u5099","\u8A31\u53EF\u6E08\u307F","\u4EFB\u610F","\u3059\u3079\u3066\u4EFB\u610F\u3067\u3059\u3002\u7BA1\u7406\u3059\u308B\u306E\u306F\u3042\u306A\u305F\u3067\u3059\u3002","\u52D5\u753B\u3068\u753B\u50CF\u3092\u4FDD\u5B58","\u78BA\u8A8D\u4E2D\u2026","\u30D5\u30A1\u30A4\u30EB\u540D\u3068\u91CD\u8907\u306E\u8A2D\u5B9A\u306B\u5F93\u3044\u3001\u5229\u7528\u53EF\u80FD\u306A\u6700\u9AD8\u753B\u8CEA\u306E\u52D5\u753B\u3084\u753B\u50CF\u3092\u30D6\u30E9\u30A6\u30B6\u30FC\u304B\u3089\u4FDD\u5B58\u3057\u307E\u3059\u3002","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u6A29\u9650\u3092\u8A31\u53EF","\u53D6\u308A\u6D88\u3059","\u30AA\u30EA\u30B8\u30CA\u30EB\u30E1\u30C7\u30A3\u30A2\u3092\u76F4\u63A5\u8AAD\u307F\u8FBC\u3080","Aviary \u304C\u30D5\u30EB\u30B5\u30A4\u30BA\u306E\u30E1\u30C7\u30A3\u30A2\u3092\u76F4\u63A5\u53D6\u5F97\u3067\u304D\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002\u3053\u306E\u6A29\u9650\u304C\u306A\u304F\u3066\u3082\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30DC\u30BF\u30F3\u306F\u4F7F\u3048\u307E\u3059\u3002","\u30E1\u30C7\u30A3\u30A2\u30B5\u30FC\u30D0\u30FC\u3092\u8A31\u53EF","\u30ED\u30FC\u30AB\u30EB\u306E yt-dlp \u30D8\u30EB\u30D1\u30FC\u306B\u63A5\u7D9A","\u30AA\u30D7\u30B7\u30E7\u30F3\u306E yt-dlp \u30D8\u30EB\u30D1\u30FC\u5C02\u7528\u3067\u3059\u3002Aviary \u306F\u62E1\u5F35\u6A5F\u80FD\u304B\u3089\u30D8\u30EB\u30D1\u30FC\u3068\u901A\u4FE1\u3059\u308B\u305F\u3081\u3001Chrome \u304C x.com \u306B\u30ED\u30FC\u30AB\u30EB\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u6C42\u3081\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u30D8\u30EB\u30D1\u30FC\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8A31\u53EF","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u59CB\u3081\u308B","\u30D6\u30E9\u30A6\u30B6\u30FC\u304B\u3089\u306E\u30EF\u30F3\u30AF\u30EA\u30C3\u30AF\u4FDD\u5B58\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","X \u3092\u958B\u304F","Aviary \u304C\u30E1\u30C7\u30A3\u30A2\u6295\u7A3F\u306B\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30DC\u30BF\u30F3\u3092\u81EA\u52D5\u3067\u8FFD\u52A0\u3057\u307E\u3059\u3002","\u300C\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u300D\u3092\u9078\u629E","Aviary \u304C\u5229\u7528\u53EF\u80FD\u306A\u6700\u9AD8\u753B\u8CEA\u3092\u9078\u3073\u307E\u3059\u3002","X \u3092\u958B\u3044\u3066\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u975E\u516C\u958B","\u30C7\u30FC\u30BF\u304C\u30D6\u30E9\u30A6\u30B6\u30FC\u306E\u5916\u306B\u9001\u4FE1\u3055\u308C\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u8A2D\u5B9A\u30FB\u30D5\u30A3\u30EB\u30BF\u30FC\u30FB\u30E1\u30E2\u30FB\u30A2\u30FC\u30AB\u30A4\u30D6\u306F x.com \u306E\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u30BB\u30F3\u30BF\u30FC\u306B\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u30DA\u30FC\u30B8\u306F\u30D6\u30E9\u30A6\u30B6\u30FC\u306E\u6A29\u9650\u306E\u307F\u3092\u6271\u3044\u307E\u3059\u3002","\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u30FC\u306F\u6A29\u9650 API \u3092\u63D0\u4F9B\u3057\u3066\u3044\u307E\u305B\u3093\u3002","\u30EA\u30AF\u30A8\u30B9\u30C8\u306F\u53D6\u308A\u6D88\u3055\u308C\u307E\u3057\u305F\u3002\u5909\u66F4\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u53D6\u308A\u6D88\u3057\u307E\u3057\u305F\u3002","\u53D6\u308A\u6D88\u3059\u6A29\u9650\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u672A\u8A31\u53EF","\u8A31\u53EF\u3057\u307E\u3057\u305F\u3002\u4ECA\u5F8C\u306F\u30D6\u30E9\u30A6\u30B6\u30FC\u7D4C\u7531\u3067\u30E1\u30C7\u30A3\u30A2\u3092\u4FDD\u5B58\u3057\u307E\u3059\u3002","\u8A31\u53EF\u3057\u307E\u3057\u305F\u3002\u4ECA\u5F8C Aviary \u306F\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u7528\u306B\u30D5\u30EB\u30B5\u30A4\u30BA\u306E\u30E1\u30C7\u30A3\u30A2\u3092\u76F4\u63A5\u8AAD\u307F\u53D6\u308C\u307E\u3059\u3002","\u8A31\u53EF\u3057\u307E\u3057\u305F\u3002Aviary \u306F\u30D6\u30E9\u30A6\u30B6\u306E\u78BA\u8A8D\u306A\u3057\u3067\u30ED\u30FC\u30AB\u30EB\u30D8\u30EB\u30D1\u30FC\u306B\u63A5\u7D9A\u3067\u304D\u307E\u3059\u3002","X \u7528 Aviary","\u53EF\u9006\u306A\u64CD\u4F5C\u3068\u30D7\u30E9\u30A4\u30D0\u30B7\u30FC\u512A\u5148\u306E\u8A2D\u5B9A\u3092\u5099\u3048\u305F\u30ED\u30FC\u30AB\u30EB X/Twitter \u62E1\u5F35\u6A5F\u80FD\u3002","Aviary \u3067\u30E1\u30C7\u30A3\u30A2\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9","Aviary \u30A2\u30FC\u30AB\u30A4\u30D6","\u30ED\u30FC\u30AB\u30EB\u30A2\u30FC\u30AB\u30A4\u30D6\u30D3\u30E5\u30FC\u30A2\u30FC\u3002\u30EA\u30E2\u30FC\u30C8\u53C2\u7167\u306F\u81EA\u52D5\u53D6\u5F97\u3055\u308C\u307E\u305B\u3093\u3002","\u30EC\u30B3\u30FC\u30C9\u3092\u691C\u7D22","\u30E1\u30C7\u30A3\u30A2\u72B6\u614B","\u3059\u3079\u3066\u306E\u30E1\u30C7\u30A3\u30A2","\u30AD\u30E3\u30D7\u30C1\u30E3\u6E08\u307F\u30D0\u30A4\u30C8","\u30EA\u30E2\u30FC\u30C8\u53C2\u7167","\u30CF\u30F3\u30C9\u30EB","\u30B9\u30EC\u30C3\u30C9\u8868\u793A","\u30E1\u30C7\u30A3\u30A2","\u4EF6","\u8868\u793A","\u4E00\u81F4\u3059\u308B\u30EC\u30B3\u30FC\u30C9\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u30BD\u30FC\u30B9","\u30D0\u30A4\u30C8","SHA-256","\u30BD\u30FC\u30B9URL\u3092\u958B\u304F","\u4EF6\u306E\u6295\u7A3F","\u30AA\u30D5\u30E9\u30A4\u30F3\u5BFE\u5FDC","\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u304C\u5FC5\u8981\u306A\u5834\u5408\u304C\u3042\u308A\u307E\u3059","\u30AD\u30E3\u30D7\u30C1\u30E3\u3055\u308C\u3066\u3044\u306A\u3044\u6295\u7A3F","\u3053\u306E\u89AA\u6295\u7A3F\u306F\u30ED\u30FC\u30AB\u30EB\u306B\u30AD\u30E3\u30D7\u30C1\u30E3\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002","\u4F1A\u8A71","{author}\u306E\u6295\u7A3F{count}\u4EF6","\u306F\u3058\u3081\u306B","\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u30AF\u30EA\u30FC\u30F3\u30A2\u30C3\u30D7","\u4EF6","\u4EFB\u610F\u306E\u6A29\u9650","\u64CD\u4F5C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002","\u6295\u7A3F\u4E0A\u306E\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB","\u30D5\u30A1\u30A4\u30EB\u540D","\u4E00\u62EC\u51E6\u7406","\u30AD\u30E5\u30FC\u306E\u72B6\u614B","\u5F85\u6A5F\u4E2D","\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u6709\u52B9\u306B\u3059\u308B\u3068\u30AA\u30EA\u30B8\u30CA\u30EB\u753B\u8CEA\u304C\u9069\u7528\u3055\u308C\u307E\u3059\u3002","\u30EA\u30B9\u30C8\u3092\u4FDD\u5B58"],"ko":["Aviary \uC124\uC815","\uB354 \uC870\uC6A9\uD55C X. \uB85C\uCEEC \uB370\uC774\uD130.","\uB2EB\uAE30","Aviary","\uAD11\uACE0, \uB2E4\uC6B4\uB85C\uB4DC, \uD544\uD130 \uB4F1 \uAC80\uC0C9","\uC124\uC815 \uAC80\uC0C9","\uB418\uB3CC\uB9AC\uAE30","\uC800\uC7A5","\uC2A4\uC704\uCE58\uC640 \uC785\uB825\uB780\uC740 \uC800\uC7A5\uD560 \uB54C \uBC18\uC601\uB429\uB2C8\uB2E4. \uBC84\uD2BC\uC740 \uC989\uC2DC \uC2E4\uD589\uB429\uB2C8\uB2E4.","\uB85C\uCEEC\uC5D0 \uC800\uC7A5\uB428","\uC124\uC815 \uC139\uC158","\uC5EC\uAE30\uC11C \uC2DC\uC791","\uBE60\uB978 \uC124\uC815","\uC77C\uC0C1 \uC124\uC815","\uBAA8\uC591","\uD398\uC774\uC9C0 \uC815\uB9AC","\uCF58\uD150\uCE20 \uD544\uD130","\uB2E4\uC6B4\uB85C\uB4DC","\uB0B4 \uB370\uC774\uD130","\uC800\uC7A5\uD55C \uAC8C\uC2DC\uBB3C","\uAC00\uC838\uC624\uAE30 \uBC0F \uB0B4\uBCF4\uB0B4\uAE30","X \uD65C\uB3D9 \uC0AD\uC81C","\uB3C4\uAD6C \uB354 \uBCF4\uAE30","\uB193\uCE5C \uB0B4\uC6A9 \uBCF4\uAE30","\uC228\uAE34 \uAC8C\uC2DC\uBB3C","\uB3D9\uC601\uC0C1 \uC7AC\uC0DD","X \uC544\uCE74\uC774\uBE0C","\uC5F0\uACB0","\uBC31\uC5C5 \uBC0F \uCD08\uAE30\uD654","\uAC1C\uC778\uC815\uBCF4 \uBC0F \uC9C4\uB2E8","\uC800\uC7A5 \uBC29\uC2DD","\uC2A4\uC704\uCE58\uC640 \uC785\uB825\uB780\uC740 \uC800\uC7A5\uD560 \uB54C \uBC18\uC601\uB429\uB2C8\uB2E4. \uC801\uC6A9, \uB0B4\uBCF4\uB0B4\uAE30, \uBBF8\uB9AC\uBCF4\uAE30, \uC0AD\uC81C \uAC19\uC740 \uBC84\uD2BC\uC740 \uC989\uC2DC \uC2E4\uD589\uB429\uB2C8\uB2E4.","\uC124\uC815 \uC5F4\uAE30","X\uB97C \uB354 \uC870\uC6A9\uD558\uAC8C","\uAD11\uACE0, \uD2B8\uB80C\uB4DC, \uCD94\uCC9C, \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294 \uD0D0\uC0C9 \uD56D\uBAA9\uC744 \uC228\uAE41\uB2C8\uB2E4.","\uC6D0\uD558\uC9C0 \uC54A\uB294 \uAC8C\uC2DC\uBB3C \uC228\uAE30\uAE30","\uB2E8\uC5B4, \uBBF8\uB514\uC5B4, \uBC30\uC9C0 \uB610\uB294 \uD398\uC774\uC9C0\uB85C \uD544\uD130\uB9C1\uD569\uB2C8\uB2E4.","\uC0AC\uC9C4\uACFC \uB3D9\uC601\uC0C1 \uC800\uC7A5","\uD488\uC9C8, \uD30C\uC77C \uC774\uB984, \uC911\uBCF5 \uAC80\uC0AC \uBC0F \uB300\uAE30\uC5F4 \uB3D9\uC791\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4.","\uACC4\uC815 \uD65C\uB3D9 \uC0AD\uC81C","\uAC8C\uC2DC\uBB3C, \uB2F5\uAE00, \uC7AC\uAC8C\uC2DC\uBB3C, \uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694 \uB610\uB294 \uBD81\uB9C8\uD06C\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uC870\uC6A9\uD55C \uC77D\uAE30","\uD2B8\uB80C\uB4DC\xB7\uD589 \uACBD\uACC4\uC120\xB7\uBC18\uC751 \uC218\uB97C \uC228\uAE30\uACE0, \uD504\uB9AC\uBBF8\uC5C4 \uAC8C\uC2DC\uBB3C\uC744 \uD750\uB9AC\uAC8C \uD558\uBA70, t.co\uB97C \uC815\uB9AC\uD558\uB294 \uC870\uBC00\uD558\uACE0 \uC5B4\uB450\uC6B4 \uD14C\uB9C8.","\uC624\uB978\uCABD \uC0AC\uC774\uB4DC\uBC14 \uC228\uAE30\uAE30","\uCF1C\uC9D0","\uD638\uBC84 \uBBF8\uB9AC\uBCF4\uAE30 \uC228\uAE30\uAE30","\uBC18\uC751 \uC218 \uC228\uAE30\uAE30","\uD14C\uB9C8","\uB524","\uC801\uC6A9","\uBBF8\uB514\uC5B4 \uBCF4\uAD00","\uC6D0\uBCF8 \uD654\uC9C8 \uB2E4\uC6B4\uB85C\uB4DC, \uADDC\uCE59\uC801\uC778 \uD30C\uC77C \uC774\uB984, \uC911\uBCF5 \uC5C6\uB294 \uAE30\uB85D, \uC138\uB85C\uB85C \uC313\uC778 \uBBF8\uB514\uC5B4.","\uC6D0\uBCF8 \uD654\uC9C8 \uC6B0\uC120","\uBBF8\uB514\uC5B4 \uBC30\uCE58","\uC138\uB85C \uC313\uAE30","\uB2E4\uC6B4\uB85C\uB4DC \uBC84\uD2BC \uD45C\uC2DC","\uD06C\uB9AC\uC5D0\uC774\uD130","\uC791\uC131 \uBAA8\uB4DC, \uC791\uC131\uAE30 \uC2A4\uB2C8\uD3AB, \uACF5\uC720 \uBC84\uD2BC \uC815\uB9AC, \uC0AC\uC774\uB4DC\uBC14\uC640 \uD2B8\uB80C\uB4DC \uC228\uAE40.","\uC9D1\uD544 \uBAA8\uB4DC","\uD2B8\uB80C\uB4DC \uC228\uAE30\uAE30","\uADE0\uC77C \uADF8\uB9AC\uB4DC","\uB9AC\uC11C\uCE58","\uB0B4\uBCF4\uB0B4\uAE30 \uCEA1\uCC98 \uCF2C, JSON+CSV+HTML+MD \uD615\uC2DD, \uCFFC\uB9AC ID \uC790\uB3D9 \uAC80\uC0C9, \uC6D0\uBCF8 \uB370\uC774\uD130.","\uD45C\uC2DC\uB41C \uAC8C\uC2DC\uBB3C \uC218\uC9D1","\uC6D0\uBCF8 \uC751\uB2F5 \uBCF4\uAD00","\uB0B4\uBCF4\uB0B4\uAE30 \uD615\uC2DD","JSON, CSV, HTML, Markdown","\uD074\uB798\uC2DD","Dim \uD14C\uB9C8\uB85C \uB418\uB3CC\uB9AC\uACE0 \uC0AC\uC774\uB4DC\uBC14\uB294 \uC720\uC9C0\uD558\uBA70 Grok\uB9CC \uC228\uAE41\uB2C8\uB2E4. \uD504\uB9AC\uBBF8\uC5C4 \uD544\uD130 \uC5C6\uC74C.","\uACE0\uBC00\uB3C4 \uBAA8\uB4DC","\uC0AC\uC6A9 \uC548 \uD568","Grok \uC694\uC18C \uC228\uAE30\uAE30","\uBBF8\uB2C8\uBA40","\uCD5C\uB300\uD55C \uAC04\uACB0\uD558\uAC8C: \uCE74\uC6B4\uD2B8 \uC5C6\uC74C, \uD14C\uB450\uB9AC \uC5C6\uC74C, \uD2B8\uB80C\uB4DC \uC5C6\uC74C, \uD070 \uAE00\uC790\uC5D0\uB3C4 \uC548\uC804\uD55C \uC5EC\uBC31.","\uB204\uC544\uB974","\uC5B8\uC5B4","\uD328\uB110\uC744 \uBC88\uC5ED\uD558\uACE0 \uC77D\uB294 \uBC29\uD5A5\uC744 \uC124\uC815\uD569\uB2C8\uB2E4(\uC544\uB78D\uC5B4\uC640 \uD788\uBE0C\uB9AC\uC5B4\uB294 \uC624\uB978\uCABD\uC5D0\uC11C \uC67C\uCABD). '\uAC1C\uC778\uC815\uBCF4'\uC5D0 \uC120\uD0DD\uD55C \uC5B8\uC5B4\uC758 \uBC88\uC5ED \uC815\uB3C4\uAC00 \uD45C\uC2DC\uB418\uBA70, \uBE60\uC9C4 \uD56D\uBAA9\uC740 \uC601\uC5B4\uB85C \uB0A8\uC2B5\uB2C8\uB2E4.","\uC900\uBE44\uB41C \uC124\uC815\uC744 \uC120\uD0DD\uD558\uAC70\uB098 \uC790\uC8FC \uC4F0\uB294 \uC791\uC5C5\uC73C\uB85C \uBC14\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","\uC790\uC8FC \uC4F0\uB294 \uC791\uC5C5","\uC900\uBE44\uB41C \uC124\uC815","\uC5B8\uC5B4","Noir\uAC00 \uC790\uB3D9\uC73C\uB85C \uC801\uC6A9\uB429\uB2C8\uB2E4. X\uC758 \uC790\uCCB4 \uC2A4\uD0C0\uC77C\uC744 \uC0AC\uC6A9\uD558\uB824\uBA74 \uB044\uAE30\uB97C \uC120\uD0DD\uD558\uC138\uC694.","\uB044\uAE30 (X \uC790\uCCB4 \uD14C\uB9C8)","\uB77C\uC774\uD2B8 \uC544\uC6C3","\uADF8\uB798\uD30C\uC774\uD2B8","\uD50C\uB7FC","\uBBF8\uB4DC\uB098\uC774\uD2B8","\uB204\uC544\uB974(\uAE30\uBCF8\uAC12)","\uD0C0\uC784\uB77C\uC778 \uAC04\uACA9\uC744 \uC881\uD600 \uD6D1\uC5B4\uBCF4\uAE30 \uC27D\uAC8C \uD569\uB2C8\uB2E4.","\uD0C0\uC784\uB77C\uC778 \uB108\uBE44","\uB113\uAC8C\uB294 \uD0D0\uC0C9 \uBA54\uB274 \uC606\uC758 \uACF5\uAC04\uC744 \uBAA8\uB450 \uC0AC\uC6A9\uD558\uACE0 \uD0D0\uC0C9 \uC0AC\uC774\uB4DC\uBC14\uB97C \uC228\uAE41\uB2C8\uB2E4. \uC5EC\uC720\uB86D\uAC8C\uB294 \uC0AC\uC774\uB4DC\uBC14\uB97C \uC720\uC9C0\uD569\uB2C8\uB2E4.","\uAE30\uBCF8","\uC5EC\uC720\uB86D\uAC8C","\uB113\uAC8C(\uAE30\uBCF8\uAC12)","Chirp \uAE00\uAF34 \uBCF5\uC6D0","\uC0AC\uC774\uD2B8\uAC00 \uC2DC\uC2A4\uD15C \uAE00\uAF34\uB85C \uB300\uCCB4\uB41C \uACF3\uC5D0 X \uACE0\uC720\uC758 Chirp \uC11C\uCCB4\uB97C \uC801\uC6A9\uD569\uB2C8\uB2E4.","\uC544\uB798 \uB124 \uAC00\uC9C0 \uC22B\uC790\uB97C \uD55C \uBC88\uC5D0 \uCF1C\uACE0 \uB055\uB2C8\uB2E4. \uBC84\uD2BC\uC740 \uACC4\uC18D \uC791\uB3D9\uD558\uBA70 \uC2A4\uD06C\uB9B0 \uB9AC\uB354\uB3C4 \uCD1D\uACC4\uB97C \uC77D\uC5B4 \uC90D\uB2C8\uB2E4.","\uB2F5\uAE00 \uC218 \uC228\uAE30\uAE30","'\uCC38\uC5EC \uC218 \uC228\uAE30\uAE30'\uAC00 \uCF1C\uC838 \uC788\uC744 \uB54C \uC801\uC6A9\uB429\uB2C8\uB2E4.","\uB9AC\uD3EC\uC2A4\uD2B8 \uC218 \uC228\uAE30\uAE30","\uC88B\uC544\uC694 \uC218 \uC228\uAE30\uAE30","\uC870\uD68C \uC218 \uC228\uAE30\uAE30","'\uCC38\uC5EC \uC218 \uC228\uAE30\uAE30'\uAC00 \uCF1C\uC838 \uC788\uC744 \uB54C \uC801\uC6A9\uB429\uB2C8\uB2E4. \uC870\uD68C \uCD1D\uACC4\uB294 \uC561\uC158 \uBC84\uD2BC\uC774 \uC544\uB2C8\uB77C \uBD84\uC11D \uB9C1\uD06C \uC548\uC5D0 \uC788\uC2B5\uB2C8\uB2E4.","\uD0ED \uC81C\uBAA9\uC758 \uC54C\uB9BC \uC218 \uC228\uAE30\uAE30","\uBE0C\uB77C\uC6B0\uC800 \uD0ED \uC81C\uBAA9\uC5D0\uC11C X\uC758 \uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC \uC218\uB97C \uC81C\uAC70\uD574, \uC228\uAE34 \uC54C\uB9BC \uBC30\uC9C0\uAC00 \uD0ED\uC744 \uD1B5\uD574 \uB2E4\uC2DC \uB098\uD0C0\uB098\uC9C0 \uC54A\uB3C4\uB85D \uD569\uB2C8\uB2E4.","\uC808\uB300 \uC2DC\uAC04 \uD45C\uC2DC","X\uC758 \uC0C1\uB300 \uD45C\uAE30 \uB300\uC2E0 \uAC01 \uAC8C\uC2DC\uBB3C\uC5D0 \uC815\uD655\uD55C \uB0A0\uC9DC\uC640 \uC2DC\uAC01\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","Aviary \uD0ED \uC544\uC774\uCF58 \uC0AC\uC6A9","X\uC758 \uD30C\uBE44\uCF58\uC744 Aviary \uB9C8\uD06C\uB85C \uBC14\uAFD4 \uD0ED\uC744 \uC27D\uAC8C \uAD6C\uBD84\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4. \uB044\uBA74 X\uC758 \uC6D0\uB798 \uC544\uC774\uCF58\uC774 \uBCF5\uC6D0\uB429\uB2C8\uB2E4.","\uD589 \uACBD\uACC4\uC120 \uC228\uAE30\uAE30","\uAC01 \uAC8C\uC2DC\uBB3C \uC544\uB798\uC758 1px \uAD6C\uBD84\uC120\uACFC \uAE30\uBCF8 \uCE7C\uB7FC\uC758 \uC88C\uC6B0 \uC120\uC744 \uC5C6\uC571\uB2C8\uB2E4.","\uACE0\uB300\uBE44","\uACBD\uACC4\uC120\uACFC \uAE00\uC790 \uB300\uBE44\uB97C \uAC15\uD558\uAC8C \uD569\uB2C8\uB2E4.","\uBAA8\uC158 \uC904\uC774\uAE30","\uC2DC\uC2A4\uD15C \uC124\uC815 \uB530\uB974\uAE30","\uD56D\uC0C1 \uC904\uC774\uAE30","\uC904\uC774\uC9C0 \uC54A\uAE30","\uC0AC\uC6A9\uC790 \uC9C0\uC815 CSS","\uC544\uB798 \uBC94\uC704\uC5D0 \uC801\uC6A9\uD560 \uC120\uD0DD\uC801 \uB85C\uCEEC \uC7AC\uC815\uC758\uC785\uB2C8\uB2E4. CSS\uB294 \uC774 \uD504\uB85C\uD544 \uBC16\uC73C\uB85C \uB098\uAC00\uC9C0 \uC54A\uC73C\uBA70 \uBC84\uADF8 \uBCF4\uACE0 \uC7AC\uD604 \uB300\uC0C1\uC774 \uC544\uB2D9\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C CSS","\uD45C\uC2DC\uB41C \uAC8C\uC2DC\uBB3C\uC5D0\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4. \uC608: article { border-radius: 18px; }","\uBBF8\uB514\uC5B4 \uC791\uC5C5 CSS","Aviary \uBBF8\uB514\uC5B4 \uBC84\uD2BC\uACFC \uADF8 \uB0B4\uC6A9\uC5D0\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4.","\uD0D0\uC0C9 CSS","X \uD0D0\uC0C9 \uB808\uC77C\uC5D0\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4.","\uC0AC\uC774\uB4DC\uBC14 CSS","X \uD0D0\uC0C9 \uC0AC\uC774\uB4DC\uBC14\uC5D0\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4.","\uC791\uC131\uAE30 CSS","\uC791\uC131\uAE30 \uB3C4\uAD6C \uBAA8\uC74C\uACFC \uD14D\uC2A4\uD2B8 \uC601\uC5ED\uC5D0\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4.","\uC0C9\uC0C1, \uAC04\uACA9, \uD14D\uC2A4\uD2B8 \uBC0F \uAC8C\uC2DC\uBB3C\uC5D0 \uD45C\uC2DC\uB418\uB294 \uC22B\uC790\uB97C \uBCC0\uACBD\uD569\uB2C8\uB2E4.","\uBAA8\uC591 \uBC0F \uB808\uC774\uC544\uC6C3","\uAC8C\uC2DC\uBB3C \uC138\uBD80 \uC815\uBCF4","\uC811\uADFC\uC131","\uACE0\uAE09 \uC2A4\uD0C0\uC77C","\uBB38\uC11C\uB97C \uBD88\uB7EC\uC62C \uB54C\uBD80\uD130 \uBCF4\uD638\uAC00 \uC2DC\uC791\uB429\uB2C8\uB2E4.","\uAD11\uACE0 \uC5C6\uB294 \uBAA8\uB4DC","\uC2A4\uD3F0\uC11C \uAC8C\uC2DC\uBB3C, \uC720\uB8CC \uD30C\uD2B8\uB108\uC2ED, \uD504\uB85C\uBAA8\uC158 \uD2B8\uB80C\uB4DC, \uC790\uCCB4 \uD504\uB85C\uBAA8\uC158, \uD45C\uC2DC\uB418\uB294 \uD504\uB9AC\uB864 \uAD11\uACE0\uB97C \uC811\uC2B5\uB2C8\uB2E4. Aviary\uB294 \uD0C0\uC784\uB77C\uC778 \uC804\uC1A1\uC744 \uCC28\uB2E8\uD558\uC9C0 \uC54A\uC73C\uBA74\uC11C X\uC758 \uBCC4\uB3C4 \uD504\uB85C\uBAA8\uC158 \uCF58\uD150\uCE20 \uAE30\uB85D \uC694\uCCAD\uB3C4 \uAC70\uBD80\uD569\uB2C8\uB2E4.","X\uC758 \uAD11\uACE0 \uB85C\uAE45 \uD638\uCD9C \uAC70\uBD80","\uAD11\uACE0 \uC5C6\uB294 \uBAA8\uB4DC\uAC00 \uCF1C\uC838 \uC788\uC744 \uB54C\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4. Aviary\uB294 X\uC758 \uD504\uB85C\uBAA8\uC158 \uCF58\uD150\uCE20 \uAE30\uB85D \uC694\uCCAD \uB2E8 \uD558\uB098\uB9CC \uAC70\uBD80\uD558\uBA70, X\uAC00 \uAD11\uACE0 \uCC28\uB2E8\uAE30\uB97C \uAC10\uC9C0\uD558\uB294 \uB370 \uC0AC\uC6A9\uD558\uB294 \uD655\uC778 \uC694\uCCAD\uC744 \uD3EC\uD568\uD574 \uB2E4\uB978 \uC5B4\uB5A4 \uC694\uCCAD\uB3C4 \uAC70\uBD80\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uADF8\uB798\uB3C4 X\uAC00 \uACBD\uACE0\uB97C \uD45C\uC2DC\uD558\uBA74 \uC774 \uC635\uC158\uC744 \uB044\uC138\uC694. \uD504\uB85C\uBAA8\uC158 \uAC8C\uC2DC\uBB3C\uC740 \uACC4\uC18D \uC228\uACA8\uC9C0\uACE0 Aviary\uB294 \uC5B4\uB5A4 \uC694\uCCAD\uB3C4 \uAC70\uBD80\uD558\uC9C0 \uC54A\uAC8C \uB429\uB2C8\uB2E4.","\uAD11\uACE0 \uCC28\uB2E8 \uC0C1\uD0DC","\uD2B8\uB80C\uB4DC, \uCD94\uCC9C, \uD558\uB2E8 \uC601\uC5ED\uC758 \uC7A1\uC74C\uC744 \uC904\uC785\uB2C8\uB2E4.","\uD2B8\uB80C\uB4DC\uC640 \uB274\uC2A4 \uBAA8\uB4C8\uC744 \uC5C6\uC571\uB2C8\uB2E4.","\uCD94\uCC9C \uACC4\uC815 \uC228\uAE30\uAE30","\uC0AC\uC774\uB4DC\uBC14\uC758 \uB098\uBA38\uC9C0\uB294 \uC720\uC9C0\uD558\uACE0 \uD314\uB85C\uC6B0 \uCD94\uCC9C \uCE74\uB4DC\uB9CC \uC228\uAE41\uB2C8\uB2E4.","\uD648 \uC791\uC131\uAE30 \uC228\uAE30\uAE30","\uD648\uC758 \uBE60\uB978 \uAC8C\uC2DC \uC791\uC131\uAE30\uB97C \uC228\uAE41\uB2C8\uB2E4. \uD544\uC694\uD560 \uB54C \uAC8C\uC2DC \uBC84\uD2BC\uC73C\uB85C \uACC4\uC18D \uC5F4 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC2A4\uB808\uB4DC \uCD94\uCC9C \uC228\uAE30\uAE30","'\uB354 \uBCF4\uAE30' \uBE14\uB85D\uACFC \uADF8 \uC544\uB798 \uCD94\uCC9C \uAC8C\uC2DC\uBB3C\uC744 \uC811\uC5B4 \uB300\uD654\uB97C \uB9C8\uC9C0\uB9C9 \uC2E4\uC81C \uB2F5\uAE00\uC5D0\uC11C \uB05D\uB0C5\uB2C8\uB2E4.","Grok \uC11C\uB78D\uACFC \uD0D0\uC0C9 \uB9C1\uD06C, \uC774\uBBF8\uC9C0 \uC0DD\uC131 \uC9C4\uC785\uC810 \uBC0F \uAC8C\uC2DC\uBB3C\uBCC4 \uC791\uC5C5\uC744 \uC228\uAE41\uB2C8\uB2E4.","\uC774\uB984, \uC544\uBC14\uD0C0 \uB610\uB294 \uCEE8\uD2B8\uB864 \uC704\uC5D0 \uD3EC\uC778\uD130\uB97C \uB450\uC5B4\uB3C4 X\uAC00 \uD504\uB85C\uD544 \uCE74\uB4DC\uB098 \uB9D0\uD48D\uC120\uC744 \uC5F4\uC9C0 \uC54A\uAC8C \uD569\uB2C8\uB2E4. \uD074\uB9AD\uD558\uB294 \uBA54\uB274, \uB808\uC774\uBE14\uACFC \uC2A4\uD06C\uB9B0 \uB9AC\uB354 \uC774\uB984\uC740 \uADF8\uB300\uB85C \uB461\uB2C8\uB2E4.","\uC9D1\uC911 \uBAA8\uB4DC","\uC544\uB798 \uC2DC\uAC04\uB300\uB97C \uBC97\uC5B4\uB098\uBA74 \uC77D\uAE30 \uC601\uC5ED\uC744 \uCC28\uBD84\uD55C \uB85C\uCEEC \uD328\uB110\uB85C \uB36E\uC2B5\uB2C8\uB2E4. \uB0B4\uBE44\uAC8C\uC774\uC158\uC740 \uACC4\uC18D \uC0AC\uC6A9\uD560 \uC218 \uC788\uACE0 5\uBD84 \uC784\uC2DC \uD574\uC81C\uB294 \uD074\uB9AD \uD55C \uBC88\uC774\uBA74 \uB429\uB2C8\uB2E4. \uC544\uBB34\uAC83\uB3C4 \uCC28\uB2E8\uB418\uC9C0 \uC54A\uC73C\uBA70 \uC774 \uAE30\uAE30\uB97C \uBC97\uC5B4\uB098\uB294 \uAC83\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC77D\uAE30 \uC2DC\uAC04 \uC2DC\uC791","24\uC2DC\uAC04 \uD615\uC2DD\uC758 \uC2DC\uAC01\uC785\uB2C8\uB2E4. \uC608: 09:00.","\uC77D\uAE30 \uC2DC\uAC04 \uC885\uB8CC","24\uC2DC\uAC04 \uD615\uC2DD\uC758 \uC2DC\uAC01\uC785\uB2C8\uB2E4. \uC885\uB8CC\uAC00 \uC2DC\uC791\uBCF4\uB2E4 \uC774\uB974\uBA74 \uC790\uC815\uC744 \uB118\uAE41\uB2C8\uB2E4.","\uD0C0\uC784\uB77C\uC778\uC744 \uBA48\uCD9C \uAC8C\uC2DC\uBB3C \uC218","\uD53C\uB4DC\uAC00 \uB354 \uB298\uC5B4\uB098\uAE30 \uC804\uC5D0 \uBCF4\uC5EC\uC904 \uAC8C\uC2DC\uBB3C \uC218\uC774\uBA70, \uACC4\uC18D \uBCF4\uAE30 \uC704\uD55C \uBC84\uD2BC\uC774 \uD568\uAED8 \uD45C\uC2DC\uB429\uB2C8\uB2E4. 0\uC774\uBA74 X\uC758 \uBB34\uD55C \uC2A4\uD06C\uB864\uC744 \uADF8\uB300\uB85C \uB461\uB2C8\uB2E4. \uC774\uBBF8 \uD654\uBA74\uC5D0 \uC788\uB294 \uAC83\uC740 \uC6C0\uC9C1\uC774\uC9C0 \uC54A\uACE0, \uBC84\uD2BC\uC740 \uB9C8\uC9C0\uB9C9 \uAC8C\uC2DC\uBB3C \uC704\uAC00 \uC544\uB2C8\uB77C \uC544\uB798\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uAE34 \uAC8C\uC2DC\uBB3C \uC790\uB3D9 \uD3BC\uCE58\uAE30","\uC2A4\uD06C\uB864\uC774 \uBA48\uCD98 \uB4A4 \uD574\uB2F9 \uAC8C\uC2DC\uBB3C\uC758 \uB354 \uBCF4\uAE30\uB9CC \uD074\uB9AD\uD569\uB2C8\uB2E4. \uB2F5\uAE00, \uC0AC\uC774\uB4DC\uBC14, \uC778\uC6A9 \uAC8C\uC2DC\uBB3C \uBC0F \uB2E4\uB978 \uB354 \uBCF4\uAE30 \uB9C1\uD06C\uB294 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uB4A4\uB85C \uC774\uB3D9 \uD6C4 \uC704\uCE58 \uBCF5\uC6D0","\uAC8C\uC2DC\uBB3C\uC774\uB098 \uB2E4\uB978 X \uD398\uC774\uC9C0\uB97C \uC5F0 \uB4A4 \uBE0C\uB77C\uC6B0\uC800\uC758 \uB4A4\uB85C \uBC84\uD2BC\uC744 \uC0AC\uC6A9\uD558\uBA74 \uAC19\uC740 \uC704\uCE58\uC758 \uAC8C\uC2DC\uBB3C\uB85C \uB3CC\uC544\uAC11\uB2C8\uB2E4. \uD720, \uD130\uCE58, \uD3EC\uC778\uD130 \uB610\uB294 \uD0A4\uBCF4\uB4DC\uB85C \uC2A4\uD06C\uB864\uD558\uBA74 \uBCF5\uC6D0\uC774 \uC989\uC2DC \uCDE8\uC18C\uB429\uB2C8\uB2E4.","\uC77D\uAE30 \uD45C\uC2DC\uAE30 \uD45C\uC2DC","\uD53C\uB4DC\uBCC4 \uC704\uCE58\uB97C \uB85C\uCEEC\uC5D0 \uC800\uC7A5\uD558\uACE0 \uB9C8\uC9C0\uB9C9 \uD655\uC778 \uC774\uD6C4 \uC0C8 \uAC8C\uC2DC\uBB3C \uC904\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uC77D\uC9C0 \uC54A\uC74C \uBC30\uC9C0\uB294 \uCD94\uAC00\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC77D\uAE30 \uD45C\uC2DC\uAE30 \uB300\uC0C1","\uB85C\uCEEC \uC704\uCE58 \uD45C\uC2DC\uAE30\uC640 \uC0C8 \uAC8C\uC2DC\uBB3C \uAD6C\uBD84\uC120\uC744 \uD45C\uC2DC\uD560 \uC704\uCE58\uB97C \uC120\uD0DD\uD569\uB2C8\uB2E4.","\uD648","\uAC8C\uC2DC\uBB3C","\uD504\uB85C\uD544","\uAC80\uC0C9","\uC54C\uB9BC","\uBA54\uC2DC\uC9C0","\uC791\uC131\uCC3D\uC5D0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uB3D9\uC548 \uC0AC\uC774\uB4DC\uBC14\uC640 \uB4A4\uCABD \uD0C0\uC784\uB77C\uC778\uC744 \uD750\uB9AC\uAC8C \uD569\uB2C8\uB2E4. \uB2E4\uB978 \uACF3\uC744 \uD074\uB9AD\uD558\uBA74 \uC989\uC2DC \uB3CC\uC544\uC635\uB2C8\uB2E4.","'\uCD94\uCC9C' \uB300\uC2E0 '\uD314\uB85C\uC6B0 \uC911' \uC5F4\uAE30","\uD0C0\uC784\uB77C\uC778\uC5D0 \uB4E4\uC5B4\uC62C \uB54C\uB9C8\uB2E4 \uD648\uC758 \uB450 \uBC88\uC9F8 \uD0ED\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4. '\uCD94\uCC9C'\uC73C\uB85C \uB418\uB3CC\uB9AC\uBA74 \uD398\uC774\uC9C0\uB97C \uBC97\uC5B4\uB0A0 \uB54C\uAE4C\uC9C0 \uADF8\uB300\uB85C \uC720\uC9C0\uB429\uB2C8\uB2E4.","For you \uD0ED \uC228\uAE30\uAE30","\uD314\uB85C\uC789\uC744 \uC120\uD0DD\uD55C \uB4A4 \uD648\uC758 \uCCAB \uBC88\uC9F8 \uD0ED\uC744 \uC811\uC2B5\uB2C8\uB2E4. \uD648\uC5D0\uC11C\uB9CC \uC801\uC6A9\uB418\uBA70 \uB044\uBA74 \uC989\uC2DC \uBCF5\uC6D0\uB429\uB2C8\uB2E4.","\uB2F5\uAE00 \uC544\uC774\uCF58\uC73C\uB85C\uB9CC \uAC8C\uC2DC\uBB3C \uC5F4\uAE30","X\uB294 \uAC8C\uC2DC\uBB3C \uD589 \uC804\uCCB4\uB97C \uB9C1\uD06C\uB85C \uB9CC\uB4E4\uAE30 \uB54C\uBB38\uC5D0 \uBCF8\uBB38\uC774\uB098 \uBC84\uD2BC \uC606\uC744 \uB20C\uB7EC\uB3C4 \uACE0\uB974\uC9C0 \uC54A\uC740 \uAC8C\uC2DC\uBB3C\uC774 \uC5F4\uB9BD\uB2C8\uB2E4. \uC774 \uC124\uC815\uC740 \uD589\uC5D0\uC11C \uD074\uB9AD \uC601\uC5ED\uC744 \uC5C6\uC560\uACE0 \uB2F5\uAE00 \uC544\uC774\uCF58\uC5D0 \uB118\uAE41\uB2C8\uB2E4. \uB2F5\uAE00 \uC544\uC774\uCF58\uC740 \uB2F5\uAE00 \uC785\uB825\uCC3D \uB300\uC2E0 \uAC8C\uC2DC\uBB3C\uC744 \uC5FD\uB2C8\uB2E4. \uB9C1\uD06C, \uBC84\uD2BC, \uBBF8\uB514\uC5B4, \uC778\uC6A9 \uAC8C\uC2DC\uBB3C\uC740 \uADF8\uB300\uB85C \uC791\uB3D9\uD569\uB2C8\uB2E4.","\uB0B4\uBE44\uAC8C\uC774\uC158 \uD56D\uBAA9 \uC228\uAE30\uAE30","\uD55C \uC904\uC5D0 X \uB0B4\uBE44\uAC8C\uC774\uC158 ID \uD558\uB098: home, explore, notifications, follow, chat, messages, grok, history, studio, premium, profile \uB610\uB294 more.","\uAD11\uACE0\uC640 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294 X \uC601\uC5ED\uC744 \uC228\uAE41\uB2C8\uB2E4.","\uAD11\uACE0 \uCC28\uB2E8","\uD398\uC774\uC9C0 \uC694\uC18C","\uC77D\uAE30 \uD750\uB984","\uD0D0\uC0C9","\uC120\uD0DD\uD55C \uACBD\uB85C\uC5D0\uC11C \uADDC\uCE59\uC774 \uD65C\uC131\uD654\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.","\uD544\uD130 \uC0AC\uC6A9","\uD0A4\uC6CC\uB4DC\xB7\uC815\uADDC\uC2DD\xB7\uD504\uB9AC\uBBF8\uC5C4\xB7\uBBF8\uB514\uC5B4 \uD544\uD130\uB97C \uD55C\uAEBC\uBC88\uC5D0 \uCF1C\uACE0 \uB055\uB2C8\uB2E4.","\uADDC\uCE59 \uC0C1\uD0DC","\uD544\uD130\uB97C \uCF24 \uB54C\uAE4C\uC9C0 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC785\uB2C8\uB2E4. \uCF1C\uAE30 \uC804\uC5D0 \uADDC\uCE59\uC744 \uD3B8\uC9D1\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC774\uBBF8 \uBCF8 \uAC8C\uC2DC\uBB3C \uD750\uB9AC\uAC8C \uD45C\uC2DC","\uAC8C\uC2DC\uBB3C\uC774 \uB450 \uBC88\uC9F8\uB85C \uC9C0\uB098\uAC00\uBA74 \uD750\uB9AC\uAC8C \uD45C\uC2DC\uD558\uACE0 Aviary\uAC00 \uB80C\uB354\uB9C1\uD55C \uAC8C\uC2DC\uBB3C\uC758 \uB85C\uCEEC \uBCF5\uC0AC\uBCF8\uC744 \uBCF4\uAD00\uD569\uB2C8\uB2E4. \uD750\uB9B0 \uAC8C\uC2DC\uBB3C\uC5D0 \uB9C8\uC6B0\uC2A4\uB97C \uC62C\uB9AC\uBA74 \uB2E4\uC2DC \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC77D\uC740 \uAC8C\uC2DC\uBB3C\uC744 \uC228\uAE38 \uC704\uCE58","\uC774\uBBF8 \uBCF8 \uAC8C\uC2DC\uBB3C\uC744 \uD750\uB9AC\uAC8C \uD45C\uC2DC\uD560 \uD53C\uB4DC\uB97C \uC120\uD0DD\uD569\uB2C8\uB2E4.","\uD544\uD130 \uADDC\uCE59","\uD55C \uC904\uC5D0 \uADDC\uCE59 \uD558\uB098. \uD544\uB4DC, \uC120\uD0DD\uC801 not, \uC5F0\uC0B0\uC790, \uAC12 \uC21C\uC785\uB2C8\uB2E4. \uD544\uB4DC\uB294 text, handle, media, verified, link\uC774\uACE0 \uC5F0\uC0B0\uC790\uB294 contains, is, starts, ends, matches\uC785\uB2C8\uB2E4. and / or\uB85C \uC787\uACE0, dim:\uC744 \uC55E\uC5D0 \uBD99\uC774\uBA74 \uC228\uAE30\uB294 \uB300\uC2E0 \uD750\uB9AC\uAC8C \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uC904\uC744 [\uC81C\uBAA9]\uC73C\uB85C \uC2DC\uC791\uD558\uBA74 \uADDC\uCE59\uC5D0 \uC774\uB984\uC774 \uBD99\uACE0, for 7d from <\uB0A0\uC9DC>\uB85C \uAE30\uD55C\uC744 \uC904 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC608: [Weekend sales] dim for 7d from 2026-08-19T10:00:00.000Z: text contains sale and media is photo","\uD734\uB300\uC6A9 \uADDC\uCE59 \uC138\uD2B8","\uC77C\uBC18 \uD14D\uC2A4\uD2B8\uB85C \uB0B4\uBCF4\uB0B4\uAC70\uB098 \uC138\uD2B8\uB97C \uBD99\uC5EC \uB123\uC5B4 \uADDC\uCE59\uC744 \uCD94\uAC00\uD558\uAC70\uB098 \uBC14\uAFB8\uAE30 \uC804\uC5D0 \uBBF8\uB9AC \uD655\uC778\uD569\uB2C8\uB2E4.","\uC5EC\uAE30\uC5D0 \uADDC\uCE59 \uBD99\uC5EC\uB123\uAE30",".txt \uB0B4\uBCF4\uB0B4\uAE30","\uBBF8\uB9AC\uBCF4\uAE30","\uADDC\uCE59 \uCD94\uAC00","\uADDC\uCE59 \uBC14\uAFB8\uAE30","\uADDC\uCE59\uC744 \uBD99\uC5EC \uB123\uC73C\uBA74 \uB450 \uAC00\uC838\uC624\uAE30 \uBC29\uC2DD\uC744 \uBAA8\uB450 \uBCFC \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD0A4\uC6CC\uB4DC \uADDC\uCE59","\uD55C \uC904\uC5D0 \uD0A4\uC6CC\uB4DC\uB098 \uBB38\uAD6C \uD558\uB098\uC529. \uB300\uC18C\uBB38\uC790\uB97C \uAD6C\uBD84\uD558\uC9C0 \uC54A\uB294 \uBD80\uBD84 \uC77C\uCE58\uC785\uB2C8\uB2E4.","\uC815\uADDC\uC2DD \uADDC\uCE59","\uD55C \uC904\uC5D0 \uD328\uD134 \uD558\uB098\uC529. /pattern/flags \uD615\uC2DD\uC774\uB098 \uD328\uD134\uB9CC \uC785\uB825\uD558\uC138\uC694(\uB300\uC18C\uBB38\uC790 \uAD6C\uBD84 \uC548 \uD568).","\uC81C\uC678\uD560 \uACC4\uC815","\uD544\uD130\uC5D0\uC11C \uD56D\uC0C1 \uC81C\uC678\uD560 \uACC4\uC815(\uD55C \uC904\uC5D0 \uD558\uB098, @ \uC5C6\uC774).","\uD504\uB9AC\uBBF8\uC5C4\xB7\uC778\uC99D \uAC8C\uC2DC\uBB3C","\uB044\uAE30","\uC228\uAE30\uAE30","\uC778\uC6A9 \uAC8C\uC2DC\uBB3C","\uB2E4\uB978 \uAC8C\uC2DC\uBB3C\uC744 \uC778\uC6A9\uD55C \uAC8C\uC2DC\uBB3C.","\uC774\uBBF8\uC9C0, GIF, \uB3D9\uC601\uC0C1\uC774 \uC788\uB294 \uB2F5\uAE00 \uC228\uAE30\uAE30","\uC5F0 \uAC8C\uC2DC\uBB3C \uC544\uB798\uC5D0\uC11C \uC0AC\uC9C4, GIF, \uB3D9\uC601\uC0C1\uC774 \uB4E4\uC5B4\uAC04 \uB2F5\uAE00\uC744 \uBAA8\uB450 \uAC77\uC5B4\uB0C5\uB2C8\uB2E4. \uD568\uAED8 \uC801\uD78C \uAE00\uC740 \uC0C1\uAD00\uC5C6\uC2B5\uB2C8\uB2E4. \uBC08\uC740 \uB300\uAC1C \uAE00\uACFC \uD568\uAED8 \uC62C\uB77C\uC624\uAE30 \uB54C\uBB38\uC785\uB2C8\uB2E4. \uAC8C\uC2DC\uBB3C \uC790\uCCB4\uC640 \uADF8 \uC704\uC758 \uC2A4\uB808\uB4DC\uB294 \uADF8\uB300\uB85C \uB450\uACE0, \uC0AC\uC9C4\uC774 \uC788\uB294 \uAC8C\uC2DC\uBB3C\uC744 \uC778\uC6A9\uD558\uAE30\uB9CC \uD55C \uB2F5\uAE00\uB3C4 \uB0A8\uAE41\uB2C8\uB2E4. \uC704\uC758 \uD544\uD130 \uC5C6\uC774 \uB2E8\uB3C5\uC73C\uB85C \uB3D9\uC791\uD569\uB2C8\uB2E4. \uADF8 \uD544\uD130\uB97C \uB300\uD654\uC5D0 \uC801\uC6A9\uD558\uBA74 \uC77D\uC73C\uB7EC \uC628 \uAC8C\uC2DC\uBB3C\uAE4C\uC9C0 \uC228\uACA8\uC9C0\uAE30 \uB54C\uBB38\uC785\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C\uC774 \uAC78\uB7EC\uC9C4 \uC774\uC720 \uD45C\uC2DC","\uB9D0\uC5C6\uC774 \uC228\uAE30\uB294 \uD544\uD130\uB294 \uBC84\uADF8\uC640 \uAD6C\uBD84\uD558\uAE30 \uC5B4\uB835\uC2B5\uB2C8\uB2E4. \uD750\uB9AC\uAC8C \uD45C\uC2DC\uB41C \uAC8C\uC2DC\uBB3C\uC740 \uB808\uC774\uC544\uC6C3\uC744 \uBC14\uAFB8\uC9C0 \uC54A\uACE0\uB3C4 \uBB34\uC5C7\uC5D0 \uAC78\uB838\uB294\uC9C0 \uC54C\uB824\uC904 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC138 \uBC88\uC9F8 \uC124\uC815\uC740 \uC228\uACA8\uC9C4 \uAC8C\uC2DC\uBB3C\uB3C4 \uC774\uC720\uB97C \uC801\uC740 \uD55C \uC904 \uB760\uB85C \uBC14\uAFB8\uBA70, \uB9C8\uC6B0\uC2A4\uB97C \uC62C\uB9AC\uAC70\uB098 \uD0ED\uC73C\uB85C \uC774\uB3D9\uD558\uBA74 \uC5F4\uB9BD\uB2C8\uB2E4.","\uD45C\uC2DC\uD558\uC9C0 \uC54A\uC74C","\uD750\uB9AC\uAC8C \uD45C\uC2DC\uB41C \uAC8C\uC2DC\uBB3C\uC5D0","\uD750\uB9AC\uAC8C \uD45C\uC2DC\uB41C \uAC8C\uC2DC\uBB3C\uACFC \uC228\uACA8\uC9C4 \uAC8C\uC2DC\uBB3C\uC5D0","\uBC18\uC751\uC774 \uC801\uC740 \uAC8C\uC2DC\uBB3C","\uC544\uB798 \uCD5C\uC19F\uAC12\uBCF4\uB2E4 \uC801\uC740 \uAC8C\uC2DC\uBB3C. Aviary\uAC00 \uC218\uCE58\uB97C \uC77D\uC744 \uC218 \uC5C6\uB294 \uAC8C\uC2DC\uBB3C\uC740 \uC774 \uC870\uAC74\uC73C\uB85C \uAC78\uB7EC\uC9C0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBC18\uC751 \uAE30\uC900","\uAC8C\uC2DC\uBB3C \uC544\uB798 \uC22B\uC790 \uC911 \uCD5C\uC19F\uAC12\uC744 \uC801\uC6A9\uD560 \uB300\uC0C1.","\uB2F5\uAE00","\uB9AC\uD3EC\uC2A4\uD2B8","\uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694","\uCD5C\uC18C \uBC18\uC751 \uC218","\uC774 \uC218\uBCF4\uB2E4 \uC801\uC740 \uAC8C\uC2DC\uBB3C\uC744 \uAC78\uB7EC\uB0C5\uB2C8\uB2E4. 0\uC774\uBA74 \uC544\uBB34\uAC83\uB3C4 \uAC78\uB7EC\uB0B4\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC0AC\uC9C4\uC774 \uC788\uB294 \uAC8C\uC2DC\uBB3C \uC228\uAE30\uAE30","\uC0AC\uC9C4\uC774 \uD3EC\uD568\uB41C \uAC8C\uC2DC\uBB3C\uC744 \uAC78\uB7EC\uB0C5\uB2C8\uB2E4.","\uB3D9\uC601\uC0C1\uC774 \uC788\uB294 \uAC8C\uC2DC\uBB3C \uC228\uAE30\uAE30","\uB3D9\uC601\uC0C1\uC774 \uD3EC\uD568\uB41C \uAC8C\uC2DC\uBB3C\uC744 \uAC78\uB7EC\uB0C5\uB2C8\uB2E4.","GIF\uAC00 \uC788\uB294 \uAC8C\uC2DC\uBB3C \uC228\uAE30\uAE30","GIF\uAC00 \uD3EC\uD568\uB41C \uAC8C\uC2DC\uBB3C\uC744 \uAC78\uB7EC\uB0C5\uB2C8\uB2E4.","\uC801\uC6A9 \uD398\uC774\uC9C0","\uD544\uD130\uAC00 \uB3D9\uC791\uD560 \uD398\uC774\uC9C0.","\uCC28\uB2E8 \uACC4\uC815 \xB7 \uB0B4 \uC7AC\uAC8C\uC2DC","\uC778\uC99D\uB41C \uD53D\uC2A4\uCC98\uAC00 \uC5C6\uC5B4 \uC774 \uC124\uC815\uC740 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC785\uB2C8\uB2E4.","\uB2E8\uC5B4, \uBBF8\uB514\uC5B4, \uACC4\uC815 \uBC30\uC9C0 \uB610\uB294 \uD398\uC774\uC9C0\uC5D0 \uB530\uB77C \uAC8C\uC2DC\uBB3C\uC744 \uC228\uAE30\uAC70\uB098 \uD750\uB9AC\uAC8C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uD544\uD130 \uC0C1\uD0DC","\uADDC\uCE59","\uCF58\uD150\uCE20 \uC720\uD615","\uACBD\uB85C","\uB2E4\uC6B4\uB85C\uB4DC \uD658\uACBD\uC124\uC815\uC740 \uBAA8\uB4E0 \uBBF8\uB514\uC5B4 \uCEE8\uD2B8\uB864\uC5D0 \uC801\uC6A9\uB429\uB2C8\uB2E4.","\uBBF8\uB514\uC5B4\uAC00 \uC788\uB294 \uAC01 \uAC8C\uC2DC\uBB3C\uC5D0 \uB2E4\uC6B4\uB85C\uB4DC \uB3D9\uC791\uACFC \uD30C\uC77C\uBCC4 \uCEE8\uD2B8\uB864\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4. \uC774 \uC635\uC158\uC744 \uB044\uBA74 \uBBF8\uB514\uC5B4 \uB9C1\uD06C \uBCF5\uC0AC\uB3C4 \uC228\uACA8\uC9D1\uB2C8\uB2E4.","\uBBF8\uB514\uC5B4 \uB9C1\uD06C \uBCF5\uC0AC \uD45C\uC2DC","\uC774\uBBF8\uC9C0, GIF, \uB3D9\uC601\uC0C1, \uC624\uB514\uC624, \uC790\uB9C9\uC758 \uCD5C\uC801 \uC9C1\uC811 URL\uC744 \uD55C \uC904\uC5D0 \uD558\uB098\uC529 \uBCF5\uC0AC\uD558\uB294 \uAC8C\uC2DC\uBB3C \uB3D9\uC791\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4. \uD574\uB2F9 \uAC8C\uC2DC\uBB3C\uC758 \uBBF8\uB514\uC5B4\uB9CC \uBCF5\uC0AC\uD558\uBA70 \uC704\uC758 \uBBF8\uB514\uC5B4 \uCEE8\uD2B8\uB864\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.","\uBA3C\uC800 \uC6D0\uBCF8 \uD615\uC2DD\uC758 name=orig\uB97C \uC2DC\uB3C4\uD558\uACE0 \uC2E4\uD328\uD558\uBA74 4096x4096\uC744 \uC2DC\uB3C4\uD569\uB2C8\uB2E4.","\uC6D0\uBCF8 \uD654\uC9C8 \uC0C1\uD0DC","\uC774\uBBF8\uC9C0\uB97C \uC6D0\uBCF8 \uD654\uC9C8\uB85C \uD45C\uC2DC","\uD0C0\uC784\uB77C\uC778 \uC0AC\uC9C4\uC744 X\uAC00 \uC790\uB9AC\uC5D0 \uB9DE\uCDB0 \uACE0\uB978 \uBC84\uC804 \uB300\uC2E0 \uC804\uCCB4 \uD06C\uAE30\uB85C \uBD88\uB7EC\uC635\uB2C8\uB2E4. \uB354 \uC120\uBA85\uD558\uC9C0\uB9CC \uB370\uC774\uD130 \uC0AC\uC6A9\uB7C9\uC740 \uBA87 \uBC30\uAC00 \uB429\uB2C8\uB2E4.","\uAE30\uBCF8 \uADF8\uB9AC\uB4DC","\uD30C\uC77C \uC774\uB984 \uD15C\uD50C\uB9BF","\uD544\uB4DC: {handle}, {account}, {tweetId}, {mediaId}, {index}, {total}, {date}, {text}, {ext}. {account}\uB294 \uAC8C\uC2DC \uACC4\uC815\uC758 \uBCC4\uCE6D\uC774\uBA70 \uACC4\uC815\uBCC4 \uD3F4\uB354\uB97C \uB9CC\uB4E4 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uBA54\uD0C0\uB370\uC774\uD130 \uC0AC\uC774\uB4DC\uCE74 \uD30C\uC77C","\uBBF8\uB514\uC5B4 \uB2E4\uC6B4\uB85C\uB4DC\uAC00 \uC644\uB8CC\uB420 \uB54C\uB9C8\uB2E4 \uB85C\uCEEC \uD14D\uC2A4\uD2B8 \uB610\uB294 JSON \uBCF4\uC870 \uD30C\uC77C\uC744 \uC800\uC7A5\uD569\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8","JSON","\uC2DC\uAC01\uC801\uC73C\uB85C \uBE44\uC2B7\uD55C \uC774\uBBF8\uC9C0 \uCC3E\uAE30","256\uBE44\uD2B8 \uC2DC\uAC01 \uC11C\uBA85\uB3C4 \uBE44\uAD50\uD569\uB2C8\uB2E4. \uB2E8\uC21C\uD558\uACE0 \uBE44\uC2B7\uD55C \uAD6C\uB3C4\uB294 \uC798\uBABB \uC77C\uCE58\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C \uAE30\uBCF8\uAC12\uC740 \uAEBC\uC9D0\uC785\uB2C8\uB2E4.","\uC911\uBCF5 \uAE30\uB85D","\uC6D0\uBCF8 URL\uC744 \uC800\uC7A5\uD558\uC9C0 \uC54A\uACE0 \uB3D9\uC77C\uD55C X \uBBF8\uB514\uC5B4 \uB610\uB294 \uC815\uD655\uD788 \uAC19\uC740 \uC774\uBBF8\uC9C0 \uBC14\uC774\uD2B8\uB97C \uAC74\uB108\uB701\uB2C8\uB2E4.","\uB3D9\uC2DC \uB2E4\uC6B4\uB85C\uB4DC","\uBC30\uCE58 \uC911 \uB3D9\uC2DC\uC5D0 \uC9C4\uD589\uB418\uB294 \uBBF8\uB514\uC5B4 \uB2E4\uC6B4\uB85C\uB4DC \uCD5C\uB300 \uC218(1-6).","\uB2E4\uC6B4\uB85C\uB4DC \uC18D\uB3C4 \uC870\uC808","\uBC30\uCE58 \uBBF8\uB514\uC5B4 \uC694\uCCAD\uC758 \uCD08\uAE30 \uBC84\uC2A4\uD2B8\uC640 \uC9C0\uC18D \uC18D\uB3C4\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBCF4\uC218\uC801","\uADE0\uD615","\uD45C\uC2DC\uB41C \uBBF8\uB514\uC5B4 \uBAA8\uB450 \uB0B4\uB824\uBC1B\uAE30","\uC774 \uD398\uC774\uC9C0\uC5D0 \uD45C\uC2DC\uB41C \uC0AC\uC9C4, \uB3D9\uC601\uC0C1, GIF, \uC378\uB124\uC77C, \uC624\uB514\uC624 \uD2B8\uB799, \uC790\uB9C9 \uD2B8\uB799\uC744 \uBAA8\uB450 \uB300\uAE30\uC5F4\uC5D0 \uCD94\uAC00\uD569\uB2C8\uB2E4.","\uB2E4\uC6B4\uB85C\uB4DC \uC0C1\uD0DC","\uAE30\uB85D \uAC1C\uC218","\uD328\uB110\uC758 \uB098\uBA38\uC9C0 \uBD80\uBD84\uC740 \uACC4\uC18D \uC791\uB3D9\uD569\uB2C8\uB2E4. \uC9C4\uB2E8\uC5D0 \uBCF4\uACE0\uD588\uC2B5\uB2C8\uB2E4.","\uC774 \uC139\uC158\uC744 \uADF8\uB9B4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4","\uB2E4\uC6B4\uB85C\uB4DC \uBC84\uD2BC, \uD488\uC9C8, \uD30C\uC77C \uC774\uB984 \uBC0F \uB300\uAE30\uC5F4\uC744 \uC124\uC815\uD569\uB2C8\uB2E4.","\uCEEC\uB809\uC158 {count}\uAC1C\uC5D0 \uAC78\uCCD0 {bytes}","\uB77C\uC774\uBE0C\uB7EC\uB9AC \uC800\uC7A5 \uC6A9\uB7C9","\uC6A9\uB7C9\uC774 \uD070 \uCEEC\uB809\uC158","\uBE0C\uB77C\uC6B0\uC800 \uC800\uC7A5 \uC6A9\uB7C9 \uBCF4\uACE0","\uC800\uC7A5 \uC6A9\uB7C9 \uC0C1\uD55C \uACBD\uACE0","\uCEA1\uCC98\uB85C \uB85C\uCEEC \uB77C\uC774\uBE0C\uB7EC\uB9AC\uAC00 \uC774 \uBA54\uAC00\uBC14\uC774\uD2B8\uB97C \uB118\uAE30 \uC804\uC5D0 \uACBD\uACE0\uD569\uB2C8\uB2E4. 0\uC774\uBA74 \uACBD\uACE0\uB97C \uB055\uB2C8\uB2E4. Aviary\uB294 \uC0C1\uD55C\uC744 \uC9C0\uD0A4\uB824\uACE0 \uBB34\uC5B8\uAC00\uB97C \uC9C0\uC6B0\uB294 \uC77C\uC774 \uC5C6\uC73C\uBA70, \uC0AD\uC81C\uB294 \uC815\uB9AC \uBBF8\uB9AC\uBCF4\uAE30\uC5D0\uC11C \uACE0\uB985\uB2C8\uB2E4.","\uCEA1\uCC98\uD55C \uC774\uBBF8\uC9C0 \uCD95\uC18C","\uC9C0\uAE08 \uC774\uD6C4\uC758 \uCEA1\uCC98\uC5D0 \uC801\uC6A9\uB429\uB2C8\uB2E4. \uC774\uBBF8 \uC800\uC7A5\uB41C \uAC83\uC740 \uBC14\uB00C\uC9C0 \uC54A\uACE0, \uCD95\uC18C\uB41C \uAE30\uB85D\uC5D0\uB294 \uCD95\uC18C\uB418\uC5C8\uB2E4\uB294 \uC0AC\uC2E4\uC774 \uB0A8\uC2B5\uB2C8\uB2E4.","\uC6D0\uBCF8 \uC720\uC9C0","4\uBD84\uC758 3","\uC808\uBC18","4\uBD84\uC758 1","\uB3D9\uC601\uC0C1 \uB300\uD45C \uC774\uBBF8\uC9C0\uB9CC","\uB3D9\uC601\uC0C1 \uB300\uC2E0 X\uAC00 \uC81C\uACF5\uD558\uB294 \uC815\uC9C0 \uC774\uBBF8\uC9C0\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4. \uB3D9\uC601\uC0C1\uC774 \uBE60\uC84C\uB2E4\uB294 \uC0AC\uC2E4\uC774 \uAE30\uB85D\uC5D0 \uB0A8\uC544, \uC774\uD6C4 \uB0B4\uBCF4\uB0B4\uAE30\uAC00 \uADF8 \uC774\uBBF8\uC9C0\uB97C \uAC8C\uC2DC\uBB3C \uC804\uCCB4\uCC98\uB7FC \uC81C\uC2DC\uD558\uC9C0 \uBABB\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uB85C\uCEEC \uCEEC\uB809\uC158 \uAC80\uC0C9","\uAC8C\uC2DC\uBB3C, \uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694, \uBD81\uB9C8\uD06C, \uBA54\uBAA8, \uCEA1\uCC98\uB97C \uAC80\uC0C9\uD569\uB2C8\uB2E4.","\uB85C\uCEEC \uB77C\uC774\uBE0C\uB7EC\uB9AC \uAC80\uC0C9","\uC758\uBBF8 \uAE30\uBC18 \uC21C\uC704","\uBBF8\uB514\uC5B4 \uB2E4\uC6B4\uB85C\uB4DC","\uBBF8\uB514\uC5B4 {count}\uAC1C","source:bookmarks, tag:reading \uB610\uB294 has:media\uB97C \uC0AC\uC6A9\uD574 \uBCF4\uC138\uC694.","\uAC8C\uC2DC\uBB3C\uC5D0 AI \uBC84\uD2BC \uD45C\uC2DC","\uBC88\uC5ED\xB7\uC694\uC57D\xB7\uC124\uBA85\xB7\uC0AC\uC2E4 \uD655\uC778 \uD504\uB86C\uD504\uD2B8\uB97C \uB9CC\uB4E4\uC5B4 \uC8FC\uB294 \uBC84\uD2BC\uC744 \uBAA8\uB4E0 \uAC8C\uC2DC\uBB3C\uC5D0 \uCD94\uAC00\uD569\uB2C8\uB2E4. AI \uACF5\uAE09\uC790\uB97C \uC124\uC815\uD558\uC9C0 \uC54A\uC558\uB2E4\uBA74 \uD504\uB86C\uD504\uD2B8\uB97C \uD074\uB9BD\uBCF4\uB4DC\uC5D0 \uBCF5\uC0AC\uD560 \uBFD0, \uC544\uBB34\uAC83\uB3C4 \uC804\uC1A1\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","t.co \uB9C1\uD06C \uD3BC\uCE58\uAE30","\uC9E7\uC740 \`t.co\` \uB9C1\uD06C\uB97C aria-label\uACFC title\uC5D0 \uC788\uB294 \uC2E4\uC81C \uC8FC\uC18C\uB85C \uBC14\uAFC9\uB2C8\uB2E4.","\uB9C1\uD06C\uC5D0\uC11C \uCD94\uC801 \uC815\uBCF4 \uC81C\uAC70","\uD0C0\uC784\uB77C\uC778 \uB9C1\uD06C\uC5D0\uC11C \uACF5\uC720 \uD1A0\uD070\uACFC \uCEA0\uD398\uC778 \uB9E4\uAC1C\uBCC0\uC218(utm_*, fbclid, X \uC790\uCCB4\uC758 t/s)\uB97C \uC81C\uAC70\uD574 \uBCF5\uC0AC\uD55C \uB0B4\uC6A9\uC774 \uC21C\uC218\uD55C \uC8FC\uC18C\uAC00 \uB418\uB3C4\uB85D \uD569\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C \uB9C1\uD06C\uB97C \uBCF5\uC0AC\uD560 \uD638\uC2A4\uD2B8","\uAC01 \uAC8C\uC2DC\uBB3C\uC5D0 \uC120\uD0DD\uD55C \uD638\uC2A4\uD2B8 \uAE30\uC900 \uC8FC\uC18C\uB97C \uBCF5\uC0AC\uD558\uB294 '\uB9C1\uD06C \uBCF5\uC0AC' \uBC84\uD2BC\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4. X\uAC00 \uB80C\uB354\uB9C1\uD55C \uAC83\uC740 \uC544\uBB34\uAC83\uB3C4 \uBC14\uAFB8\uC9C0 \uC54A\uACE0 \uC774\uB3D9\uB3C4 \uB9AC\uB514\uB809\uC158\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uBC14\uB00C\uB294 \uAC83\uC740 \uBCF5\uC0AC\uB418\uB294 \uBB38\uC790\uC5F4\uBFD0\uC785\uB2C8\uB2E4. X\uB85C \uB450\uBA74 \uBC84\uD2BC\uC774 \uC0AC\uB77C\uC9D1\uB2C8\uB2E4.","\uACC4\uC815 \uC0C9\uC0C1","\uD615\uC2DD: \uC0AC\uC6A9\uC790\uBA85: \uC0C9\uC0C1. \uD55C \uC904\uC5D0 \uD558\uB098\uC529. \uC0C9\uC0C1\uC740 amber, rose, violet, sky, green, slate\uC785\uB2C8\uB2E4. \uBE48 \uC904\uB85C \uB450\uBA74 \uD0DC\uADF8\uAC00 \uC0AD\uC81C\uB429\uB2C8\uB2E4.","\uACC4\uC815 \uBA54\uBAA8","\uD615\uC2DD: \uACC4\uC815: \uBA54\uBAA8. \uD55C \uC904\uC5D0 \uD558\uB098\uC529. \uBA54\uBAA8\uB97C \uBE44\uC6B0\uBA74 \uC0AD\uC81C\uB429\uB2C8\uB2E4.","\uACC4\uC815 \uBA54\uBAA8 \uBAA8\uB450 \uC9C0\uC6B0\uAE30","\uC800\uC7A5\uB41C \uBA54\uBAA8\uB97C \uBAA8\uB450 \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uC0C1\uC6A9\uAD6C","\uD55C \uC904\uC5D0 \uD558\uB098\uC529. \uC791\uC131\uAE30 \uB3C4\uAD6C \uBAA8\uC74C\uC5D0\uC11C \uC0BD\uC785\uD560 \uC218 \uC788\uB294 \uC7AC\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB2F5\uAE00\xB7\uD15C\uD50C\uB9BF\uC785\uB2C8\uB2E4.","\uC774 \uBE0C\uB77C\uC6B0\uC800\uC5D0 \uC800\uC7A5\uB41C \uAC8C\uC2DC\uBB3C\uC744 \uAC80\uC0C9\uD558\uACE0 \uAD00\uB9AC\uD569\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C \uB3C4\uAD6C","\uAE00\uC4F0\uAE30 \uB3C4\uAD6C","\uC800\uC7A5 \uACF5\uAC04 \uBC0F \uBCF4\uACE0\uC11C","\uB2E4\uC74C \uB0B4\uBCF4\uB0B4\uAE30\uB97C \uC704\uD574 \uD604\uC7AC \uD398\uC774\uC9C0\uC5D0 \uBCF4\uC774\uB294 \uAC8C\uC2DC\uBB3C\uC744 \uBAA8\uC544 \uB461\uB2C8\uB2E4.","\uC27C\uD45C\uB85C \uAD6C\uBD84\uD574 \uC785\uB825\uD569\uB2C8\uB2E4. \uC9C0\uC6D0 \uD615\uC2DD: json, csv, html, markdown, xlsx.","X\uAC00 \uC774 \uD0ED\uC5D0 \uBCF4\uB0B4\uB294 GraphQL \uC6D0\uBCF8 \uC751\uB2F5\uB3C4 \uC800\uC7A5\uD574 \uB098\uC911\uC5D0 \uB2E4\uC2DC \uD574\uC11D\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4. \uC800\uC7A5 \uC804\uC5D0 \uC138\uC158 \uD1A0\uD070\uC740 \uC81C\uAC70\uB429\uB2C8\uB2E4.","\uB0B4\uBCF4\uB0B4\uAE30\uC5D0\uC11C \uBBF8\uB514\uC5B4 \uBC14\uC774\uD2B8 \uCEA1\uCC98","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5 \uC911 \uBBF8\uB514\uC5B4\uB97C \uAC00\uC838\uC640 \uC131\uACF5\uD55C \uBC14\uC774\uD2B8\uB97C \uAE38\uC774\uC640 \uCCB4\uD06C\uC12C\uACFC \uD568\uAED8 \uD3EC\uD568\uD569\uB2C8\uB2E4. \uC2E4\uD328\uD55C \uD56D\uBAA9\uC740 \uC7AC\uC2DC\uB3C4 \uAC00\uB2A5\uD55C \uCC38\uC870\uB85C \uB0A8\uC2B5\uB2C8\uB2E4.","\uCFFC\uB9AC ID \uC790\uB3D9 \uAC80\uC0C9","\uBD88\uB7EC\uC628 \uC2A4\uD06C\uB9BD\uD2B8\uC5D0\uC11C X\uC758 GraphQL \uC791\uC5C5 ID\uB97C \uCC3E\uC544 \uB85C\uCEEC\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4.","\uBCF4\uD638\uB41C \uAC8C\uC2DC\uBB3C\uC744 \uACF5\uC720 \uB0B4\uBCF4\uB0B4\uAE30\uC5D0 \uD3EC\uD568","\uBA85\uC2DC\uC801\uC73C\uB85C \uD65C\uC131\uD654\uD560 \uB54C\uAE4C\uC9C0 \uBCF4\uD638\uB41C \uAC8C\uC2DC\uBB3C\uC740 HTML, Markdown, WARC, WACZ \uBC0F \uC815\uC801 \uBDF0\uC5B4 \uCD9C\uB825\uC5D0\uC11C \uC81C\uC678\uB429\uB2C8\uB2E4. JSON\uACFC CSV\uB294 \uBCF4\uAD00\uC6A9\uC73C\uB85C \uB0A8\uACE0 \uB300\uC0C1 \uD544\uB4DC\uB97C \uC720\uC9C0\uD569\uB2C8\uB2E4.","\uB300\uC0C1\uC744 \uC54C \uC218 \uC5C6\uB294 \uAC8C\uC2DC\uBB3C\uC744 \uACF5\uC720 \uB0B4\uBCF4\uB0B4\uAE30\uC5D0 \uD3EC\uD568","DOM\uC5D0\uB9CC \uC788\uB294 \uAE30\uB85D, \uAC00\uC838\uC628 \uAE30\uB85D \uBC0F \uC624\uB798\uB41C \uAE30\uB85D\uC740 \uBA85\uC2DC\uC801\uC73C\uB85C \uD65C\uC131\uD654\uD560 \uB54C\uAE4C\uC9C0 \uACF5\uC720\uC6A9 \uB0B4\uBCF4\uB0B4\uAE30\uC5D0\uC11C \uC81C\uC678\uB429\uB2C8\uB2E4. JSON\uACFC CSV\uB294 \uBCF4\uAD00\uC6A9\uC73C\uB85C \uB0A8\uC2B5\uB2C8\uB2E4.","\uC800\uC7A5 \uD3F4\uB354","\uB0B4\uBCF4\uB0B4\uAE30 ZIP\uC758 \uCD5C\uC0C1\uC704 \uD3F4\uB354\uC774\uC790 \uB2E4\uC6B4\uB85C\uB4DC \uC774\uB984 \uC55E\uC5D0 \uBD99\uC77C \uD3F4\uB354 \uC774\uB984(\uB610\uB294 \uACBD\uB85C).","{jobs}\uAC1C \uC791\uC5C5 \uCD94\uC801 \xB7 GraphQL ID {queries}\uAC1C \uCE90\uC2DC\uB428","\uB0B4\uBCF4\uB0B4\uAE30 \uC0C1\uD0DC","\uD45C\uC2DC\uB41C \uAC8C\uC2DC\uBB3C \uB0B4\uBCF4\uB0B4\uAE30","\uD604\uC7AC \uD45C\uC2DC\uB41C \uAC8C\uC2DC\uBB3C\uC744 \uBAA8\uC544 ZIP\uC73C\uB85C \uB0B4\uB824\uBC1B\uC2B5\uB2C8\uB2E4.","\uC9C4\uB2E8 \uC815\uBCF4 \uBCF5\uC0AC","\uC9C0\uC6D0\uC6A9 \uC9C4\uB2E8 \uC815\uBCF4(\uBC84\uC804, \uACBD\uB85C, \uCD5C\uADFC \uB85C\uADF8)\uB97C \uBCF5\uC0AC\uD569\uB2C8\uB2E4.","\uC6D0\uBCF8 WARC \uB610\uB294 \uC7AC\uC0DD \uC900\uBE44\uAC00 \uB41C WACZ\uB97C \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. WACZ\uB294 \uC544\uCE74\uC774\uBE0C \uBC0F \uC778\uB371\uC2A4 \uD56D\uBAA9\uC744 \uC555\uCD95\uD558\uC9C0 \uC54A\uACE0 \uBCF4\uAD00\uD569\uB2C8\uB2E4.","\uC608\uC0C1 WACZ \uD06C\uAE30: \uB808\uCF54\uB4DC {records}\uAC1C\uC5D0 {size}.","\uBCF4\uC874 \uC544\uCE74\uC774\uBE0C","\uBCF4\uC874 \uC544\uCE74\uC774\uBE0C \uC791\uC5C5","WARC","WACZ","\uCDE8\uC18C","replayweb.page \uC5F4\uAE30","Aviary \uC804\uC6A9 WACZ \uC99D\uBA85","Aviary \uC804\uC6A9 WACZ \uC99D\uBA85 \uC791\uC5C5","\uD0A4 \uC30D \uB0B4\uBCF4\uB0B4\uAE30","Markdown\uC73C\uB85C \uBCF5\uC0AC","\uC77C\uBC18 Markdown \uACB0\uACFC\uB97C \uD074\uB9BD\uBCF4\uB4DC\uC5D0 \uBCF5\uC0AC\uD569\uB2C8\uB2E4.","Obsidian\uC6A9 Markdown \uC800\uC7A5","YAML \uBA38\uB9AC\uB9D0\uACFC Aviary \uD0DC\uADF8\uAC00 \uD3EC\uD568\uB41C Markdown.","Notion\uC6A9 Markdown \uC800\uC7A5","Notion\uC774 \uAE54\uB054\uD558\uAC8C \uAC00\uC838\uC624\uB294 \uC81C\uBAA9 \uC911\uC2EC Markdown.","\uAE30\uB85D\uC744 JSON\uC73C\uB85C \uC800\uC7A5","ZIP\uC73C\uB85C \uBB36\uC9C0 \uC54A\uC740 \uC6D0\uBCF8 ExportRecord[] JSON.","ZIP\uB2F9 \uAE30\uB85D \uC218","\uAE34 \uB0B4\uBCF4\uB0B4\uAE30\uB97C \uD558\uB098\uC758 \uAC70\uB300\uD55C \uD30C\uC77C \uB300\uC2E0 \uC5EC\uB7EC \uC544\uCE74\uC774\uBE0C\uB85C \uB098\uB215\uB2C8\uB2E4(25~1000).","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5 \uCD5C\uB300 \uC218","\uCD5C\uC2E0 \uC791\uC5C5\uC744 \uC720\uC9C0\uD569\uB2C8\uB2E4. 0\uC740 \uBB34\uC81C\uD55C\uC785\uB2C8\uB2E4.","\uC791\uC5C5\uB2F9 \uAE30\uB85D \uCD5C\uB300 \uC218","\uAC01 \uC791\uC5C5\uC758 \uCD5C\uC2E0 \uAE30\uB85D\uC744 \uC720\uC9C0\uD569\uB2C8\uB2E4. 0\uC740 \uBB34\uC81C\uD55C\uC785\uB2C8\uB2E4.","\uB0B4\uBCF4\uB0B4\uAE30 \uBCF4\uAD00 \uAE30\uAC04(\uC77C)","\uC2DC\uC791\uD560 \uB54C \uC624\uB798\uB41C \uC791\uC5C5\uC744 \uC9C0\uC6C1\uB2C8\uB2E4. 0\uC774\uBA74 \uAE30\uAC04 \uAE30\uC900 \uC815\uB9AC\uB97C \uB055\uB2C8\uB2E4.","\uD398\uC774\uC9C0\uC758 \uAC8C\uC2DC\uBB3C\uC744 \uCEA1\uCC98\uD558\uACE0 \uD734\uB300 \uAC00\uB2A5\uD55C \uC0AC\uBCF8\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4.","\uCEA1\uCC98","\uD328\uD0A4\uC9C0","\uB300\uC0C1","\uC791\uC5C5","\uBCF4\uC874","\uC0AD\uC81C\uD560 \uD56D\uBAA9","\uC120\uD0DD\uD55C \uD65C\uB3D9\uC740 \uBD81\uB9C8\uD06C, \uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694, \uC7AC\uAC8C\uC2DC\uBB3C, \uB2F5\uAE00, \uAC8C\uC2DC\uBB3C \uC21C\uC11C\uB85C \uC0AD\uC81C\uB429\uB2C8\uB2E4.","\uBD81\uB9C8\uD06C","X \uAE30\uB85D\uC5D0\uC11C \uC800\uC7A5\uD55C \uAC8C\uC2DC\uBB3C\uC744 \uC81C\uAC70\uD569\uB2C8\uB2E4.","X \uAE30\uB85D\uC5D0\uC11C \uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694\uB97C \uC81C\uAC70\uD569\uB2C8\uB2E4.","\uC7AC\uAC8C\uC2DC \uD0ED\uC5D0\uC11C \uC7AC\uAC8C\uC2DC\uB97C \uCDE8\uC18C\uD569\uB2C8\uB2E4.","\uC6D0\uBCF8 \uAC8C\uC2DC\uBB3C\uC740 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uACE0 \uB0B4\uAC00 \uC791\uC131\uD55C \uB2F5\uAE00\uB9CC \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C","\uB0B4\uAC00 \uC791\uC131\uD55C \uAC8C\uC2DC\uBB3C\uACFC \uC778\uC6A9 \uAC8C\uC2DC\uBB3C\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uBBF8\uB9AC\uBCF4\uAE30\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. X \uACC4\uC815 \uB370\uC774\uD130\uB294 \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.","\uC0AD\uC81C\uD55C \uAC8C\uC2DC\uBB3C\uACFC \uB2F5\uAE00\uC740 \uBCF5\uC6D0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC81C\uAC70\uD55C \uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694, \uC7AC\uAC8C\uC2DC\uBB3C, \uBD81\uB9C8\uD06C\uB3C4 Aviary\uC5D0\uC11C \uB418\uB3CC\uB9B4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC2E4\uD589","\uACE0\uAE09 \uC635\uC158","\uC0AD\uC81C \uC18D\uB3C4\uB97C \uBCC0\uACBD\uD558\uAC70\uB098 \uC815\uD574\uC9C4 \uC791\uC5C5 \uC218 \uC774\uD6C4\uC5D0 \uC77C\uC2DC \uC911\uC9C0\uD569\uB2C8\uB2E4.","\uC18D\uB3C4","\uACC4\uC815 \uC791\uC5C5 \uC0AC\uC774\uC5D0 \uBB34\uC791\uC704 \uB300\uAE30 \uC2DC\uAC04\uC744 \uCD94\uAC00\uD558\uACE0 \uAC01 \uBB36\uC74C \uB4A4\uC5D0\uB294 \uB354 \uAE38\uAC8C \uC27D\uB2C8\uB2E4.","\uC2E0\uC911\uD558\uAC8C","\uBE60\uB974\uAC8C","\uBB36\uC74C\uB2F9 \uC791\uC5C5 \uC218","\uC774 \uAC1C\uC218\uB9CC\uD07C \uCC98\uB9AC\uD55C \uB4A4 \uC77C\uC2DC \uC911\uC9C0\uD569\uB2C8\uB2E4. \uC81C\uD55C\uD558\uC9C0 \uC54A\uC73C\uB824\uBA74 0\uC744 \uC0AC\uC6A9\uD558\uC138\uC694. \uB2E4\uC2DC \uC2DC\uC791\uD558\uBA74 \uC0C8 \uBB36\uC74C\uC774 \uC2DC\uC791\uB429\uB2C8\uB2E4.","\uD65C\uB3D9\uC744 \uC120\uD0DD\uD558\uACE0 \uC2E4\uD589\uC744 \uB204\uB974\uC138\uC694. \uC0AD\uC81C\uAC00 \uC989\uC2DC \uC2DC\uC791\uB429\uB2C8\uB2E4.","\uB3CC\uC544\uBCF4\uAE30\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4","\uD544\uD130\uB9C1\uC5D0\uC11C \uC774\uBBF8 \uBCF8 \uAC8C\uC2DC\uBB3C \uD750\uB9AC\uAC8C \uD45C\uC2DC\uB97C \uCF1C\uC138\uC694. \uB3CC\uC544\uBCF4\uAE30\uB294 Aviary\uAC00 \uC774\uBBF8 \uB80C\uB354\uB9C1\uD55C \uD589\uB9CC \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uD3EC\uD568 \uB0B4\uC6A9","\uD65C\uC131 \uBE0C\uB77C\uC6B0\uC800 \uD504\uB85C\uD544\uC5D0\uC11C Aviary\uAC00 \uBCF8 \uBAA8\uB4E0 \uB0B4\uC6A9\uC785\uB2C8\uB2E4. \uD544\uD130\uB9C1\uB41C \uAC8C\uC2DC\uBB3C\uC5D0\uB294 \uD65C\uC131 \uADDC\uCE59\uC774 \uAE30\uB85D\uD55C \uC774\uC720\uAC00 \uB0A8\uC2B5\uB2C8\uB2E4.","X\uC5D0 \uCD94\uAC00 \uC694\uCCAD\uC744 \uBCF4\uB0B4\uC9C0 \uC54A\uACE0 Aviary\uAC00 \uC774\uBBF8 \uBCF8 \uAC8C\uC2DC\uBB3C\uC744 \uAC80\uD1A0\uD569\uB2C8\uB2E4.","\uC228\uAE30\uAE30 \uBC84\uD2BC\uC740 \uC704 \uC124\uC815\uC744 \uB530\uB985\uB2C8\uB2E4.","\uB2EB\uC740 \uAC8C\uC2DC\uBB3C \uC228\uAE30\uAE30","\uC228\uAE34 \uAC8C\uC2DC\uBB3C\uC744 \uC811\uC5B4 \uB450\uC5B4 \uB2E4\uC74C \uAC8C\uC2DC\uBB3C\uC774 \uC704\uB85C \uC62C\uB77C\uC624\uAC8C \uD569\uB2C8\uB2E4.","\uC228\uAE30\uAE30 \uBC84\uD2BC \uD45C\uC2DC","\uAC01 \uAC8C\uC2DC\uBB3C\uC758 \uB354\uBCF4\uAE30 \uBA54\uB274 \uC606\uC5D0 \uC228\uAE30\uAE30 \uBC84\uD2BC\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.","\uC228\uAE30\uAE30 \uBC84\uD2BC \uC0C1\uD0DC","'\uB2EB\uC740 \uAC8C\uC2DC\uBB3C \uC228\uAE30\uAE30'\uB97C \uCF1C\uBA74 \uD65C\uC131\uD654\uB429\uB2C8\uB2E4.","\uC228\uAE30\uAE30 \uAE30\uB2A5\uACFC \uBC84\uD2BC\uC744 \uC801\uC6A9\uD560 \uD398\uC774\uC9C0.","\uAE30\uC5B5\uD560 \uAC8C\uC2DC\uBB3C \uCD5C\uB300 \uC218","\uC774 \uAC1C\uC218(100~50000)\uB97C \uB118\uC73C\uBA74 \uC624\uB798\uB41C \uD56D\uBAA9\uBD80\uD130 \uC0AD\uC81C\uB429\uB2C8\uB2E4.","\uC800\uC7A5\uB41C \uC228\uAE34 \uAC8C\uC2DC\uBB3C","\uB9C8\uC9C0\uB9C9 \uC228\uAE30\uAE30 \uCDE8\uC18C","\uAC00\uC7A5 \uCD5C\uADFC\uC5D0 \uC228\uAE34 \uAC8C\uC2DC\uBB3C\uC744 \uB418\uB3CC\uB9BD\uB2C8\uB2E4.","\uBCF5\uC6D0","\uC228\uAE34 \uAC8C\uC2DC\uBB3C \uC9C0\uC6B0\uAE30","\uC228\uAE34 \uAC8C\uC2DC\uBB3C\uC744 \uBAA8\uB450 \uC78A\uACE0 \uB418\uB3CC\uB9BD\uB2C8\uB2E4.","\uC228\uAE34 \uAC8C\uC2DC\uBB3C\uC744 \uACC4\uC18D \uC228\uAE38 \uC704\uCE58\uB97C \uC120\uD0DD\uD558\uAC70\uB098 \uB2E4\uC2DC \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC801\uC6A9 \uBC94\uC704","\uBCF4\uC874","\uBCF5\uAD6C","\uD654\uBA74 \uBC16\uC73C\uB85C \uB098\uAC04 \uB3D9\uC601\uC0C1 \uC77C\uC2DC\uC815\uC9C0","\uD0C0\uC784\uB77C\uC778 \uB3D9\uC601\uC0C1\uC774 \uD654\uBA74 \uBC16\uC73C\uB85C \uB098\uAC00\uBA74 \uB514\uCF54\uB529\uC744 \uBA48\uCD94\uACE0, \uB2E4\uC2DC \uBCF4\uC774\uBA74 \uC7AC\uC0DD\uD569\uB2C8\uB2E4. \uC9C1\uC811 \uC77C\uC2DC\uC815\uC9C0\uD55C \uB3D9\uC601\uC0C1\uC740 \uADF8\uB300\uB85C \uC720\uC9C0\uB429\uB2C8\uB2E4.","\uD0ED\uC774 \uBE44\uD65C\uC131\uD654\uB418\uC5B4\uB3C4 \uB3D9\uC601\uC0C1 \uACC4\uC18D \uC7AC\uC0DD","X\uB294 \uD0ED\uC744 \uC804\uD658\uD558\uBA74 \uC7AC\uC0DD \uC911\uC778 \uB3D9\uC601\uC0C1\uC744 \uBA48\uCDA5\uB2C8\uB2E4. \uC774 \uC124\uC815\uC740 \uB3CC\uC544\uC654\uC744 \uB54C \uB2E4\uC2DC \uC7AC\uC0DD\uD569\uB2C8\uB2E4. \uC9C1\uC811 \uC77C\uC2DC\uC815\uC9C0\uD55C \uB3D9\uC601\uC0C1\uC740 \uADF8\uB300\uB85C \uBA48\uCDB0 \uC788\uC2B5\uB2C8\uB2E4.","\uB3D9\uC601\uC0C1 \uBC18\uBCF5 \uC7AC\uC0DD","\uB3D9\uC601\uC0C1\uC774 \uB05D\uB098\uBA74 \uBA48\uCD94\uC9C0 \uC54A\uACE0 \uCC98\uC74C\uBD80\uD130 \uB2E4\uC2DC \uC7AC\uC0DD\uD569\uB2C8\uB2E4.","\uB3D9\uC601\uC0C1 \uC7AC\uC0DD\uBAA9\uB85D\uC744 \uCD5C\uACE0 \uD654\uC9C8\uB85C \uACE0\uC815","\uC5EC\uB7EC \uD654\uC9C8\uC774 \uB2F4\uAE34 \uC7AC\uC0DD\uBAA9\uB85D\uC774 Aviary\uC5D0 \uC804\uB2EC\uB418\uBA74 \uAC00\uC7A5 \uB192\uC740 \uD654\uC9C8\uB9CC \uB0A8\uAE41\uB2C8\uB2E4. \uBE60\uB978 \uC5F0\uACB0\uC5D0\uC11C\uB3C4 X\uB294 \uCD5C\uACE0 \uD654\uC9C8\uBCF4\uB2E4 \uB0AE\uC740 \uAC12\uC744 \uC120\uD0DD\uD558\uB294 \uACBD\uC6B0\uAC00 \uB9CE\uC2B5\uB2C8\uB2E4. \uB370\uC774\uD130 \uC0AC\uC6A9\uB7C9\uC774 \uB298\uC5B4\uB098\uBA70, Aviary\uAC00 \uC2E4\uC81C\uB85C \uBCF8 \uC7AC\uC0DD\uBAA9\uB85D\uC5D0\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4.","\uB3D9\uC601\uC0C1\uC774 \uD654\uBA74 \uBC16\uC73C\uB85C \uB098\uAC00\uBA74 \uC77C\uC2DC \uC911\uC9C0\uD569\uB2C8\uB2E4.","\uC7AC\uC0DD","{count}\uAC1C \xB7 \uCD5C\uADFC {kind} {latestCount}\uAC1C @ {at}","\uC800\uC7A5\uB41C \uC2A4\uB0C5\uC0F7","\uC774 \uD654\uBA74\uC5D0\uC11C \uD314\uB85C\uC6CC \uC218\uC9D1","\uD604\uC7AC \uD398\uC774\uC9C0\uC758 UserCell \uD589\uC744 \uD6D1\uC2B5\uB2C8\uB2E4. \uBA3C\uC800 /\uACC4\uC815/followers \uD654\uBA74\uC744 \uC5EC\uC138\uC694.","\uC774 \uD654\uBA74\uC5D0\uC11C \uD314\uB85C\uC789 \uC218\uC9D1","\uD604\uC7AC \uD398\uC774\uC9C0\uC758 UserCell \uD589\uC744 \uD6D1\uC2B5\uB2C8\uB2E4. \uBA3C\uC800 /\uACC4\uC815/following \uD654\uBA74\uC744 \uC5EC\uC138\uC694.","\uC2A4\uB0C5\uC0F7 \uBAA8\uB450 \uC9C0\uC6B0\uAE30","\uC800\uC7A5\uB41C \uD314\uB85C\uC6CC\xB7\uD314\uB85C\uC789 \uC2A4\uB0C5\uC0F7\uC744 \uBAA8\uB450 \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uACF5\uC2DD X \uC544\uCE74\uC774\uBE0C \uAC00\uC838\uC624\uAE30","x.com\uC5D0\uC11C \uB0B4\uBCF4\uB0B8 ZIP\uC744 \uC120\uD0DD\uD558\uC138\uC694. STORE \uBC0F DEFLATE \uD56D\uBAA9\uC744 \uC9C0\uC6D0\uD558\uBA70, \uC7AC\uAC1C \uAC00\uB2A5\uD55C \uB3D9\uC548 \uC6D0\uBCF8\uC740 \uB85C\uCEEC\uC5D0 \uC720\uC9C0\uB429\uB2C8\uB2E4.","\uCEA1\uCC98\uD55C \uB808\uCF54\uB4DC \uAC80\uC0C9","\uCD5C\uADFC \uB0B4\uBCF4\uB0B4\uAE30 \uC218\uC9D1 \uC2E4\uD589\uC5D0\uC11C \uC804\uCCB4 \uD14D\uC2A4\uD2B8\uB97C \uAC80\uC0C9\uD569\uB2C8\uB2E4.","@\uD578\uB4E4, \uD0A4\uC6CC\uB4DC, \uBB38\uAD6C\u2026","\uB0B4\uBCF4\uB0B4\uAE30 \uC2E4\uD589\uC5D0\uC11C \uCEA1\uCC98\uD55C \uB808\uCF54\uB4DC\uB97C \uAC80\uC0C9\uD558\uB824\uBA74 \uC785\uB825\uD558\uC138\uC694.","Markdown \uBCF4\uACE0\uC11C \uB0B4\uB824\uBC1B\uAE30","\uAC10\uC0AC \uB85C\uADF8, \uC2A4\uB0C5\uC0F7 \uBE44\uAD50, \uC815\uB9AC \uBBF8\uB9AC\uBCF4\uAE30.","{total}\uAC1C \xB7 \uB300\uAE30 {queued} \xB7 \uC2B9\uC778 {approved} \xB7 \uAC74\uB108\uB700 {skipped}","\uC815\uB9AC \uAC80\uD1A0 \uB300\uAE30\uC5F4","\uD30C\uAD34\uC801\uC778 \uC791\uC5C5","Aviary\uB294 \uAC8C\uC2DC\uBB3C\xB7\uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694\xB7\uD314\uB85C\uC6B0\uB97C \uC0AD\uC81C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC774 \uB300\uAE30\uC5F4\uC740 \uAC80\uD1A0\uC6A9 \uBAA9\uB85D\uC774\uBA70, \uC2B9\uC778\uD558\uAC70\uB098 \uAC74\uB108\uB6F0\uC5B4\uB3C4 \uAC10\uC0AC \uB85C\uADF8\uC5D0\uB9CC \uAE30\uB85D\uB429\uB2C8\uB2E4.","\uC815\uB9AC \uBBF8\uB9AC\uBCF4\uAE30\uB97C \uB300\uAE30\uC5F4\uC5D0 \uCD94\uAC00","\uCD5C\uADFC \uC815\uB9AC \uBBF8\uB9AC\uBCF4\uAE30\uC5D0\uC11C \uBCF4\uD638\uB418\uC9C0 \uC54A\uC740 \uD6C4\uBCF4\uB97C \uBAA8\uB450 \uB300\uAE30\uC5F4\uC5D0 \uCD94\uAC00\uD569\uB2C8\uB2E4(\uD30C\uAD34\uC801\uC778 \uC791\uC5C5 \uC5C6\uC74C).","\uC815\uB9AC \uB300\uAE30\uC5F4 \uBE44\uC6B0\uAE30","\uACC4\uC815 \uB370\uC774\uD130\uB97C \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uACE0 \uB300\uAE30\uC5F4 \uD56D\uBAA9\uC744 \uBAA8\uB450 \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uACF5\uC2DD X \uC544\uCE74\uC774\uBE0C\uB97C \uAC00\uC838\uC624\uAC70\uB098 \uD314\uB85C\uC6CC \uC2A4\uB0C5\uC0F7\uC744 \uBE44\uAD50\uD569\uB2C8\uB2E4.","\uC2E4\uC2DC\uAC04 \uC2A4\uB0C5\uC0F7","Aria2\uB85C \uB118\uAE30\uAE30","\uD070 \uBBF8\uB514\uC5B4 \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uC9C1\uC811 \uC6B4\uC601\uD558\uB294 Aria2 JSON-RPC \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB85C \uBCF4\uB0C5\uB2C8\uB2E4.","Aria2 \uC5D4\uB4DC\uD3EC\uC778\uD2B8","http://localhost:6800 (\uB05D\uC5D0 \uC2AC\uB798\uC2DC \uBD88\uD544\uC694)","Aria2 RPC \uC2DC\uD06C\uB9BF","token: \uC778\uC99D\uC5D0 \uC4F0\uB294 \uACF5\uC720 \uC2DC\uD06C\uB9BF(\uC120\uD0DD).","\uD45C\uC2DC","\uC774 \uD06C\uAE30\uB97C \uB118\uC73C\uBA74 \uC804\uB2EC (MB)","\uC774\uBCF4\uB2E4 \uC791\uC740 \uD30C\uC77C\uC740 \uBE0C\uB77C\uC6B0\uC800\uB85C \uC800\uC7A5\uD569\uB2C8\uB2E4. Aviary\uAC00 \uBA3C\uC800 \uD06C\uAE30\uB97C \uD655\uC778\uD558\uBA70, \uC11C\uBC84\uAC00 \uD06C\uAE30\uB97C \uC54C\uB824\uC8FC\uC9C0 \uC54A\uC73C\uBA74 \uADF8\uB300\uB85C \uC804\uB2EC\uD569\uB2C8\uB2E4.","Aria2 \uC5F0\uACB0 \uD14C\uC2A4\uD2B8","\uAC04\uB2E8\uD55C JSON-RPC \uD638\uCD9C\uC744 \uBCF4\uB0C5\uB2C8\uB2E4.","Aria2 \uD65C\uC131 \uB2E4\uC6B4\uB85C\uB4DC","\uC0C8\uB85C \uACE0\uCCD0 \uC9C4\uD589 \uC911\uC778 \uC804\uC1A1\uC744 \uB098\uC5F4\uD569\uB2C8\uB2E4. \uCDE8\uC18C\uB97C \uB20C\uB7EC \uC911\uB2E8\uD558\uC138\uC694.","\uC0C8\uB85C \uACE0\uCE68","\uB85C\uCEEC yt-dlp\uB85C \uB118\uAE30\uAE30","\uC778\uC99D\uB41C \uB85C\uCEEC \uB3C4\uC6B0\uBBF8\uAC00 \uC2E4\uD589 \uC911\uC77C \uB54C \uB354 \uB192\uC740 \uD488\uC9C8\uC758 \uC801\uC751\uD615 \uC800\uC7A5\uC744 \uC81C\uC548\uD569\uB2C8\uB2E4.","yt-dlp \uB3C4\uC6B0\uBBF8 \uC5D4\uB4DC\uD3EC\uC778\uD2B8","http://127.0.0.1:8787 (\uB8E8\uD504\uBC31 \uC804\uC6A9)","yt-dlp \uB3C4\uC6B0\uBBF8 \uBE44\uBC00 \uAC12","\uB85C\uCEEC \uD504\uB85C\uC138\uC2A4\uC640 \uACF5\uC720\uD558\uB294 AVIARY_YTDLP_TOKEN\uC785\uB2C8\uB2E4.","Bluesky \uAD50\uCC28 \uAC8C\uC2DC","\uC791\uC131\uCC3D\uC758 \uAE00\uC744 \uD544\uC694\uD560 \uB54C Bluesky \uACC4\uC815\uC5D0 \uC62C\uB9BD\uB2C8\uB2E4.","Bluesky \uC11C\uBE44\uC2A4 URL","\uAE30\uBCF8\uAC12: https://bsky.social","Bluesky \uACC4\uC815","\uB0B4 \uACC4\uC815(@ \uC5C6\uC774, \uC608: you.bsky.social)","Bluesky \uC571 \uBE44\uBC00\uBC88\uD638","\uACC4\uC815 \uC124\uC815\uC5D0\uC11C \uBC1C\uAE09\uD55C \uC571 \uBE44\uBC00\uBC88\uD638. \uAE30\uBCF8 \uBE44\uBC00\uBC88\uD638\uB294 \uC4F0\uC9C0 \uB9C8\uC138\uC694.","Mastodon \uAD50\uCC28 \uAC8C\uC2DC","\uC791\uC131\uCC3D\uC758 \uAE00\uC744 \uD544\uC694\uD560 \uB54C Mastodon \uACC4\uC815\uC5D0 \uC62C\uB9BD\uB2C8\uB2E4.","Mastodon \uC778\uC2A4\uD134\uC2A4","https://mastodon.social","Mastodon \uC561\uC138\uC2A4 \uD1A0\uD070","write:statuses \uBC94\uC704\uB97C \uAC00\uC9C4 \uBCA0\uC5B4\uB7EC \uD1A0\uD070.","\uCD5C\uADFC \uB2E4\uC6B4\uB85C\uB4DC \uCCA8\uBD80","\uAD50\uCC28 \uAC8C\uC2DC\uC758 \uCCAB \uAE00\uC5D0 Aviary\uC5D0\uC11C \uB9C8\uC9C0\uB9C9\uC73C\uB85C \uC131\uACF5\uD55C \uBBF8\uB514\uC5B4 \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uCCA8\uBD80\uD569\uB2C8\uB2E4.","\uC2A4\uB808\uB4DC\uB85C \uD06C\uB85C\uC2A4\uD3EC\uC2A4\uD2B8","\uBE48 \uC904\uC744 \uAE30\uC900\uC73C\uB85C \uB098\uB204\uACE0 \uAC01 \uC138\uADF8\uBA3C\uD2B8\uB97C \uC774\uC804 \uAC8C\uC2DC\uBB3C\uC5D0 \uB2F5\uAE00\uB85C \uBCF4\uB0C5\uB2C8\uB2E4.","\uC791\uC131\uCC3D\uC744 Bluesky\uB85C","\uD604\uC7AC \uC791\uC131\uCC3D\uC758 \uAE00\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC791\uC131\uCC3D\uC744 Mastodon\uC73C\uB85C","AI \uC81C\uACF5\uC790 \uC2E4\uD589","AI \uBA85\uB839 \uBA54\uB274\uAC00 \uC124\uC815\uD55C \uC81C\uACF5\uC790\uC5D0\uAC8C \uD504\uB86C\uD504\uD2B8\uB97C \uBCF4\uB0BC \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.","AI \uC81C\uACF5\uC790","Anthropic Messages API","OpenAI Chat Completions","OpenAI \uD638\uD658(LocalAI, Ollama \uD504\uB85D\uC2DC \uB4F1)","AI \uC5D4\uB4DC\uD3EC\uC778\uD2B8(\uC120\uD0DD)","\uC120\uD0DD\uD55C \uC81C\uACF5\uC790\uC758 \uAE30\uBCF8 \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB97C \uB300\uCCB4\uD569\uB2C8\uB2E4.","AI \uBAA8\uB378","\uC608: claude-sonnet-4-6, gpt-4o, llama3.1:8b","AI API \uD0A4","\uB85C\uCEEC\uC5D0\uB9CC \uC800\uC7A5\uB429\uB2C8\uB2E4. Aviary\uB294 \uC124\uC815\uD55C \uC81C\uACF5\uC790\uC758 \uC778\uC99D \uD5E4\uB354 \uC678\uC5D0\uB294 \uC774 \uAC12\uC744 \uBCF4\uB0B4\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD5C8\uC6A9\uB428","\uB124\uD2B8\uC6CC\uD06C \uC0C1\uD0DC","AI \uB300\uC0C1","AI \uB370\uC774\uD130 \uACF5\uAC1C","\uBCF4\uB0B4\uAE30 \uC804\uC5D0 Aviary\uB294 \uC81C\uACF5\uC790, \uC5D4\uB4DC\uD3EC\uC778\uD2B8, \uD544\uB4DC, \uBB38\uC790/\uD1A0\uD070 \uC608\uC0C1\uCE58, \uBCF4\uC874 \uBC0F \uC608\uC0B0 \uC0C1\uD0DC\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC624\uB298\uC758 AI \uC0AC\uC6A9\uB7C9","AI \uC694\uCCAD \uCD5C\uB300 \uBC14\uC774\uD2B8","UTF-8 \uBCF8\uBB38\uC774 \uC774 \uD06C\uAE30\uB97C \uB118\uB294 AI \uC694\uCCAD\uC740 \uC804\uC1A1 \uC804\uC5D0 \uC911\uB2E8\uD569\uB2C8\uB2E4. 0\uC73C\uB85C \uC124\uC815\uD558\uBA74 \uBAA8\uB4E0 AI \uC694\uCCAD\uC744 \uCC28\uB2E8\uD569\uB2C8\uB2E4.","AI \uC77C\uC77C \uC694\uCCAD \uBC14\uC774\uD2B8","\uB85C\uCEEC \uB0A0\uC9DC \uAE30\uC900\uC73C\uB85C \uC774\uB9CC\uD07C\uC758 UTF-8 \uC694\uCCAD \uBC14\uC774\uD2B8\uC5D0 \uB3C4\uB2EC\uD558\uBA74 AI \uACF5\uAE09\uC790 \uD638\uCD9C\uC744 \uC911\uB2E8\uD569\uB2C8\uB2E4. 0\uC73C\uB85C \uC124\uC815\uD558\uBA74 \uBAA8\uB4E0 AI \uC694\uCCAD\uC744 \uCC28\uB2E8\uD569\uB2C8\uB2E4.","\uC758\uBBF8 \uAE30\uBC18 \uAC80\uC0C9","\uC720\uC0AC\uB3C4 \uAC80\uC0C9\uC744 \uC704\uD574 \uCEA1\uCC98\uD55C \uB808\uCF54\uB4DC \uD14D\uC2A4\uD2B8\uB97C \uC124\uC815\uB41C \uC784\uBCA0\uB529 \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB85C \uBCF4\uB0C5\uB2C8\uB2E4. \uB300\uC0C1, \uD544\uB4DC, \uBCF4\uC874 \uBC0F \uBC14\uC774\uD2B8 \uC608\uC0B0\uC744 \uC5EC\uAE30\uC11C \uD655\uC778\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC784\uBCA0\uB529 \uC5D4\uB4DC\uD3EC\uC778\uD2B8","{data: [{embedding: number[]}]}\uB97C \uBC18\uD658\uD558\uB294 POST \uC5D4\uB4DC\uD3EC\uC778\uD2B8","\uC784\uBCA0\uB529 \uBAA8\uB378","\uC608: text-embedding-3-small","\uC784\uBCA0\uB529 API \uD0A4","\uB85C\uCEEC\uC5D0 \uC800\uC7A5\uB418\uBA70 Authorization \uD5E4\uB354\uB85C\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uAD6C\uC131\uB418\uC9C0 \uC54A\uC74C","\uC784\uBCA0\uB529 \uB300\uC0C1","\uC784\uBCA0\uB529 \uB370\uC774\uD130 \uACF5\uAC1C","\uC694\uCCAD\uC5D0\uB294 \uBAA8\uB378\uACFC \uCEA1\uCC98\uD55C \uB808\uCF54\uB4DC \uD14D\uC2A4\uD2B8\uAC00 \uD3EC\uD568\uB429\uB2C8\uB2E4. \uBCA1\uD130\uC640 \uC81C\uD55C\uB41C \uD14D\uC2A4\uD2B8\uB294 Aviary\uC758 \uB85C\uCEEC \uC778\uB371\uC2A4\uC5D0 \uBCF4\uAD00\uB418\uBA70 \uC81C\uACF5\uC790 \uBCF4\uC874 \uC815\uCC45\uC744 \uB530\uB985\uB2C8\uB2E4.","\uC624\uB298\uC758 \uC784\uBCA0\uB529 \uC0AC\uC6A9\uB7C9","\uC784\uBCA0\uB529 \uB808\uCF54\uB4DC \uCD5C\uB300 \uBC14\uC774\uD2B8","UTF-8 \uBCF8\uBB38\uC774 \uC774 \uD06C\uAE30\uB97C \uB118\uB294 \uB808\uCF54\uB4DC\uB294 \uC804\uC1A1 \uC804\uC5D0 \uC911\uB2E8\uD569\uB2C8\uB2E4. 0\uC73C\uB85C \uC124\uC815\uD558\uBA74 \uBAA8\uB4E0 \uC784\uBCA0\uB529 \uD638\uCD9C\uC744 \uCC28\uB2E8\uD569\uB2C8\uB2E4.","\uC784\uBCA0\uB529 \uC77C\uC77C \uB808\uCF54\uB4DC \uBC14\uC774\uD2B8","\uB85C\uCEEC \uB0A0\uC9DC \uAE30\uC900\uC73C\uB85C \uC774\uB9CC\uD07C\uC758 UTF-8 \uB808\uCF54\uB4DC \uBC14\uC774\uD2B8\uC5D0 \uB3C4\uB2EC\uD558\uBA74 \uC784\uBCA0\uB529 \uD638\uCD9C\uC744 \uC911\uB2E8\uD569\uB2C8\uB2E4. 0\uC73C\uB85C \uC124\uC815\uD558\uBA74 \uBAA8\uB4E0 \uC784\uBCA0\uB529 \uD638\uCD9C\uC744 \uCC28\uB2E8\uD569\uB2C8\uB2E4.","\uB0B4\uBCF4\uB0BC \uB54C\uB9C8\uB2E4 \uC790\uB3D9 \uC784\uBCA0\uB529","\uD65C\uC131\uD654\uD558\uAE30 \uC804\uC5D0 \uC704\uC758 \uC5D4\uB4DC\uD3EC\uC778\uD2B8, \uCEA1\uCC98\uD55C \uB808\uCF54\uB4DC \uD544\uB4DC, \uB85C\uCEEC \uBCF4\uC874 \uBC0F \uC77C\uC77C \uBC14\uC774\uD2B8 \uC608\uC0B0\uC744 \uD655\uC778\uD558\uC138\uC694. \uAC01 \uB0B4\uBCF4\uB0B4\uAE30 \uD6C4 \uBC31\uADF8\uB77C\uC6B4\uB4DC\uC5D0\uC11C \uC784\uBCA0\uB529\uD569\uB2C8\uB2E4. \uAE30\uBCF8\uAC12\uC740 \uAEBC\uC9D0\uC785\uB2C8\uB2E4.","\uC758\uBBF8 \uC0C9\uC778 \uB2E4\uC2DC \uB9CC\uB4E4\uAE30","\uC218\uC9D1\uD55C \uBAA8\uB4E0 \uAE30\uB85D\uC744 \uC784\uBCA0\uB529\uD569\uB2C8\uB2E4. \uCE90\uC2DC\uB41C \uD56D\uBAA9\uC740 \uAC74\uB108\uB6F0\uBBC0\uB85C \uB2E4\uC2DC \uC2E4\uD589\uD574\uB3C4 \uBD80\uB2F4\uC774 \uC801\uC2B5\uB2C8\uB2E4.","\uCEA1\uCC98\uD55C \uB808\uCF54\uB4DC\uC758 \uBCA1\uD130 \uC720\uC0AC\uB3C4\uC785\uB2C8\uB2E4. \uC784\uBCA0\uB529\uC740 \uD544\uC694\uD560 \uB54C \uC2E4\uD589\uB429\uB2C8\uB2E4.","\uCC3E\uB294 \uB0B4\uC6A9\uC744 \uC124\uBA85\uD558\uC138\uC694\u2026","\uC758\uBBF8 \uC0C9\uC778 \uC9C0\uC6B0\uAE30","\uC784\uBCA0\uB529\uB41C \uAE30\uB85D\uC744 \uBAA8\uB450 \uC78A\uC2B5\uB2C8\uB2E4.","AI \uBC0F \uC784\uBCA0\uB529 \uC0AC\uC6A9\uB7C9 \uC9C0\uC6B0\uAE30","\uB85C\uCEEC \uC694\uCCAD \uCE74\uC6B4\uD130\uB9CC \uC9C0\uC6C1\uB2C8\uB2E4. \uC2DC\uB9E8\uD2F1 \uC778\uB371\uC2A4\uB098 \uC81C\uACF5\uC790 \uC790\uACA9 \uC99D\uBA85\uC740 \uC0AD\uC81C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uCF1C\uC9D0","\uAEBC\uC9D0","\uAD6C\uC131\uB428","\uC5D4\uB4DC\uD3EC\uC778\uD2B8 \uC5C6\uC74C","\uC790\uACA9 \uC99D\uBA85 \uC5C6\uC74C","\uD0A4 \uB610\uB294 \uBAA8\uB378 \uC5C6\uC74C","\uAC1C \uC0C9\uC778\uB428","{name}: {state} \xB7 {config}","{name}: {state} \xB7 {count}{indexed}","\uC5F0\uB3D9 \uC0C1\uD0DC","\uCD5C\uADFC \uD1B5\uD569 \uC624\uB958","\uAC10\uC0AC \uB85C\uADF8\uC5D0\uC11C \uAC00\uC838\uC624\uBA70 \uC2E4\uD328\uD55C \uD1B5\uD569 \uD638\uCD9C\uB9CC \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC120\uD0DD\uC801 \uB85C\uCEEC \uC11C\uBE44\uC2A4\uC640 AI \uACF5\uAE09\uC790\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.","\uC778\uD154\uB9AC\uC804\uC2A4","\uAC00\uB824\uC9D0. \uC800\uC7A5\uB41C \uC790\uACA9 \uC99D\uBA85\uC774 \uC720\uC9C0\uB429\uB2C8\uB2E4.","\uD604\uC7AC \uCEEC\uB809\uC158 \uB4A4\uC5D0 \uC911\uC9C0\uD558\uACE0 \uC774\uBBF8 \uAE30\uB85D\uB41C \uB0B4\uC6A9\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4.","\uB85C\uCEEC \uB370\uC774\uD130\uB97C \uC4F0\uAC70\uB098 \uC0AD\uC81C\uD558\uC9C0 \uC54A\uACE0 \uBC31\uC5C5\uC744 \uAC80\uC99D\uD558\uACE0 \uAC19\uC740 \uCDA9\uB3CC\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC120\uD0DD\uD55C \uD504\uB85C\uD544 \uCEEC\uB809\uC158\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4. \uC4F0\uAE30\uC5D0 \uC2E4\uD328\uD558\uBA74 \uC774\uBBF8 \uBCC0\uACBD\uB41C \uCEEC\uB809\uC158\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4.","\uC790\uACA9 \uC99D\uBA85\uC740 \uAC00\uB824\uC838 \uC788\uC73C\uBA70 \uC774 \uD504\uB85C\uD544\uC5D0 \uC800\uC7A5\uB41C \uAC12\uC774 \uC720\uC9C0\uB429\uB2C8\uB2E4.","\uBAA8\uB4E0 \uD658\uACBD\uC124\uC815 \uCD08\uAE30\uD654","Aviary \uAE30\uBCF8\uAC12\uC73C\uB85C \uBCF5\uC6D0\uD569\uB2C8\uB2E4. \uAD11\uACE0 \uC5C6\uB294 \uBAA8\uB4DC\uB294 \uCF1C\uC9C4 \uC0C1\uD0DC\uB85C \uC720\uC9C0\uB418\uACE0 \uB2E4\uB978 \uBAA8\uB4E0 \uC2DC\uAC01 \uBC0F \uB3D9\uC791 \uCEE8\uD2B8\uB864\uC740 \uAEBC\uC9D1\uB2C8\uB2E4. \uC800\uC7A5\uD55C \uAC8C\uC2DC\uBB3C, \uBA54\uBAA8, \uBD81\uB9C8\uD06C \uBC0F \uB2E4\uC6B4\uB85C\uB4DC \uAE30\uB85D\uC740 \uC720\uC9C0\uB429\uB2C8\uB2E4.","\uC124\uC815 \uB0B4\uBCF4\uB0B4\uAE30","\uC124\uC815\uC744 JSON\uC73C\uB85C \uB0B4\uB824\uBC1B\uC2B5\uB2C8\uB2E4. API \uD0A4\uC640 \uBE44\uBC00\uBC88\uD638\uB294 \uC790\uB9AC\uD45C\uC2DC\uC790\uB85C \uBC14\uB00C\uBBC0\uB85C \uACF5\uC720\uD574\uB3C4 \uC548\uC804\uD569\uB2C8\uB2E4. \uC5EC\uAE30\uC11C \uAC00\uC838\uC624\uBA74 \uC774 \uCEF4\uD4E8\uD130\uC5D0 \uC800\uC7A5\uB41C \uC778\uC99D \uC815\uBCF4\uB294 \uADF8\uB300\uB85C \uC720\uC9C0\uB429\uB2C8\uB2E4.","\uC124\uC815 \uAC00\uC838\uC624\uAE30(JSON)","Aviary\uC5D0\uC11C \uB0B4\uBCF4\uB0B8 \uC124\uC815 \uD30C\uC77C\uC744 \uBD99\uC5EC \uB123\uACE0 \uAC00\uC838\uC624\uAE30\uB97C \uB204\uB974\uC138\uC694. \uAC00\uB824\uC9C4 \uC778\uC99D \uC815\uBCF4\uB294 \uC5EC\uAE30\uC5D0 \uC800\uC7A5\uB41C \uAC12\uC774 \uC720\uC9C0\uB429\uB2C8\uB2E4.","\uAC00\uC838\uC624\uAE30","\uC804\uCCB4 \uB77C\uC774\uBE0C\uB7EC\uB9AC \uBC31\uC5C5 \uB0B4\uBCF4\uB0B4\uAE30","\uC5F4\uB824 \uC788\uB294 \uD504\uB85C\uD544\uBFD0 \uC544\uB2C8\uB77C \uC774 \uCEF4\uD4E8\uD130\uC758 \uBAA8\uB4E0 \uD504\uB85C\uD544\uC744 \uB2F4\uC740 \uBC84\uC804\uC774 \uBD99\uC740 JSON \uBC31\uC5C5\uC744 \uB0B4\uB824\uBC1B\uC2B5\uB2C8\uB2E4. \uC790\uACA9 \uC99D\uBA85\uC740 \uAE30\uBCF8\uC801\uC73C\uB85C \uC81C\uC678\uB418\uBA70, \uBCF5\uC6D0\uD574\uB3C4 \uC5EC\uAE30\uC5D0 \uC774\uBBF8 \uC800\uC7A5\uB41C \uC790\uACA9 \uC99D\uBA85\uC740 \uADF8\uB300\uB85C \uB0A8\uC2B5\uB2C8\uB2E4.","\uC790\uACA9 \uC99D\uBA85\uC744 \uD3EC\uD568\uD574 \uBC31\uC5C5 \uB0B4\uBCF4\uB0B4\uAE30","\uAC19\uC740 \uBC31\uC5C5\uC5D0 \uC774 \uBE0C\uB77C\uC6B0\uC800\uC5D0 \uC800\uC7A5\uB41C API \uD0A4\uC640 WACZ \uC11C\uBA85 ID\uB97C \uD3EC\uD568\uD569\uB2C8\uB2E4. \uD30C\uC77C\uC744 \uC5EC\uB294 \uC0AC\uB78C\uC740 \uC0AC\uC6A9\uD560 \uC218 \uC788\uC73C\uBBC0\uB85C \uBE44\uBC00\uBC88\uD638\uCC98\uB7FC \uBCF4\uAD00\uD558\uC138\uC694.","\uB77C\uC774\uBE0C\uB7EC\uB9AC \uBC31\uC5C5 \uC120\uD0DD","\uB85C\uCEEC \uB370\uC774\uD130\uB97C \uBCC0\uACBD\uD558\uAE30 \uC804\uC5D0 JSON \uBC31\uC5C5\uC758 \uBC84\uC804, \uAC1C\uC218, \uCDA9\uB3CC \uBC0F \uCCB4\uD06C\uC12C\uC744 \uD655\uC778\uD558\uB824\uBA74 \uBC31\uC5C5\uC744 \uC120\uD0DD\uD558\uC138\uC694.","\uB85C\uCEEC \uC791\uC5C5 \uB85C\uADF8 \uC720\uC9C0","\uB2E4\uC6B4\uB85C\uB4DC, \uB0B4\uBCF4\uB0B4\uAE30, \uC124\uC815 \uBCC0\uACBD\uC744 \uC774 \uAE30\uAE30\uC5D0 \uAE30\uB85D\uD574 Aviary\uAC00 \uBB34\uC5C7\uC744 \uD588\uB294\uC9C0 \uD655\uC778\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4. \uC678\uBD80\uB85C \uC804\uC1A1\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB044\uBA74 \uC0C8 \uAE30\uB85D\uC774 \uC989\uC2DC \uC911\uB2E8\uB418\uBA70, \uAE30\uC874 \uAE30\uB85D\uC740 \uC9C0\uC6B8 \uB54C\uAE4C\uC9C0 \uB0A8\uC2B5\uB2C8\uB2E4.","\uAC10\uC0AC \uAE30\uB85D \uC218","\uAC10\uC0AC \uB85C\uADF8 \uC9C0\uC6B0\uAE30","\uB85C\uCEEC \uC791\uC5C5 \uB85C\uADF8\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uB85C\uCEEC \uB370\uC774\uD130\uB97C \uBC31\uC5C5\uD558\uAC70\uB098 \uBCF5\uC6D0\uD558\uACE0 Aviary\uB97C \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.","\uD658\uACBD\uC124\uC815","\uB77C\uC774\uBE0C\uB7EC\uB9AC \uBC31\uC5C5","\uAC10\uC0AC \uAE30\uB85D","\uC800\uC7A5 \uC704\uCE58","\uC124\uC815\uC740 \uC774 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uB9CC \uB0A8\uC2B5\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790 \uC9C0\uC815 CSS \uC548\uC804","\uC0AC\uC6A9\uC790 \uC9C0\uC815 CSS\uB294 \uB85C\uCEEC\uC5D0\uB9CC \uC800\uC7A5\uB418\uACE0 \uC9C0\uC815\uD55C \uD45C\uBA74\uC5D0\uB9CC \uC801\uC6A9\uB418\uBA70 \uC9C4\uB2E8 \uC815\uBCF4\uC640 \uD568\uAED8 \uC804\uC1A1\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uACE0\uAE09 \uC0AC\uC6A9\uC790 \uC7AC\uC815\uC758\uC774\uBBC0\uB85C \uC9C0\uC6D0\uD300\uC5D0\uC11C \uC2DC\uAC01\uC801 \uD6A8\uACFC\uB97C \uC7AC\uD604\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB85C\uCEEC \uC804\uC6A9 \uBAA8\uB4DC","\uC124\uC815\uD55C \uC5F0\uB3D9\uC73C\uB85C \uB098\uAC00\uB294 \uBAA8\uB4E0 \uC694\uCCAD\uC744 \uCC28\uB2E8\uD569\uB2C8\uB2E4. \uB300\uC0C1\uC740 Aria2, \uD06C\uB85C\uC2A4\uD3EC\uC2A4\uD305, AI \uC694\uCCAD, \uC784\uBCA0\uB529\uC785\uB2C8\uB2E4. \uBBF8\uB514\uC5B4 \uC800\uC7A5\uC740 \uACC4\uC18D X\uC758 \uC11C\uBC84\uC5D0\uC11C \uB0B4\uB824\uBC1B\uC2B5\uB2C8\uB2E4. \uD398\uC774\uC9C0\uAC00 \uC6D0\uB798 \uBD88\uB7EC\uC628 \uACF3\uACFC \uAC19\uC2B5\uB2C8\uB2E4. \uAE30\uBCF8\uC73C\uB85C \uCF1C\uC838 \uC788\uC73C\uBA70, \uC5F0\uB3D9\uC744 \uCF1C\uBA74 \uC774 \uBAA8\uB4DC\uAC00 \uAEBC\uC9D1\uB2C8\uB2E4.","X\uC758 \uBD84\uC11D \uBE44\uCF58 \uAC70\uBD80","\uC2A4\uD06C\uB864\uD558\uAC70\uB098 \uD074\uB9AD\uD558\uAC70\uB098 \uC77C\uC2DC\uC815\uC9C0\uD560 \uB54C X\uAC00 \uBCF4\uB0B4\uB294 \uCD94\uC801 \uC2E0\uD638\uB97C \uB9C9\uC2B5\uB2C8\uB2E4. \uBD84\uC11D \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB9CC \uAC70\uBD80\uD558\uBA70 \uD0C0\uC784\uB77C\uC778\xB7\uBBF8\uB514\uC5B4\xB7\uB85C\uADF8\uC778 \uD2B8\uB798\uD53D\uC740 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC120\uD0DD\uC790 \uC0C1\uD0DC \uBAA8\uB2C8\uD130\uB9C1","\uD604\uC7AC X \uD654\uBA74\uC5D0\uC11C \uD544\uC218 \uBC0F \uB300\uCCB4 \uC575\uCEE4\uB97C \uD655\uC778\uD569\uB2C8\uB2E4. \uC120\uD0DD\uC790 \uC9C4\uB2E8\uC774 \uD544\uC694\uD558\uC9C0 \uC54A\uC73C\uBA74 \uB044\uC138\uC694.","\uD398\uC774\uC9C0\uC5D0 \uC5F0\uACB0\uB428","\uD398\uC774\uC9C0 \uC811\uADFC","\uAC70\uBD80\uD55C \uBE44\uCF58","\uC77C\uBD80 \uBCC0\uACBD \uC0AC\uD56D\uC744 \uC800\uC7A5\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uBE0C\uB77C\uC6B0\uC800 \uC800\uC7A5 \uACF5\uAC04\uC774 \uAC00\uB4DD \uCC3C\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC800\uC7A5","\uD154\uB808\uBA54\uD2B8\uB9AC","\uD328\uB110 \uC5B8\uC5B4","\uBAA8\uB2C8\uD130\uB9C1 \uC911","\uC120\uD0DD\uC790 \uC0C1\uD0DC","\uBB34\uC5C7\uC774 \uB85C\uCEEC\uC5D0 \uB0A8\uB294\uC9C0 \uD655\uC778\uD558\uACE0 Aviary\uAC00 X\uC5D0\uC11C \uACC4\uC18D \uC791\uB3D9\uD558\uB294\uC9C0 \uC810\uAC80\uD569\uB2C8\uB2E4.","\uAC1C\uC778\uC815\uBCF4 \uACBD\uACC4","\uD398\uC774\uC9C0 \uD6C4\uD06C","\uB85C\uCEEC \uB370\uC774\uD130","\uD638\uD658\uC131","\uC800\uC7A5\uD558\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC0AC\uD56D","\uC124\uC815\uC744 \uC800\uC7A5\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.","\uC774 \uC139\uC158\uC744 \uB098\uAC00\uAE30 \uC804\uC5D0 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uC800\uC7A5\uD558\uAC70\uB098 \uB418\uB3CC\uB9AC\uC138\uC694.","\uC800\uC7A5 \uC911...","\uD574\uB2F9 \uBCC0\uACBD \uB0B4\uC6A9\uC744 \uC800\uC7A5\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uBCC0\uACBD\uD55C \uD6C4 \uC800\uC7A5\uD558\uC138\uC694.","\uC800\uC7A5\uD558\uAE30 \uC804\uC5D0 \uC798\uBABB\uB41C \uAC12\uC744 \uC218\uC815\uD558\uC138\uC694.","\uC9C4\uB2E8 \uC815\uBCF4\uB97C \uD074\uB9BD\uBCF4\uB4DC\uC5D0 \uBCF5\uC0AC\uD588\uC2B5\uB2C8\uB2E4.","\uC0AD\uC81C \uC0C1\uD0DC\uAC00 \uC5C5\uB370\uC774\uD2B8\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uC0AD\uC81C \uBA85\uB839\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","\uB85C\uCEEC \uC804\uC6A9 \uBAA8\uB4DC \uCF2C.","\uB85C\uCEEC \uC804\uC6A9 \uBAA8\uB4DC \uB054.","\uBD84\uC11D \uBE44\uCF58\uC744 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4.","\uBD84\uC11D \uBE44\uCF58\uC744 \uD5C8\uC6A9\uD588\uC2B5\uB2C8\uB2E4.","\uC120\uD0DD\uC790 \uC0C1\uD0DC \uBAA8\uB2C8\uD130\uB9C1 \uCF2C.","\uC120\uD0DD\uC790 \uC0C1\uD0DC \uBAA8\uB2C8\uD130\uB9C1 \uB054.","\uAD6C\uC870 \uAD00\uCC30 \uACB0\uACFC\uB97C \uD074\uB9BD\uBCF4\uB4DC\uC5D0 \uBCF5\uC0AC\uD588\uC2B5\uB2C8\uB2E4.","\uAD6C\uC870 \uAD00\uCC30 \uACB0\uACFC\uB97C \uBCF5\uC0AC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC131\uB2A5 \uC9C0\uD45C\uB97C \uCD08\uAE30\uD654\uD588\uC2B5\uB2C8\uB2E4.","\uC131\uB2A5 \uC9C0\uD45C\uB97C \uCD08\uAE30\uD654\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC800\uC7A5\uB41C \uACBD\uACE0\uB97C \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4.","\uC800\uC7A5\uB41C \uACBD\uACE0\uB97C \uC9C0\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uAD11\uACE0 \uAD00\uCC30 \uAE30\uB85D\uC744 \uCD08\uAE30\uD654\uD588\uC2B5\uB2C8\uB2E4.","\uAD11\uACE0 \uAD00\uCC30 \uAE30\uB85D\uC744 \uCD08\uAE30\uD654\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uD504\uB85C\uD544\uC774 \uC804\uD658\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uB85C\uB4DC\uD558\uB294 \uC911\u2026","\uD504\uB85C\uD544 \uC804\uD658\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","{moved}\uAC1C \uC800\uC7A5\uC18C \uD560\uB2F9, \uC7AC\uC2DC\uB3C4 \uD6C4 \uC644\uB8CC {completedAfterRetry}\uAC1C, \uAE30\uC874 \uD56D\uBAA9 {skipped}\uAC1C, \uCDA9\uB3CC {conflicted}\uAC1C, \uC2E4\uD328 {failed}\uAC1C.","\uD504\uB85C\uD544\uC774 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uB85C\uB4DC\uD558\uB294 \uC911\u2026","\uD504\uB85C\uD544 \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","\uB2F5\uBCC0\uC744 \uAE30\uB85D\uD588\uC2B5\uB2C8\uB2E4.","\uBAA8\uB4E0 \uAE30\uB2A5\uC744 \uAED0\uC2B5\uB2C8\uB2E4. \uD398\uC774\uC9C0\uAC00 \uC5EC\uC804\uD788 \uC774\uC0C1\uD55C\uAC00\uC694?","\uAE30\uB2A5 \uCC3E\uAE30\uB97C \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4.","\uAE30\uB2A5 \uCC3E\uAE30\uB97C \uC911\uB2E8\uD588\uC2B5\uB2C8\uB2E4. \uBAA8\uB4E0 \uAE30\uB2A5\uC774 \uB2E4\uC2DC \uCF1C\uC84C\uC2B5\uB2C8\uB2E4.","Aria2 \uC804\uB2EC \uCF2C.","Aria2 \uC804\uB2EC \uB054.","Aria2 \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","Aria2 \uC2DC\uD06C\uB9BF\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","Aria2 \uAE30\uC900 \uD06C\uAE30\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","Aria2\uC5D0 \uC5F0\uACB0\uB428.","Aria2\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: {error}","Aria2 \uC5F0\uACB0 \uD14C\uC2A4\uD2B8\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","{gid}\uC744(\uB97C) \uCDE8\uC18C\uD588\uC2B5\uB2C8\uB2E4.","Aria2 \uCDE8\uC18C \uC2E4\uD328: {error}","Aria2 \uCDE8\uC18C\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","Aria2 \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","yt-dlp\uB85C \uB118\uAE30\uAE30\uB97C \uCF30\uC2B5\uB2C8\uB2E4.","yt-dlp\uB85C \uB118\uAE30\uAE30\uB97C \uAED0\uC2B5\uB2C8\uB2E4.","yt-dlp \uB3C4\uC6B0\uBBF8 \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","yt-dlp \uB3C4\uC6B0\uBBF8 \uBE44\uBC00 \uAC12\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","Bluesky \uCF2C.","Bluesky \uB054.","Bluesky \uC11C\uBE44\uC2A4\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","Bluesky \uACC4\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","Bluesky \uC571 \uBE44\uBC00\uBC88\uD638\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","Mastodon \uCF2C.","Mastodon \uB054.","Mastodon \uC778\uC2A4\uD134\uC2A4\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","Mastodon \uD1A0\uD070\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uD06C\uB85C\uC2A4\uD3EC\uC2A4\uD2B8 \uCCA8\uBD80 \uCF2C.","\uD06C\uB85C\uC2A4\uD3EC\uC2A4\uD2B8 \uCCA8\uBD80 \uB054.","Bluesky\uC5D0 {posts}\uAC1C\uB97C \uAC8C\uC2DC\uD588\uC2B5\uB2C8\uB2E4.{url}","Bluesky \uC2E4\uD328: {error}","Bluesky \uAD50\uCC28 \uAC8C\uC2DC\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","Mastodon\uC5D0 {posts}\uAC1C\uB97C \uAC8C\uC2DC\uD588\uC2B5\uB2C8\uB2E4.{url}","Mastodon \uC2E4\uD328: {error}","Mastodon \uAD50\uCC28 \uAC8C\uC2DC\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","AI \uC2E4\uD589 \uCF2C.","AI \uC2E4\uD589 \uB054.","AI \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","AI \uBAA8\uB378\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","AI API \uD0A4\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","AI \uC694\uCCAD \uC608\uC0B0 \uC800\uC7A5\uB428.","AI \uC77C\uC77C \uC608\uC0B0 \uC800\uC7A5\uB428.","\uC758\uBBF8 \uAE30\uBC18 \uAC80\uC0C9 \uCF2C.","\uC758\uBBF8 \uAE30\uBC18 \uAC80\uC0C9 \uB054.","\uC784\uBCA0\uB529 \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC784\uBCA0\uB529 \uBAA8\uB378\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC784\uBCA0\uB529 API \uD0A4\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC784\uBCA0\uB529 \uC694\uCCAD \uC608\uC0B0 \uC800\uC7A5\uB428.","\uC784\uBCA0\uB529 \uC77C\uC77C \uC608\uC0B0 \uC800\uC7A5\uB428.","\uC790\uB3D9 \uC784\uBCA0\uB529 \uCF2C.","\uC790\uB3D9 \uC784\uBCA0\uB529 \uB054.","\uC758\uBBF8 \uC0C9\uC778\uC744 \uB2E4\uC2DC \uB9CC\uB4DC\uB294 \uC911\u2026","\uC608\uC0B0\uC5D0 \uB3C4\uB2EC\uD574 \uC784\uBCA0\uB529\uC744 \uC911\uC9C0\uD588\uC2B5\uB2C8\uB2E4({blocked}\uAC1C \uB808\uCF54\uB4DC\uB294 \uC804\uC1A1\uB418\uC9C0 \uC54A\uC74C).","\uC0C9\uC778\uB428: \uC2E0\uADDC +{added}\uAC1C \xB7 \uAC74\uB108\uB700 {skipped}\uAC1C \xB7 \uC624\uB958 {errors}\uAC1C \xB7 \uCD1D {total}\uAC1C{trimmed}.","\uC784\uBCA0\uB529\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","\uC758\uBBF8 \uC0C9\uC778\uC744 \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4.","\uC2DC\uB9E8\uD2F1 \uC0C9\uC778\uC744 \uC9C0\uC6B8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","AI \uBC0F \uC784\uBCA0\uB529 \uC0AC\uC6A9\uB7C9 \uC9C0\uC6C0.","AI \uBC0F \uC784\uBCA0\uB529 \uC0AC\uC6A9\uB7C9\uC744 \uC9C0\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uD658\uACBD\uC124\uC815\uC744 \uCD08\uAE30\uD654\uD588\uC2B5\uB2C8\uB2E4. \uAD11\uACE0 \uC5C6\uB294 \uBAA8\uB4DC\uAC00 \uCF1C\uC838 \uC788\uC2B5\uB2C8\uB2E4.","\uC124\uC815\uC744 \uCD08\uAE30\uD654\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC124\uC815\uC744 \uB0B4\uBCF4\uB0C8\uC2B5\uB2C8\uB2E4.","\uC124\uC815\uC744 \uB0B4\uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC124\uC815\uC744 \uAC00\uC838\uC654\uC2B5\uB2C8\uB2E4. {warning}","\uAC00\uC838\uC624\uAE30 \uC2E4\uD328: {errors}","\uC124\uC815\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uB77C\uC774\uBE0C\uB7EC\uB9AC \uBC31\uC5C5\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD588\uC2B5\uB2C8\uB2E4: {filename} ({collections}\uAC1C \uCEEC\uB809\uC158, {bytes}).","\uC804\uCCB4 \uB77C\uC774\uBE0C\uB7EC\uB9AC \uBC31\uC5C5\uC744 \uB0B4\uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC790\uACA9 \uC99D\uBA85\uC774 \uD3EC\uD568\uB41C \uBC31\uC5C5\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD588\uC2B5\uB2C8\uB2E4: {filename} ({collections}\uAC1C \uCEEC\uB809\uC158, {bytes}).","\uB77C\uC774\uBE0C\uB7EC\uB9AC \uBC31\uC5C5\uC744 \uC77D\uB294 \uC911\u2026","\uBC31\uC5C5\uC744 \uBD88\uB7EC\uC654\uC2B5\uB2C8\uB2E4: {collections}\uAC1C \uCEEC\uB809\uC158, {conflicts}\uAC1C \uBCC0\uACBD.","\uB77C\uC774\uBE0C\uB7EC\uB9AC \uBC31\uC5C5\uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uBCF5\uC6D0\uC744 \uCDE8\uC18C\uD558\uB294 \uC911\u2026","\uC2DC\uD5D8 \uC2E4\uD589\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB85C\uCEEC \uB370\uC774\uD130\uB294 \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.","\uC2DC\uD5D8 \uC2E4\uD589 \uC2E4\uD328: {errors}","\uB77C\uC774\uBE0C\uB7EC\uB9AC \uBCF5\uC6D0 \uC2DC\uD5D8 \uC2E4\uD589\uC744 \uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uB77C\uC774\uBE0C\uB7EC\uB9AC \uBC31\uC5C5\uC744 \uBCF5\uC6D0\uD588\uC2B5\uB2C8\uB2E4({collections}\uAC1C \uCEEC\uB809\uC158). \uB2E4\uC2DC \uBD88\uB7EC\uC624\uB294 \uC911\u2026","\uBCF5\uC6D0\uC774 \uCDE8\uC18C\uB418\uC5C8\uACE0 \uB85C\uCEEC \uB370\uC774\uD130\uAC00 \uB864\uBC31\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uBCF5\uC6D0\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uBCF5\uC6D0 \uC2E4\uD328: {errors}","\uB77C\uC774\uBE0C\uB7EC\uB9AC \uBC31\uC5C5\uC744 \uBCF5\uC6D0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC791\uC5C5 \uAE30\uB85D \uCF2C.","\uC791\uC5C5 \uAE30\uB85D \uB054.","\uAC10\uC0AC \uB85C\uADF8\uB97C \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4.","\uAC10\uC0AC \uB85C\uADF8\uB97C \uC9C0\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","@{handle}\uC758 \uD314\uB85C\uC6CC {count}\uBA85\uC744 \uC218\uC9D1\uD588\uC2B5\uB2C8\uB2E4. \uBAA9\uB85D \uBD88\uB7EC\uC624\uAE30\uAC00 \uB05D\uB09C \uC0C1\uD0DC\uC600\uC73C\uBBC0\uB85C \uC804\uBD80\uC785\uB2C8\uB2E4.","@{handle}\uC758 \uD314\uB85C\uC6CC {count}\uBA85\uC744 \uC218\uC9D1\uD588\uC2B5\uB2C8\uB2E4. \uBAA9\uB85D\uC744 \uC544\uC9C1 \uBD88\uB7EC\uC624\uB294 \uC911\uC774\uC5B4\uC11C \uD654\uBA74\uC5D0 \uBCF4\uC774\uB358 \uB9CC\uD07C\uB9CC \uC218\uC9D1\uD588\uC2B5\uB2C8\uB2E4. \uB05D\uAE4C\uC9C0 \uC2A4\uD06C\uB864\uD55C \uB4A4 \uB2E4\uC2DC \uC218\uC9D1\uD558\uBA74 \uC804\uCCB4 \uBAA9\uB85D\uC744 \uC5BB\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","UserCell \uD589\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC2A4\uB0C5\uC0F7\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","@{handle}\uC774(\uAC00) \uD314\uB85C\uC6B0\uD558\uB294 \uACC4\uC815 {count}\uAC1C\uB97C \uC218\uC9D1\uD588\uC2B5\uB2C8\uB2E4. \uBAA9\uB85D \uBD88\uB7EC\uC624\uAE30\uAC00 \uB05D\uB09C \uC0C1\uD0DC\uC600\uC73C\uBBC0\uB85C \uC804\uBD80\uC785\uB2C8\uB2E4.","@{handle}\uC774(\uAC00) \uD314\uB85C\uC6B0\uD558\uB294 \uACC4\uC815 {count}\uAC1C\uB97C \uC218\uC9D1\uD588\uC2B5\uB2C8\uB2E4. \uBAA9\uB85D\uC744 \uC544\uC9C1 \uBD88\uB7EC\uC624\uB294 \uC911\uC774\uC5B4\uC11C \uD654\uBA74\uC5D0 \uBCF4\uC774\uB358 \uB9CC\uD07C\uB9CC \uC218\uC9D1\uD588\uC2B5\uB2C8\uB2E4. \uB05D\uAE4C\uC9C0 \uC2A4\uD06C\uB864\uD55C \uB4A4 \uB2E4\uC2DC \uC218\uC9D1\uD558\uBA74 \uC804\uCCB4 \uBAA9\uB85D\uC744 \uC5BB\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC2A4\uB0C5\uC0F7\uC744 \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4.","\uC2A4\uB0C5\uC0F7\uC744 \uC9C0\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC544\uCE74\uC774\uBE0C \uAC00\uC838\uC624\uAE30\uAC00 \uC77C\uC2DC \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uC544\uCE74\uC774\uBE0C \uAC00\uC838\uC624\uAE30\uAC00 \uC7AC\uAC1C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uC544\uCE74\uC774\uBE0C \uAC00\uC838\uC624\uAE30\uAC00 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uC544\uCE74\uC774\uBE0C \uAC00\uC838\uC624\uAE30 \uC7AC\uC2DC\uB3C4\uAC00 \uC2DC\uC791\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uBCF4\uAD00 \uD30C\uC77C\uC744 \uC77D\uB294 \uC911, \uD070 \uD30C\uC77C\uC740 \uC2DC\uAC04\uC774 \uAC78\uB9BD\uB2C8\uB2E4\u2026","{layout} \uD615\uC2DD \uC544\uCE74\uC774\uBE0C\uB97C \uC77D\uC5C8\uC2B5\uB2C8\uB2E4. {records}\uAC74\uC758 \uAE30\uB85D\uC744 \uAC00\uC838\uC654\uC2B5\uB2C8\uB2E4. \uBCF5\uAD6C: \uC544\uCE74\uC774\uBE0C \uB9C1\uD06C {archiveLinks}\uAC74, \uCEA1\uCC98\uB41C \uB9C1\uD06C {corpusLinks}\uAC74, \uCC38\uAC00\uC790 ID {participants}\uAC74 \uD574\uACB0, {unresolved}\uAC74\uC740 \uBBF8\uD574\uACB0\uB85C \uC720\uC9C0. \uACBD\uACE0 {warnings}\uAC74, \uC624\uB958 {errors}\uAC74. \uD30C\uC77C: \uC778\uC2DD {recognized}\uAC74, \uAC74\uB108\uB700 {skipped}\uAC74, \uC190\uC0C1 {malformed}\uAC74.{absent}","\uBCF4\uAD00 \uD30C\uC77C \uAC00\uC838\uC624\uAE30\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","\uBCF4\uACE0\uC11C\uB97C \uB9CC\uB4DC\uB294 \uC911\u2026","\uBCF4\uACE0\uC11C\uB97C \uB0B4\uB824\uBC1B\uC558\uC2B5\uB2C8\uB2E4.","\uBCF4\uACE0\uC11C\uB97C \uB9CC\uB4E4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC815\uB9AC \uBBF8\uB9AC\uBCF4\uAE30\uB97C \uB9CC\uB4DC\uB294 \uC911\u2026","\uD56D\uBAA9 {added}\uAC1C\uB97C \uB300\uAE30\uC5F4\uC5D0 \uCD94\uAC00\uD588\uC2B5\uB2C8\uB2E4(\uBCF4\uD638\uB41C \uD56D\uBAA9 {protected}\uAC1C\uB294 \uAC74\uB108\uB700).","\uC815\uB9AC\uB97C \uB300\uAE30\uC5F4\uC5D0 \uB123\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC815\uB9AC \uB300\uAE30\uC5F4\uC744 \uBE44\uC6E0\uC2B5\uB2C8\uB2E4.","\uB300\uAE30\uC5F4\uC744 \uBE44\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC800\uC7A5 \uC6A9\uB7C9 \uC0C1\uD55C \uACBD\uACE0\uB97C \uAED0\uC2B5\uB2C8\uB2E4.","\uC800\uC7A5 \uC6A9\uB7C9 \uC0C1\uD55C \uACBD\uACE0\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uCEA1\uCC98\uD55C \uC774\uBBF8\uC9C0\uAC00 \uC6D0\uB798 \uD06C\uAE30\uB97C \uC720\uC9C0\uD569\uB2C8\uB2E4.","\uCEA1\uCC98\uD55C \uC774\uBBF8\uC9C0\uB97C \uCD95\uC18C\uD569\uB2C8\uB2E4.","\uB3D9\uC601\uC0C1\uC744 \uB300\uD45C \uC774\uBBF8\uC9C0\uB85C \uCEA1\uCC98\uD569\uB2C8\uB2E4.","\uB3D9\uC601\uC0C1\uC744 \uC804\uCCB4\uB85C \uCEA1\uCC98\uD569\uB2C8\uB2E4.","X \uB0B4\uBD80 \uBCF4\uACE0\uC11C\uB97C \uC77D\uB294 \uC911\u2026","X \uB0B4\uBD80 \uBCF4\uACE0\uC11C\uB97C \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","X \uB0B4\uBD80 \uBCF4\uACE0\uC11C\uB97C \uB0B4\uBCF4\uB0BC \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC120\uD0DD\uD55C \uD30C\uC77C {count}\uAC1C\uB97C \uB0B4\uB824\uBC1B\uB294 \uC911\uC785\uB2C8\uB2E4.","\uCEA1\uCC98\uD55C \uBBF8\uB514\uC5B4\uB97C \uB2E4\uC6B4\uB85C\uB4DC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uB77C\uC774\uBE0C\uB7EC\uB9AC \uAC80\uC0C9\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uD1B5\uD569\uC5D0\uC11C \uC784\uBCA0\uB529 \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uC640 \uD0A4\uB97C \uD655\uC778\uD558\uC138\uC694.","\uBD81\uB9C8\uD06C\uB97C \uC5C5\uB370\uC774\uD2B8\uD588\uC2B5\uB2C8\uB2E4.","\uBD81\uB9C8\uD06C\uB97C \uC5C5\uB370\uC774\uD2B8\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uBD81\uB9C8\uD06C\uB97C \uC0AD\uC81C\uD588\uC2B5\uB2C8\uB2E4.","\uBD81\uB9C8\uD06C\uAC00 \uC774\uBBF8 \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uBD81\uB9C8\uD06C\uB97C \uC0AD\uC81C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uBD81\uB9C8\uD06C\uB97C \uB0B4\uBCF4\uB0C8\uC2B5\uB2C8\uB2E4. {files}\uAC1C \uD30C\uC77C\uC5D0 {records}\uAC1C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.","\uBD81\uB9C8\uD06C\uB97C \uB0B4\uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uBD81\uB9C8\uD06C\uB97C \uBAA8\uB450 \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4.","\uBD81\uB9C8\uD06C\uB97C \uC9C0\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","AI \uBC84\uD2BC \uCF1C\uC9D0.","AI \uBC84\uD2BC \uAEBC\uC9D0.","\uB9C1\uD06C \uD3BC\uCE58\uAE30 \uCF2C.","\uB9C1\uD06C \uD3BC\uCE58\uAE30 \uB054.","\uB9C1\uD06C \uC815\uB9AC \uCF2C.","\uB9C1\uD06C \uC815\uB9AC \uB054.","\uB9C1\uD06C \uBCF5\uC0AC \uBC84\uD2BC \uB054.","\uB9C1\uD06C \uBCF5\uC0AC \uBC84\uD2BC \uCF2C.","\uACC4\uC815 \uC0C9\uC0C1\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uACC4\uC815 \uBA54\uBAA8\uB97C \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4.","\uBA54\uBAA8\uB97C \uC9C0\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uB0B4\uBCF4\uB0B4\uAE30 \uCEA1\uCC98 \uCF2C.","\uB0B4\uBCF4\uB0B4\uAE30 \uCEA1\uCC98 \uB054.","\uC6D0\uBCF8 \uC751\uB2F5 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uBBF8\uB514\uC5B4 \uBC14\uC774\uD2B8 \uCEA1\uCC98 \uCF1C\uC9D0.","\uBBF8\uB514\uC5B4 \uBC14\uC774\uD2B8 \uCEA1\uCC98 \uAEBC\uC9D0.","\uCFFC\uB9AC \uAC80\uC0C9 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uBCF4\uD638\uB41C \uAC8C\uC2DC\uBB3C \uACF5\uC720\uB97C \uD65C\uC131\uD654\uD588\uC2B5\uB2C8\uB2E4.","\uBCF4\uD638\uB41C \uAC8C\uC2DC\uBB3C\uC744 \uACF5\uC720 \uB0B4\uBCF4\uB0B4\uAE30\uC5D0\uC11C \uC81C\uC678\uD588\uC2B5\uB2C8\uB2E4.","\uB300\uC0C1\uC744 \uC54C \uC218 \uC5C6\uB294 \uAC8C\uC2DC\uBB3C \uACF5\uC720\uB97C \uD65C\uC131\uD654\uD588\uC2B5\uB2C8\uB2E4.","\uB300\uC0C1\uC744 \uC54C \uC218 \uC5C6\uB294 \uAC8C\uC2DC\uBB3C\uC744 \uACF5\uC720 \uB0B4\uBCF4\uB0B4\uAE30\uC5D0\uC11C \uC81C\uC678\uD588\uC2B5\uB2C8\uB2E4.","\uC800\uC7A5 \uD3F4\uB354\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5\uC774 \uC77C\uC2DC \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5\uC774 \uC7AC\uAC1C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uD45C\uC2DC\uB41C \uAC8C\uC2DC\uBB3C\uC744 \uBAA8\uC73C\uB294 \uC911\u2026","\uC774 \uD654\uBA74\uC5D0\uC11C \uAC8C\uC2DC\uBB3C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uD0C0\uC784\uB77C\uC778\uC744 \uC2A4\uD06C\uB864\uD574 \uBD88\uB7EC\uC628 \uB4A4 \uB2E4\uC2DC \uB0B4\uBCF4\uB0B4\uC138\uC694.","{records}\uAC1C \uB808\uCF54\uB4DC\uB97C {files}\uAC1C ZIP\uC73C\uB85C \uB0B4\uBCF4\uB0C4 \u2192 {filename}","{records}\uAC1C \uB808\uCF54\uB4DC \uB0B4\uBCF4\uB0C4 \u2192 {filename}","{records}\uAC1C \uB808\uCF54\uB4DC \uB0B4\uBCF4\uB0C4 \u2192 {filename}","\uB0B4\uBCF4\uB0B4\uAE30\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC9C4\uB2E8 \uC815\uBCF4\uB97C \uD655\uC778\uD558\uC138\uC694.","\uC544\uC9C1 \uC2A4\uB808\uB4DC \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC788\uB294 \uCEA1\uCC98 \uAC8C\uC2DC\uBB3C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCEA1\uCC98\uD55C \uC2A4\uB808\uB4DC \uB9AC\uB354\uB97C \uB0B4\uBCF4\uB0C8\uC2B5\uB2C8\uB2E4.","\uC2A4\uB808\uB4DC\uB97C \uB2E4\uC2DC \uAD6C\uC131\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC9C4\uB2E8\uC744 \uD655\uC778\uD558\uC138\uC694.","\uC9C4\uB2E8 \uC815\uBCF4\uB97C \uBCF5\uC0AC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","{records}\uAC1C \uB808\uCF54\uB4DC\uB97C \uD074\uB9BD\uBCF4\uB4DC\uC5D0 \uBCF5\uC0AC\uD568.","{records}\uAC1C \uB808\uCF54\uB4DC\uB97C {target}(\uC73C)\uB85C \uB0B4\uBCF4\uB0C4.","\uC678\uBD80 \uB0B4\uBCF4\uB0B4\uAE30\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","ZIP\uB2F9 \uAE30\uB85D \uC218\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5 \uBCF4\uAD00 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uAE30\uB85D \uBCF4\uAD00 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uAE30\uAC04 \uAE30\uC900 \uBCF4\uAD00 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","WARC\uB97C \uB2E4\uC6B4\uB85C\uB4DC\uD588\uC2B5\uB2C8\uB2E4({records}\uAC1C \uB808\uCF54\uB4DC).","WARC \uB0B4\uBCF4\uB0B4\uAE30\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","WACZ \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC(\uB808\uCF54\uB4DC {records}\uAC1C, {size}).","WACZ \uB0B4\uBCF4\uB0B4\uAE30\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB514\uC2A4\uD06C \uACF5\uAC04\uC744 \uD655\uBCF4\uD558\uAC70\uB098 \uB354 \uC801\uC740 \uAE30\uB85D\uC744 \uB0B4\uBCF4\uB0B8 \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.","\uC11C\uBA85 ID\uB97C \uAD50\uCCB4\uD588\uC2B5\uB2C8\uB2E4.","\uC11C\uBA85 ID\uB97C \uAD50\uCCB4\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","Aviary \uC804\uC6A9 WACZ \uC99D\uBA85\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD588\uC2B5\uB2C8\uB2E4({records}\uAC1C \uB808\uCF54\uB4DC, {size}).","Aviary \uC804\uC6A9 WACZ \uC99D\uBA85 \uB0B4\uBCF4\uB0B4\uAE30\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","\uC11C\uBA85 \uD0A4 \uC30D\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD588\uC2B5\uB2C8\uB2E4: {filename}.","\uC11C\uBA85 \uD0A4 \uC30D\uC744 \uB0B4\uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uBBF8\uB514\uC5B4 \uBC84\uD2BC \uCF2C.","\uBBF8\uB514\uC5B4 \uBC84\uD2BC \uB054.","\uBBF8\uB514\uC5B4 \uB9C1\uD06C \uBCF5\uC0AC\uB97C \uCF30\uC2B5\uB2C8\uB2E4.","\uBBF8\uB514\uC5B4 \uB9C1\uD06C \uBCF5\uC0AC\uB97C \uAED0\uC2B5\uB2C8\uB2E4.","\uC6D0\uBCF8 \uD654\uC9C8 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC6D0\uBCF8 \uD06C\uAE30 \uC774\uBBF8\uC9C0 \uCF2C.","\uC6D0\uBCF8 \uD06C\uAE30 \uC774\uBBF8\uC9C0 \uB054.","\uBBF8\uB514\uC5B4 \uBC30\uCE58\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uD30C\uC77C \uC774\uB984 \uD15C\uD50C\uB9BF\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC0AC\uC774\uB4DC\uCE74 \uD30C\uC77C \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC2DC\uAC01\uC801 \uC911\uBCF5 \uCC3E\uAE30 \uCF1C\uC9D0.","\uC2DC\uAC01\uC801 \uC911\uBCF5 \uCC3E\uAE30 \uAEBC\uC9D0.","\uC911\uBCF5 \uAE30\uB85D \uCF2C.","\uC911\uBCF5 \uAE30\uB85D \uB054.","\uB3D9\uC2DC \uB2E4\uC6B4\uB85C\uB4DC \uC81C\uD55C\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uB2E4\uC6B4\uB85C\uB4DC \uC18D\uB3C4\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC774 \uD654\uBA74\uC758 \uBBF8\uB514\uC5B4\uB97C \uB0B4\uB824\uBC1B\uB294 \uC911\u2026","\uC77C\uAD04 \uB2E4\uC6B4\uB85C\uB4DC\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","\uAE30\uB85D\uC744 \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4.","\uAE30\uB85D\uC744 \uC9C0\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uAE30\uB85D \uB0B4\uBCF4\uB0B4\uAE30 \uC644\uB8CC: {records}\uAC1C \uB808\uCF54\uB4DC, {files}\uAC1C \uD30C\uC77C.","\uB2E4\uC6B4\uB85C\uB4DC \uAE30\uB85D\uC744 \uB0B4\uBCF4\uB0BC \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCEA1\uCC98 \uBBF8\uB514\uC5B4 \uC644\uB8CC: {downloaded}\uAC1C \uC800\uC7A5 / {duplicate}\uAC1C \uC911\uBCF5 / {failed}\uAC1C \uC2E4\uD328.","\uC7AC\uC2DC\uB3C4\uD560 \uC2E4\uD328\uD55C \uBBF8\uB514\uC5B4 \uC791\uC5C5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD504\uB9AC\uC14B\uC744 \uC801\uC6A9\uD588\uC2B5\uB2C8\uB2E4: {preset}({changes}\uAC1C \uBCC0\uACBD)","\uD504\uB9AC\uC14B\uC774 \uC774\uBBF8 \uC801\uC6A9\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4: {preset}","\uD504\uB9AC\uC14B\uC744 \uC801\uC6A9\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uD14C\uB9C8\uC785\uB2C8\uB2E4.","\uD14C\uB9C8\uB97C \uBCC0\uACBD\uD588\uC2B5\uB2C8\uB2E4.","\uD45C\uC2DC \uBC00\uB3C4\uB97C \uBCC0\uACBD\uD588\uC2B5\uB2C8\uB2E4.","\uD0C0\uC784\uB77C\uC778 \uB108\uBE44\uB97C \uBCC0\uACBD\uD588\uC2B5\uB2C8\uB2E4.","Chirp \uAE00\uAF34 \uCF2C.","Chirp \uAE00\uAF34 \uB054.","\uCC38\uC5EC \uC218 \uC228\uAE40.","\uCC38\uC5EC \uC218 \uD45C\uC2DC.","\uCE74\uC6B4\uD2B8 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uD0ED \uC54C\uB9BC \uC218\uB97C \uC228\uACBC\uC2B5\uB2C8\uB2E4.","\uD0ED \uC54C\uB9BC \uC218\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC808\uB300 \uC2DC\uAC04 \uD45C\uC2DC\uB97C \uCF30\uC2B5\uB2C8\uB2E4.","\uC808\uB300 \uC2DC\uAC04 \uD45C\uC2DC\uB97C \uAED0\uC2B5\uB2C8\uB2E4.","Aviary \uD0ED \uC544\uC774\uCF58\uC744 \uCF30\uC2B5\uB2C8\uB2E4.","X \uD0ED \uC544\uC774\uCF58\uC744 \uBCF5\uC6D0\uD588\uC2B5\uB2C8\uB2E4.","\uD589 \uD14C\uB450\uB9AC \uC228\uAE40.","\uD589 \uD14C\uB450\uB9AC \uBCF5\uC6D0.","\uB300\uBE44 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uBAA8\uC158 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uAD11\uACE0 \uC5C6\uB294 \uBAA8\uB4DC \uCF1C\uC9D0.","\uAD11\uACE0 \uC5C6\uB294 \uBAA8\uB4DC \uAEBC\uC9D0.","\uAD11\uACE0 \uB85C\uAE45\uC744 \uAC70\uBD80\uD568.","\uAD11\uACE0 \uB85C\uAE45\uC744 \uD5C8\uC6A9\uD568.","\uC0AC\uC774\uB4DC\uBC14 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uD2B8\uB80C\uB4DC \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uB808\uC774\uC544\uC6C3 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","Grok \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uD638\uBC84 \uC124\uC815\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC9D1\uC911 \uBAA8\uB4DC\uB97C \uCF30\uC2B5\uB2C8\uB2E4.","\uC9D1\uC911 \uBAA8\uB4DC\uB97C \uAED0\uC2B5\uB2C8\uB2E4.","\uC77D\uAE30 \uC2DC\uAC04\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uD0C0\uC784\uB77C\uC778\uC774 \uBA48\uCD94\uC9C0 \uC54A\uACE0 \uC2A4\uD06C\uB864\uB429\uB2C8\uB2E4.","\uAE34 \uAC8C\uC2DC\uBB3C\uC744 \uC790\uB3D9\uC73C\uB85C \uD3BC\uCE69\uB2C8\uB2E4.","\uAE34 \uAC8C\uC2DC\uBB3C\uC744 \uC811\uD78C \uC0C1\uD0DC\uB85C \uB461\uB2C8\uB2E4.","\uB4A4\uB85C \uC774\uB3D9\uD558\uBA74 \uC6D0\uB798 \uC704\uCE58\uB97C \uBCF5\uC6D0\uD569\uB2C8\uB2E4.","\uB4A4\uB85C \uC774\uB3D9\uD558\uBA74 X\uC758 \uC704\uCE58\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC77D\uAE30 \uD45C\uC2DC\uAE30 \uCF1C\uC9D0.","\uC77D\uAE30 \uD45C\uC2DC\uAE30 \uAEBC\uC9D0.","\uC77D\uAE30 \uD45C\uC2DC\uAE30 \uB300\uC0C1\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC791\uC131 \uBAA8\uB4DC \uCF2C.","\uC791\uC131 \uBAA8\uB4DC \uB054.","'\uD314\uB85C\uC6B0 \uC911' \uD0C0\uC784\uB77C\uC778 \uCF2C.","'\uD314\uB85C\uC6B0 \uC911' \uD0C0\uC784\uB77C\uC778 \uB054.","For you \uD0ED\uC744 \uC228\uACBC\uC2B5\uB2C8\uB2E4.","For you \uD0ED\uC744 \uBCF5\uC6D0\uD588\uC2B5\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C\uC774 \uB2F5\uAE00 \uC544\uC774\uCF58\uC73C\uB85C \uC5F4\uB9BD\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C\uC774 \uB2E4\uC2DC \uD589 \uC804\uCCB4\uC5D0\uC11C \uC5F4\uB9BD\uB2C8\uB2E4.","\uB0B4\uBE44\uAC8C\uC774\uC158 \uD45C\uC2DC\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uD654\uBA74 \uBC16 \uB3D9\uC601\uC0C1\uC744 \uC77C\uC2DC\uC815\uC9C0\uD568.","\uD654\uBA74 \uBC16 \uB3D9\uC601\uC0C1\uC744 \uACC4\uC18D \uC7AC\uC0DD\uD568.","\uB3D9\uC601\uC0C1\uC774 \uACC4\uC18D \uC7AC\uC0DD\uB429\uB2C8\uB2E4.","\uD0ED\uACFC \uD568\uAED8 \uB3D9\uC601\uC0C1\uC774 \uBA48\uCDA5\uB2C8\uB2E4.","\uB3D9\uC601\uC0C1 \uBC18\uBCF5 \uC7AC\uC0DD\uC744 \uCF30\uC2B5\uB2C8\uB2E4.","\uB3D9\uC601\uC0C1 \uBC18\uBCF5 \uC7AC\uC0DD\uC744 \uAED0\uC2B5\uB2C8\uB2E4.","\uC7AC\uC0DD\uBAA9\uB85D \uACE0\uC815\uC744 \uCF30\uC2B5\uB2C8\uB2E4.","\uC7AC\uC0DD\uBAA9\uB85D \uACE0\uC815\uC744 \uAED0\uC2B5\uB2C8\uB2E4.","\uD544\uD130\uB97C \uCF30\uC2B5\uB2C8\uB2E4.","\uD544\uD130\uB97C \uAED0\uC2B5\uB2C8\uB2E4.","\uBCF8 \uAC8C\uC2DC\uBB3C \uD750\uB9AC\uAC8C \uD45C\uC2DC\uB97C \uCF30\uC2B5\uB2C8\uB2E4.","\uBCF8 \uAC8C\uC2DC\uBB3C \uD750\uB9AC\uAC8C \uD45C\uC2DC\uB97C \uAED0\uC2B5\uB2C8\uB2E4.","\uC77D\uC740 \uAC8C\uC2DC\uBB3C \uB300\uC0C1\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uBCF8 \uAC8C\uC2DC\uBB3C \uAE30\uB85D\uC744 \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4.","\uBCF8 \uAC8C\uC2DC\uBB3C \uAE30\uB85D\uC744 \uC9C0\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uD544\uD130 \uADDC\uCE59\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uADDC\uCE59 {count}\uAC1C\uB97C \uAC31\uC2E0\uD588\uC2B5\uB2C8\uB2E4.","\uADDC\uCE59 {count}\uAC1C\uB97C \uAC31\uC2E0\uD588\uC2B5\uB2C8\uB2E4.","\uB9CC\uB8CC\uB41C \uADDC\uCE59\uC744 \uAC31\uC2E0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uD504\uB9AC\uBBF8\uC5C4 \uD544\uD130\uB97C \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC778\uC6A9 \uAC8C\uC2DC\uBB3C \uD544\uD130 \uC800\uC7A5\uB428.","\uBBF8\uB514\uC5B4 \uB2F5\uAE00\uC744 \uC228\uACBC\uC2B5\uB2C8\uB2E4.","\uBBF8\uB514\uC5B4 \uB2F5\uAE00\uC744 \uB2E4\uC2DC \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uD544\uD130 \uC0AC\uC720 \uC124\uC815 \uC800\uC7A5\uB428.","\uBC18\uC751 \uD544\uD130 \uC800\uC7A5\uB428.","\uBC18\uC751 \uAE30\uC900 \uC800\uC7A5\uB428.","\uBAA8\uB4E0 \uACBD\uB85C\uC5D0\uC11C \uD544\uD130\uB97C \uAED0\uC2B5\uB2C8\uB2E4.","\uADDC\uCE59 \uC138\uD2B8\uB97C \uB0B4\uBCF4\uB0C8\uC2B5\uB2C8\uB2E4: {filename} ({count}\uC904).","\uADDC\uCE59 \uC138\uD2B8\uB97C \uB0B4\uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uADDC\uCE59 \uC138\uD2B8\uB97C \uD655\uC778\uD574\uC57C \uD569\uB2C8\uB2E4.","\uADDC\uCE59 \uC138\uD2B8 \uBBF8\uB9AC\uBCF4\uAE30\uAC00 \uC900\uBE44\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uADDC\uCE59 \uC138\uD2B8\uB97C \uBBF8\uB9AC \uBCF4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uADDC\uCE59 {count}\uAC1C\uB97C \uCD94\uAC00\uD588\uC2B5\uB2C8\uB2E4.","\uADDC\uCE59 \uC138\uD2B8\uB97C \uADDC\uCE59 {count}\uAC1C\uB85C \uBC14\uAFE8\uC2B5\uB2C8\uB2E4.","\uADDC\uCE59 \uC138\uD2B8\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC228\uAE34 \uAC8C\uC2DC\uBB3C\uC744 \uC801\uC6A9\uD588\uC2B5\uB2C8\uB2E4.","\uC228\uAE34 \uAC8C\uC2DC\uBB3C\uC744 \uB2E4\uC2DC \uD45C\uC2DC\uD588\uC2B5\uB2C8\uB2E4.","\uC228\uAE30\uAE30 \uBC84\uD2BC \uCF2C.","\uC228\uAE30\uAE30 \uBC84\uD2BC \uB054.","\uBAA8\uB4E0 \uACBD\uB85C\uC5D0\uC11C \uC228\uAE30\uAE30\uB97C \uAED0\uC2B5\uB2C8\uB2E4.","\uBCF5\uC6D0\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB9C8\uC9C0\uB9C9 \uC228\uAE30\uAE30\uB97C \uCDE8\uC18C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C\uC744 \uBCF5\uC6D0\uD588\uC2B5\uB2C8\uB2E4.","\uC774\uBBF8 \uBCF5\uC6D0\uB41C \uAC8C\uC2DC\uBB3C\uC785\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C\uC744 \uBCF5\uC6D0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC228\uAE34 \uAC8C\uC2DC\uBB3C {removed}\uAC1C\uB97C \uC0AD\uC81C\uD588\uC2B5\uB2C8\uB2E4.","\uC228\uAE34 \uAC8C\uC2DC\uBB3C {removed}\uAC1C\uB97C \uC0AD\uC81C\uD588\uC2B5\uB2C8\uB2E4.","\uC228\uAE34 \uAC8C\uC2DC\uBB3C\uC744 \uC9C0\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC774\uC804 \uB370\uC774\uD130\uB97C \uBC30\uC815\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC544\uBB34\uAC83\uB3C4 \uC62E\uAE30\uC9C0 \uC54A\uC558\uC73C\uBBC0\uB85C \uC6D0\uB798 \uC790\uB9AC\uC5D0 \uADF8\uB300\uB85C \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uD398\uC774\uC9C0\uB97C \uB2E4\uC2DC \uC5F4\uC5B4 \uC2DC\uB3C4\uD558\uC138\uC694.","\uAE30\uB2A5 \uAC80\uC0C9\uC744 \uC2DC\uC791\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uAE30\uB2A5 \uAC80\uC0C9\uC744 \uC9C0\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uADF8 \uB2F5\uBCC0\uC744 \uAE30\uB85D\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uAC80\uC0C9\uC740 \uADF8\uB300\uB85C\uC774\uBBC0\uB85C \uAC19\uC740 \uBC84\uD2BC\uC744 \uB2E4\uC2DC \uB204\uB974\uC138\uC694.","\uAE30\uB2A5 \uAC80\uC0C9\uC744 \uBA48\uCD94\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uBCF5\uC6D0\uC744 \uCDE8\uC18C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uD604\uC7AC \uCEEC\uB809\uC158\uC774 \uB05D\uB098\uBA74 \uC2A4\uC2A4\uB85C \uBA48\uCDA5\uB2C8\uB2E4.","\uAC00\uC838\uC624\uAE30\uB97C \uC77C\uC2DC\uC911\uC9C0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC774\uBBF8 \uB05D\uB0AC\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC139\uC158\uC744 \uB2E4\uC2DC \uC5F4\uC5B4 \uC5B4\uB514\uAE4C\uC9C0 \uC9C4\uD589\uB410\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694.","\uAC00\uC838\uC624\uAE30\uB97C \uC7AC\uAC1C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC800\uC7A5\uB41C \uC6D0\uBCF8\uC774 \uC9C0\uC6CC\uC84C\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uD30C\uC77C\uBD80\uD130 \uC0C8\uB85C \uC2DC\uC791\uD558\uC138\uC694.","\uAC00\uC838\uC624\uAE30\uB97C \uCDE8\uC18C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC774\uBBF8 \uB05D\uB0AC\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC139\uC158\uC744 \uB2E4\uC2DC \uC5F4\uC5B4 \uC5B4\uB514\uAE4C\uC9C0 \uC9C4\uD589\uB410\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694.","\uAC00\uC838\uC624\uAE30\uB97C \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uBCF4\uAD00 \uD30C\uC77C\uC744 \uB2E4\uC2DC \uC120\uD0DD\uD574 \uC0C8 \uAC00\uC838\uC624\uAE30\uB97C \uC2DC\uC791\uD558\uC138\uC694.","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5\uC744 \uC77C\uC2DC\uC911\uC9C0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC774\uBBF8 \uB05D\uB0AC\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC139\uC158\uC744 \uB2E4\uC2DC \uC5F4\uC5B4 \uD604\uC7AC \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uC138\uC694.","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5\uC744 \uC7AC\uAC1C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uCCB4\uD06C\uD3EC\uC778\uD2B8\uAC00 \uC9C0\uC6CC\uC84C\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC0C8 \uB0B4\uBCF4\uB0B4\uAE30\uB97C \uC2DC\uC791\uD558\uC138\uC694.","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5\uC744 \uCDE8\uC18C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC774\uBBF8 \uB05D\uB0AC\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC139\uC158\uC744 \uB2E4\uC2DC \uC5F4\uC5B4 \uD604\uC7AC \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uC138\uC694.","\uADF8 \uC77C\uAD04 \uC791\uC5C5\uC744 \uC2E4\uD589\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. Aviary \uAD8C\uD55C \uD398\uC774\uC9C0\uC5D0\uC11C \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uD5C8\uC6A9\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.","\uC77C\uAD04 \uC791\uC5C5\uC774 \uADF8 \uC9C0\uC2DC\uB97C \uBC1B\uC544\uB4E4\uC774\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uC774\uBBF8 \uB05D\uB0AC\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC139\uC158\uC744 \uB2E4\uC2DC \uC5F4\uC5B4 \uD604\uC7AC \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uC138\uC694.","\uB300\uAE30 \uC911\uC778 \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uC7AC\uAC1C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. Aviary \uAD8C\uD55C \uD398\uC774\uC9C0\uC5D0\uC11C \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uD5C8\uC6A9\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.","\uC2E4\uD328\uD55C \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. Aviary \uAD8C\uD55C \uD398\uC774\uC9C0\uC5D0\uC11C \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uD5C8\uC6A9\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.","\uC694\uC57D\uC744 \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC0AC\uB77C\uC9C4 \uB0B4\uC6A9\uC740 \uC5C6\uC73C\uB2C8 \uD398\uC774\uC9C0\uB97C \uC0C8\uB85C \uACE0\uCE5C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.","\uAC80\uC0C9\uACFC \uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB354 \uC9E7\uC740 \uB2E8\uC5B4\uB85C \uAC80\uC0C9\uD558\uAC70\uB098 \uC67C\uCABD\uC5D0\uC11C \uC139\uC158\uC744 \uC120\uD0DD\uD558\uC138\uC694.","\uBCF4\uC874\uB428: \uBE0C\uB77C\uC6B0\uC800\uAC00 \uACF5\uAC04\uC744 \uD655\uBCF4\uD558\uB824\uACE0 \uC774 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uC9C0\uC6B0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uCD5C\uC120 \uB178\uB825: \uB514\uC2A4\uD06C \uACF5\uAC04\uC774 \uBD80\uC871\uD558\uBA74 \uBE0C\uB77C\uC6B0\uC800\uAC00 \uC774 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uC9C0\uC6B8 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uBC31\uC5C5\uC744 \uBCF4\uAD00\uD558\uC138\uC694.","\uBE0C\uB77C\uC6B0\uC800\uAC00 \uC774 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uBCF4\uC874\uD560\uC9C0 \uC54C\uB824\uC8FC\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uBC31\uC5C5\uC744 \uBCF4\uAD00\uD558\uC138\uC694.","\uC774 \uC720\uC800\uC2A4\uD06C\uB9BD\uD2B8 \uAD00\uB9AC\uC790\uB294 Aviary\uC5D0 \uD398\uC774\uC9C0 \uC790\uCCB4\uC5D0 \uB300\uD55C \uC811\uADFC \uAD8C\uD55C\uC744 \uC8FC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC774 \uBE0C\uB77C\uC6B0\uC800\uB294 Aviary\uC758 \uD398\uC774\uC9C0 \uC2A4\uD06C\uB9BD\uD2B8\uB97C \uBD88\uB7EC\uC624\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.","Aviary\uC758 \uD398\uC774\uC9C0 \uC2A4\uD06C\uB9BD\uD2B8\uB294 \uB85C\uB4DC\uB418\uC5C8\uC9C0\uB9CC \uB2E4\uB978 \uBB34\uC5B8\uAC00\uAC00 \uBA3C\uC800 \uC751\uB2F5\uD588\uC2B5\uB2C8\uB2E4. \uB300\uAC1C \uB2E4\uB978 \uD655\uC7A5 \uD504\uB85C\uADF8\uB7A8\uC785\uB2C8\uB2E4. \uC774 \uD398\uC774\uC9C0\uC5D0\uC11C\uB294 \uB124\uD2B8\uC6CC\uD06C \uC218\uC900\uC758 \uAD11\uACE0 \uCC28\uB2E8\uC774 Aviary\uC758 \uD1B5\uC81C \uC544\uB798\uC5D0 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC774 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C\uB294 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC120\uD0DD\uC790 \uC77C\uCE58","\uD544\uC218 \uD45C\uBA74 \uB204\uB77D","\uC120\uD0DD\uC801 \uD45C\uBA74 \uB204\uB77D","\uB300\uCCB4 \uC120\uD0DD\uC790 \uC0AC\uC6A9 \uC911","\uC601\uD5A5\uBC1B\uB294 \uAE30\uB2A5","\uB9C8\uC9C0\uB9C9 \uC120\uD0DD\uC790 \uC804\uD658","\uAD11\uACE0 \uAD00\uCC30","\uAD11\uACE0 \uB9C8\uCEE4 \uC218","\uAD11\uACE0 \uD0D0\uC9C0 \uACC4\uC57D \uBCC0\uD654","\uBCF4\uAD00\uB41C \uAD11\uACE0 \uAD00\uCC30","\uB124\uC774\uD2F0\uBE0C","\uD2B8\uB80C\uB4DC","\uC790\uCCB4 \uD504\uB85C\uBAA8\uC158","\uB3D9\uC601\uC0C1","\uC2E4\uD589\uD558\uAE30 \uC804\uC5D0 X\uC5D0 \uB85C\uADF8\uC778\uD558\uC138\uC694.","\uC2E4\uD589\uC744 \uD65C\uC131\uD654\uD558\uB824\uBA74 \uD65C\uB3D9\uC744 \uD558\uB098 \uC774\uC0C1 \uC120\uD0DD\uD558\uC138\uC694.","\uC0AD\uC81C\uB97C \uC2DC\uC791\uD558\uB294 \uC911\u2026","Long Animation Frame\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC544\uC9C1 \uC801\uC6A9 \uC0D8\uD50C \uC5C6\uC74C","\uAC1C \uC624\uB958","\uAC1C \uC624\uB958","Aviary\uC758 \uBAA8\uB4E0 \uAE30\uB2A5\uC744 \uAEBC\uB3C4 \uD398\uC774\uC9C0\uAC00 \uC5EC\uC804\uD788 \uC774\uC0C1\uD588\uC73C\uBBC0\uB85C \uC6D0\uC778\uC740 Aviary\uAC00 \uC544\uB2D9\uB2C8\uB2E4. \uB2E4\uB978 \uD655\uC7A5 \uD504\uB85C\uADF8\uB7A8, \uC0AC\uC6A9\uC790 \uC2A4\uD06C\uB9BD\uD2B8 \uB610\uB294 X \uC790\uCCB4\uB97C \uB2E4\uC74C\uC73C\uB85C \uD655\uC778\uD574 \uBCF4\uC138\uC694.","\uC2E4\uD589 \uC911\uC778 Aviary \uAE30\uB2A5\uC774 \uC5C6\uC5B4 \uCC3E\uC744 \uB300\uC0C1\uC774 \uC5C6\uC5C8\uC2B5\uB2C8\uB2E4.","\uD65C\uC131 \uB2E4\uC6B4\uB85C\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB85C\uCEEC \uC804\uC6A9 \uBAA8\uB4DC\uB85C \uCC28\uB2E8\uB428","\uCC28\uB2E8\uB428 (\uC608\uC0B0\uC774 0)","\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4(\uD1B5\uD569\uC774 \uBE44\uD65C\uC131\uD654\uB418\uC5C8\uAC70\uB098 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC74C).","\uD504\uB85C\uD544\uC758 \uD314\uB85C\uC6CC \uB610\uB294 \uD314\uB85C\uC789 \uBAA9\uB85D\uC744 \uC5F0 \uB2E4\uC74C '\uC2A4\uB0C5\uC0F7 \uCEA1\uCC98'\uB85C \uAE30\uB85D\uD558\uC138\uC694.","\uC774 \uD615\uC2DD\uC5D0\uB294 \uC5C6\uC2B5\uB2C8\uB2E4:","\u201C{query}\u201D\uC640 \uC77C\uCE58\uD558\uB294 \uCEA1\uCC98\uD55C \uB808\uCF54\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","X \uB0B4\uBD80 \uBCF4\uACE0\uC11C","X\uAC00 \uC81C\uACF5\uD55C \uC6D4\uAC04 \uB178\uCD9C \uC694\uC57D\uC744 \uB85C\uCEEC\uC5D0\uC11C \uC77D\uC2B5\uB2C8\uB2E4. \uC9D1\uACC4 \uB808\uC774\uBE14\uC744 \uBCF4\uC5EC \uC8FC\uBA70 \uD504\uB85C\uB355\uC158 \uB7AD\uD0B9 \uAC00\uC911\uCE58\uB098 \uC804\uCCB4 \uAC8C\uC2DC\uBB3C \uAC10\uC0AC\uAC00 \uC544\uB2D9\uB2C8\uB2E4.","X \uB0B4\uBD80 \uBCF4\uACE0\uC11C JSON \uAC00\uC838\uC624\uAE30","X \uB0B4\uBD80 \uBCF4\uACE0\uC11C\uB97C \uB85C\uCEEC\uC5D0 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uC774\uBC88 \uB2EC\uC5D0\uB294 \uB178\uCD9C \uB808\uC774\uBE14\uC774 \uBCF4\uACE0\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.","\uC544\uC9C1 X \uBCF4\uACE0\uC11C\uB97C \uAC00\uC838\uC624\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.","\uB2E4\uB978 \uB2EC\uC744 \uAC00\uC838\uC624\uBA74 \uBCF4\uACE0\uC11C\uB97C \uBE44\uAD50\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC120\uD0DD \uD56D\uBAA9 \uB0B4\uB824\uBC1B\uAE30","\uD30C\uC77C {total}\uAC1C \uC911 {selected}\uAC1C\uB97C \uC120\uD0DD\uD588\uC2B5\uB2C8\uB2E4. {unavailable}\uAC1C\uB294 \uB0B4\uB824\uBC1B\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBBF8\uB514\uC5B4 \uC885\uB958","\uBAA8\uB4E0 \uC885\uB958","\uBAA8\uB450 \uC120\uD0DD","\uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC774 \uAC80\uC0C9\uC5D0\uB294 \uB0B4\uB824\uBC1B\uC744 \uC218 \uC788\uB294 \uD30C\uC77C\uC774 {limit}\uAC1C\uB97C \uB118\uC2B5\uB2C8\uB2E4. \uBA3C\uC800 \uBC94\uC704\uB97C \uC881\uD788\uC138\uC694.","\uC77C\uCE58\uD558\uB294 \uB85C\uCEEC \uCEEC\uB809\uC158\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uBC0F \uC758\uBBF8 \uC77C\uCE58","\uC758\uBBF8 \uC77C\uCE58","\uD14D\uC2A4\uD2B8 \uC77C\uCE58","(\uD14D\uC2A4\uD2B8 \uC5C6\uC74C)","\uB85C\uCEEC \uBD81\uB9C8\uD06C \uCC3E\uAE30","\uD14D\uC2A4\uD2B8, \uD578\uB4E4, \uD0DC\uADF8, \uD3F4\uB354 \uB610\uB294 ID\uB85C \uC800\uC7A5\uD55C \uAC8C\uC2DC\uBB3C\uC744 \uAC80\uC0C9\uD569\uB2C8\uB2E4. \uCEA1\uCC98\uB41C \uBD81\uB9C8\uD06C\uC5D0\uB294 \uC2A4\uD06C\uB864\uD558\uB294 \uB3D9\uC548 X\uAC00 \uD398\uC774\uC9C0\uB85C \uBCF4\uB0B8 \uAC8C\uC2DC\uBB3C\uB9CC \uD3EC\uD568\uB429\uB2C8\uB2E4.","\uB85C\uCEEC \uBD81\uB9C8\uD06C \uAC80\uC0C9","\uC544\uC9C1 \uC800\uC7A5\uB41C \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uC544\uBB34 \uAC8C\uC2DC\uBB3C\uC5D0\uC11C '\uB85C\uCEEC\uC5D0 \uC800\uC7A5'\uC744 \uC0AC\uC6A9\uD558\uBA74 \uC0AC\uBCF8\uC774 \uC5EC\uAE30\uC5D0 \uBCF4\uAD00\uB429\uB2C8\uB2E4.","\uC774 \uAC80\uC0C9\uACFC \uC77C\uCE58\uD558\uB294 \uB85C\uCEEC \uBD81\uB9C8\uD06C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBA54\uBAA8","\uBD81\uB9C8\uD06C \uBA54\uBAA8","\uC0AD\uC81C","\uC544\uB798\uC5D0 \uC0AC\uC6A9\uC790\uBA85: \uBA54\uBAA8 \uD615\uC2DD\uC73C\uB85C \uCD94\uAC00\uD558\uC138\uC694. \uBA54\uBAA8\uB294 \uD574\uB2F9 \uACC4\uC815\uC758 \uAC8C\uC2DC\uBB3C \uC606\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uCEA1\uCC98\uB97C \uCF1C\uACE0 \uD0C0\uC784\uB77C\uC778\uC744 \uC2A4\uD06C\uB864\uD55C \uB2E4\uC74C \uB0B4\uBCF4\uB0B4\uC138\uC694. \uC791\uC5C5\uACFC \uD574\uB2F9 \uB808\uCF54\uB4DC\uAC00 \uC5EC\uAE30\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","WARC \uBCF4\uAD00 \uD30C\uC77C\uC744 \uB9CC\uB4DC\uB294 \uC911\u2026","WACZ \uC544\uCE74\uC774\uBE0C \uB9CC\uB4DC\uB294 \uC911\u2026","\uC800\uC7A5\uB41C \uD0A4 \uC30D\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB2E4\uB978 \uC544\uCE74\uC774\uBE0C\uC5D0 \uC11C\uBA85\uD558\uAE30 \uC804\uC5D0 \uAD50\uCCB4\uD558\uC138\uC694.","\uCC98\uC74C \uC0AC\uC6A9\uD560 \uB54C \uB85C\uCEEC P-384 ID\uB97C \uB9CC\uB4ED\uB2C8\uB2E4. \uC77C\uBC18 WACZ \uB2E4\uC6B4\uB85C\uB4DC\uC5D0\uB294 \uC11C\uBA85\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC0C8 \uC11C\uBA85 ID\uB97C \uB9CC\uB4DC\uB294 \uC911\u2026","Aviary \uC804\uC6A9 WACZ \uC99D\uBA85 \uC0DD\uC131 \uC911\u2026","\uC11C\uBA85 \uD0A4 \uC30D\uC744 \uC900\uBE44\uD558\uB294 \uC911\u2026","\uB2E4\uC6B4\uB85C\uB4DC \uAE30\uB85D \uB0B4\uBCF4\uB0B4\uAE30","\uC120\uD0DD\uD55C \uB0A0\uC9DC \uBC94\uC704\uC758 \uB85C\uCEEC \uC911\uBCF5 \uC81C\uAC70 \uAE30\uB85D\uC744 JSON \uBC0F CSV\uB85C \uB0B4\uBCF4\uB0C5\uB2C8\uB2E4. \uC6D0\uBCF8 \uBBF8\uB514\uC5B4 URL\uC740 \uD3EC\uD568\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uAE30\uB85D \uC2DC\uC791 \uB0A0\uC9DC","\uAE30\uB85D \uC885\uB8CC \uB0A0\uC9DC","\uBC94\uC704 \uB0B4\uBCF4\uB0B4\uAE30","\uCEA1\uCC98 \uC624\uB514\uC624 \uB2E4\uC6B4\uB85C\uB4DC","\uB85C\uCEEC \uCEA1\uCC98\uC5D0 \uC774\uBBF8 \uC788\uB294 \uC624\uB514\uC624 \uD2B8\uB799\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. \uBA54\uD0C0\uB370\uC774\uD130 \uAC80\uC0C9\uC740 \uC694\uCCAD\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uCEA1\uCC98 \uC790\uB9C9 \uB2E4\uC6B4\uB85C\uB4DC","\uB85C\uCEEC \uCEA1\uCC98\uC5D0 \uC774\uBBF8 \uC788\uB294 \uC790\uB9C9 \uD2B8\uB799\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. \uBA54\uD0C0\uB370\uC774\uD130 \uAC80\uC0C9\uC740 \uC694\uCCAD\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD589","\uC774\uC804\uC5D0 \uAD00\uCC30\uB41C \uB9C8\uCEE4\uAC00 \uB354 \uC774\uC0C1 \uAC10\uC9C0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4: {markers}.","@{handle}\uC5D0\uC11C \uC2E4\uD589\uD560 \uC900\uBE44\uAC00 \uB418\uC5C8\uC2B5\uB2C8\uB2E4.","{feature}: {count}\uD68C \xB7 \uCD1D {total}ms \xB7 \uCD5C\uB300 {max}ms \xB7 \uC804\uCCB4 {full} / \uC99D\uBD84 {incremental}","{observed}\uAC1C\uC758 \uAE34 \uD504\uB808\uC784 \xB7 \uC0C1\uAD00\uB428 {correlated}\uAC1C","\uAE30\uB2A5 {count}\uAC1C","X\uAC00 {language}(\uC73C)\uB85C \uD45C\uC2DC\uB418\uACE0 \uC788\uC73C\uBA70, Aviary\uC5D0\uB294 \uC774 \uC5B8\uC5B4\uC758 \uAD11\uACE0 \uB77C\uBCA8\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uC5EC\uAE30\uC11C\uB294 \uC2A4\uD3F0\uC11C \uAC8C\uC2DC\uBB3C\uC774 \uB77C\uBCA8\uB85C \uC228\uACA8\uC9C0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC774 \uD398\uC774\uC9C0\uB97C \uBC14\uAFBC \uAC83\uC740 {feature}\uC785\uB2C8\uB2E4. \uCC3E\uB294 \uB370 {rounds}\uBC88\uC758 \uB77C\uC6B4\uB4DC\uAC00 \uAC78\uB838\uC2B5\uB2C8\uB2E4. \uBAA8\uB4E0 \uAE30\uB2A5\uC774 \uB2E4\uC2DC \uCF1C\uC838 \uC788\uC73C\uB2C8, \uACC4\uC18D \uAEBC \uB450\uB824\uBA74 \uD574\uB2F9 \uAE30\uB2A5\uC758 \uC790\uCCB4 \uC124\uC815\uC5D0\uC11C \uB044\uC138\uC694.","{total}\uD68C \uC911 {round}\uD68C\uCC28. {off}\uAC1C \uAE30\uB2A5\uC774 \uBAA8\uB450 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4.","{total}\uD68C \uC911 {round}\uD68C\uCC28. \uC544\uC9C1 \uC758\uC2EC\uB418\uB294 {suspect}\uAC1C \uC911 {off}\uAC1C\uAC00 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4.","\uC2DD\uBCC4\uC790 {gid} \xB7 {status}","{count}\uAC1C \uD56D\uBAA9","\uAC8C\uC2DC\uBB3C {posts}\uAC1C \xB7 \uC88B\uC544\uC694 {likes}\uAC1C \xB7 \uCABD\uC9C0 {messages}\uAC1C(\uACF5\uAC1C \uAC80\uC0C9 \uC81C\uC678) \xB7 \uBBF8\uB514\uC5B4 \uCC38\uC870 {media}\uAC1C \xB7 \uD314\uB85C\uC6CC {followers}\uBA85 \xB7 \uD314\uB85C\uC789 {following}\uBA85 \xB7 \uBAA9\uB85D {lists}\uAC1C","\uC544\uCE74\uC774\uBE0C \uB9C1\uD06C {archiveLinks}\uAC1C + \uCEA1\uCC98\uB41C \uB9C1\uD06C {corpusLinks}\uAC1C \uD655\uC7A5 \xB7 \uCC38\uC5EC\uC790 ID {participants}\uAC1C \uD655\uC778 \xB7 {unresolved}\uAC1C\uB294 \uD655\uC778\uB418\uC9C0 \uC54A\uC740 ID\uB85C \uC720\uC9C0 \xB7 \uC694\uCCAD \uC5C6\uC74C","{status} \xB7 {filename} \xB7 \uB808\uCF54\uB4DC {records}\uAC1C \xB7 \uD30C\uC77C {files}\uAC1C \xB7 \uACBD\uACE0 {warnings}\uAC1C","\uC800\uC7A5 {saved}\uAC1C \xB7 \uBBF8\uB7EC {mirrored}\uAC1C \xB7 \uC608\uC815 {due}\uAC1C \xB7 \uD0DC\uADF8 {tags}\uAC1C \xB7 \uD3F4\uB354 {folders}\uAC1C","\uACF5\uAC1C {public}\uAC1C \xB7 \uBCF4\uD638\uB428 {protected}\uAC1C \xB7 \uC54C \uC218 \uC5C6\uC74C {unknown}\uAC1C \xB7 \uACF5\uC720 \uB0B4\uBCF4\uB0B4\uAE30 \uC81C\uC678 {excluded}\uAC1C","{status} \xB7 \uB808\uCF54\uB4DC {records}\uAC1C \xB7 {surface}","\uB85C\uCEEC ID {fingerprint}. \uC774 \uD0A4\uAC00 \uACC4\uC18D \uC0AC\uC6A9\uB418\uC5C8\uC74C\uC744 \uC99D\uBA85\uD558\uC9C0\uB9CC X\uAC00 \uC81C\uACF5\uD55C \uB0B4\uC6A9\uC744 \uC99D\uBA85\uD558\uC9C0\uB294 \uC54A\uC2B5\uB2C8\uB2E4.","\uC774\uBC88 \uC138\uC158\uC5D0\uC11C {count}\uAC1C","\uADDC\uCE59 {imported}\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4. \uBC14\uAFB8\uAE30\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uCD94\uAC00\uB294 {line}\uBC88\uC9F8 \uC904\uC5D0\uC11C \uCC28\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4: {error}","\uADDC\uCE59 {imported}\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4. {added}\uAC1C \uCD94\uAC00; {duplicates}\uAC1C\uB294 \uC774\uBBF8 \uC788\uC2B5\uB2C8\uB2E4. {replaced}\uAC1C\uB97C {total}\uAC1C\uB85C \uBC14\uAFC9\uB2C8\uB2E4.","\uC800\uC7A5\uB41C \uACBD\uACE0\uC640 \uC624\uB958\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4. \uC5EC\uAE30\uC5D0\uB294 Aviary \uC790\uCCB4 \uBA54\uC2DC\uC9C0 \uD14D\uC2A4\uD2B8, \uC2DC\uAC01, \uC138\uBD80 \uD544\uB4DC \uC774\uB984\uB9CC \uAE30\uB85D\uB429\uB2C8\uB2E4.","\uC81C\uD55C\uB41C \uB85C\uCEEC \uB9C8\uCEE4 \uAE30\uB85D\uACFC \uBCC0\uD654 \uACBD\uACE0\uB97C \uC9C0\uC6C1\uB2C8\uB2E4. \uAC8C\uC2DC\uBB3C \uD14D\uC2A4\uD2B8, \uD578\uB4E4, URL \uB610\uB294 \uC751\uB2F5 \uBCF8\uBB38\uC740 \uC5EC\uAE30\uC5D0 \uC800\uC7A5\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","Aviary\uC758 \uBAA8\uB4E0 \uAE30\uB2A5\uC744 \uAED0\uB2E4\uAC00 \uC808\uBC18\uC529 \uB2E4\uC2DC \uCF1C\uBA74\uC11C, \uB9E4 \uD68C\uCC28\uB9C8\uB2E4 \uD398\uC774\uC9C0\uAC00 \uC5EC\uC804\uD788 \uC774\uC0C1\uD55C\uC9C0 \uBB3B\uC2B5\uB2C8\uB2E4. \uC57D \uB2E4\uC12F \uBC88\uC774\uBA74 \uC6D0\uC778 \uAE30\uB2A5\uC744 \uC9C0\uBAA9\uD569\uB2C8\uB2E4. \uC124\uC815\uC5D0\uB294 \uC544\uBB34\uAC83\uB3C4 \uAE30\uB85D\uD558\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uB3C4\uC911\uC5D0 \uADF8\uB9CC\uB450\uB354\uB77C\uB3C4 \uC0C8\uB85C\uACE0\uCE68\uD558\uBA74 \uBAA8\uB450 \uBCF5\uAD6C\uB429\uB2C8\uB2E4. \uCEE8\uD2B8\uB864 \uC13C\uD130\uC640 \uADF8 \uC5B8\uC5B4\uB294 \uB0B4\uB0B4 \uCF1C\uC838 \uC788\uC73C\uBBC0\uB85C \uB458 \uB2E4 \uC6D0\uC778\uC73C\uB85C \uC9C0\uBAA9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBAA8\uB4E0 \uAE30\uB2A5\uC744 \uB048 \uC0C1\uD0DC\uC5D0\uC11C \uB2E4\uC2DC \uC2DC\uC791\uD569\uB2C8\uB2E4.","\uCC3E\uAE30\uB97C \uB2EB\uC2B5\uB2C8\uB2E4. \uBC14\uB00C\uB294 \uAC83\uC740 \uC5C6\uC73C\uBA70 \uBAA8\uB4E0 \uAE30\uB2A5\uC740 \uC774\uBBF8 \uCF1C\uC838 \uC788\uC2B5\uB2C8\uB2E4.","\uC774 \uAE30\uB2A5\uB4E4\uC744 \uAEBC\uB3C4 \uBB38\uC81C\uAC00 \uB0A8\uC544 \uC788\uC73C\uBBC0\uB85C \uC6D0\uC778\uC740 \uB098\uBA38\uC9C0 \uC911 \uD558\uB098\uC785\uB2C8\uB2E4.","\uC774 \uAE30\uB2A5\uB4E4\uC744 \uB044\uB2C8 \uBB38\uC81C\uAC00 \uC0AC\uB77C\uC84C\uC73C\uBBC0\uB85C \uC6D0\uC778\uC740 \uC774 \uC911 \uD558\uB098\uC785\uB2C8\uB2E4.","\uBAA8\uB4E0 \uAE30\uB2A5\uC744 \uB2E4\uC2DC \uCF1C\uACE0 \uCC3E\uAE30\uB97C \uBC84\uB9BD\uB2C8\uB2E4. \uB2F5\uBCC0\uC740 \uAE30\uB85D\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","{filename} \uC77C\uC2DC \uC911\uC9C0.","{filename} \uC7AC\uAC1C.","{filename} \uCDE8\uC18C.","{filename} \uC7AC\uC2DC\uB3C4.","{jobId} \uC77C\uC2DC \uC911\uC9C0.","{jobId} \uC7AC\uAC1C.","{jobId} \uCDE8\uC18C.","\uAD6C\uC870 \uAD00\uCC30 \uACB0\uACFC \uBCF5\uC0AC","\uBCC0\uACBD \uC131\uB2A5","\uC131\uB2A5 \uC9C0\uD45C \uCD08\uAE30\uD654","\uC774 \uC5B8\uC5B4\uC758 \uAD11\uACE0 \uB77C\uBCA8","\uC800\uC7A5\uB41C \uACBD\uACE0","\uC800\uC7A5\uB41C \uACBD\uACE0 \uC9C0\uC6B0\uAE30","\uAD11\uACE0 \uAD00\uCC30 \uCD08\uAE30\uD654","\uD65C\uC131 \uD504\uB85C\uD544","\uD504\uB85C\uD544 \uC804\uD658","\uC5EC\uAE30\uC5D0 \uC774\uC804 \uB370\uC774\uD130 \uD560\uB2F9","\uC0C8 \uD504\uB85C\uD544","\uC774 \uD398\uC774\uC9C0\uB97C \uB9DD\uAC00\uB728\uB9AC\uB294 \uAE30\uB2A5 \uCC3E\uAE30","\uAE30\uB2A5 \uCC3E\uAE30","\uB2E4\uC2DC \uCC3E\uAE30","\uACB0\uACFC \uC9C0\uC6B0\uAE30","\uC544\uC9C1 \uC758\uC2EC\uB418\uB294 \uAE30\uB2A5","\uD398\uC774\uC9C0\uAC00 \uC5EC\uC804\uD788 \uC774\uC0C1\uD568","\uD398\uC774\uC9C0\uAC00 \uC774\uC81C \uC815\uC0C1\uC73C\uB85C \uBCF4\uC784","\uCC3E\uAE30 \uC911\uB2E8","\uBC31\uC5C5 \uBC84\uC804","\uBC31\uC5C5 \uCEEC\uB809\uC158","\uCEEC\uB809\uC158 \uBCC0\uACBD","\uC790\uACA9 \uC99D\uBA85","\uBC31\uC5C5 \uACBD\uACE0","\uBCF5\uC6D0 \uCDE8\uC18C","\uBCF5\uC6D0 \uC2DC\uD5D8 \uC2E4\uD589","\uC774 \uB77C\uC774\uBE0C\uB7EC\uB9AC \uBC31\uC5C5 \uBCF5\uC6D0","\uC544\uC9C1 \uC2A4\uB0C5\uC0F7\uC774 \uC5C6\uC2B5\uB2C8\uB2E4","\uAC00\uC838\uC628 \uCEEC\uB809\uC158","\uB85C\uCEEC \uC544\uCE74\uC774\uBE0C \uBCF5\uAD6C","\uC544\uCE74\uC774\uBE0C \uAC00\uC838\uC624\uAE30","\uC544\uCE74\uC774\uBE0C \uAC00\uC838\uC624\uAE30 \uC77C\uC2DC \uC911\uC9C0","\uC544\uCE74\uC774\uBE0C \uAC00\uC838\uC624\uAE30 \uC7AC\uAC1C","\uC544\uCE74\uC774\uBE0C \uAC00\uC838\uC624\uAE30 \uCDE8\uC18C","\uC544\uCE74\uC774\uBE0C \uAC00\uC838\uC624\uAE30 \uB2E4\uC2DC \uC2DC\uB3C4","\uCD5C\uC2E0 X \uB0B4\uBD80 \uBCF4\uACE0\uC11C","\uCD5C\uC2E0 \uBCF4\uACE0\uC11C\uC758 \uB808\uC774\uBE14","X \uB0B4\uBD80 \uBCF4\uACE0\uC11C","\uC6D4\uBCC4 \uBE44\uAD50","\uC800\uC7A5\uB41C X \uB0B4\uBD80 \uBCF4\uACE0\uC11C \uB0B4\uBCF4\uB0B4\uAE30","\uB85C\uCEEC \uBD81\uB9C8\uD06C","\uB85C\uCEEC \uBD81\uB9C8\uD06C \uB0B4\uBCF4\uB0B4\uAE30","\uBD81\uB9C8\uD06C \uAD00\uB9AC \uB3C4\uAD6C\uC6A9\uC73C\uB85C \uB0B4\uBCF4\uB0B4\uAE30","\uB85C\uCEEC \uBD81\uB9C8\uD06C \uC0AD\uC81C","\uC544\uC9C1 \uACC4\uC815 \uBA54\uBAA8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4","\uB300\uC0C1 \uBC94\uC704","\uC544\uC9C1 \uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5 \uC77C\uC2DC \uC911\uC9C0","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5 \uC7AC\uAC1C","\uB0B4\uBCF4\uB0B4\uAE30 \uC791\uC5C5 \uCDE8\uC18C","\uCEA1\uCC98\uD55C \uC2A4\uB808\uB4DC \uB2E4\uC2DC \uAD6C\uC131","\uD65C\uC131 \uBBF8\uB514\uC5B4 \uBC30\uCE58","\uC911\uBCF5 \uC77C\uCE58","\uD488\uC9C8 \uC601\uC218\uC99D","\uB9C8\uC9C0\uB9C9 \uC911\uBCF5 \uC77C\uCE58","\uB2E4\uC6B4\uB85C\uB4DC \uAE30\uB85D \uC9C0\uC6B0\uAE30","\uB300\uAE30 \uC911\uC778 \uBBF8\uB514\uC5B4 \uC7AC\uAC1C","\uC2E4\uD328\uD55C \uBBF8\uB514\uC5B4 \uB2E4\uC2DC \uC2DC\uB3C4","\uB2E4\uC2DC \uC791\uC131\uB41C \uC7AC\uC0DD\uBAA9\uB85D","\uBCF8 \uAC8C\uC2DC\uBB3C \uAE30\uB85D \uC9C0\uC6B0\uAE30","\uC77D\uC744 \uC218 \uC5C6\uB294 \uADDC\uCE59","\uB9CC\uB8CC\uB41C \uADDC\uCE59","\uB9CC\uB8CC\uB41C \uADDC\uCE59 \uAC31\uC2E0","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uAC8C\uC2DC\uBB3C","\uB3CC\uC544\uBCF4\uAE30 \uC5F4\uAE30","\uC77C\uC2DC \uC911\uC9C0","\uB2E4\uC2DC \uC2DC\uC791","\uC911\uC9C0","\uD0A4 \uC30D \uAD50\uCCB4","\uC815\uC0C1\uC785\uB2C8\uB2E4. \uBAA8\uB4E0 \uBCC0\uACBD \uC0AC\uD56D\uC774 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","Aviary\uC758 \uD14C\uC2A4\uD2B8 \uB370\uC774\uD130\uB97C \uAC31\uC2E0\uD558\uAE30 \uC704\uD574 X\uAC00 \uC774 \uD398\uC774\uC9C0\uB97C \uAD6C\uC131\uD558\uB294 \uBC29\uC2DD(\uC694\uC18C \uC218, \uC911\uCCA9, \uB808\uC774\uC544\uC6C3)\uC744 \uBCF5\uC0AC\uD569\uB2C8\uB2E4. \uAC8C\uC2DC\uBB3C \uBCF8\uBB38, \uC774\uB984, \uC0AC\uC6A9\uC790 \uC774\uB984, \uB9C1\uD06C, ID\uB294 \uD3EC\uD568\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBCC0\uACBD \uCE21\uC815\uC740 \uB85C\uCEEC\uC5D0 \uBA38\uBB3C\uBA70 \uAE30\uB2A5 ID\uC640 \uC81C\uD55C\uB41C \uC2DC\uAC04\uB9CC \uC800\uC7A5\uD569\uB2C8\uB2E4.","\uD504\uB85C\uD544 \uB3C4\uC785 \uC774\uC804\uC758, \uC5B4\uB514\uC5D0\uB3C4 \uBC30\uC815\uB418\uC9C0 \uC54A\uC740 \uC124\uC815\uACFC \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC800\uC7A5\uC18C\uB97C \uD604\uC7AC \uD504\uB85C\uD544\uB85C \uC62E\uAE41\uB2C8\uB2E4. \uC9C0\uAE08\uC758 X \uACBD\uB85C\uC5D0\uC11C \uBB34\uC5C7\uB3C4 \uCD94\uCE21\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uACC4\uC815\uC744 \uBC14\uAFB8\uAC70\uB098 \uB2E4\uB978 \uC544\uCE74\uC774\uBE0C\uB97C \uAC00\uC838\uC624\uAE30 \uC804\uC5D0 \uBE48 \uC624\uD504\uB77C\uC778 \uD504\uB85C\uD544\uC744 \uB9CC\uB4ED\uB2C8\uB2E4.","\uAE30\uB85D\uB41C \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCE21\uC815 \uC911\u2026","\uC774 \uBE0C\uB77C\uC6B0\uC800 \uC800\uC7A5\uC18C\uB294 \uC5EC\uAE30\uC11C \uCE21\uC815\uD560 \uC218 \uC5C6\uC5B4 Aviary\uAC00 \uD06C\uAE30\uB97C \uC54C\uB824\uC8FC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC774 \uBE0C\uB77C\uC6B0\uC800\uB294 \uC800\uC7A5 \uC6A9\uB7C9 \uBCF4\uACE0\uB97C \uC885\uB958\uBCC4\uB85C \uB098\uB204\uC9C0 \uC54A\uC544 Aviary \uC790\uCCB4 \uCE21\uC815\uAC12\uB9CC \uBCF4\uC5EC\uC90D\uB2C8\uB2E4.","\uC815\uADDC\uD654\uD55C \uBCF4\uACE0\uC11C\uB97C \uB85C\uCEEC JSON\uC73C\uB85C \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. X\uC5D0\uC11C \uBC1B\uC740 \uC0AC\uC6A9\uC790 \uB370\uC774\uD130\uC774\uBA70 Aviary\uB294 \uB7AD\uD0B9 \uAC00\uC911\uCE58\uB97C \uCD94\uAC00\uD558\uAC70\uB098 \uC810\uC218\uB97C \uCD94\uC815\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC774 \uD504\uB85C\uD544\uC758 \uBAA8\uB4E0 \uBD81\uB9C8\uD06C\uB97C JSON\uACFC CSV\uB85C \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. \uBBF8\uB7EC\uC5D0\uB294 \uC2A4\uD06C\uB864\uD558\uB294 \uB3D9\uC548 X\uAC00 \uD398\uC774\uC9C0\uB85C \uBCF4\uB0B8 \uB0B4\uC6A9\uB9CC \uC800\uC7A5\uB429\uB2C8\uB2E4.","Karakeep, Linkwarden, linkding\uC640 \uBAA8\uB4E0 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uAC00\uC838\uC62C \uC218 \uC788\uB294 \uBE0C\uB77C\uC6B0\uC800 \uBD81\uB9C8\uD06C \uD30C\uC77C\uACFC Raindrop.io\uC5D0\uC11C \uAC00\uC838\uC62C \uC218 \uC788\uB294 CSV\uB97C \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4.","\uC800\uC7A5\uB41C \uB85C\uCEEC \uBD81\uB9C8\uD06C\uB97C \uBAA8\uB450 \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uCEA1\uCC98\uD55C \uB2F5\uAE00\uC744 \uC0C1\uC704 \uAC8C\uC2DC\uBB3C\uBD80\uD130 \uC77D\uC2B5\uB2C8\uB2E4. \uB204\uB77D\uB41C \uC0C1\uC704 \uAC8C\uC2DC\uBB3C\uC740 \uB85C\uCEEC \uACF5\uBC31\uC73C\uB85C \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uB85C\uCEEC \uC911\uBCF5 \uD310\uBCC4 \uC0C9\uC778\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.","\uC774\uC804 \uC138\uC158\uC5D0\uC11C \uC77C\uC2DC\uC911\uC9C0\uB418\uC5C8\uAC70\uB098 \uB300\uAE30 \uC911\uC774\uB358 \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uBCF5\uAD6C\uD569\uB2C8\uB2E4.","\uC9C0\uC18D \uD050\uC5D0\uC11C \uC2E4\uD328\uD588\uAC70\uB098 \uCDE8\uC18C\uB41C \uBBF8\uB514\uC5B4 \uC791\uC5C5\uC744 \uBAA8\uB450 \uB2E4\uC2DC \uC2DC\uB3C4\uD569\uB2C8\uB2E4.","\uC774 \uBE4C\uB4DC\uC5D0\uC11C\uB294 \uD504\uB9AC\uC14B\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC800\uC7A5\uB41C \uAC8C\uC2DC\uBB3C ID\uB97C \uC9C0\uC6CC \uBAA8\uB4E0 \uAC8C\uC2DC\uBB3C\uC744 \uB2E4\uC2DC \uBCF4\uC9C0 \uC54A\uC740 \uAC83\uC73C\uB85C \uB9CC\uB4ED\uB2C8\uB2E4.","\uB9CC\uB8CC\uB41C \uAC01 \uADDC\uCE59\uC758 \uAE30\uAC04\uC744 \uC9C0\uAE08\uBD80\uD130 \uB2E4\uC2DC \uC2DC\uC791\uD569\uB2C8\uB2E4. \uB9CC\uB8CC\uB418\uC5B4\uB3C4 \uC0AD\uC81C\uB418\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uADDC\uCE59\uC740 \uC5B8\uC81C\uB4E0 \uB418\uC0B4\uB9B4 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC2DC\uAC04 \uBC94\uC704\uB97C \uAC80\uD1A0\uD558\uACE0 \uAC8C\uC2DC\uBB3C \uC720\uD615\uC73C\uB85C \uD544\uD130\uB9C1\uD558\uBA70 \uC791\uC131\uC790\uBCC4\uB85C \uBB36\uACE0 \uC6D0\uBCF8 \uAC8C\uC2DC\uBB3C\uC744 \uC5FD\uB2C8\uB2E4. \uC694\uCCAD\uC740 \uBC1C\uC0DD\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC774 \uBE4C\uB4DC\uC5D0\uC11C\uB294 \uC228\uAE34 \uAC8C\uC2DC\uBB3C \uC800\uC7A5\uC18C\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC900\uBE44\uB428.","\uC0AD\uC81C\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uC791\uC5C5 \uD55C\uB3C4\uC5D0 \uB3C4\uB2EC\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uC791\uD558\uBA74 \uB2E4\uC74C \uBB36\uC74C\uC744 \uC2E4\uD589\uD569\uB2C8\uB2E4.","\uC0AD\uC81C\uAC00 \uC77C\uC2DC \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uC0AD\uC81C\uAC00 \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uBBF8\uB9AC\uBCF4\uAE30\uAC00 \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4.","\uC0AD\uC81C\uAC00 \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4.","\uB85C\uADF8\uC778\uD55C \uACC4\uC815\uC774 \uBC14\uB00C\uC5C8\uC2B5\uB2C8\uB2E4. \uB354 \uC774\uC0C1 \uC791\uC5C5\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.","\uB2E4\uB978 X \uD0ED\uC5D0\uC11C \uC774\uBBF8 \uC774 \uC0AD\uC81C\uB97C \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4.","\uC774 \uD0ED\uC5D0\uC11C \uC774\uBBF8 \uC0AD\uC81C\uB97C \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4.","X\uAC00 \uB85C\uADF8\uC778 \uB610\uB294 \uC545\uC6A9 \uBC29\uC9C0 \uD655\uC778\uC744 \uD45C\uC2DC\uD588\uC2B5\uB2C8\uB2E4. \uC644\uB8CC\uD55C \uD6C4 \uB2E4\uC2DC \uC2DC\uC791\uD558\uC138\uC694.","\uACC4\uC815 \uCE74\uD14C\uACE0\uB9AC\uB97C \uD558\uB098 \uC774\uC0C1 \uC120\uD0DD\uD558\uC138\uC694.","\uC77C\uC2DC \uC911\uC9C0\uD560 \uC2E4\uD589 \uC911\uC778 \uC0AD\uC81C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB2E4\uC2DC \uC2DC\uC791\uD560 \uC77C\uC2DC \uC911\uC9C0\uB41C \uC0AD\uC81C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC911\uC9C0\uD560 \uC0AD\uC81C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","X \uD65C\uB3D9 \uC0AD\uC81C\uB97C \uC544\uC9C1 \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4.","\uC774 \uC0AD\uC81C\uB97C \uC2DC\uC791\uD55C X \uD0ED\uC5D0\uC11C \uB2E4\uC2DC \uC2DC\uC791\uD558\uC138\uC694.","\uD398\uC774\uC9C0\uB97C \uB2E4\uC12F \uBC88 \uC790\uB3D9\uC73C\uB85C \uC0C8\uB85C \uACE0\uCE5C \uD6C4\uC5D0\uB3C4 X\uAC00 \uC791\uC5C5\uC744 \uC801\uC6A9\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uC791\uD558\uC5EC \uC7AC\uC2DC\uB3C4\uD558\uC138\uC694.","\uC608\uAE30\uCE58 \uC54A\uC740 \uC624\uB958\uB85C \uC0AD\uC81C\uAC00 \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uC0AD\uC81C \uBA85\uB839\uC744 \uC644\uB8CC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uACC4\uC815 \uC815\uB9AC\uAC00 \uC77C\uC2DC \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uACC4\uC815 \uC815\uB9AC\uAC00 \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uACC4\uC815 \uC815\uB9AC \uAE30\uB85D\uC744 \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4.","\uC774 \uC815\uB9AC\uAC00 \uB2E4\uB978 X \uD0ED\uC73C\uB85C \uC62E\uACA8\uC84C\uC2B5\uB2C8\uB2E4.","{category} \uC5EC\uB294 \uC911.","{category} \uBBF8\uB9AC\uBCF4\uAE30 \uC911.","{category} \uC815\uB9AC \uC911.","\uC120\uD0DD\uD55C \uC815\uB9AC \uC791\uC5C5\uC774 \uBAA8\uB450 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","{category} \uB354 \uBD88\uB7EC\uC624\uB294 \uC911.","{category} {count}\uAC1C\uB97C \uB354 \uBD88\uB7EC\uC654\uC2B5\uB2C8\uB2E4.","X\uAC00 \uC544\uC9C1 \uC774\uC804 {category} \uD56D\uBAA9\uC744 \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4.","{category} \uD56D\uBAA9\uC774 \uB354 \uC788\uB294\uC9C0 \uD655\uC778\uD558\uB294 \uC911 ({checks}/{limit}).","{category}: {count}\uAC1C \uCC3E\uC74C.","{category}: {count}\uAC1C \uC81C\uAC70\uD568.","{count}\uAC1C \uC791\uC5C5 \uD6C4 {seconds}\uCD08 \uB3D9\uC548 \uC26C\uB294 \uC911\uC785\uB2C8\uB2E4. \uC0AD\uC81C\uB294 \uC790\uB3D9\uC73C\uB85C \uACC4\uC18D\uB429\uB2C8\uB2E4.","{category} \uACC4\uC18D \uC9C4\uD589.","\uC608\uC0C1\uD55C \uCEE8\uD2B8\uB864\uC774 \uC5C6\uC5B4 \uD56D\uBAA9 \uD558\uB098\uB97C \uAC74\uB108\uB6F0\uC5C8\uC2B5\uB2C8\uB2E4.","\uACC4\uC815 \uC791\uC5C5\uC774 \uC801\uC6A9\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. Aviary\uAC00 \uB2E4\uC2DC \uC2DC\uB3C4\uD569\uB2C8\uB2E4.","\uBE60\uC9C4 \uD56D\uBAA9\uC774 \uC5C6\uB294\uC9C0 \uD655\uC778\uD558\uAE30 \uC704\uD574 {category} \uD56D\uBAA9\uC744 \uCC98\uC74C\uBD80\uD130 \uB2E4\uC2DC \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4.","\uCC98\uC74C\uBD80\uD130 \uB2E4\uC2DC \uD655\uC778\uD55C \uACB0\uACFC {category} \uD56D\uBAA9\uC774 \uB354 \uC5C6\uC2B5\uB2C8\uB2E4.","{category} \uD56D\uBAA9\uC774 \uB354 \uC5C6\uC2B5\uB2C8\uB2E4.","X\uC758 \uB2E4\uC74C \uD55C\uB3C4 \uC2DC\uAC04\uB300\uB97C \uC704\uD574 \uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694\uB97C \uB2E4\uC2DC \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4.","X\uAC00 \uC791\uC5C5\uC744 \uB450 \uBC88 \uC801\uC6A9\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. {seconds}\uCD08 \uD6C4 {category} \uD56D\uBAA9\uC744 \uB2E4\uC2DC \uBD88\uB7EC\uC635\uB2C8\uB2E4 ({attempt}/{max}).","\uC9C0\uAE08 {category} \uD56D\uBAA9\uC744 \uB2E4\uC2DC \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4. \uC0AD\uC81C\uB294 \uC790\uB3D9\uC73C\uB85C \uACC4\uC18D\uB429\uB2C8\uB2E4.","\uACC4\uC815 \uC815\uB9AC \uC7A0\uAE08\uC744 \uAC31\uC2E0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","X\uC5D0 \uB85C\uADF8\uC778\uD55C \uD6C4 \uB2E4\uC2DC \uC2DC\uC791\uD558\uC138\uC694.","\uC608\uAE30\uCE58 \uC54A\uC740 \uC624\uB958\uB85C \uACC4\uC815 \uC815\uB9AC\uAC00 \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uACC4\uC815 \uC815\uB9AC\uAC00 \uCC28\uB2E8\uB418\uC5B4 \uD655\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.","X\uC758 \uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694 \uC791\uC5C5 \uD55C\uB3C4(500\uAC1C)\uC5D0 \uB3C4\uB2EC\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC74C \uC2DC\uAC04\uB300\uAE4C\uC9C0 {seconds}\uCD08 \uAE30\uB2E4\uB9BD\uB2C8\uB2E4. \uC0AD\uC81C\uB294 \uC790\uB3D9\uC73C\uB85C \uACC4\uC18D\uB429\uB2C8\uB2E4.","X\uC758 \uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694 \uC791\uC5C5 \uD55C\uB3C4(500\uAC1C)\uC5D0 \uB3C4\uB2EC\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC74C \uC2DC\uAC04\uB300\uAE4C\uC9C0 1\uBD84 \uAE30\uB2E4\uB9BD\uB2C8\uB2E4. \uC0AD\uC81C\uB294 \uC790\uB3D9\uC73C\uB85C \uACC4\uC18D\uB429\uB2C8\uB2E4.","X\uC758 \uB9C8\uC74C\uC5D0 \uB4E4\uC5B4\uC694 \uC791\uC5C5 \uD55C\uB3C4(500\uAC1C)\uC5D0 \uB3C4\uB2EC\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uC74C \uC2DC\uAC04\uB300\uAE4C\uC9C0 {minutes}\uBD84 \uAE30\uB2E4\uB9BD\uB2C8\uB2E4. \uC0AD\uC81C\uB294 \uC790\uB3D9\uC73C\uB85C \uACC4\uC18D\uB429\uB2C8\uB2E4.","Aviary AI \uBA85\uB839 \uBA54\uB274 \uC5F4\uAE30","\uC81C\uACF5\uC790\uB85C \uC2E4\uD589","\uC2E4\uD589 \uC911\u2026","\uACB0\uACFC\uB97C \uD074\uB9BD\uBCF4\uB4DC\uC5D0 \uBCF5\uC0AC\uD588\uC2B5\uB2C8\uB2E4.","\uACB0\uACFC\uB97C \uBCF5\uC0AC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uBE0C\uB77C\uC6B0\uC800\uAC00 \uD074\uB9BD\uBCF4\uB4DC \uC811\uADFC\uC744 \uCC28\uB2E8\uD588\uC2B5\uB2C8\uB2E4.","\uC81C\uACF5\uC790\uAC00 \uC751\uB2F5\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4","\uC5F0\uB3D9\uC5D0\uC11C \uD0A4\uC640 \uBAA8\uB378\uC744 \uD655\uC778\uD558\uC138\uC694.","\uD504\uB86C\uD504\uD2B8\uB97C \uD074\uB9BD\uBCF4\uB4DC\uC5D0 \uBCF5\uC0AC\uD588\uC2B5\uB2C8\uB2E4. \uC5B4\uC2DC\uC2A4\uD134\uD2B8\uC5D0 \uBD99\uC5EC\uB123\uC73C\uC138\uC694.","\uD504\uB86C\uD504\uD2B8\uB97C \uBCF5\uC0AC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uBE0C\uB77C\uC6B0\uC800\uAC00 \uD074\uB9BD\uBCF4\uB4DC \uC811\uADFC\uC744 \uCC28\uB2E8\uD588\uC2B5\uB2C8\uB2E4.","\uC678\uBD80 AI \uC694\uCCAD \uAC80\uD1A0","\uC694\uCCAD \uBCF4\uB0B4\uAE30\uB97C \uC120\uD0DD\uD558\uAE30 \uC804\uC5D0\uB294 \uC544\uBB34\uAC83\uB3C4 \uC804\uC1A1\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBB34\uC81C\uD55C","Aviary\uB294 \uC0AC\uC6A9\uB7C9 \uCE74\uC6B4\uD130\uB9CC \uC800\uC7A5\uD558\uBA70, \uC81C\uACF5\uC5C5\uCCB4\uC758 \uBCF4\uC874 \uAE30\uAC04\uC740 \uD574\uB2F9 \uC815\uCC45\uC744 \uB530\uB985\uB2C8\uB2E4.","\uC608\uC0B0\uC774 \uC774 \uC694\uCCAD\uC744 \uCC28\uB2E8\uD588\uC2B5\uB2C8\uB2E4.","\uC694\uCCAD \uBCF4\uB0B4\uAE30","\uBC88\uC5ED","\uC120\uD0DD\uD55C \uAC8C\uC2DC\uBB3C\uC744 \uD604\uC7AC \uC5B8\uC5B4\uB85C \uBC88\uC5ED\uD569\uB2C8\uB2E4.","\uC694\uC57D","\uC2A4\uB808\uB4DC\uB098 \uAE34 \uAC8C\uC2DC\uBB3C\uC744 3\uAC1C\uC758 \uD56D\uBAA9\uC73C\uB85C \uC694\uC57D\uD569\uB2C8\uB2E4.","\uC124\uBA85","\uAC8C\uC2DC\uBB3C\uC758 \uB9E5\uB77D, \uC804\uBB38 \uC6A9\uC5B4, \uC778\uC6A9\uC744 \uC124\uBA85\uD569\uB2C8\uB2E4.","\uD329\uD2B8\uCCB4\uD06C \uD504\uB86C\uD504\uD2B8","\uAC8C\uC2DC\uBB3C\uC5D0 \uB300\uD55C \uD329\uD2B8\uCCB4\uD06C \uD504\uB86C\uD504\uD2B8\uB97C \uB9CC\uB4ED\uB2C8\uB2E4 (\uD0A4\uAC00 \uC5C6\uC73C\uBA74 \uB124\uD2B8\uC6CC\uD06C\uB97C \uC4F0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4).","\uC2A4\uB2C8\uD3AB","Aviary \uC791\uC131\uAE30 \uC2A4\uB2C8\uD3AB \uC5F4\uAE30","\uC544\uC9C1 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uC81C\uC5B4\uD310 \u2192 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uC5D0\uC11C \uCD94\uAC00\uD558\uC138\uC694.","\uBA3C\uC800 \uC791\uC131\uAE30\uB97C \uD074\uB9AD\uD55C \uB4A4 \uC2A4\uB2C8\uD3AB\uC744 \uACE0\uB974\uC138\uC694.","Aviary\uAC00 \uCF1C\uC838 \uC788\uC2B5\uB2C8\uB2E4","\uCC98\uC74C\uBD80\uD130 \uB450 \uAC00\uC9C0\uAC00 \uCF1C\uC838 \uC788\uC2B5\uB2C8\uB2E4. \uADF8 \uC678\uC5D0\uB294 \uC9C1\uC811 \uCF1C\uAE30 \uC804\uAE4C\uC9C0 \uBAA8\uB450 \uAEBC\uC9C4 \uC0C1\uD0DC\uB85C \uC720\uC9C0\uB429\uB2C8\uB2E4.","\uC2A4\uD3F0\uC11C \uAC8C\uC2DC\uBB3C, \uD64D\uBCF4 \uD2B8\uB80C\uB4DC, \uD504\uB9AC\uB864 \uAD11\uACE0\uAC00 \uC228\uACA8\uC9D1\uB2C8\uB2E4.","\uC0AC\uC9C4\uACFC \uB3D9\uC601\uC0C1\uC5D0 \uB2E4\uC6B4\uB85C\uB4DC \uBC84\uD2BC\uC774 \uCD94\uAC00\uB418\uBA70, \uD074\uB9AD\uD560 \uB54C\uB9CC \uB3D9\uC791\uD569\uB2C8\uB2E4.","\uC124\uC815\uC744 \uBC14\uAFB8\uB824\uBA74 X \uC67C\uCABD \uB0B4\uBE44\uAC8C\uC774\uC158\uC758 \uB9C8\uC9C0\uB9C9 \uD589\uC5D0\uC11C Aviary\uB97C \uC5EC\uC138\uC694.","\uD655\uC778","\uB85C\uCEEC \uB77C\uC774\uBE0C\uB7EC\uB9AC\uAC00 \uC774\uBBF8 \uC124\uC815\uD55C \uC800\uC7A5 \uC6A9\uB7C9 \uC0C1\uD55C\uC744 \uB118\uC5C8\uC2B5\uB2C8\uB2E4. \uC544\uBB34\uAC83\uB3C4 \uC9C0\uC6B0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.","\uC774 \uCEA1\uCC98\uB85C \uB85C\uCEEC \uB77C\uC774\uBE0C\uB7EC\uB9AC\uAC00 \uC124\uC815\uD55C \uC800\uC7A5 \uC6A9\uB7C9 \uC0C1\uD55C\uC744 \uB118\uC2B5\uB2C8\uB2E4. \uC544\uBB34\uAC83\uB3C4 \uC9C0\uC6B0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.","\uC6D0\uBCF8","\uC778\uC6A9","\uD544\uD130\uB428","\uC804\uCCB4","\uB530\uB77C\uC7A1\uAE30 \uCE74\uD14C\uACE0\uB9AC","\uB3CC\uC544\uBCF4\uAE30","\uB530\uB77C\uC7A1\uAE30 \uB2EB\uAE30","\uAE30\uAC04","\uC815\uB82C","\uCD5C\uC2E0\uC21C","\uC624\uB798\uB41C \uC21C","\uBC00\uB3C4\uAC00 \uB0AE\uC740 \uC21C","\uC791\uC131\uC790\uBCC4\uB85C \uBB36\uAE30","\uC870\uC6A9\uD55C \uAE30\uAC04\uC785\uB2C8\uB2E4. \uC0C8\uB85C \uD655\uC778\uD560 \uAC83\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC774 \uAE30\uAC04\uC5D0\uB294 \uC544\uBB34\uAC83\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB530\uB77C\uC7A1\uAE30\uC5D0\uB294 Aviary\uAC00 \uC774\uBBF8 \uD45C\uC2DC\uD55C \uAC8C\uC2DC\uBB3C\uB9CC \uD3EC\uD568\uB429\uB2C8\uB2E4. X\uC5D0 \uCD94\uAC00\uB85C \uC694\uCCAD\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC774\uC0C1\uC785\uB2C8\uB2E4.","\uC54C \uC218 \uC5C6\uB294 \uACC4\uC815","\uC0AC\uC9C4","\uC624\uB514\uC624","\uC790\uB9C9","\uC378\uB124\uC77C","\uBBF8\uB9AC\uBCF4\uAE30 \uBD88\uB7EC\uC624\uAE30","\uC790\uB9C9 \uC5F4\uAE30","\uAC8C\uC2DC\uBB3C \uC5F4\uAE30","\uC8FC\uC694 \uB9C1\uD06C","\uAC1C\uC758 \uAC8C\uC2DC\uBB3C\uC744 Aviary\uAC00 \uC774 \uAE30\uAC04\uC5D0 \uBD24\uC2B5\uB2C8\uB2E4","\uAC1C\uC758 \uAC8C\uC2DC\uBB3C\uC744 Aviary\uAC00 \uC774 \uAE30\uAC04\uC5D0 \uBD24\uC2B5\uB2C8\uB2E4","\uD68C \uACF5\uC720\uB428","\uD68C \uACF5\uC720\uB428","\uBC18\uC751 \uCD5C\uC19F\uAC12 \uBBF8\uB9CC","\uC228\uAE40: \uC0AC\uC9C4\uC774 \uC788\uB294 \uAC8C\uC2DC\uBB3C\uC785\uB2C8\uB2E4","\uC228\uAE40: \uB3D9\uC601\uC0C1\uC774 \uC788\uB294 \uAC8C\uC2DC\uBB3C\uC785\uB2C8\uB2E4","\uC228\uAE40: GIF\uAC00 \uC788\uB294 \uAC8C\uC2DC\uBB3C\uC785\uB2C8\uB2E4","\uC228\uAE40: \uC778\uC99D\uB41C \uACC4\uC815\uC758 \uAC8C\uC2DC\uBB3C\uC785\uB2C8\uB2E4","\uC228\uAE40: \uB2E4\uB978 \uAC8C\uC2DC\uBB3C\uC744 \uC778\uC6A9\uD55C \uAC8C\uC2DC\uBB3C\uC785\uB2C8\uB2E4","\uADDC\uCE59\uC5D0 \uC758\uD574 \uD750\uB9AC\uAC8C \uD45C\uC2DC","\uADDC\uCE59\uC5D0 \uC758\uD574 \uC228\uAE40","\uD0A4\uC6CC\uB4DC\uC5D0 \uC758\uD574 \uD750\uB9AC\uAC8C \uD45C\uC2DC","\uD0A4\uC6CC\uB4DC\uC5D0 \uC758\uD574 \uC228\uAE40","\uD328\uD134\uC5D0 \uC758\uD574 \uD750\uB9AC\uAC8C \uD45C\uC2DC","\uD328\uD134\uC5D0 \uC758\uD574 \uC228\uAE40","\uC774 \uAC8C\uC2DC\uBB3C \uC228\uAE30\uAE30","\uAC8C\uC2DC\uBB3C\uC744 \uC228\uACBC\uC2B5\uB2C8\uB2E4","\uC228\uAE34 \uAC8C\uC2DC\uBB3C\uC744 \uC800\uC7A5\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC800\uC7A5\uC18C\uAC00 \uC4F0\uAE30\uB97C \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4.","\uC2E4\uD589 \uCDE8\uC18C","\uADF8 \uAC8C\uC2DC\uBB3C\uC744 \uBCF5\uC6D0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC77D\uAE30 \uC2DC\uAC04\uC774 \uC544\uB2D9\uB2C8\uB2E4","\uB2E4\uC74C \uC2DC\uAC04\uB300\uAE4C\uC9C0 Aviary\uAC00 \uD0C0\uC784\uB77C\uC778\uC744 \uB36E\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uC544\uBB34\uAC83\uB3C4 \uCC28\uB2E8\uB418\uC9C0 \uC54A\uC558\uACE0 \uC774 \uAE30\uAE30\uB97C \uBC97\uC5B4\uB09C \uAC83\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4.","5\uBD84\uB9CC \uBCF4\uAE30","\uD589 \uD074\uB9AD\uC774 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4. \uB2F5\uAE00 \uC544\uC774\uCF58\uC774 \uAC8C\uC2DC\uBB3C\uC744 \uC5FD\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C \uB354 \uBCF4\uAE30","\uBD81\uB9C8\uD06C \uC800\uC7A5\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","\uB85C\uCEEC\uC5D0 \uC800\uC7A5","\uB85C\uCEEC \uBD81\uB9C8\uD06C \uC0AD\uC81C","\uB9C1\uD06C \uBCF5\uC0AC","\uC774 \uAC8C\uC2DC\uBB3C\uC758 \uB9C1\uD06C \uBCF5\uC0AC","\uC774 \uAC8C\uC2DC\uBB3C\uC5D0\uB294 Aviary\uAC00 \uBCF5\uC0AC\uD560 \uC218 \uC788\uB294 \uB9C1\uD06C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBCF5\uC0AC\uB428","\uC2E4\uD328","\uD074\uB9BD\uBCF4\uB4DC\uAC00 \uC774 \uBCF5\uC0AC\uB97C \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4.","\uBA54\uBAA8","\uD0DC\uADF8","\uCD5C\uACE0 \uC9C1\uC811 \uD488\uC9C8","\uB2E4\uC6B4\uB85C\uB4DC \uAD8C\uD55C\uC774 \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. Aviary \uC635\uC158\uC5D0\uC11C \uBE0C\uB77C\uC6B0\uC800 \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uD65C\uC131\uD654\uD558\uC138\uC694.","\uBBF8\uB514\uC5B4 \uB2E4\uC6B4\uB85C\uB4DC\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uAC8C\uC2DC\uBB3C\uC758 \uBC84\uD2BC\uC73C\uB85C \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.","\uBA3C\uC800 \uC774\uBBF8\uC9C0\uB098 \uB3D9\uC601\uC0C1\uC744 \uB9C8\uC6B0\uC2A4 \uC624\uB978\uCABD \uBC84\uD2BC\uC73C\uB85C \uD074\uB9AD\uD55C \uB2E4\uC74C Aviary \uB2E4\uC6B4\uB85C\uB4DC\uB97C \uC120\uD0DD\uD558\uC138\uC694.","\uB2E4\uC6B4\uB85C\uB4DC \xB7 \uAC00\uC7A5 \uC88B\uC740 \uC9C1\uC811 MP4","\uB2E4\uC6B4\uB85C\uB4DC","\uC774 \uAC8C\uC2DC\uBB3C \uC790\uCCB4\uC758 \uBBF8\uB514\uC5B4\uB97C \uB0B4\uB824\uBC1B\uC2B5\uB2C8\uB2E4. \uC778\uC6A9\uB41C \uAC8C\uC2DC\uBB3C\uACFC \uCE74\uB4DC\uC758 \uBBF8\uB514\uC5B4\uC5D0\uB294 \uC790\uCCB4 \uB2E4\uC6B4\uB85C\uB4DC \uBC84\uD2BC\uC774 \uC788\uC2B5\uB2C8\uB2E4.","\uC774 \uAC8C\uC2DC\uBB3C\uC758 \uBAA8\uB4E0 \uBBF8\uB514\uC5B4 \uB2E4\uC6B4\uB85C\uB4DC","\uC9C1\uC811 \uB3D9\uC601\uC0C1\uC744 \uC544\uC9C1 \uBD88\uB7EC\uC624\uB294 \uC911\uC785\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.","\uB9C1\uD06C \uBCF5\uC0AC","\uC774 \uAC8C\uC2DC\uBB3C\uC758 \uCD5C\uC801 \uC9C1\uC811 \uBBF8\uB514\uC5B4 \uB9C1\uD06C \uBCF5\uC0AC","\uC801\uC751\uD615","yt-dlp\uB85C \uBCF4\uB0B4\uAE30","\uAD00\uCC30\uB41C \uC801\uC751\uD615 \uB3D9\uC601\uC0C1\uC744 \uB85C\uCEEC yt-dlp\uB85C \uBCF4\uB0B4\uAE30","yt-dlp \uBA85\uB839 \uBCF5\uC0AC","\uAD00\uCC30\uB41C \uC801\uC751\uD615 \uB3D9\uC601\uC0C1\uC758 yt-dlp \uBA85\uB839 \uBCF5\uC0AC","\uB354 \uB192\uC740 \uD488\uC9C8\uC758 \uC801\uC751\uD615 \uB3D9\uC601\uC0C1","\uBCF4\uB0B4\uB294 \uC911\u2026","\uAC70\uBD80\uB428","\uB85C\uCEEC yt-dlp \uB3C4\uC6B0\uBBF8\uAC00 \uC774 \uC791\uC5C5\uC744 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4.","\uB85C\uCEEC yt-dlp \uB3C4\uC6B0\uBBF8\uAC00 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","\uC800\uC7A5\uB428","yt-dlp\uAC00 \uC801\uC751\uD615 \uB3D9\uC601\uC0C1\uC744 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4.","\uB204\uB77D\uB428","\uADF8 yt-dlp \uC791\uC5C5\uC740 \uB354 \uC774\uC0C1 \uC5C6\uC2B5\uB2C8\uB2E4. \uBA85\uB839\uC744 \uBCF5\uC0AC\uD574 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.","\uB85C\uCEEC yt-dlp \uB3C4\uC6B0\uBBF8\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","yt-dlp \uBA85\uB839\uC744 \uBCF5\uC0AC\uD588\uC2B5\uB2C8\uB2E4.","yt-dlp \uBA85\uB839\uC744 \uBCF5\uC0AC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uB2E4\uC6B4\uB85C\uB4DC \uC911\u2026","\uB2E4\uC2DC \uC2DC\uB3C4","\uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC2DC\uC791\uB428","\uBE0C\uB77C\uC6B0\uC800\uAC00 \uC544\uC9C1 \uC774 \uD30C\uC77C\uC744 \uC804\uC1A1\uD558\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uACB0\uACFC\uB294 \uB2E4\uC6B4\uB85C\uB4DC \uBAA9\uB85D\uC5D0\uC11C \uD655\uC778\uD558\uC138\uC694.","\uBE0C\uB77C\uC6B0\uC800\uAC00 \uD30C\uC77C\uC744 \uC800\uC7A5\uD558\uC9C0 \uC54A\uACE0 \uC5F4\uC5C8\uC2B5\uB2C8\uB2E4. \uC2E4\uC81C\uB85C \uC800\uC7A5\uD558\uB824\uBA74 Aviary\uC5D0 \uB2E4\uC6B4\uB85C\uB4DC \uAD8C\uD55C\uC744 \uD5C8\uC6A9\uD558\uC138\uC694.","\uB2E4\uC6B4\uB85C\uB4DC\uD55C \uBC14\uC774\uD2B8\uAC00 \uAE30\uB85D\uC758 \uD56D\uBAA9\uACFC \uC77C\uCE58\uD558\uC5EC \uAC74\uB108\uB6F0\uC5C8\uC2B5\uB2C8\uB2E4.","\uC774\uBBF8\uC9C0\uAC00 \uAE30\uB85D\uC758 \uD56D\uBAA9\uACFC \uBE44\uC2B7\uD558\uC5EC \uAC74\uB108\uB6F0\uC5C8\uC2B5\uB2C8\uB2E4.","\uAC19\uC740 X \uBBF8\uB514\uC5B4\uC758 \uB2E4\uB978 \uD06C\uAE30\uC774\uBBC0\uB85C \uAC74\uB108\uB6F0\uC5C8\uC2B5\uB2C8\uB2E4.","Aviary\uC5D0\uB294 \uBE0C\uB77C\uC6B0\uC800 \uB2E4\uC6B4\uB85C\uB4DC \uAD8C\uD55C\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uC635\uC158 \uD398\uC774\uC9C0\uB97C \uC5FD\uB2C8\uB2E4.","\uC6D0\uBCF8 \uC774\uBBF8\uC9C0 \uB2E4\uC2DC \uC2DC\uB3C4","\uC774\uC804\uC5D0 \uB2E4\uC6B4\uB85C\uB4DC\uD568","\uC6D0\uBCF8 \uD488\uC9C8","\uB300\uCCB4 \uD488\uC9C8\uC785\uB2C8\uB2E4. \uD074\uB9AD\uD558\uC5EC \uC6D0\uBCF8 \uB2E4\uC2DC \uC2DC\uB3C4","\uCD5C\uACE0 \uC9C1\uC811 \uD488\uC9C8","\uD488\uC9C8 \uC54C \uC218 \uC5C6\uC74C","\uC774 \uC774\uBBF8\uC9C0\uB294 \uB2E4\uC6B4\uB85C\uB4DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD5C8\uC6A9","\uAD8C\uD55C","\uB2E4\uC6B4\uB85C\uB4DC \uC811\uADFC \uAD8C\uD55C","\uCD5C\uACE0 \uD654\uC9C8\uC758 \uB3D9\uC601\uC0C1\uACFC \uC774\uBBF8\uC9C0\uB97C \uB2E4\uC6B4\uB85C\uB4DC\uD558\uB294 \uB370 \uD544\uC694\uD55C \uAD8C\uD55C\uC744 \uCF1C\uC138\uC694. \uC5B4\uB5A4 \uB370\uC774\uD130\uB3C4 \uBE0C\uB77C\uC6B0\uC800 \uBC16\uC73C\uB85C \uC804\uC1A1\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uB2E4\uC6B4\uB85C\uB4DC \uC900\uBE44 \uC0C1\uD0DC","\uD5C8\uC6A9\uB428","\uC120\uD0DD \uC0AC\uD56D","\uBAA8\uB450 \uC120\uD0DD \uC0AC\uD56D\uC774\uBA70 \uC0AC\uC6A9\uC790\uAC00 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB3D9\uC601\uC0C1\uACFC \uC774\uBBF8\uC9C0 \uC800\uC7A5","\uD655\uC778 \uC911\u2026","\uD30C\uC77C \uC774\uB984\uACFC \uC911\uBCF5 \uC124\uC815\uC5D0 \uB530\uB77C \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCD5C\uACE0 \uD654\uC9C8\uC758 \uB3D9\uC601\uC0C1\uC774\uB098 \uC774\uBBF8\uC9C0\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4.","\uB2E4\uC6B4\uB85C\uB4DC \uAD8C\uD55C \uD5C8\uC6A9","\uCDE8\uC18C","\uC6D0\uBCF8 \uBBF8\uB514\uC5B4 \uC9C1\uC811 \uC77D\uAE30","Aviary\uAC00 \uC804\uCCB4 \uD06C\uAE30 \uBBF8\uB514\uC5B4\uB97C \uC9C1\uC811 \uAC00\uC838\uC62C \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4. \uC774 \uAD8C\uD55C\uC774 \uC5C6\uC5B4\uB3C4 \uB2E4\uC6B4\uB85C\uB4DC \uBC84\uD2BC\uC740 \uC791\uB3D9\uD569\uB2C8\uB2E4.","\uBBF8\uB514\uC5B4 \uC11C\uBC84 \uD5C8\uC6A9","\uB85C\uCEEC yt-dlp \uB3C4\uC6B0\uBBF8\uC5D0 \uC5F0\uACB0","\uC120\uD0DD \uC0AC\uD56D\uC778 yt-dlp \uB3C4\uC6B0\uBBF8 \uC804\uC6A9\uC785\uB2C8\uB2E4. Aviary\uAC00 \uD655\uC7A5 \uD504\uB85C\uADF8\uB7A8\uC5D0\uC11C \uB3C4\uC6B0\uBBF8\uC640 \uD1B5\uC2E0\uD558\uBBC0\uB85C Chrome\uC774 x.com\uC5D0 \uB85C\uCEEC \uB124\uD2B8\uC6CC\uD06C \uC811\uADFC\uC744 \uBB3B\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uB3C4\uC6B0\uBBF8 \uC811\uADFC \uD5C8\uC6A9","\uB2E4\uC6B4\uB85C\uB4DC \uC2DC\uC791","\uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uD55C \uBC88\uC758 \uD074\uB9AD\uC73C\uB85C \uC800\uC7A5\uD558\uB3C4\uB85D \uC124\uC815\uD558\uC138\uC694.","X \uC5F4\uAE30","Aviary\uAC00 \uBBF8\uB514\uC5B4 \uAC8C\uC2DC\uBB3C\uC5D0 \uB2E4\uC6B4\uB85C\uB4DC \uBC84\uD2BC\uC744 \uC790\uB3D9\uC73C\uB85C \uCD94\uAC00\uD569\uB2C8\uB2E4.","\uB2E4\uC6B4\uB85C\uB4DC \uC120\uD0DD","Aviary\uAC00 \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCD5C\uACE0 \uD654\uC9C8\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4.","X\uB97C \uC5F4\uC5B4 \uB2E4\uC6B4\uB85C\uB4DC","\uAE30\uBCF8\uC801\uC73C\uB85C \uBE44\uACF5\uAC1C","\uC5B4\uB5A4 \uB370\uC774\uD130\uB3C4 \uBE0C\uB77C\uC6B0\uC800 \uBC16\uC73C\uB85C \uC804\uC1A1\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC124\uC815, \uD544\uD130, \uBA54\uBAA8, \uBCF4\uAD00 \uC790\uB8CC\uB294 x.com\uC758 \uC81C\uC5B4\uD310\uC5D0 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uD398\uC774\uC9C0\uB294 \uBE0C\uB77C\uC6B0\uC800 \uAD8C\uD55C\uB9CC \uAD00\uB9AC\uD569\uB2C8\uB2E4.","\uC774 \uBE0C\uB77C\uC6B0\uC800\uB294 \uAD8C\uD55C API\uB97C \uC81C\uACF5\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC694\uCCAD\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uBCC0\uACBD\uB41C \uAC83\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCDE8\uC18C\uD588\uC2B5\uB2C8\uB2E4.","\uCDE8\uC18C\uD560 \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC74C","\uD5C8\uC6A9\uD588\uC2B5\uB2C8\uB2E4. \uC774\uC81C \uBE0C\uB77C\uC6B0\uC800\uB97C \uD1B5\uD574 \uBBF8\uB514\uC5B4\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4.","\uD5C8\uC6A9\uD588\uC2B5\uB2C8\uB2E4. \uC774\uC81C Aviary\uAC00 \uB0B4\uBCF4\uB0B4\uAE30\uB97C \uC704\uD574 \uC6D0\uBCF8 \uD06C\uAE30 \uBBF8\uB514\uC5B4\uB97C \uC9C1\uC811 \uC77D\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD5C8\uC6A9\uD588\uC2B5\uB2C8\uB2E4. Aviary\uAC00 \uBE0C\uB77C\uC6B0\uC800 \uD655\uC778 \uC5C6\uC774 \uB85C\uCEEC \uB3C4\uC6B0\uBBF8\uC5D0 \uC5F0\uACB0\uD569\uB2C8\uB2E4.","X\uC6A9 Aviary","\uB418\uB3CC\uB9B4 \uC218 \uC788\uB294 \uC81C\uC5B4\uC640 \uAC1C\uC778\uC815\uBCF4 \uBCF4\uD638 \uAE30\uBCF8\uAC12\uC744 \uC81C\uACF5\uD558\uB294 \uB85C\uCEEC X/Twitter \uD5A5\uC0C1 \uB3C4\uAD6C\uC785\uB2C8\uB2E4.","Aviary\uB85C \uBBF8\uB514\uC5B4 \uB2E4\uC6B4\uB85C\uB4DC","Aviary \uC544\uCE74\uC774\uBE0C","\uB85C\uCEEC \uC544\uCE74\uC774\uBE0C \uBDF0\uC5B4. \uC6D0\uACA9 \uCC38\uC870\uB97C \uC790\uB3D9\uC73C\uB85C \uAC00\uC838\uC624\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uB808\uCF54\uB4DC \uAC80\uC0C9","\uBBF8\uB514\uC5B4 \uC0C1\uD0DC","\uBAA8\uB4E0 \uBBF8\uB514\uC5B4","\uCEA1\uCC98\uB41C \uBC14\uC774\uD2B8","\uC6D0\uACA9 \uCC38\uC870","\uD578\uB4E4","\uC2A4\uB808\uB4DC \uBCF4\uAE30","\uBBF8\uB514\uC5B4","\uAC1C \uB808\uCF54\uB4DC","\uD45C\uC2DC\uB428","\uC77C\uCE58\uD558\uB294 \uB808\uCF54\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCD9C\uCC98","\uBC14\uC774\uD2B8","SHA-256","\uCD9C\uCC98 URL \uC5F4\uAE30","\uAC1C \uAC8C\uC2DC\uBB3C","\uC624\uD504\uB77C\uC778 \uC900\uBE44\uB428","\uB124\uD2B8\uC6CC\uD06C\uAC00 \uD544\uC694\uD560 \uC218 \uC788\uC74C","\uCEA1\uCC98\uB418\uC9C0 \uC54A\uC740 \uAC8C\uC2DC\uBB3C","\uC774 \uC0C1\uC704 \uAC8C\uC2DC\uBB3C\uC740 \uB85C\uCEEC\uC5D0 \uCEA1\uCC98\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.","\uB300\uD654","{author} \uAC8C\uC2DC\uBB3C {count}\uAC1C","\uC2DC\uC791","\uACC4\uC815 \uC815\uB9AC","\uAC74","\uC120\uD0DD\uC801 \uAD8C\uD55C","\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","\uAC8C\uC2DC\uBB3C \uCEE8\uD2B8\uB864","\uD30C\uC77C \uC774\uB984","\uC77C\uAD04 \uCC98\uB9AC","\uB300\uAE30\uC5F4 \uC0C1\uD0DC","\uB300\uAE30 \uC911","\uB2E4\uC6B4\uB85C\uB4DC \uCEE8\uD2B8\uB864\uC744 \uCF1C\uBA74 \uC6D0\uBCF8 \uD654\uC9C8\uC774 \uC801\uC6A9\uB429\uB2C8\uB2E4.","\uBAA9\uB85D \uC800\uC7A5"],"ar":["\u0625\u0639\u062F\u0627\u062F\u0627\u062A Aviary","X \u0623\u0643\u062B\u0631 \u0647\u062F\u0648\u0621\u064B\u0627. \u0628\u064A\u0627\u0646\u0627\u062A \u0645\u062D\u0644\u064A\u0629.","\u0625\u063A\u0644\u0627\u0642","Aviary","\u0627\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0648\u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0648\u0627\u0644\u0641\u0644\u0627\u062A\u0631 \u0648\u0627\u0644\u0645\u0632\u064A\u062F","\u0627\u0644\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A","\u062A\u0631\u0627\u062C\u0639","\u062D\u0641\u0638","\u062A\u0646\u062A\u0638\u0631 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0648\u0627\u0644\u062D\u0642\u0648\u0644 \u0627\u0644\u0636\u063A\u0637 \u0639\u0644\u0649 \u062D\u0641\u0638. \u062A\u0639\u0645\u0644 \u0627\u0644\u0623\u0632\u0631\u0627\u0631 \u0641\u0648\u0631\u064B\u0627.","\u062A\u0645 \u0627\u0644\u062D\u0641\u0638 \u0645\u062D\u0644\u064A\u064B\u0627","\u0623\u0642\u0633\u0627\u0645 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A","\u0627\u0628\u062F\u0623 \u0647\u0646\u0627","\u0625\u0639\u062F\u0627\u062F \u0633\u0631\u064A\u0639","\u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u064A\u0648\u0645\u064A","\u0627\u0644\u0645\u0638\u0647\u0631","\u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u0635\u0641\u062D\u0629","\u0641\u0644\u0627\u062A\u0631 \u0627\u0644\u0645\u062D\u062A\u0648\u0649","\u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A","\u0628\u064A\u0627\u0646\u0627\u062A\u0643","\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629","\u0627\u0644\u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0648\u0627\u0644\u062A\u0635\u062F\u064A\u0631","\u062D\u0630\u0641 \u0646\u0634\u0627\u0637 X","\u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0623\u062F\u0648\u0627\u062A","\u0627\u0644\u0644\u062D\u0627\u0642 \u0628\u0645\u0627 \u0641\u0627\u062A","\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629","\u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648","\u0623\u0631\u0634\u064A\u0641 X","\u0627\u0644\u0627\u062A\u0635\u0627\u0644\u0627\u062A","\u0627\u0644\u0646\u0633\u062E \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A \u0648\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0636\u0628\u0637","\u0627\u0644\u062E\u0635\u0648\u0635\u064A\u0629 \u0648\u0627\u0644\u062A\u0634\u062E\u064A\u0635","\u0637\u0631\u064A\u0642\u0629 \u0639\u0645\u0644 \u0627\u0644\u062D\u0641\u0638","\u062A\u0646\u062A\u0638\u0631 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0648\u0627\u0644\u062D\u0642\u0648\u0644 \u0627\u0644\u0636\u063A\u0637 \u0639\u0644\u0649 \u062D\u0641\u0638. \u062A\u0639\u0645\u0644 \u0623\u0632\u0631\u0627\u0631 \u0645\u062B\u0644 \u062A\u0637\u0628\u064A\u0642 \u0648\u062A\u0635\u062F\u064A\u0631 \u0648\u0645\u0639\u0627\u064A\u0646\u0629 \u0648\u062D\u0630\u0641 \u0641\u0648\u0631\u064B\u0627.","\u0641\u062A\u062D \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A","\u0627\u062C\u0639\u0644 X \u0623\u0643\u062B\u0631 \u0647\u062F\u0648\u0621\u064B\u0627","\u0623\u062E\u0641\u0650 \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0648\u0627\u0644\u0645\u0648\u0627\u0636\u064A\u0639 \u0627\u0644\u0631\u0627\u0626\u062C\u0629 \u0648\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D\u0627\u062A \u0648\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062A\u0646\u0642\u0644 \u0627\u0644\u062A\u064A \u0644\u0627 \u062A\u0633\u062A\u062E\u062F\u0645\u0647\u0627.","\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u063A\u064A\u0631 \u0627\u0644\u0645\u0631\u063A\u0648\u0628\u0629","\u0635\u0641\u0651\u0650 \u062D\u0633\u0628 \u0627\u0644\u0643\u0644\u0645\u0627\u062A \u0623\u0648 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0623\u0648 \u0627\u0644\u0634\u0627\u0631\u0627\u062A \u0623\u0648 \u0627\u0644\u0635\u0641\u062D\u0629.","\u062D\u0641\u0638 \u0627\u0644\u0635\u0648\u0631 \u0648\u0645\u0642\u0627\u0637\u0639 \u0627\u0644\u0641\u064A\u062F\u064A\u0648","\u0627\u062E\u062A\u0631 \u0627\u0644\u062C\u0648\u062F\u0629 \u0648\u0623\u0633\u0645\u0627\u0621 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0648\u0641\u062D\u0635 \u0627\u0644\u062A\u0643\u0631\u0627\u0631 \u0648\u0633\u0644\u0648\u0643 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631.","\u062D\u0630\u0641 \u0646\u0634\u0627\u0637 \u0627\u0644\u062D\u0633\u0627\u0628","\u0627\u062D\u0630\u0641 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0648\u0627\u0644\u0631\u062F\u0648\u062F \u0648\u0625\u0639\u0627\u062F\u0627\u062A \u0627\u0644\u0646\u0634\u0631 \u0648\u0627\u0644\u0625\u0639\u062C\u0627\u0628\u0627\u062A \u0648\u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629.","\u0642\u0631\u0627\u0621\u0629 \u0647\u0627\u062F\u0626\u0629","\u064A\u062E\u0641\u064A \u0627\u0644\u0627\u062A\u062C\u0627\u0647\u0627\u062A \u0648\u062D\u062F\u0648\u062F \u0627\u0644\u0635\u0641\u0648\u0641 \u0648\u0623\u0639\u062F\u0627\u062F \u0627\u0644\u062A\u0641\u0627\u0639\u0644\u060C \u0648\u064A\u0639\u062A\u0651\u0645 \u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0628\u0631\u064A\u0645\u064A\u0648\u0645\u060C \u0648\u064A\u0646\u0638\u0651\u0641 \u0631\u0648\u0627\u0628\u0637 t.co\u060C \u0628\u0633\u0645\u0629 \u062F\u0627\u0643\u0646\u0629 \u0648\u0645\u0643\u062B\u0641\u0629.","\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A","\u0645\u064F\u0641\u0639\u0651\u0644","\u0645\u0646\u0639 \u0627\u0644\u0645\u0639\u0627\u064A\u0646\u0627\u062A \u0639\u0646\u062F \u0627\u0644\u062A\u0645\u0631\u064A\u0631","\u0625\u062E\u0641\u0627\u0621 \u0623\u0639\u062F\u0627\u062F \u0627\u0644\u062A\u0641\u0627\u0639\u0644","\u0627\u0644\u0645\u0638\u0647\u0631","\u062E\u0627\u0641\u062A","\u062A\u0637\u0628\u064A\u0642","\u0623\u0631\u0634\u0641\u0629 \u0627\u0644\u0648\u0633\u0627\u0626\u0637","\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0628\u0627\u0644\u062C\u0648\u062F\u0629 \u0627\u0644\u0623\u0635\u0644\u064A\u0629\u060C \u0623\u0633\u0645\u0627\u0621 \u0645\u0644\u0641\u0627\u062A \u062B\u0627\u0628\u062A\u0629\u060C \u0633\u062C\u0644 \u0628\u0644\u0627 \u062A\u0643\u0631\u0627\u0631\u060C \u0648\u0633\u0627\u0626\u0637 \u0645\u0631\u062A\u0628\u0629 \u0639\u0645\u0648\u062F\u064A\u064B\u0627.","\u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u062C\u0648\u062F\u0629 \u0627\u0644\u0623\u0635\u0644\u064A\u0629","\u062A\u062E\u0637\u064A\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637","\u0645\u062A\u0631\u0627\u0635","\u0625\u0638\u0647\u0627\u0631 \u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u062A\u0646\u0632\u064A\u0644","\u0635\u0627\u0646\u0639 \u0645\u062D\u062A\u0648\u0649","\u0648\u0636\u0639 \u0627\u0644\u0643\u062A\u0627\u0628\u0629\u060C \u0645\u0642\u062A\u0637\u0641\u0627\u062A \u0627\u0644\u0645\u062D\u0631\u0651\u0631\u060C \u062A\u0646\u0638\u064A\u0641 \u0632\u0631 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629\u060C \u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0648\u0627\u0644\u0627\u062A\u062C\u0627\u0647\u0627\u062A.","\u0648\u0636\u0639 \u0627\u0644\u0643\u062A\u0627\u0628\u0629","\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u062A\u0631\u0646\u062F\u0627\u062A","\u0634\u0628\u0643\u0629 \u0645\u0646\u062A\u0638\u0645\u0629","\u0628\u062D\u062B","\u0627\u0644\u062A\u0642\u0627\u0637 \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0645\u0641\u0639\u0651\u0644\u060C \u0635\u064A\u063A JSON+CSV+HTML+MD\u060C \u0627\u0643\u062A\u0634\u0627\u0641 \u0645\u0639\u0631\u0651\u0641\u0627\u062A \u0627\u0644\u0627\u0633\u062A\u0639\u0644\u0627\u0645 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627\u060C \u0628\u064A\u0627\u0646\u0627\u062A \u062E\u0627\u0645.","\u062C\u0645\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0638\u0627\u0647\u0631\u0629","\u062D\u0641\u0638 \u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0627\u062A \u0627\u0644\u062E\u0627\u0645","\u0635\u064A\u063A \u0627\u0644\u062A\u0635\u062F\u064A\u0631","JSON, CSV, HTML, Markdown","\u0643\u0644\u0627\u0633\u064A\u0643\u064A","\u064A\u0639\u064A\u062F \u0627\u0644\u0633\u0645\u0629 \u0627\u0644\u0645\u0639\u062A\u0645\u0629\u060C \u0648\u064A\u0628\u0642\u064A \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A\u060C \u0648\u064A\u062E\u0641\u064A Grok \u0641\u0642\u0637\u060C \u0628\u0644\u0627 \u062A\u0635\u0641\u064A\u0629 \u0628\u0631\u064A\u0645\u064A\u0648\u0645.","\u0627\u0644\u0648\u0636\u0639 \u0627\u0644\u0645\u0643\u062B\u0641","\u0645\u0639\u0637\u0651\u0644","\u0625\u062E\u0641\u0627\u0621 \u0648\u0627\u062C\u0647\u0627\u062A Grok","\u0628\u0633\u064A\u0637","\u0623\u0642\u0635\u0649 \u062A\u0628\u0633\u064A\u0637: \u0628\u0644\u0627 \u0623\u0639\u062F\u0627\u062F\u060C \u0628\u0644\u0627 \u062D\u062F\u0648\u062F\u060C \u0628\u0644\u0627 \u0627\u062A\u062C\u0627\u0647\u0627\u062A\u060C \u0645\u0633\u0627\u062D\u0627\u062A \u0622\u0645\u0646\u0629 \u0644\u0644\u0646\u0635 \u0627\u0644\u0643\u0628\u064A\u0631.","\u0646\u0648\u0627\u0631","\u0627\u0644\u0644\u063A\u0629","\u064A\u062A\u0631\u062C\u0645 \u0627\u0644\u0644\u0648\u062D\u0629 \u0648\u064A\u0636\u0628\u0637 \u0627\u062A\u062C\u0627\u0647 \u0627\u0644\u0642\u0631\u0627\u0621\u0629\u060C \u0645\u0646 \u0627\u0644\u064A\u0645\u064A\u0646 \u0625\u0644\u0649 \u0627\u0644\u064A\u0633\u0627\u0631 \u0644\u0644\u0639\u0631\u0628\u064A\u0629 \u0648\u0627\u0644\u0639\u0628\u0631\u064A\u0629. \u064A\u0639\u0631\u0636 \u0642\u0633\u0645 \u0627\u0644\u062E\u0635\u0648\u0635\u064A\u0629 \u0646\u0633\u0628\u0629 \u0627\u0643\u062A\u0645\u0627\u0644 \u0627\u0644\u0644\u063A\u0629 \u0627\u0644\u0645\u062E\u062A\u0627\u0631\u0629\u060C \u0648\u0645\u0627 \u064A\u0646\u0642\u0635 \u064A\u0628\u0642\u0649 \u0628\u0627\u0644\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629.","\u0627\u062E\u062A\u0631 \u0625\u0639\u062F\u0627\u062F\u064B\u0627 \u062C\u0627\u0647\u0632\u064B\u0627 \u0623\u0648 \u0627\u0646\u062A\u0642\u0644 \u0645\u0628\u0627\u0634\u0631\u0629 \u0625\u0644\u0649 \u0645\u0647\u0645\u0629 \u0634\u0627\u0626\u0639\u0629.","\u0627\u0644\u0645\u0647\u0627\u0645 \u0627\u0644\u0634\u0627\u0626\u0639\u0629","\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u062C\u0627\u0647\u0632\u0629","\u0627\u0644\u0644\u063A\u0629","\u064A\u064F\u0637\u0628\u064E\u0651\u0642 Noir \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627. \u0627\u062E\u062A\u0631 \u0625\u064A\u0642\u0627\u0641 \u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u062A\u0646\u0633\u064A\u0642 X \u0627\u0644\u0623\u0635\u0644\u064A.","\u0625\u064A\u0642\u0627\u0641 (\u0633\u0645\u0629 X \u0627\u0644\u0623\u0635\u0644\u064A\u0629)","\u0625\u0637\u0641\u0627\u0621 \u0627\u0644\u0623\u0636\u0648\u0627\u0621","\u062C\u0631\u0627\u0641\u064A\u062A","\u0628\u0631\u0642\u0648\u0642\u064A","\u0645\u0646\u062A\u0635\u0641 \u0627\u0644\u0644\u064A\u0644","\u0646\u0648\u0627\u0631 (\u0627\u0641\u062A\u0631\u0627\u0636\u064A)","\u064A\u0642\u0644\u0651\u0635 \u0627\u0644\u0645\u0633\u0627\u0641\u0627\u062A \u0641\u064A \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \u0644\u062A\u0635\u0641\u0651\u062D \u0623\u0633\u0631\u0639.","\u0639\u0631\u0636 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A","\u064A\u0633\u062A\u062E\u062F\u0645 \u0627\u0644\u0648\u0636\u0639 \u0627\u0644\u0639\u0631\u064A\u0636 \u0627\u0644\u0645\u0633\u0627\u062D\u0629 \u0627\u0644\u0643\u0627\u0645\u0644\u0629 \u0628\u062C\u0627\u0646\u0628 \u0627\u0644\u062A\u0646\u0642\u0644 \u0648\u064A\u062E\u0641\u064A \u0634\u0631\u064A\u0637 \u0627\u0644\u0627\u0633\u062A\u0643\u0634\u0627\u0641. \u064A\u062D\u0627\u0641\u0638 \u0627\u0644\u0648\u0636\u0639 \u0627\u0644\u0645\u0631\u064A\u062D \u0639\u0644\u0649 \u0630\u0644\u0643 \u0627\u0644\u0634\u0631\u064A\u0637.","\u0627\u0641\u062A\u0631\u0627\u0636\u064A","\u0645\u0631\u064A\u062D","\u0639\u0631\u064A\u0636 (\u0627\u0641\u062A\u0631\u0627\u0636\u064A)","\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u062E\u0637 Chirp","\u064A\u0641\u0631\u0636 \u062E\u0637 Chirp \u0627\u0644\u062E\u0627\u0635 \u0628\u0640 X \u062D\u064A\u062B \u0639\u0627\u062F \u0627\u0644\u0645\u0648\u0642\u0639 \u0625\u0644\u0649 \u062E\u0637 \u0627\u0644\u0646\u0638\u0627\u0645.","\u0645\u0641\u062A\u0627\u062D \u0631\u0626\u064A\u0633\u064A \u0644\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0623\u0631\u0628\u0639\u0629 \u0623\u062F\u0646\u0627\u0647. \u062A\u0638\u0644 \u0627\u0644\u0623\u0632\u0631\u0627\u0631 \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0648\u064A\u0633\u062A\u0645\u0631 \u0642\u0627\u0631\u0626 \u0627\u0644\u0634\u0627\u0634\u0629 \u0641\u064A \u0627\u0644\u0625\u0639\u0644\u0627\u0646 \u0639\u0646 \u0627\u0644\u0625\u062C\u0645\u0627\u0644\u064A\u0627\u062A.","\u0625\u062E\u0641\u0627\u0621 \u0639\u062F\u062F \u0627\u0644\u0631\u062F\u0648\u062F","\u064A\u064F\u0637\u0628\u064E\u0651\u0642 \u0623\u062B\u0646\u0627\u0621 \u062A\u0641\u0639\u064A\u0644 \xAB\u0625\u062E\u0641\u0627\u0621 \u0623\u0639\u062F\u0627\u062F \u0627\u0644\u062A\u0641\u0627\u0639\u0644\xBB.","\u0625\u062E\u0641\u0627\u0621 \u0639\u062F\u062F \u0625\u0639\u0627\u062F\u0627\u062A \u0627\u0644\u0646\u0634\u0631","\u0625\u062E\u0641\u0627\u0621 \u0639\u062F\u062F \u0627\u0644\u0625\u0639\u062C\u0627\u0628\u0627\u062A","\u0625\u062E\u0641\u0627\u0621 \u0639\u062F\u062F \u0627\u0644\u0645\u0634\u0627\u0647\u062F\u0627\u062A","\u064A\u064F\u0637\u0628\u064E\u0651\u0642 \u0623\u062B\u0646\u0627\u0621 \u062A\u0641\u0639\u064A\u0644 \xAB\u0625\u062E\u0641\u0627\u0621 \u0623\u0639\u062F\u0627\u062F \u0627\u0644\u062A\u0641\u0627\u0639\u0644\xBB. \u064A\u0648\u062C\u062F \u0625\u062C\u0645\u0627\u0644\u064A \u0627\u0644\u0645\u0634\u0627\u0647\u062F\u0627\u062A \u062F\u0627\u062E\u0644 \u0631\u0627\u0628\u0637 \u0627\u0644\u062A\u062D\u0644\u064A\u0644\u0627\u062A \u0648\u0644\u064A\u0633 \u0641\u064A \u0632\u0631 \u0625\u062C\u0631\u0627\u0621.","\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0639\u062F\u0651\u0627\u062F \u0641\u064A \u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u062A\u0628\u0648\u064A\u0628","\u064A\u0632\u064A\u0644 \u0639\u062F\u062F \u063A\u064A\u0631 \u0627\u0644\u0645\u0642\u0631\u0648\u0621 \u0641\u064A X \u0645\u0646 \u0639\u0646\u0648\u0627\u0646 \u062A\u0628\u0648\u064A\u0628 \u0627\u0644\u0645\u062A\u0635\u0641\u062D\u060C \u062D\u062A\u0649 \u0644\u0627 \u064A\u0639\u064A\u062F \u0627\u0644\u062A\u0628\u0648\u064A\u0628 \u0625\u0634\u0639\u0627\u0631\u064B\u0627 \u0633\u0628\u0642 \u0623\u0646 \u0623\u062E\u0641\u064A\u062A\u0647.","\u0637\u0648\u0627\u0628\u0639 \u0632\u0645\u0646\u064A\u0629 \u0645\u0637\u0644\u0642\u0629","\u064A\u0639\u0631\u0636 \u0627\u0644\u062A\u0627\u0631\u064A\u062E \u0648\u0627\u0644\u0648\u0642\u062A \u0627\u0644\u062F\u0642\u064A\u0642\u064A\u0646 \u0639\u0644\u0649 \u0643\u0644 \u0645\u0646\u0634\u0648\u0631 \u0628\u062F\u0644\u064B\u0627 \u0645\u0646 \u0627\u0644\u0646\u0635 \u0627\u0644\u0646\u0633\u0628\u064A \u0641\u064A X.","\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0623\u064A\u0642\u0648\u0646\u0629 \u062A\u0628\u0648\u064A\u0628 Aviary","\u064A\u0633\u062A\u0628\u062F\u0644 \u0623\u064A\u0642\u0648\u0646\u0629 X \u0627\u0644\u0645\u0641\u0636\u0651\u0644\u0629 \u0628\u0639\u0644\u0627\u0645\u0629 Aviary \u0644\u062A\u0645\u064A\u064A\u0632 \u062A\u0628\u0648\u064A\u0628\u0627\u062A\u0647\u0627 \u0628\u0633\u0647\u0648\u0644\u0629. \u0648\u0639\u0646\u062F \u0627\u0644\u0625\u064A\u0642\u0627\u0641 \u062A\u0639\u0648\u062F \u0623\u064A\u0642\u0648\u0646\u0629 X \u0627\u0644\u0623\u0635\u0644\u064A\u0629.","\u0625\u062E\u0641\u0627\u0621 \u062D\u062F\u0648\u062F \u0627\u0644\u0635\u0641\u0648\u0641","\u064A\u0632\u064A\u0644 \u0627\u0644\u0641\u0627\u0635\u0644 \u0628\u0633\u0645\u0643 \u0628\u0643\u0633\u0644 \u0648\u0627\u062D\u062F \u0623\u0633\u0641\u0644 \u0643\u0644 \u0645\u0646\u0634\u0648\u0631\u060C \u0648\u0627\u0644\u062E\u0637\u0648\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A\u0629 \u0644\u0644\u0639\u0645\u0648\u062F \u0627\u0644\u0631\u0626\u064A\u0633\u064A.","\u062A\u0628\u0627\u064A\u0646 \u0639\u0627\u0644\u064D","\u064A\u0633\u062A\u062E\u062F\u0645 \u062D\u062F\u0648\u062F\u064B\u0627 \u0648\u062A\u0628\u0627\u064A\u0646\u064B\u0627 \u0646\u0635\u064A\u064B\u0627 \u0623\u0642\u0648\u0649.","\u062A\u0642\u0644\u064A\u0644 \u0627\u0644\u062D\u0631\u0643\u0629","\u0627\u062A\u0651\u0628\u0627\u0639 \u0625\u0639\u062F\u0627\u062F \u0627\u0644\u0646\u0638\u0627\u0645","\u0627\u0644\u062A\u0642\u0644\u064A\u0644 \u062F\u0627\u0626\u0645\u064B\u0627","\u0639\u062F\u0645 \u0627\u0644\u062A\u0642\u0644\u064A\u0644","CSS \u0645\u062E\u0635\u0635","\u062A\u0639\u062F\u064A\u0644\u0627\u062A \u0645\u062D\u0644\u064A\u0629 \u0627\u062E\u062A\u064A\u0627\u0631\u064A\u0629 \u0644\u0644\u0623\u0633\u0637\u062D \u0627\u0644\u0645\u062D\u062F\u062F\u0629 \u0623\u062F\u0646\u0627\u0647. \u0644\u0627 \u064A\u063A\u0627\u062F\u0631 CSS \u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A \u0648\u0644\u0627 \u062A\u063A\u0637\u064A\u0647 \u062A\u0648\u0642\u0639\u0627\u062A \u062A\u0642\u0627\u0631\u064A\u0631 \u0627\u0644\u0623\u062E\u0637\u0627\u0621.","CSS \u0644\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A","\u064A\u0637\u0628\u0642 \u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0639\u0631\u0648\u0636\u0629 \u0641\u0642\u0637. \u0645\u062B\u0627\u0644: article { border-radius: 18px; }","CSS \u0644\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637","\u064A\u0637\u0628\u0642 \u0639\u0644\u0649 \u0623\u0632\u0631\u0627\u0631 \u0648\u0633\u0627\u0626\u0637 Aviary \u0648\u0645\u062D\u062A\u0648\u064A\u0627\u062A\u0647\u0627 \u0641\u0642\u0637.","CSS \u0644\u0644\u062A\u0646\u0642\u0644","\u064A\u0637\u0628\u0642 \u0639\u0644\u0649 \u0634\u0631\u064A\u0637 \u062A\u0646\u0642\u0644 X \u0641\u0642\u0637.","CSS \u0644\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A","\u064A\u0637\u0628\u0642 \u0639\u0644\u0649 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0644\u0644\u0627\u0633\u062A\u0643\u0634\u0627\u0641 \u0641\u064A X \u0641\u0642\u0637.","CSS \u0644\u0644\u0643\u0627\u062A\u0628","\u064A\u0637\u0628\u0642 \u0639\u0644\u0649 \u0634\u0631\u064A\u0637 \u0623\u062F\u0648\u0627\u062A \u0627\u0644\u0643\u0627\u062A\u0628 \u0648\u0645\u0646\u0637\u0642\u0629 \u0627\u0644\u0646\u0635 \u0641\u0642\u0637.","\u063A\u064A\u0651\u0631 \u0627\u0644\u0623\u0644\u0648\u0627\u0646 \u0648\u0627\u0644\u062A\u0628\u0627\u0639\u062F \u0648\u0627\u0644\u0646\u0635 \u0648\u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0638\u0627\u0647\u0631\u0629 \u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A.","\u0627\u0644\u0645\u0638\u0647\u0631 \u0648\u0627\u0644\u062A\u062E\u0637\u064A\u0637","\u062A\u0641\u0627\u0635\u064A\u0644 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A","\u0625\u0645\u0643\u0627\u0646\u064A\u0629 \u0627\u0644\u0648\u0635\u0648\u0644","\u062A\u0646\u0633\u064A\u0642 \u0645\u062A\u0642\u062F\u0645","\u062A\u0628\u062F\u0623 \u0627\u0644\u062D\u0645\u0627\u064A\u0629 \u0639\u0646\u062F \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0645\u0633\u062A\u0646\u062F.","\u0648\u0636\u0639 \u0628\u0644\u0627 \u0625\u0639\u0644\u0627\u0646\u0627\u062A","\u064A\u0637\u0648\u064A \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0645\u0648\u0651\u0644\u0629 \u0648\u0627\u0644\u0634\u0631\u0627\u0643\u0627\u062A \u0627\u0644\u0645\u062F\u0641\u0648\u0639\u0629 \u0648\u0627\u0644\u0645\u0648\u0627\u0636\u064A\u0639 \u0627\u0644\u0631\u0627\u0626\u062C\u0629 \u0627\u0644\u0645\u0631\u0648\u0651\u062C\u0629 \u0648\u0627\u0644\u0639\u0631\u0648\u0636 \u0627\u0644\u062F\u0627\u062E\u0644\u064A\u0629 \u0648\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0645\u0627 \u0642\u0628\u0644 \u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0638\u0627\u0647\u0631\u0629. \u064A\u0631\u0641\u0636 Aviary \u0623\u064A\u0636\u064B\u0627 \u0637\u0644\u0628 \u0627\u0644\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u0645\u0646\u0641\u0635\u0644 \u0644\u0644\u0645\u062D\u062A\u0648\u0649 \u0627\u0644\u0645\u0631\u0648\u0651\u062C \u0645\u0646 X \u0645\u0646 \u062F\u0648\u0646 \u062D\u0638\u0631 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A.","\u0631\u0641\u0636 \u0637\u0644\u0628 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0641\u064A X","\u064A\u0646\u0637\u0628\u0642 \u0647\u0630\u0627 \u0641\u0642\u0637 \u0623\u062B\u0646\u0627\u0621 \u062A\u0641\u0639\u064A\u0644 \u0648\u0636\u0639 \u0628\u0644\u0627 \u0625\u0639\u0644\u0627\u0646\u0627\u062A. \u064A\u0631\u0641\u0636 Aviary \u0637\u0644\u0628\u064B\u0627 \u0648\u0627\u062D\u062F\u064B\u0627 \u0641\u0642\u0637 (\u0637\u0644\u0628 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u0645\u062D\u062A\u0648\u0649 \u0627\u0644\u0645\u0645\u0648\u0651\u0644 \u0627\u0644\u062E\u0627\u0635 \u0628\u0645\u0646\u0635\u0629 X) \u0648\u0644\u0627 \u064A\u0631\u0641\u0636 \u0623\u064A \u0637\u0644\u0628 \u0622\u062E\u0631\u060C \u0628\u0645\u0627 \u0641\u064A \u0630\u0644\u0643 \u0627\u0644\u0641\u062D\u0648\u0635\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u0633\u062A\u062E\u062F\u0645\u0647\u0627 X \u0644\u0627\u0643\u062A\u0634\u0627\u0641 \u0645\u0627\u0646\u0639 \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A. \u0623\u0648\u0642\u0641 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u0625\u0630\u0627 \u0627\u0634\u062A\u0643\u062A X \u0631\u063A\u0645 \u0630\u0644\u0643: \u062A\u0628\u0642\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0645\u0648\u0651\u0644\u0629 \u0645\u062E\u0641\u064A\u0629 \u0648\u064A\u062A\u0648\u0642\u0641 Aviary \u0639\u0646 \u0631\u0641\u0636 \u0623\u064A \u0637\u0644\u0628 \u0639\u0644\u0649 \u0627\u0644\u0625\u0637\u0644\u0627\u0642.","\u062D\u0627\u0644\u0629 \u0627\u0644\u062D\u0645\u0627\u064A\u0629 \u0645\u0646 \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A","\u064A\u0642\u0644\u0651\u0644 \u0636\u062C\u064A\u062C \u0627\u0644\u062A\u0631\u0646\u062F\u0627\u062A \u0648\u0627\u0644\u062A\u0648\u0635\u064A\u0627\u062A \u0648\u0627\u0644\u062A\u0630\u064A\u064A\u0644.","\u064A\u0632\u064A\u0644 \u0627\u0644\u0645\u0648\u0627\u0636\u064A\u0639 \u0627\u0644\u0631\u0627\u0626\u062C\u0629 \u0648\u0648\u062D\u062F\u0627\u062A \u0627\u0644\u0623\u062E\u0628\u0627\u0631.","\u0625\u062E\u0641\u0627\u0621 \u0627\u0642\u062A\u0631\u0627\u062D\u0627\u062A \u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629","\u064A\u0632\u064A\u0644 \u0628\u0637\u0627\u0642\u0627\u062A \xAB\u0645\u0646 \u062A\u062A\u0627\u0628\u0639\xBB \u0645\u0646 \u062F\u0648\u0646 \u0625\u062E\u0641\u0627\u0621 \u0628\u0642\u064A\u0629 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A.","\u0625\u062E\u0641\u0627\u0621 \u0645\u062D\u0631\u0631 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629","\u064A\u0632\u064A\u0644 \u0645\u062D\u0631\u0631 \u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0633\u0631\u064A\u0639 \u0645\u0646 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629. \u064A\u0638\u0644 \u0632\u0631 \xAB\u0646\u0634\u0631\xBB \u0645\u062A\u0627\u062D\u064B\u0627 \u0644\u0641\u062A\u062D\u0647 \u0639\u0646\u062F \u0627\u0644\u062D\u0627\u062C\u0629.","\u0625\u062E\u0641\u0627\u0621 \u062A\u0648\u0635\u064A\u0627\u062A \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629","\u064A\u0646\u0647\u064A \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629 \u0639\u0646\u062F \u0622\u062E\u0631 \u0631\u062F \u062D\u0642\u064A\u0642\u064A \u0628\u0637\u064A \u0642\u0633\u0645 \u0627\u0643\u062A\u0634\u0641 \u0627\u0644\u0645\u0632\u064A\u062F \u0648\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u062A\u0631\u062D\u0629 \u0623\u0633\u0641\u0644\u0647.","\u064A\u0632\u064A\u0644 \u0644\u0648\u062D\u0629 Grok \u0648\u0631\u0627\u0628\u0637 \u0627\u0644\u062A\u0646\u0642\u0644 \u0648\u0645\u062F\u0627\u062E\u0644 \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0635\u0648\u0631 \u0648\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0643\u0644 \u0645\u0646\u0634\u0648\u0631.","\u064A\u0645\u0646\u0639 X \u0645\u0646 \u0641\u062A\u062D \u0628\u0637\u0627\u0642\u0629 \u0645\u0644\u0641 \u0634\u062E\u0635\u064A \u0623\u0648 \u062A\u0644\u0645\u064A\u062D \u0639\u0646\u062F \u0648\u0636\u0639 \u0627\u0644\u0645\u0624\u0634\u0631 \u0639\u0644\u0649 \u0627\u0633\u0645 \u0623\u0648 \u0635\u0648\u0631\u0629 \u0623\u0648 \u0639\u0646\u0635\u0631 \u062A\u062D\u0643\u0645. \u062A\u0628\u0642\u0649 \u0627\u0644\u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u062A\u064A \u062A\u0646\u0642\u0631\u0647\u0627 \u0648\u0627\u0644\u062A\u0633\u0645\u064A\u0627\u062A \u0648\u0623\u0633\u0645\u0627\u0621 \u0642\u0627\u0631\u0626 \u0627\u0644\u0634\u0627\u0634\u0629 \u0643\u0645\u0627 \u0647\u064A.","\u0648\u0636\u0639 \u0627\u0644\u062A\u0631\u0643\u064A\u0632","\u062E\u0627\u0631\u062C \u0627\u0644\u0623\u0648\u0642\u0627\u062A \u0623\u062F\u0646\u0627\u0647\u060C \u064A\u063A\u0637\u064A \u0639\u0645\u0648\u062F \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0628\u0644\u0648\u062D\u0629 \u0645\u062D\u0644\u064A\u0629 \u0647\u0627\u062F\u0626\u0629. \u064A\u0628\u0642\u0649 \u0627\u0644\u062A\u0646\u0642\u0644 \u0645\u062A\u0627\u062D\u064B\u0627\u060C \u0648\u064A\u0643\u0641\u064A \u0646\u0642\u0631\u0629 \u0648\u0627\u062D\u062F\u0629 \u0644\u062A\u062C\u0627\u0648\u0632 \u0645\u0624\u0642\u062A \u0644\u062E\u0645\u0633 \u062F\u0642\u0627\u0626\u0642. \u0644\u0627 \u064A\u064F\u062D\u062C\u0628 \u0634\u064A\u0621 \u0648\u0644\u0627 \u064A\u063A\u0627\u062F\u0631 \u0634\u064A\u0621 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632.","\u0628\u062F\u0627\u064A\u0629 \u0633\u0627\u0639\u0627\u062A \u0627\u0644\u0642\u0631\u0627\u0621\u0629","\u0627\u0644\u0648\u0642\u062A \u0628\u0646\u0638\u0627\u0645 24 \u0633\u0627\u0639\u0629\u060C \u0645\u062B\u0644 09:00.","\u0646\u0647\u0627\u064A\u0629 \u0633\u0627\u0639\u0627\u062A \u0627\u0644\u0642\u0631\u0627\u0621\u0629","\u0627\u0644\u0648\u0642\u062A \u0628\u0646\u0638\u0627\u0645 24 \u0633\u0627\u0639\u0629. \u0625\u0630\u0627 \u0633\u0628\u0642\u062A \u0627\u0644\u0646\u0647\u0627\u064A\u0629\u064F \u0627\u0644\u0628\u062F\u0627\u064A\u0629\u064E \u0641\u0625\u0646 \u0627\u0644\u0645\u062F\u0629 \u062A\u0645\u062A\u062F \u0639\u0628\u0631 \u0645\u0646\u062A\u0635\u0641 \u0627\u0644\u0644\u064A\u0644.","\u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \u0628\u0639\u062F","\u0639\u062F\u062F \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u064F\u0639\u0631\u0636 \u0642\u0628\u0644 \u0623\u0646 \u064A\u062A\u0648\u0642\u0641 \u0627\u0644\u062A\u0645\u0631\u064A\u0631 \u0639\u0646 \u0627\u0644\u0627\u0645\u062A\u062F\u0627\u062F\u060C \u0645\u0639 \u0632\u0631 \u0644\u0644\u0645\u062A\u0627\u0628\u0639\u0629. \u0627\u0644\u0635\u0641\u0631 \u064A\u062A\u0631\u0643 \u0627\u0644\u062A\u0645\u0631\u064A\u0631 \u0627\u0644\u0644\u0627\u0646\u0647\u0627\u0626\u064A \u0641\u064A X \u0643\u0645\u0627 \u0647\u0648. \u0644\u0627 \u064A\u062A\u062D\u0631\u0643 \u0623\u064A \u0634\u064A\u0621 \u0645\u0648\u062C\u0648\u062F \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629\u060C \u0648\u064A\u0638\u0647\u0631 \u0627\u0644\u0632\u0631 \u0623\u0633\u0641\u0644 \u0622\u062E\u0631 \u0645\u0646\u0634\u0648\u0631 \u0644\u0627 \u0641\u0648\u0642\u0647.","\u062A\u0648\u0633\u064A\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0637\u0648\u064A\u0644\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627","\u064A\u0646\u0642\u0631 \u0639\u0644\u0649 \u0632\u0631 \u0639\u0631\u0636 \u0627\u0644\u0645\u0632\u064A\u062F \u0627\u0644\u062E\u0627\u0635 \u0628\u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0641\u0642\u0637 \u0628\u0639\u062F \u062A\u0648\u0642\u0641 \u0627\u0644\u062A\u0645\u0631\u064A\u0631. \u0644\u0627 \u064A\u063A\u064A\u0651\u0631 \u0627\u0644\u0631\u062F\u0648\u062F \u0623\u0648 \u0627\u0644\u0623\u0634\u0631\u0637\u0629 \u0627\u0644\u062C\u0627\u0646\u0628\u064A\u0629 \u0623\u0648 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u062A\u0628\u0633\u0629 \u0623\u0648 \u0631\u0648\u0627\u0628\u0637 \u0639\u0631\u0636 \u0627\u0644\u0645\u0632\u064A\u062F \u0627\u0644\u0623\u062E\u0631\u0649.","\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u0648\u0636\u0639 \u0628\u0639\u062F \u0627\u0644\u0631\u062C\u0648\u0639","\u064A\u0639\u0648\u062F \u0625\u0644\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u0638\u0627\u0647\u0631 \u0646\u0641\u0633\u0647 \u0628\u0639\u062F \u0641\u062A\u062D \u0645\u0646\u0634\u0648\u0631 \u0623\u0648 \u0635\u0641\u062D\u0629 \u0623\u062E\u0631\u0649 \u0639\u0644\u0649 X \u0648\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0632\u0631 \u0627\u0644\u0631\u062C\u0648\u0639 \u0641\u064A \u0627\u0644\u0645\u062A\u0635\u0641\u062D. \u0623\u064A \u062A\u0645\u0631\u064A\u0631 \u0628\u0627\u0644\u0639\u062C\u0644\u0629 \u0623\u0648 \u0627\u0644\u0644\u0645\u0633 \u0623\u0648 \u0627\u0644\u0645\u0624\u0634\u0631 \u0623\u0648 \u0644\u0648\u062D\u0629 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u064A\u0644\u063A\u064A \u0627\u0644\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0641\u0648\u0631\u064B\u0627.","\u0625\u0638\u0647\u0627\u0631 \u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0642\u0631\u0627\u0621\u0629","\u064A\u062D\u0641\u0638 \u0645\u0648\u0636\u0639\u064B\u0627 \u0645\u062D\u0644\u064A\u064B\u0627 \u0644\u0643\u0644 \u0645\u0648\u062C\u0632 \u0648\u064A\u0639\u0631\u0636 \u0633\u0637\u0631\u064B\u0627 \u0644\u0644\u062C\u062F\u064A\u062F \u0645\u0646\u0630 \u0622\u062E\u0631 \u0632\u064A\u0627\u0631\u0629. \u0644\u0627 \u064A\u0636\u064A\u0641 \u0634\u0627\u0631\u0629 \u0644\u063A\u064A\u0631 \u0627\u0644\u0645\u0642\u0631\u0648\u0621.","\u0623\u0633\u0637\u062D \u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0642\u0631\u0627\u0621\u0629","\u0627\u062E\u062A\u0631 \u0627\u0644\u0623\u0645\u0627\u0643\u0646 \u0627\u0644\u062A\u064A \u062A\u0638\u0647\u0631 \u0641\u064A\u0647\u0627 \u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0645\u0648\u0636\u0639 \u0627\u0644\u0645\u062D\u0644\u064A\u0629 \u0648\u0641\u0627\u0635\u0644 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062C\u062F\u064A\u062F\u0629.","\u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629","\u0645\u0646\u0634\u0648\u0631","\u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A","\u0627\u0644\u0628\u062D\u062B","\u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062A","\u0627\u0644\u0631\u0633\u0627\u0626\u0644","\u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062A\u0631\u0643\u064A\u0632 \u0639\u0644\u0649 \u0645\u062D\u0631\u0631 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u060C \u064A\u062E\u0641\u062A \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0648\u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \u062E\u0644\u0641\u0647. \u064A\u0639\u0648\u062F \u0643\u0644 \u0634\u064A\u0621 \u0628\u0645\u062C\u0631\u062F \u0627\u0644\u0646\u0642\u0631 \u062E\u0627\u0631\u062C\u0647.","\u0641\u062A\u062D \xAB\u0627\u0644\u0645\u062A\u0627\u0628\u064E\u0639\u0648\u0646\xBB \u0628\u062F\u0644\u064B\u0627 \u0645\u0646 \xAB\u0644\u0643\xBB","\u064A\u062D\u062F\u062F \u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062A\u0628\u0648\u064A\u0628 \u0627\u0644\u062B\u0627\u0646\u064A\u0629 \u0641\u064A \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629 \u0641\u064A \u0643\u0644 \u0645\u0631\u0629 \u062A\u0635\u0644 \u0641\u064A\u0647\u0627 \u0625\u0644\u0649 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A. \u0648\u0625\u0630\u0627 \u0639\u062F\u062A \u0625\u0644\u0649 \xAB\u0644\u0643\xBB \u0641\u0633\u064A\u0628\u0642\u0649 \u0643\u0630\u0644\u0643 \u062D\u062A\u0649 \u062A\u063A\u0627\u062F\u0631 \u0627\u0644\u0635\u0641\u062D\u0629.","\u0625\u062E\u0641\u0627\u0621 \u062A\u0628\u0648\u064A\u0628 \xAB\u0644\u0643\xBB","\u064A\u062E\u062A\u0627\u0631 \xAB\u0627\u0644\u0645\u062A\u0627\u0628\u064E\u0639\u0648\u0646\xBB \u062B\u0645 \u064A\u0637\u0648\u064A \u0623\u0648\u0644 \u062A\u0628\u0648\u064A\u0628 \u0641\u064A \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629. \u064A\u0639\u0645\u0644 \u0639\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629 \u0641\u0642\u0637 \u0648\u064A\u064F\u0639\u0627\u062F \u0641\u0648\u0631\u064B\u0627 \u0639\u0646\u062F \u0625\u064A\u0642\u0627\u0641\u0647.","\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0645\u0646 \u0623\u064A\u0642\u0648\u0646\u0629 \u0627\u0644\u0631\u062F \u0641\u0642\u0637","\u064A\u062C\u0639\u0644 X \u0627\u0644\u0635\u0641 \u0628\u0623\u0643\u0645\u0644\u0647 \u0631\u0627\u0628\u0637\u064B\u0627\u060C \u0644\u0630\u0627 \u0641\u0625\u0646 \u0627\u0644\u0636\u063A\u0637 \u0639\u0644\u0649 \u0627\u0644\u0646\u0635 \u0623\u0648 \u0628\u062C\u0648\u0627\u0631 \u0623\u062D\u062F \u0627\u0644\u0623\u0632\u0631\u0627\u0631 \u064A\u0641\u062A\u062D \u0645\u0646\u0634\u0648\u0631\u064B\u0627 \u0644\u0645 \u062A\u062E\u062A\u0631\u0647. \u064A\u0632\u064A\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u0645\u0646\u0637\u0642\u0629 \u0627\u0644\u0646\u0642\u0631 \u0645\u0646 \u0627\u0644\u0635\u0641 \u0648\u064A\u0645\u0646\u062D\u0647\u0627 \u0644\u0623\u064A\u0642\u0648\u0646\u0629 \u0627\u0644\u0631\u062F\u060C \u0627\u0644\u062A\u064A \u062A\u0641\u062A\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0628\u062F\u0644\u064B\u0627 \u0645\u0646 \u0645\u0631\u0628\u0639 \u0627\u0644\u0631\u062F. \u062A\u0638\u0644 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0648\u0627\u0644\u0623\u0632\u0631\u0627\u0631 \u0648\u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0648\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u062A\u0628\u0633\u0629 \u062A\u0639\u0645\u0644 \u0643\u0645\u0627 \u0647\u064A.","\u0625\u062E\u0641\u0627\u0621 \u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062A\u0646\u0642\u0644","\u0645\u0639\u0631\u0651\u0641 \u062A\u0646\u0642\u0651\u0644 \u062B\u0627\u0628\u062A \u0648\u0627\u062D\u062F \u0645\u0646 X \u0641\u064A \u0643\u0644 \u0633\u0637\u0631: home \u0648explore \u0648notifications \u0648follow \u0648chat \u0648messages \u0648grok \u0648history \u0648studio \u0648premium \u0648profile \u0623\u0648 more.","\u0623\u062E\u0641\u0650 \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0648\u0623\u062C\u0632\u0627\u0621 X \u0627\u0644\u062A\u064A \u0644\u0627 \u062A\u0633\u062A\u062E\u062F\u0645\u0647\u0627.","\u0627\u0644\u062D\u0645\u0627\u064A\u0629 \u0645\u0646 \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A","\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0635\u0641\u062D\u0629","\u062A\u062F\u0641\u0642 \u0627\u0644\u0642\u0631\u0627\u0621\u0629","\u0627\u0644\u062A\u0646\u0642\u0644","\u0627\u0644\u0642\u0648\u0627\u0639\u062F \u0646\u0634\u0637\u0629 \u0641\u064A \u0627\u0644\u0645\u0633\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u062F\u062F\u0629.","\u062A\u0641\u0639\u064A\u0644 \u0627\u0644\u0641\u0644\u0627\u062A\u0631","\u0645\u0641\u062A\u0627\u062D \u0631\u0626\u064A\u0633\u064A \u0644\u0641\u0644\u0627\u062A\u0631 \u0627\u0644\u0643\u0644\u0645\u0627\u062A \u0627\u0644\u0645\u0641\u062A\u0627\u062D\u064A\u0629 \u0648\u0627\u0644\u062A\u0639\u0628\u064A\u0631\u0627\u062A \u0627\u0644\u0646\u0645\u0637\u064A\u0629 \u0648\u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A \u0627\u0644\u0645\u0645\u064A\u0632\u0629 \u0648\u0627\u0644\u0648\u0633\u0627\u0626\u0637.","\u062D\u0627\u0644\u0629 \u0627\u0644\u0642\u0648\u0627\u0639\u062F","\u063A\u064A\u0631 \u0646\u0634\u0637 \u062D\u062A\u0649 \u062A\u0641\u0639\u064A\u0644 \u0639\u0648\u0627\u0645\u0644 \u0627\u0644\u062A\u0635\u0641\u064A\u0629. \u064A\u0645\u0643\u0646\u0643 \u062A\u0639\u062F\u064A\u0644 \u0627\u0644\u0642\u0648\u0627\u0639\u062F \u0642\u0628\u0644 \u062A\u0634\u063A\u064A\u0644\u0647\u0627.","\u062A\u0639\u062A\u064A\u0645 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u0631\u0623\u064A\u062A\u0647\u0627","\u064A\u064F\u062E\u0641\u062A \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0639\u0646\u062F \u0645\u0631\u0648\u0631\u0647 \u0644\u0644\u0645\u0631\u0629 \u0627\u0644\u062B\u0627\u0646\u064A\u0629 \u0648\u064A\u062D\u062A\u0641\u0638 \u0628\u0646\u0633\u062E\u0629 \u0645\u062D\u0644\u064A\u0629 \u0645\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u0639\u0631\u0636\u0647\u0627 Aviary. \u0645\u0631\u0631 \u0627\u0644\u0645\u0624\u0634\u0631 \u0641\u0648\u0642 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u062E\u0627\u0641\u062A \u0644\u0625\u0638\u0647\u0627\u0631\u0647.","\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0648\u0621\u0629 \u0641\u064A","\u0627\u062E\u062A\u0631 \u0627\u0644\u0645\u0648\u062C\u0632\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u062E\u0641\u062A \u0641\u064A\u0647\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u0631\u0623\u064A\u062A\u0647\u0627 \u0645\u0646 \u0642\u0628\u0644.","\u0642\u0648\u0627\u0639\u062F \u0627\u0644\u062A\u0635\u0641\u064A\u0629","\u0642\u0627\u0639\u062F\u0629 \u0648\u0627\u062D\u062F\u0629 \u0641\u064A \u0643\u0644 \u0633\u0637\u0631: \u0627\u0644\u062D\u0642\u0644\u060C \u062B\u0645 not \u0627\u062E\u062A\u064A\u0627\u0631\u064A\u0629\u060C \u062B\u0645 \u0627\u0644\u0639\u0627\u0645\u0644\u060C \u062B\u0645 \u0627\u0644\u0642\u064A\u0645\u0629. \u0627\u0644\u062D\u0642\u0648\u0644 \u0647\u064A text \u0648handle \u0648media \u0648verified \u0648link\u060C \u0648\u0627\u0644\u0639\u0648\u0627\u0645\u0644 \u0647\u064A contains \u0648is \u0648starts \u0648ends \u0648matches. \u0627\u0631\u0628\u0637\u0647\u0627 \u0628\u0640 and / or\u060C \u0648\u0627\u0628\u062F\u0623 \u0628\u0640 \u200Edim:\u200E \u0644\u0644\u062A\u0639\u062A\u064A\u0645 \u0628\u062F\u0644 \u0627\u0644\u0625\u062E\u0641\u0627\u0621. \u0633\u0645\u0650\u0651 \u0627\u0644\u0642\u0627\u0639\u062F\u0629 \u0628\u0628\u062F\u0621 \u0627\u0644\u0633\u0637\u0631 \u0628\u0640 [\u0639\u0646\u0648\u0627\u0646]\u060C \u0648\u0627\u0645\u0646\u062D\u0647\u0627 \u0645\u062F\u0629 \u0645\u062D\u062F\u0648\u062F\u0629 \u0628\u0640 \u200Efor 7d from <\u0627\u0644\u062A\u0627\u0631\u064A\u062E>\u200E. \u0645\u062B\u0627\u0644: [Weekend sales] dim for 7d from 2026-08-19T10:00:00.000Z: text contains sale and media is photo","\u0645\u062C\u0645\u0648\u0639\u0629 \u0642\u0648\u0627\u0639\u062F \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u0646\u0642\u0644","\u0635\u062F\u0651\u0631 \u0646\u0635\u064B\u0627 \u0639\u0627\u062F\u064A\u064B\u0627 \u0623\u0648 \u0627\u0644\u0635\u0642 \u0645\u062C\u0645\u0648\u0639\u0629 \u0644\u0645\u0639\u0627\u064A\u0646\u062A\u0647\u0627 \u0642\u0628\u0644 \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0642\u0648\u0627\u0639\u062F \u0623\u0648 \u0627\u0633\u062A\u0628\u062F\u0627\u0644\u0647\u0627.","\u0627\u0644\u0635\u0642 \u0627\u0644\u0642\u0648\u0627\u0639\u062F \u0647\u0646\u0627","\u062A\u0635\u062F\u064A\u0631 .txt","\u0645\u0639\u0627\u064A\u0646\u0629","\u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0642\u0648\u0627\u0639\u062F","\u0627\u0633\u062A\u0628\u062F\u0627\u0644 \u0627\u0644\u0642\u0648\u0627\u0639\u062F","\u0627\u0644\u0635\u0642 \u0627\u0644\u0642\u0648\u0627\u0639\u062F \u0644\u0639\u0631\u0636 \u062E\u064A\u0627\u0631\u064A \u0627\u0644\u0627\u0633\u062A\u064A\u0631\u0627\u062F.","\u0642\u0648\u0627\u0639\u062F \u0627\u0644\u0643\u0644\u0645\u0627\u062A \u0627\u0644\u0645\u0641\u062A\u0627\u062D\u064A\u0629","\u0643\u0644\u0645\u0629 \u0623\u0648 \u0639\u0628\u0627\u0631\u0629 \u0648\u0627\u062D\u062F\u0629 \u0641\u064A \u0643\u0644 \u0633\u0637\u0631. \u0627\u0644\u0645\u0637\u0627\u0628\u0642\u0629 \u062C\u0632\u0626\u064A\u0629 \u0648\u0644\u0627 \u062A\u0645\u064A\u0651\u0632 \u0628\u064A\u0646 \u0627\u0644\u0623\u062D\u0631\u0641 \u0627\u0644\u0643\u0628\u064A\u0631\u0629 \u0648\u0627\u0644\u0635\u063A\u064A\u0631\u0629.","\u0642\u0648\u0627\u0639\u062F \u0627\u0644\u062A\u0639\u0628\u064A\u0631\u0627\u062A \u0627\u0644\u0646\u0645\u0637\u064A\u0629","\u0646\u0645\u0637 \u0648\u0627\u062D\u062F \u0641\u064A \u0643\u0644 \u0633\u0637\u0631. \u0627\u0633\u062A\u062E\u062F\u0645 \u200E/pattern/flags\u200E \u0623\u0648 \u0627\u0644\u0646\u0645\u0637 \u0645\u062C\u0631\u062F\u064B\u0627 (\u062F\u0648\u0646 \u062A\u0645\u064A\u064A\u0632 \u062D\u0627\u0644\u0629 \u0627\u0644\u0623\u062D\u0631\u0641).","\u062D\u0633\u0627\u0628\u0627\u062A \u0645\u0633\u062A\u062B\u0646\u0627\u0629","\u0623\u0633\u0645\u0627\u0621 \u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A (\u0648\u0627\u062D\u062F \u0641\u064A \u0643\u0644 \u0633\u0637\u0631\u060C \u062F\u0648\u0646 @) \u0627\u0644\u062A\u064A \u0644\u0627 \u062A\u064F\u0641\u0644\u062A\u0631 \u0623\u0628\u062F\u064B\u0627.","\u0645\u0646\u0634\u0648\u0631\u0627\u062A Premium \u0648\u0627\u0644\u0645\u0648\u062B\u0651\u0642\u0629","\u0625\u064A\u0642\u0627\u0641","\u0625\u062E\u0641\u0627\u0621","\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0627\u0642\u062A\u0628\u0627\u0633","\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u0642\u062A\u0628\u0633 \u0645\u0646\u0634\u0648\u0631\u064B\u0627 \u0622\u062E\u0631.","\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0631\u062F\u0648\u062F \u0627\u0644\u062A\u064A \u0641\u064A\u0647\u0627 \u0635\u0648\u0631 \u0623\u0648 \u0635\u0648\u0631 \u0645\u062A\u062D\u0631\u0643\u0629 \u0623\u0648 \u0641\u064A\u062F\u064A\u0648","\u0623\u0633\u0641\u0644 \u0645\u0646\u0634\u0648\u0631 \u0641\u062A\u062D\u062A\u0647\u060C \u064A\u064F\u0633\u0642\u0637 \u0643\u0644 \u0631\u062F \u064A\u062D\u0645\u0644 \u0635\u0648\u0631\u0629 \u0623\u0648 \u0635\u0648\u0631\u0629 \u0645\u062A\u062D\u0631\u0643\u0629 \u0623\u0648 \u0641\u064A\u062F\u064A\u0648. \u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0631\u0627\u0641\u0642 \u0644\u0627 \u064A\u063A\u064A\u0651\u0631 \u0634\u064A\u0626\u064B\u0627\u060C \u0641\u0623\u063A\u0644\u0628 \u0627\u0644\u0637\u0631\u0627\u0626\u0641 \u062A\u0623\u062A\u064A \u0645\u0639 \u062A\u0639\u0644\u064A\u0642 \u0645\u0643\u062A\u0648\u0628. \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0646\u0641\u0633\u0647 \u0648\u0627\u0644\u0633\u0644\u0633\u0644\u0629 \u0641\u0648\u0642\u0647 \u064A\u0628\u0642\u064A\u0627\u0646 \u0643\u0645\u0627 \u0647\u0645\u0627\u060C \u0648\u064A\u0628\u0642\u0649 \u0627\u0644\u0631\u062F \u0627\u0644\u0630\u064A \u064A\u0643\u062A\u0641\u064A \u0628\u0627\u0642\u062A\u0628\u0627\u0633 \u0645\u0646\u0634\u0648\u0631 \u0641\u064A\u0647 \u0635\u0648\u0631\u0629. \u062A\u0639\u0645\u0644 \u0647\u0630\u0647 \u0627\u0644\u062E\u0627\u0635\u064A\u0629 \u0648\u062D\u062F\u0647\u0627 \u062F\u0648\u0646 \u0627\u0644\u0645\u0631\u0634\u062D\u0627\u062A \u0623\u0639\u0644\u0627\u0647\u060C \u0644\u0623\u0646 \u062A\u0648\u062C\u064A\u0647 \u062A\u0644\u0643 \u0627\u0644\u0645\u0631\u0634\u062D\u0627\u062A \u0625\u0644\u0649 \u0645\u062D\u0627\u062F\u062B\u0629 \u0633\u064A\u062E\u0641\u064A \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u0630\u064A \u062C\u0626\u062A \u0644\u0642\u0631\u0627\u0621\u062A\u0647.","\u0628\u064A\u0627\u0646 \u0633\u0628\u0628 \u062A\u0635\u0641\u064A\u0629 \u0627\u0644\u0645\u0646\u0634\u0648\u0631","\u0627\u0644\u0641\u0644\u062A\u0631 \u0627\u0644\u0630\u064A \u064A\u062E\u0641\u064A \u0628\u0635\u0645\u062A \u064A\u0635\u0639\u0628 \u062A\u0645\u064A\u064A\u0632\u0647 \u0639\u0646 \u062E\u0644\u0644. \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0639\u062A\u064E\u0651\u0645\u0629 \u064A\u0645\u0643\u0646\u0647\u0627 \u0628\u064A\u0627\u0646 \u0645\u0627 \u0627\u0644\u0630\u064A \u0635\u0641\u0651\u0627\u0647\u0627 \u062F\u0648\u0646 \u0623\u064A \u062A\u0623\u062B\u064A\u0631 \u0639\u0644\u0649 \u0627\u0644\u062A\u062E\u0637\u064A\u0637\u061B \u0648\u0627\u0644\u062E\u064A\u0627\u0631 \u0627\u0644\u062B\u0627\u0644\u062B \u064A\u062D\u0648\u0651\u0644 \u0623\u064A\u0636\u064B\u0627 \u0643\u0644 \u0645\u0646\u0634\u0648\u0631 \u0645\u062E\u0641\u064A \u0625\u0644\u0649 \u0634\u0631\u064A\u0637 \u0645\u0646 \u0633\u0637\u0631 \u0648\u0627\u062D\u062F \u064A\u0630\u0643\u0631 \u0627\u0644\u0633\u0628\u0628 \u0648\u064A\u064F\u0641\u062A\u062D \u0639\u0646\u062F \u062A\u0645\u0631\u064A\u0631 \u0627\u0644\u0645\u0624\u0634\u0631 \u0623\u0648 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u064A\u0647 \u0628\u0645\u0641\u062A\u0627\u062D Tab.","\u0639\u062F\u0645 \u0628\u064A\u0627\u0646 \u0634\u064A\u0621","\u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0639\u062A\u064E\u0651\u0645\u0629","\u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0639\u062A\u064E\u0651\u0645\u0629 \u0648\u0627\u0644\u0645\u062E\u0641\u064A\u0629","\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0642\u0644\u064A\u0644\u0629 \u0627\u0644\u062A\u0641\u0627\u0639\u0644","\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u062F\u0648\u0646 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 \u0623\u062F\u0646\u0627\u0647. \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u0630\u064A \u064A\u062A\u0639\u0630\u0651\u0631 \u0639\u0644\u0649 Aviary \u0642\u0631\u0627\u0621\u0629 \u0639\u062F\u062F\u0647 \u0644\u0627 \u064A\u064F\u0635\u0641\u0651\u0649 \u0628\u0646\u0627\u0621\u064B \u0639\u0644\u064A\u0647 \u0623\u0628\u062F\u064B\u0627.","\u0642\u064A\u0627\u0633 \u0627\u0644\u062A\u0641\u0627\u0639\u0644 \u0628\u0640","\u0623\u064A \u0627\u0644\u0623\u0639\u062F\u0627\u062F \u0623\u0633\u0641\u0644 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u064A\u0646\u0637\u0628\u0642 \u0639\u0644\u064A\u0647 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649.","\u0627\u0644\u0631\u062F\u0648\u062F","\u0625\u0639\u0627\u062F\u0627\u062A \u0627\u0644\u0646\u0634\u0631","\u0627\u0644\u0625\u0639\u062C\u0627\u0628\u0627\u062A","\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 \u0644\u0644\u062A\u0641\u0627\u0639\u0644","\u062A\u064F\u0635\u0641\u0651\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u062F\u0648\u0646 \u0647\u0630\u0627 \u0627\u0644\u0639\u062F\u062F. \u0627\u0644\u0635\u0641\u0631 \u0644\u0627 \u064A\u0635\u0641\u0651\u064A \u0623\u064A \u0645\u0646\u0634\u0648\u0631.","\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0630\u0627\u062A \u0627\u0644\u0635\u0648\u0631","\u064A\u0641\u0644\u062A\u0631 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0635\u0648\u0631.","\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0630\u0627\u062A \u0627\u0644\u0641\u064A\u062F\u064A\u0648","\u064A\u0641\u0644\u062A\u0631 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0645\u0642\u0627\u0637\u0639 \u0641\u064A\u062F\u064A\u0648.","\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0630\u0627\u062A \u0635\u0648\u0631 GIF","\u064A\u0641\u0644\u062A\u0631 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0635\u0648\u0631 GIF.","\u0645\u0641\u0639\u0651\u0644 \u0641\u064A","\u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u0639\u0645\u0644 \u0641\u064A\u0647\u0627 \u0627\u0644\u0641\u0644\u0627\u062A\u0631.","\u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A \u0627\u0644\u0645\u062D\u0638\u0648\u0631\u0629 \u0648\u0625\u0639\u0627\u062F\u0629 \u0646\u0634\u0631 \u0627\u0644\u0630\u0627\u062A","\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0639\u064A\u0651\u0646\u0629 \u0645\u0648\u062B\u0651\u0642\u0629\u061B \u062A\u0628\u0642\u0649 \u0647\u0630\u0647 \u0627\u0644\u062E\u064A\u0627\u0631\u0627\u062A \u0645\u0639\u0637\u0651\u0644\u0629.","\u0623\u062E\u0641\u0650 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0623\u0648 \u062E\u0641\u0651\u0641\u0647\u0627 \u062D\u0633\u0628 \u0627\u0644\u0643\u0644\u0645\u0627\u062A \u0623\u0648 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0623\u0648 \u0634\u0627\u0631\u0627\u062A \u0627\u0644\u062D\u0633\u0627\u0628 \u0623\u0648 \u0627\u0644\u0635\u0641\u062D\u0629.","\u062D\u0627\u0644\u0629 \u0639\u0648\u0627\u0645\u0644 \u0627\u0644\u062A\u0635\u0641\u064A\u0629","\u0627\u0644\u0642\u0648\u0627\u0639\u062F","\u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0645\u062D\u062A\u0648\u0649","\u0627\u0644\u0645\u0633\u0627\u0631\u0627\u062A","\u064A\u0646\u0637\u0628\u0642 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 \u0639\u0644\u0649 \u0643\u0644 \u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062A\u062D\u0643\u0645 \u0641\u064A \u0627\u0644\u0648\u0633\u0627\u0626\u0637.","\u064A\u0636\u064A\u0641 \u0625\u062C\u0631\u0627\u0621 \u062A\u0646\u0632\u064A\u0644 \u0625\u0644\u0649 \u0643\u0644 \u0645\u0646\u0634\u0648\u0631 \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0648\u0633\u0627\u0626\u0637\u060C \u0645\u0639 \u0639\u0646\u0627\u0635\u0631 \u062A\u062D\u0643\u0645 \u0644\u0643\u0644 \u0645\u0644\u0641. \u064A\u0624\u062F\u064A \u0625\u064A\u0642\u0627\u0641\u0647 \u0623\u064A\u0636\u064B\u0627 \u0625\u0644\u0649 \u0625\u062E\u0641\u0627\u0621 \u0646\u0633\u062E \u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637.","\u0625\u0638\u0647\u0627\u0631 \u0646\u0633\u062E \u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637","\u064A\u0636\u064A\u0641 \u0625\u062C\u0631\u0627\u0621\u064B \u0644\u0644\u0645\u0646\u0634\u0648\u0631 \u064A\u0646\u0633\u062E \u0623\u0641\u0636\u0644 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u0645\u0628\u0627\u0634\u0631\u0629 \u0644\u0644\u0635\u0648\u0631 \u0648\u0635\u0648\u0631 GIF \u0648\u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0648\u0627\u0644\u0635\u0648\u062A \u0648\u0627\u0644\u062A\u0631\u062C\u0645\u0627\u062A\u060C \u0631\u0627\u0628\u0637\u064B\u0627 \u0648\u0627\u062D\u062F\u064B\u0627 \u0641\u064A \u0643\u0644 \u0633\u0637\u0631. \u064A\u0646\u0633\u062E \u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0646\u0641\u0633\u0647 \u0641\u0642\u0637 \u0648\u064A\u062A\u0637\u0644\u0628 \u0639\u0646\u0627\u0635\u0631 \u062A\u062D\u0643\u0645 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0623\u0639\u0644\u0627\u0647.","\u062C\u0631\u0651\u0628 name=orig \u0628\u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0645\u0635\u062F\u0631 \u0623\u0648\u0644\u0627\u064B\u060C \u062B\u0645 4096x4096 \u0625\u0630\u0627 \u0641\u0634\u0644.","\u062D\u0627\u0644\u0629 \u0627\u0644\u062C\u0648\u062F\u0629 \u0627\u0644\u0623\u0635\u0644\u064A\u0629","\u0639\u0631\u0636 \u0627\u0644\u0635\u0648\u0631 \u0628\u0627\u0644\u062C\u0648\u062F\u0629 \u0627\u0644\u0623\u0635\u0644\u064A\u0629","\u064A\u062D\u0645\u0651\u0644 \u0635\u0648\u0631 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \u0628\u0627\u0644\u062D\u062C\u0645 \u0627\u0644\u0643\u0627\u0645\u0644 \u0628\u062F\u0644\u064B\u0627 \u0645\u0646 \u0627\u0644\u0646\u0633\u062E\u0629 \u0627\u0644\u062A\u064A \u064A\u062E\u062A\u0627\u0631\u0647\u0627 X \u0644\u0644\u0645\u0633\u0627\u062D\u0629 \u0627\u0644\u0645\u062A\u0627\u062D\u0629. \u0623\u0648\u0636\u062D\u060C \u0644\u0643\u0646 \u0628\u0627\u0633\u062A\u0647\u0644\u0627\u0643 \u0628\u064A\u0627\u0646\u0627\u062A \u0623\u0643\u0628\u0631 \u0628\u0639\u062F\u0629 \u0623\u0636\u0639\u0627\u0641.","\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629","\u0642\u0627\u0644\u0628 \u0627\u0633\u0645 \u0627\u0644\u0645\u0644\u0641","\u0627\u0644\u062D\u0642\u0648\u0644: {handle} \u0648{account} \u0648{tweetId} \u0648{mediaId} \u0648{index} \u0648{total} \u0648{date} \u0648{text} \u0648{ext}. \u200F{account} \u0627\u0633\u0645 \u0628\u062F\u064A\u0644 \u0644\u0644\u062D\u0633\u0627\u0628 \u0627\u0644\u0646\u0627\u0634\u0631 \u0648\u064A\u0645\u0643\u0646\u0647 \u0625\u0646\u0634\u0627\u0621 \u0645\u062C\u0644\u062F\u0627\u062A \u0644\u0643\u0644 \u062D\u0633\u0627\u0628.","\u0645\u0644\u0641 \u0628\u064A\u0627\u0646\u0627\u062A \u0648\u0635\u0641\u064A\u0629 \u0645\u0631\u0627\u0641\u0642","\u064A\u062D\u0641\u0638 \u0645\u0644\u0641\u064B\u0627 \u0645\u062D\u0644\u064A\u064B\u0627 \u0645\u0631\u0627\u0641\u0642\u064B\u0627 \u0628\u0635\u064A\u063A\u0629 \u0646\u0635 \u0623\u0648 JSON \u0628\u0639\u062F \u0627\u0643\u062A\u0645\u0627\u0644 \u0643\u0644 \u062A\u0646\u0632\u064A\u0644 \u0644\u0644\u0648\u0633\u0627\u0626\u0637.","\u0646\u0635","JSON","\u0645\u0637\u0627\u0628\u0642\u0629 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0645\u062A\u0634\u0627\u0628\u0647\u0629 \u0628\u0635\u0631\u064A\u064B\u0627","\u064A\u0642\u0627\u0631\u0646 \u0623\u064A\u0636\u064B\u0627 \u062A\u0648\u0642\u064A\u0639\u064B\u0627 \u0628\u0635\u0631\u064A\u064B\u0627 \u0645\u0646 256 \u0628\u062A. \u0642\u062F \u062A\u064F\u0639\u062F \u0627\u0644\u062A\u0643\u0648\u064A\u0646\u0627\u062A \u0627\u0644\u0628\u0633\u064A\u0637\u0629 \u0627\u0644\u0645\u062A\u0634\u0627\u0628\u0647\u0629 \u062A\u0637\u0627\u0628\u0642\u064B\u0627 \u0628\u0627\u0644\u062E\u0637\u0623\u060C \u0644\u0630\u0644\u0643 \u064A\u0628\u0642\u0649 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u0645\u062A\u0648\u0642\u0641\u064B\u0627 \u0627\u0641\u062A\u0631\u0627\u0636\u064A\u064B\u0627.","\u0633\u062C\u0644 \u0627\u0644\u062A\u0643\u0631\u0627\u0631\u0627\u062A","\u064A\u062A\u062E\u0637\u0649 \u0648\u0633\u064A\u0637 X \u0646\u0641\u0633\u0647 \u0623\u0648 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0645\u0637\u0627\u0628\u0642\u0629 \u0645\u0646 \u062F\u0648\u0646 \u062D\u0641\u0638 \u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0645\u0635\u062F\u0631.","\u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0627\u0644\u0645\u062A\u0632\u0627\u0645\u0646\u0629","\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u062C\u0627\u0631\u064A\u0629 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062F\u0641\u0639\u0629 (1-6).","\u0648\u062A\u064A\u0631\u0629 \u0627\u0644\u062A\u0646\u0632\u064A\u0644","\u064A\u062A\u062D\u0643\u0645 \u0641\u064A \u0627\u0644\u062F\u0641\u0639\u0629 \u0627\u0644\u0627\u0641\u062A\u062A\u0627\u062D\u064A\u0629 \u0648\u0627\u0644\u0648\u062A\u064A\u0631\u0629 \u0627\u0644\u0645\u0633\u062A\u0645\u0631\u0629 \u0644\u0637\u0644\u0628\u0627\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u062C\u0645\u0639\u0629.","\u0645\u062D\u0627\u0641\u0638","\u0645\u062A\u0648\u0627\u0632\u0646","\u062A\u0646\u0632\u064A\u0644 \u0643\u0644 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0638\u0627\u0647\u0631\u0629","\u0623\u0636\u0641 \u0643\u0644 \u0627\u0644\u0635\u0648\u0631 \u0648\u0645\u0642\u0627\u0637\u0639 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0648\u0645\u0644\u0641\u0627\u062A GIF \u0648\u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0645\u0635\u063A\u0631\u0629 \u0648\u0645\u0633\u0627\u0631\u0627\u062A \u0627\u0644\u0635\u0648\u062A \u0648\u0627\u0644\u062A\u0631\u062C\u0645\u0629 \u0627\u0644\u0638\u0627\u0647\u0631\u0629 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629 \u0625\u0644\u0649 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631.","\u062D\u0627\u0644\u0629 \u0627\u0644\u062A\u0646\u0632\u064A\u0644","\u0639\u062F\u062F \u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0633\u062C\u0644","\u0628\u0642\u064A\u0629 \u0627\u0644\u0644\u0648\u062D\u0629 \u0644\u0627 \u062A\u0632\u0627\u0644 \u062A\u0639\u0645\u0644. \u062A\u0645 \u0627\u0644\u0625\u0628\u0644\u0627\u063A \u0641\u064A \u0627\u0644\u062A\u0634\u062E\u064A\u0635\u0627\u062A.","\u062A\u0639\u0630\u0651\u0631 \u0631\u0633\u0645 \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645","\u0627\u0636\u0628\u0637 \u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 \u0648\u0627\u0644\u062C\u0648\u062F\u0629 \u0648\u0623\u0633\u0645\u0627\u0621 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0648\u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631.","{bytes} \u0645\u0648\u0632\u064E\u0651\u0639\u0629 \u0639\u0644\u0649 {count} \u0645\u062C\u0645\u0648\u0639\u0629","\u0645\u0633\u0627\u062D\u0629 \u062A\u062E\u0632\u064A\u0646 \u0627\u0644\u0645\u0643\u062A\u0628\u0629","\u0623\u0643\u0628\u0631 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0627\u062A","\u062A\u0642\u0631\u064A\u0631 \u062A\u062E\u0632\u064A\u0646 \u0627\u0644\u0645\u062A\u0635\u0641\u062D","\u062A\u0646\u0628\u064A\u0647 \u062D\u062F \u0627\u0644\u062A\u062E\u0632\u064A\u0646","\u064A\u0646\u0628\u0651\u0647 \u0642\u0628\u0644 \u0623\u0646 \u064A\u062A\u062C\u0627\u0648\u0632 \u0627\u0644\u062A\u0642\u0627\u0637\u064F \u0627\u0644\u0645\u0643\u062A\u0628\u0629\u064E \u0627\u0644\u0645\u062D\u0644\u064A\u0629 \u0647\u0630\u0627 \u0627\u0644\u0639\u062F\u062F \u0645\u0646 \u0627\u0644\u0645\u064A\u063A\u0627\u0628\u0627\u064A\u062A. \u0627\u0644\u0642\u064A\u0645\u0629 0 \u062A\u0648\u0642\u0641 \u0627\u0644\u062A\u0646\u0628\u064A\u0647. \u0644\u0627 \u064A\u062D\u0630\u0641 Aviary \u0623\u064A \u0634\u064A\u0621 \u0644\u064A\u0628\u0642\u0649 \u062A\u062D\u062A \u0627\u0644\u062D\u062F\u061B \u064A\u064F\u062E\u062A\u0627\u0631 \u0627\u0644\u062D\u0630\u0641 \u0645\u0646 \u0645\u0639\u0627\u064A\u0646\u0629 \u0627\u0644\u062A\u0646\u0638\u064A\u0641.","\u062A\u0635\u063A\u064A\u0631 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0645\u0644\u062A\u0642\u064E\u0637\u0629","\u064A\u0646\u0637\u0628\u0642 \u0639\u0644\u0649 \u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u0627\u0644\u062A\u0642\u0627\u0637 \u0645\u0646 \u0627\u0644\u0622\u0646 \u0641\u0635\u0627\u0639\u062F\u064B\u0627. \u0644\u0627 \u064A\u062A\u063A\u064A\u0631 \u0634\u064A\u0621 \u0645\u0645\u0627 \u0647\u0648 \u0645\u062E\u0632\u064E\u0651\u0646\u060C \u0648\u064A\u0630\u0643\u0631 \u0643\u0644 \u0633\u062C\u0644 \u0645\u0635\u063A\u064E\u0651\u0631 \u0623\u0646\u0647 \u0635\u064F\u063A\u0650\u0651\u0631.","\u0627\u0644\u0625\u0628\u0642\u0627\u0621 \u0639\u0644\u0649 \u0627\u0644\u0623\u0635\u0644","\u062B\u0644\u0627\u062B\u0629 \u0623\u0631\u0628\u0627\u0639","\u0627\u0644\u0646\u0635\u0641","\u0627\u0644\u0631\u0628\u0639","\u0635\u0648\u0631\u0629 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u062B\u0627\u0628\u062A\u0629 \u0641\u0642\u0637","\u064A\u062D\u0641\u0638 \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u062B\u0627\u0628\u062A\u0629 \u0627\u0644\u062A\u064A \u064A\u0642\u062F\u0651\u0645\u0647\u0627 X \u0644\u0644\u0641\u064A\u062F\u064A\u0648 \u0628\u062F\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0646\u0641\u0633\u0647. \u064A\u0630\u0643\u0631 \u0627\u0644\u0633\u062C\u0644 \u0623\u0646 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0644\u0645 \u064A\u064F\u062D\u0641\u064E\u0638\u060C \u062D\u062A\u0649 \u0644\u0627 \u064A\u0642\u062F\u0651\u0645 \u062A\u0635\u062F\u064A\u0631\u064C \u0644\u0627\u062D\u0642 \u0627\u0644\u0635\u0648\u0631\u0629\u064E \u0639\u0644\u0649 \u0623\u0646\u0647\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0643\u0627\u0645\u0644\u064B\u0627.","\u0627\u0644\u0628\u062D\u062B \u0641\u064A \u0643\u0644 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A\u0629","\u0627\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0648\u0627\u0644\u0625\u0639\u062C\u0627\u0628\u0627\u062A \u0648\u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0648\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0648\u0627\u0644\u0644\u0642\u0637\u0627\u062A.","\u0627\u0644\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0645\u0643\u062A\u0628\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629","\u0627\u0644\u062A\u0631\u062A\u064A\u0628 \u0627\u0644\u062F\u0644\u0627\u0644\u064A","\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0648\u0633\u0627\u0626\u0637","{count} \u0648\u0633\u0627\u0626\u0637","\u062C\u0631\u0651\u0628 source:bookmarks \u0623\u0648 tag:reading \u0623\u0648 has:media.","\u0625\u0638\u0647\u0627\u0631 \u0632\u0631 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A","\u064A\u0636\u064A\u0641 \u0625\u0644\u0649 \u0643\u0644 \u0645\u0646\u0634\u0648\u0631 \u0632\u0631\u064B\u0627 \u064A\u064F\u0646\u0634\u0626 \u0637\u0644\u0628\u064B\u0627 \u0644\u0644\u062A\u0631\u062C\u0645\u0629 \u0623\u0648 \u0627\u0644\u062A\u0644\u062E\u064A\u0635 \u0623\u0648 \u0627\u0644\u0634\u0631\u062D \u0623\u0648 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u062D\u0642\u0627\u0626\u0642. \u0648\u0628\u062F\u0648\u0646 \u0625\u0639\u062F\u0627\u062F \u0645\u0632\u0648\u0651\u062F \u0630\u0643\u0627\u0621 \u0627\u0635\u0637\u0646\u0627\u0639\u064A\u060C \u064A\u064F\u0646\u0633\u062E \u0627\u0644\u0637\u0644\u0628 \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629 \u0641\u0642\u0637 \u0648\u0644\u0627 \u064A\u064F\u0631\u0633\u0644 \u0623\u064A \u0634\u064A\u0621 \u0625\u0644\u0649 \u0623\u064A \u062C\u0647\u0629.","\u062A\u0648\u0633\u064A\u0639 \u0631\u0648\u0627\u0628\u0637 t.co","\u064A\u0633\u062A\u0628\u062F\u0644 \u0631\u0648\u0627\u0628\u0637 \`t.co\` \u0627\u0644\u0645\u062E\u062A\u0635\u0631\u0629 \u0628\u0627\u0644\u0648\u062C\u0647\u0629 \u0627\u0644\u0645\u0623\u062E\u0648\u0630\u0629 \u0645\u0646 aria-label \u0648\u0627\u0644\u0639\u0646\u0627\u0648\u064A\u0646.","\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u062A\u062A\u0628\u0651\u0639 \u0645\u0646 \u0627\u0644\u0631\u0648\u0627\u0628\u0637","\u064A\u0632\u064A\u0644 \u0631\u0645\u0648\u0632 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0648\u0645\u0639\u0627\u0645\u0644\u0627\u062A \u0627\u0644\u062D\u0645\u0644\u0627\u062A (utm_* \u0648fbclid \u0648\u0645\u0639\u0627\u0645\u0644\u0627\u062A t/s \u0627\u0644\u062E\u0627\u0635\u0629 \u0628\u0640 X) \u0645\u0646 \u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A\u060C \u0641\u064A\u0635\u0628\u062D \u0645\u0627 \u062A\u0646\u0633\u062E\u0647 \u0647\u0648 \u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0645\u062C\u0631\u0651\u062F.","\u0646\u0633\u062E \u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0628\u0627\u0633\u0645","\u064A\u0636\u064A\u0641 \u0625\u0644\u0649 \u0643\u0644 \u0645\u0646\u0634\u0648\u0631 \u0632\u0631 \xAB\u0646\u0633\u062E \u0627\u0644\u0631\u0627\u0628\u0637\xBB \u064A\u0643\u062A\u0628 \u0639\u0646\u0648\u0627\u0646 \u0630\u0644\u0643 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0639\u0644\u0649 \u0627\u0644\u0645\u0636\u064A\u0641 \u0627\u0644\u0645\u062E\u062A\u0627\u0631. \u0644\u0627 \u064A\u064F\u0639\u0627\u062F \u0643\u062A\u0627\u0628\u0629 \u0623\u064A \u0634\u064A\u0621 \u0639\u0631\u0636\u0647 X \u0648\u0644\u0627 \u064A\u064F\u0639\u0627\u062F \u062A\u0648\u062C\u064A\u0647 \u0623\u064A \u062A\u0646\u0642\u0651\u0644. \u064A\u062A\u063A\u064A\u0651\u0631 \u0645\u0627 \u062A\u0646\u0633\u062E\u0647 \u0641\u0642\u0637. \u0627\u062A\u0631\u0643\u0647 \u0639\u0644\u0649 X \u0644\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0632\u0631.","\u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A","\u0627\u0644\u0635\u064A\u063A\u0629: \u0627\u0644\u0645\u0639\u0631\u0651\u0641: \u0627\u0644\u0644\u0648\u0646. \u0648\u0627\u062D\u062F \u0641\u064A \u0643\u0644 \u0633\u0637\u0631. \u0627\u0644\u0623\u0644\u0648\u0627\u0646 \u0647\u064A amber \u0648rose \u0648violet \u0648sky \u0648green \u0648slate. \u0627\u0644\u0633\u0637\u0631 \u0627\u0644\u0641\u0627\u0631\u063A \u064A\u0632\u064A\u0644 \u0627\u0644\u0648\u0633\u0645.","\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A","\u0627\u0644\u0635\u064A\u063A\u0629: \u0627\u0644\u062D\u0633\u0627\u0628: \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629. \u0648\u0627\u062D\u062F\u0629 \u0641\u064A \u0643\u0644 \u0633\u0637\u0631. \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0627\u0644\u0641\u0627\u0631\u063A\u0629 \u062A\u062D\u0630\u0641 \u0627\u0644\u0639\u0646\u0635\u0631.","\u0645\u0633\u062D \u0643\u0644 \u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A","\u064A\u062D\u0630\u0641 \u0643\u0644 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629.","\u0627\u0644\u0646\u0635\u0648\u0635 \u0627\u0644\u062C\u0627\u0647\u0632\u0629","\u0645\u0642\u062A\u0637\u0641 \u0648\u0627\u062D\u062F \u0641\u064A \u0643\u0644 \u0633\u0637\u0631. \u0631\u062F\u0648\u062F \u0648\u0642\u0648\u0627\u0644\u0628 \u0642\u0627\u0628\u0644\u0629 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u062A\u064F\u062F\u0631\u062C \u0645\u0646 \u0634\u0631\u064A\u0637 \u0623\u062F\u0648\u0627\u062A \u0627\u0644\u0645\u062D\u0631\u0631.","\u0627\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0632\u0646\u0629 \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0648\u0623\u062F\u0631\u0647\u0627.","\u0623\u062F\u0648\u0627\u062A \u0627\u0644\u0645\u0646\u0634\u0648\u0631","\u0623\u062F\u0648\u0627\u062A \u0627\u0644\u0643\u062A\u0627\u0628\u0629","\u0627\u0644\u062A\u062E\u0632\u064A\u0646 \u0648\u0627\u0644\u062A\u0642\u0627\u0631\u064A\u0631","\u064A\u062C\u0645\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0638\u0627\u0647\u0631\u0629 \u0641\u064A \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629 \u0627\u0633\u062A\u0639\u062F\u0627\u062F\u064B\u0627 \u0644\u0639\u0645\u0644\u064A\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u062A\u0627\u0644\u064A\u0629.","\u0642\u0627\u0626\u0645\u0629 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0641\u0648\u0627\u0635\u0644. \u0627\u0644\u0645\u062F\u0639\u0648\u0645: json\u060C csv\u060C html\u060C markdown\u060C xlsx.","\u064A\u062D\u0641\u0638 \u0623\u064A\u0636\u064B\u0627 \u0627\u0633\u062A\u062C\u0627\u0628\u0627\u062A GraphQL \u0627\u0644\u062E\u0627\u0645 \u0627\u0644\u062A\u064A \u064A\u0631\u0633\u0644\u0647\u0627 X \u0625\u0644\u0649 \u0647\u0630\u0647 \u0627\u0644\u062A\u0628\u0648\u064A\u0628\u0629\u060C \u0644\u064A\u0645\u0643\u0646 \u062A\u062D\u0644\u064A\u0644\u0647\u0627 \u0644\u0627\u062D\u0642\u064B\u0627. \u062A\u064F\u0632\u0627\u0644 \u0631\u0645\u0648\u0632 \u0627\u0644\u062C\u0644\u0633\u0629 \u0642\u0628\u0644 \u0627\u0644\u0643\u062A\u0627\u0628\u0629.","\u0627\u0644\u062A\u0642\u0627\u0637 \u0648\u062D\u062F\u0627\u062A \u0628\u0627\u064A\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0641\u064A \u0627\u0644\u062A\u0635\u062F\u064A\u0631","\u064A\u062C\u0644\u0628 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0648\u064A\u0636\u0645\u0651\u0646 \u0648\u062D\u062F\u0627\u062A \u0627\u0644\u0628\u0627\u064A\u062A \u0627\u0644\u0646\u0627\u062C\u062D\u0629 \u0645\u0639 \u0627\u0644\u0637\u0648\u0644 \u0648\u0627\u0644\u0645\u062C\u0645\u0648\u0639 \u0627\u0644\u0627\u062E\u062A\u0628\u0627\u0631\u064A\u061B \u0648\u062A\u0628\u0642\u0649 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0641\u0627\u0634\u0644\u0629 \u0645\u0631\u0627\u062C\u0639 \u0642\u0627\u0628\u0644\u0629 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.","\u0627\u0643\u062A\u0634\u0627\u0641 \u0645\u0639\u0631\u0651\u0641\u0627\u062A \u0627\u0644\u0627\u0633\u062A\u0639\u0644\u0627\u0645 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627","\u064A\u0641\u062D\u0635 \u0627\u0644\u0633\u0643\u0631\u0628\u062A\u0627\u062A \u0627\u0644\u0645\u062D\u0645\u0651\u0644\u0629 \u0628\u062D\u062B\u064B\u0627 \u0639\u0646 \u0645\u0639\u0631\u0651\u0641\u0627\u062A \u0639\u0645\u0644\u064A\u0627\u062A GraphQL \u0641\u064A X \u0648\u064A\u062E\u0632\u0651\u0646\u0647\u0627 \u0645\u062D\u0644\u064A\u064B\u0627.","\u062A\u0636\u0645\u064A\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0645\u064A\u0629 \u0641\u064A \u0635\u0627\u062F\u0631\u0627\u062A \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629","\u062A\u0628\u0642\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0645\u064A\u0629 \u062E\u0627\u0631\u062C HTML \u0648Markdown \u0648WARC \u0648WACZ \u0648\u0645\u062E\u0631\u062C\u0627\u062A \u0627\u0644\u0639\u0627\u0631\u0636 \u0627\u0644\u062B\u0627\u0628\u062A \u062D\u062A\u0649 \u062A\u0641\u0639\u0651\u0644 \u0630\u0644\u0643 \u0635\u0631\u0627\u062D\u0629. \u062A\u0638\u0644 JSON \u0648CSV \u0623\u0631\u0634\u064A\u0641\u064A\u0629 \u0648\u062A\u062D\u0627\u0641\u0638\u0627\u0646 \u0639\u0644\u0649 \u062D\u0642\u0644 \u0627\u0644\u062C\u0645\u0647\u0648\u0631.","\u062A\u0636\u0645\u064A\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0630\u0627\u062A \u0627\u0644\u062C\u0645\u0647\u0648\u0631 \u063A\u064A\u0631 \u0627\u0644\u0645\u0639\u0631\u0648\u0641 \u0641\u064A \u0635\u0627\u062F\u0631\u0627\u062A \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629","\u062A\u0628\u0642\u0649 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0627\u0644\u0645\u0648\u062C\u0648\u062F\u0629 \u0641\u064A DOM \u0641\u0642\u0637 \u0648\u0627\u0644\u0645\u0633\u062A\u0648\u0631\u062F\u0629 \u0648\u0627\u0644\u0642\u062F\u064A\u0645\u0629 \u062E\u0627\u0631\u062C \u0627\u0644\u0635\u0627\u062F\u0631\u0627\u062A \u0627\u0644\u0645\u0648\u062C\u0647\u0629 \u0644\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u062D\u062A\u0649 \u062A\u0641\u0639\u0651\u0644 \u0630\u0644\u0643 \u0635\u0631\u0627\u062D\u0629. \u062A\u0638\u0644 JSON \u0648CSV \u0623\u0631\u0634\u064A\u0641\u064A\u0629.","\u0645\u062C\u0644\u062F \u0627\u0644\u062D\u0641\u0638","\u0627\u0633\u0645 \u0627\u0644\u0645\u062C\u0644\u062F (\u0623\u0648 \u0627\u0644\u0645\u0633\u0627\u0631) \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u0643\u062C\u0630\u0631 \u0644\u0645\u0644\u0641 ZIP \u0648\u0643\u0628\u0627\u062F\u0626\u0629 \u0644\u0644\u062A\u0646\u0632\u064A\u0644.","\u062A\u0645 \u062A\u062A\u0628\u0639 {jobs} \u0645\u0646 \u0627\u0644\u0645\u0647\u0627\u0645 \xB7 \u062A\u0645 \u062A\u062E\u0632\u064A\u0646 {queries} \u0645\u0646 \u0645\u0639\u0631\u0651\u0641\u0627\u062A GraphQL \u0645\u0624\u0642\u062A\u064B\u0627","\u062D\u0627\u0644\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631","\u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0638\u0627\u0647\u0631\u0629","\u064A\u062C\u0645\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0639\u0631\u0648\u0636\u0629 \u062D\u0627\u0644\u064A\u064B\u0627 \u0648\u064A\u0646\u0632\u0651\u0644\u0647\u0627 \u0643\u0645\u0644\u0641 ZIP.","\u0646\u0633\u062E \u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u062A\u0634\u062E\u064A\u0635","\u064A\u0646\u0633\u062E \u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u062F\u0639\u0645 (\u0627\u0644\u0625\u0635\u062F\u0627\u0631\u060C \u0627\u0644\u0635\u0641\u062D\u0629\u060C \u0622\u062E\u0631 \u0627\u0644\u0633\u062C\u0644).","\u0646\u0632\u0651\u0644 \u0645\u0644\u0641 WARC \u062E\u0627\u0645\u064B\u0627 \u0623\u0648 \u0645\u0644\u0641 WACZ \u062C\u0627\u0647\u0632\u064B\u0627 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0639\u0631\u0636. \u064A\u062D\u062A\u0641\u0638 WACZ \u0628\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0623\u0631\u0634\u064A\u0641 \u0648\u0627\u0644\u0641\u0647\u0631\u0633 \u0645\u0646 \u062F\u0648\u0646 \u0636\u063A\u0637.","\u062D\u062C\u0645 WACZ \u0627\u0644\u062A\u0642\u062F\u064A\u0631\u064A: {size} \u0644\u0639\u062F\u062F {records} \u0645\u0646 \u0627\u0644\u0633\u062C\u0644\u0627\u062A.","\u0623\u0631\u0634\u064A\u0641 \u0627\u0644\u062D\u0641\u0638","\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0623\u0631\u0634\u064A\u0641 \u0627\u0644\u062D\u0641\u0638","WARC","WACZ","\u0625\u0644\u063A\u0627\u0621","\u0641\u062A\u062D replayweb.page","\u0625\u062B\u0628\u0627\u062A WACZ \u062E\u0627\u0635 \u0628\u0640 Aviary","\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0625\u062B\u0628\u0627\u062A WACZ \u0627\u0644\u062E\u0627\u0635 \u0628\u0640 Aviary","\u062A\u0635\u062F\u064A\u0631 \u0632\u0648\u062C \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D","\u0646\u0633\u062E \u0628\u0635\u064A\u063A\u0629 Markdown","\u064A\u0646\u0633\u062E \u062A\u0635\u062F\u064A\u0631\u064B\u0627 \u0628\u0635\u064A\u063A\u0629 Markdown \u0628\u0633\u064A\u0637\u0629 \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629.","\u062D\u0641\u0638 Markdown \u0644\u0640 Obsidian","Markdown \u0645\u0639 \u062A\u0631\u0648\u064A\u0633\u0629 YAML \u0648\u0648\u0633\u0648\u0645 Aviary.","\u062D\u0641\u0638 Markdown \u0644\u0640 Notion","Markdown \u064A\u0639\u062A\u0645\u062F \u0639\u0644\u0649 \u0627\u0644\u0639\u0646\u0627\u0648\u064A\u0646 \u0648\u064A\u0633\u062A\u0648\u0631\u062F\u0647 Notion \u0628\u0633\u0644\u0627\u0633\u0629.","\u062D\u0641\u0638 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0628\u0635\u064A\u063A\u0629 JSON","\u200FJSON \u062E\u0627\u0645 \u0645\u0646 \u0646\u0648\u0639 ExportRecord[] \u062F\u0648\u0646 \u062A\u063A\u0644\u064A\u0641 ZIP.","\u0639\u062F\u062F \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0644\u0643\u0644 ZIP","\u064A\u0642\u0633\u0651\u0645 \u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0637\u0648\u064A\u0644\u0629 \u0639\u0644\u0649 \u0639\u062F\u0629 \u0645\u0644\u0641\u0627\u062A \u0628\u062F\u0644 \u0645\u0644\u0641 \u0648\u0627\u062D\u062F \u0636\u062E\u0645 (25-1000).","\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0645\u0647\u0627\u0645 \u0627\u0644\u062A\u0635\u062F\u064A\u0631","\u064A\u062D\u062A\u0641\u0638 \u0628\u0623\u062D\u062F\u062B \u0627\u0644\u0645\u0647\u0627\u0645. \u0627\u0633\u062A\u062E\u062F\u0645 0 \u0644\u0639\u062F\u062F \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F.","\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0633\u062C\u0644\u0627\u062A \u0644\u0643\u0644 \u0645\u0647\u0645\u0629","\u064A\u062D\u062A\u0641\u0638 \u0628\u0623\u062D\u062F\u062B \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0641\u064A \u0643\u0644 \u0645\u0647\u0645\u0629. \u0627\u0633\u062A\u062E\u062F\u0645 0 \u0644\u0639\u062F\u062F \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F.","\u0623\u0642\u0635\u0649 \u0639\u0645\u0631 \u0644\u0644\u062A\u0635\u062F\u064A\u0631 (\u0628\u0627\u0644\u0623\u064A\u0627\u0645)","\u064A\u062D\u0630\u0641 \u0627\u0644\u0645\u0647\u0627\u0645 \u0627\u0644\u0623\u0642\u062F\u0645 \u0639\u0646\u062F \u0627\u0644\u0628\u062F\u0621. \u0627\u0633\u062A\u062E\u062F\u0645 0 \u0644\u062A\u0639\u0637\u064A\u0644 \u0627\u0644\u062A\u0646\u0638\u064A\u0641 \u062D\u0633\u0628 \u0627\u0644\u0639\u0645\u0631.","\u0627\u0644\u062A\u0642\u0637 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0639\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0648\u0646\u0632\u0651\u0644 \u0646\u0633\u062E\u064B\u0627 \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u0646\u0642\u0644.","\u0627\u0644\u0627\u0644\u062A\u0642\u0627\u0637","\u0627\u0644\u062D\u0632\u0645\u0629","\u0627\u0644\u0648\u062C\u0647\u0629","\u0627\u0644\u0645\u0647\u0627\u0645","\u0627\u0644\u062D\u0641\u0638","\u0645\u0627 \u062A\u0631\u064A\u062F \u062D\u0630\u0641\u0647","\u062A\u064F\u062D\u0630\u0641 \u0627\u0644\u0623\u0646\u0634\u0637\u0629 \u0627\u0644\u0645\u062D\u062F\u062F\u0629 \u0628\u0647\u0630\u0627 \u0627\u0644\u062A\u0631\u062A\u064A\u0628: \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629\u060C \u0627\u0644\u0625\u0639\u062C\u0627\u0628\u0627\u062A\u060C \u0625\u0639\u0627\u062F\u0627\u062A \u0627\u0644\u0646\u0634\u0631\u060C \u0627\u0644\u0631\u062F\u0648\u062F\u060C \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A.","\u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629","\u064A\u0632\u064A\u0644 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629 \u0645\u0646 \u0633\u062C\u0644 X.","\u064A\u0632\u064A\u0644 \u0627\u0644\u0625\u0639\u062C\u0627\u0628\u0627\u062A \u0645\u0646 \u0633\u062C\u0644 X.","\u064A\u0644\u063A\u064A \u0625\u0639\u0627\u062F\u0627\u062A \u0627\u0644\u0646\u0634\u0631 \u0645\u0646 \u0639\u0644\u0627\u0645\u0629 \u062A\u0628\u0648\u064A\u0628 \u0625\u0639\u0627\u062F\u0627\u062A \u0627\u0644\u0646\u0634\u0631.","\u064A\u062D\u0630\u0641 \u0627\u0644\u0631\u062F\u0648\u062F \u0627\u0644\u062A\u064A \u0643\u062A\u0628\u062A\u0647\u0627 \u0645\u0646 \u062F\u0648\u0646 \u0627\u0644\u0645\u0633\u0627\u0633 \u0628\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0623\u0635\u0644\u064A\u0629.","\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A","\u064A\u062D\u0630\u0641 \u0645\u0646\u0634\u0648\u0631\u0627\u062A\u0643 \u0648\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u062A\u0628\u0633\u0629 \u0627\u0644\u062A\u064A \u0643\u062A\u0628\u062A\u0647\u0627.","\u0627\u0643\u062A\u0645\u0644\u062A \u0627\u0644\u0645\u0639\u0627\u064A\u0646\u0629. \u0644\u0645 \u062A\u062A\u063A\u064A\u0631 \u0623\u064A \u0628\u064A\u0627\u0646\u0627\u062A \u0641\u064A \u062D\u0633\u0627\u0628 X.","\u0644\u0627 \u064A\u0645\u0643\u0646 \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0648\u0627\u0644\u0631\u062F\u0648\u062F \u0627\u0644\u0645\u062D\u0630\u0648\u0641\u0629. \u0648\u0644\u0627 \u064A\u0633\u062A\u0637\u064A\u0639 Aviary \u0625\u0631\u062C\u0627\u0639 \u0627\u0644\u0625\u0639\u062C\u0627\u0628\u0627\u062A \u0623\u0648 \u0625\u0639\u0627\u062F\u0627\u062A \u0627\u0644\u0646\u0634\u0631 \u0623\u0648 \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0627\u0644\u062A\u064A \u0623\u064F\u0632\u064A\u0644\u062A.","\u062A\u0634\u063A\u064A\u0644","\u062E\u064A\u0627\u0631\u0627\u062A \u0645\u062A\u0642\u062F\u0645\u0629","\u063A\u064A\u0651\u0631 \u0633\u0631\u0639\u0629 \u0627\u0644\u062D\u0630\u0641 \u0623\u0648 \u0623\u0648\u0642\u0641 \u0645\u0624\u0642\u062A\u064B\u0627 \u0628\u0639\u062F \u0639\u062F\u062F \u0645\u062D\u062F\u062F \u0645\u0646 \u0627\u0644\u0625\u062C\u0631\u0627\u0621\u0627\u062A.","\u0627\u0644\u0633\u0631\u0639\u0629","\u064A\u0636\u064A\u0641 \u0627\u0646\u062A\u0638\u0627\u0631\u0627\u064B \u0639\u0634\u0648\u0627\u0626\u064A\u0627\u064B \u0628\u064A\u0646 \u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0627\u0644\u062D\u0633\u0627\u0628 \u0648\u0641\u062A\u0631\u0627\u062A \u062A\u0648\u0642\u0641 \u0623\u0637\u0648\u0644 \u0628\u0639\u062F \u0643\u0644 \u062F\u0641\u0639\u0629.","\u062D\u0630\u0631","\u0633\u0631\u064A\u0639","\u0627\u0644\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0644\u0643\u0644 \u062F\u0641\u0639\u0629","\u064A\u062A\u0648\u0642\u0641 \u0645\u0624\u0642\u062A\u0627 \u0628\u0639\u062F \u0647\u0630\u0627 \u0627\u0644\u0639\u062F\u062F \u0645\u0646 \u0627\u0644\u0646\u062A\u0627\u0626\u062C. \u0627\u0633\u062A\u062E\u062F\u0645 0 \u0645\u0646 \u062F\u0648\u0646 \u062D\u062F. \u062A\u0628\u062F\u0623 \u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629 \u062F\u0641\u0639\u0629 \u062C\u062F\u064A\u062F\u0629.","\u062D\u062F\u062F \u0627\u0644\u0646\u0634\u0627\u0637 \u0648\u0627\u0636\u063A\u0637 \u0639\u0644\u0649 \u062A\u0634\u063A\u064A\u0644. \u064A\u0628\u062F\u0623 \u0627\u0644\u062D\u0630\u0641 \u0641\u0648\u0631\u064B\u0627.","\u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u062C\u0627\u0647\u0632\u0629","\u0641\u0639\u0651\u0644 \u062E\u064A\u0627\u0631 \u062A\u062E\u0641\u064A\u0641 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u0631\u0623\u064A\u062A\u0647\u0627 \u0641\u064A \u0627\u0644\u062A\u0635\u0641\u064A\u0629. \u062A\u0633\u062A\u062E\u062F\u0645 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0635\u0641\u0648\u0641 \u0627\u0644\u062A\u064A \u0639\u0631\u0636\u0647\u0627 Aviary \u0641\u0642\u0637.","\u0645\u0627 \u062A\u062A\u0636\u0645\u0646\u0647","\u0643\u0644 \u0645\u0627 \u0634\u0627\u0647\u062F\u0647 Aviary \u0641\u064A \u0645\u0644\u0641 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0627\u0644\u0646\u0634\u0637. \u062A\u062D\u062A\u0641\u0638 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0635\u0641\u0627\u0629 \u0628\u0633\u0628\u0628 \u0642\u0627\u0639\u062F\u0629 \u0627\u0644\u062A\u0635\u0641\u064A\u0629 \u0627\u0644\u0646\u0634\u0637\u0629.","\u0631\u0627\u062C\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u0634\u0627\u0647\u062F\u0647\u0627 Aviary \u0628\u0627\u0644\u0641\u0639\u0644 \u0645\u0646 \u062F\u0648\u0646 \u0637\u0644\u0628 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 X.","\u062A\u062A\u0628\u0639 \u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0625\u0639\u062F\u0627\u062F \u0623\u0639\u0644\u0627\u0647.","\u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u0628\u0639\u062F\u0629","\u064A\u0628\u0642\u064A \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u0623\u062E\u0641\u064A\u062A\u0647\u0627 \u0645\u0637\u0648\u064A\u0629 \u0644\u064A\u0635\u0639\u062F \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u062A\u0627\u0644\u064A \u0625\u0644\u0649 \u0627\u0644\u0623\u0639\u0644\u0649.","\u0625\u0638\u0647\u0627\u0631 \u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u0625\u062E\u0641\u0627\u0621","\u064A\u0636\u064A\u0641 \u0632\u0631 \u0625\u062E\u0641\u0627\u0621 \u0644\u0643\u0644 \u0645\u0646\u0634\u0648\u0631 \u0628\u062C\u0627\u0646\u0628 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0632\u064A\u062F.","\u062D\u0627\u0644\u0629 \u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u0625\u062E\u0641\u0627\u0621","\u064A\u062A\u0641\u0639\u0651\u0644 \u0639\u0646\u062F \u062A\u0634\u063A\u064A\u0644 \u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u0628\u0639\u062F\u0629.","\u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u064A\u0646\u0637\u0628\u0642 \u0641\u064A\u0647\u0627 \u0627\u0644\u0625\u062E\u0641\u0627\u0621 \u0648\u0632\u0631\u0647.","\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629","\u062A\u064F\u062D\u0630\u0641 \u0623\u0642\u062F\u0645 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0639\u0646\u062F \u062A\u062C\u0627\u0648\u0632 \u0647\u0630\u0627 \u0627\u0644\u0639\u062F\u062F (100-50000).","\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629 \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629","\u0627\u0644\u062A\u0631\u0627\u062C\u0639 \u0639\u0646 \u0622\u062E\u0631 \u0625\u062E\u0641\u0627\u0621","\u064A\u0633\u062A\u0639\u064A\u062F \u0622\u062E\u0631 \u0645\u0646\u0634\u0648\u0631 \u062A\u0645 \u0625\u062E\u0641\u0627\u0624\u0647.","\u0627\u0633\u062A\u0639\u0627\u062F\u0629","\u0645\u0633\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629","\u064A\u0646\u0633\u0649 \u0643\u0644 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629 \u0648\u064A\u0639\u064A\u062F\u0647\u0627 \u062C\u0645\u064A\u0639\u064B\u0627.","\u0627\u062E\u062A\u0631 \u0623\u064A\u0646 \u062A\u0628\u0642\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629 \u0645\u062E\u0641\u064A\u0629 \u0623\u0648 \u0623\u0639\u062F \u0625\u0638\u0647\u0627\u0631\u0647\u0627.","\u0627\u0644\u062A\u063A\u0637\u064A\u0629","\u0627\u0644\u0627\u062D\u062A\u0641\u0627\u0638","\u0627\u0644\u0627\u0633\u062A\u0631\u062F\u0627\u062F","\u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0645\u0624\u0642\u062A\u064B\u0627 \u0639\u0646\u062F \u062E\u0631\u0648\u062C\u0647 \u0645\u0646 \u0627\u0644\u0634\u0627\u0634\u0629","\u064A\u0648\u0642\u0641 \u0641\u0643 \u062A\u0631\u0645\u064A\u0632 \u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \u0639\u0646\u062F \u062E\u0631\u0648\u062C\u0647 \u0645\u0646 \u0627\u0644\u0634\u0627\u0634\u0629\u060C \u0648\u064A\u0633\u062A\u0623\u0646\u0641\u0647 \u0639\u0646\u062F \u0639\u0648\u062F\u062A\u0647. \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u0630\u064A \u0623\u0648\u0642\u0641\u062A\u0647 \u0628\u0646\u0641\u0633\u0643 \u064A\u0628\u0642\u0649 \u0645\u062A\u0648\u0642\u0641\u064B\u0627.","\u0645\u062A\u0627\u0628\u0639\u0629 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0639\u0646\u062F \u0641\u0642\u062F\u0627\u0646 \u0627\u0644\u062A\u0628\u0648\u064A\u0628 \u0644\u0644\u062A\u0631\u0643\u064A\u0632","\u064A\u0648\u0642\u0641 X \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0642\u064A\u062F \u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u0639\u0646\u062F \u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u062A\u0628\u0648\u064A\u0628\u0627\u062A. \u064A\u0633\u062A\u0623\u0646\u0641\u0647 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u0639\u0646\u062F \u0639\u0648\u062F\u062A\u0643. \u0623\u0645\u0627 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u0630\u064A \u0623\u0648\u0642\u0641\u062A\u0647 \u0628\u0646\u0641\u0633\u0643 \u0641\u064A\u0628\u0642\u0649 \u0645\u062A\u0648\u0642\u0641\u064B\u0627.","\u062A\u0643\u0631\u0627\u0631 \u0627\u0644\u0641\u064A\u062F\u064A\u0648\u0647\u0627\u062A","\u064A\u0639\u064A\u062F \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0639\u0646\u062F \u0648\u0635\u0648\u0644\u0647 \u0625\u0644\u0649 \u0627\u0644\u0646\u0647\u0627\u064A\u0629 \u0628\u062F\u0644\u064B\u0627 \u0645\u0646 \u0627\u0644\u062A\u0648\u0642\u0641.","\u062A\u062B\u0628\u064A\u062A \u0642\u0648\u0627\u0626\u0645 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0639\u0644\u0649 \u0623\u0641\u0636\u0644 \u062C\u0648\u062F\u0629","\u0639\u0646\u062F\u0645\u0627 \u064A\u0633\u0644\u0651\u0645 X \u0625\u0644\u0649 Aviary \u0642\u0627\u0626\u0645\u0629 \u062A\u0634\u063A\u064A\u0644 \u062A\u0636\u0645 \u0639\u062F\u0629 \u062C\u0648\u062F\u0627\u062A\u060C \u064A\u064F\u0628\u0642\u064A \u0639\u0644\u0649 \u0627\u0644\u0623\u0639\u0644\u0649 \u0641\u0642\u0637. \u063A\u0627\u0644\u0628\u064B\u0627 \u0645\u0627 \u064A\u0643\u062A\u0641\u064A X \u0628\u062C\u0648\u062F\u0629 \u0623\u0642\u0644 \u0645\u0646 \u0627\u0644\u0623\u0641\u0636\u0644 \u0627\u0644\u0645\u062A\u0627\u062D\u0629 \u062D\u062A\u0649 \u0639\u0644\u0649 \u0627\u062A\u0635\u0627\u0644 \u0633\u0631\u064A\u0639. \u064A\u0633\u062A\u0647\u0644\u0643 \u0647\u0630\u0627 \u0628\u064A\u0627\u0646\u0627\u062A \u0623\u0643\u062B\u0631\u060C \u0648\u0644\u0627 \u064A\u0639\u0645\u0644 \u0625\u0644\u0627 \u0639\u0644\u0649 \u0627\u0644\u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u062A\u064A \u064A\u0631\u0627\u0647\u0627 Aviary.","\u0623\u0648\u0642\u0641 \u0645\u0642\u0627\u0637\u0639 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0645\u0624\u0642\u062A\u064B\u0627 \u0628\u0639\u062F \u0645\u063A\u0627\u062F\u0631\u062A\u0647\u0627 \u0627\u0644\u0634\u0627\u0634\u0629.","\u0627\u0644\u062A\u0634\u063A\u064A\u0644","{count} \u0645\u0646 \u0627\u0644\u0625\u062F\u062E\u0627\u0644\u0627\u062A \xB7 \u0627\u0644\u0623\u062D\u062F\u062B {kind} \u0648\u0639\u062F\u062F\u0647 {latestCount} \u0641\u064A {at}","\u0627\u0644\u0644\u0642\u0637\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629","\u062C\u0645\u0639 \u0627\u0644\u0645\u062A\u0627\u0628\u0650\u0639\u064A\u0646 \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629","\u064A\u0645\u0631\u0651 \u0639\u0644\u0649 \u0635\u0641\u0648\u0641 UserCell \u0641\u064A \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629. \u0627\u0641\u062A\u062D \u0623\u0648\u0644\u064B\u0627 \u0635\u0641\u062D\u0629 \u200E/\u0627\u0644\u062D\u0633\u0627\u0628/followers\u200E.","\u062C\u0645\u0639 \u0627\u0644\u0645\u062A\u0627\u0628\u064E\u0639\u064A\u0646 \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629","\u064A\u0645\u0631\u0651 \u0639\u0644\u0649 \u0635\u0641\u0648\u0641 UserCell \u0641\u064A \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629. \u0627\u0641\u062A\u062D \u0623\u0648\u0644\u064B\u0627 \u0635\u0641\u062D\u0629 \u200E/\u0627\u0644\u062D\u0633\u0627\u0628/following\u200E.","\u0645\u0633\u062D \u0643\u0644 \u0627\u0644\u0644\u0642\u0637\u0627\u062A","\u064A\u062D\u0630\u0641 \u0643\u0644 \u0644\u0642\u0637\u0627\u062A \u0627\u0644\u0645\u062A\u0627\u0628\u0650\u0639\u064A\u0646 \u0648\u0627\u0644\u0645\u062A\u0627\u0628\u064E\u0639\u064A\u0646 \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629.","\u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0623\u0631\u0634\u064A\u0641 X \u0627\u0644\u0631\u0633\u0645\u064A","\u0627\u062E\u062A\u0631 \u0645\u0644\u0641 ZIP \u0645\u064F\u0635\u062F\u0651\u0631\u0627\u064B \u0645\u0646 x.com. \u062A\u064F\u062F\u0639\u0645 \u0625\u062F\u062E\u0627\u0644\u0627\u062A STORE \u0648DEFLATE\u061B \u0648\u062A\u0628\u0642\u0649 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0635\u062F\u0631 \u0645\u062D\u0644\u064A\u0629 \u0645\u0627 \u062F\u0627\u0645 \u0627\u0644\u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0642\u0627\u0628\u0644\u0627\u064B \u0644\u0644\u0627\u0633\u062A\u0626\u0646\u0627\u0641.","\u0627\u0644\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629","\u0628\u062D\u062B \u0646\u0635\u064A \u0643\u0627\u0645\u0644 \u0641\u064A \u0623\u062D\u062F\u062B \u0639\u0645\u0644\u064A\u0629 \u062C\u0645\u0639 \u0644\u0644\u062A\u0635\u062F\u064A\u0631.","@\u0627\u0644\u0645\u0639\u0631\u0651\u0641\u060C \u0643\u0644\u0645\u0629 \u0645\u0641\u062A\u0627\u062D\u064A\u0629\u060C \u0639\u0628\u0627\u0631\u0629\u2026","\u0627\u0643\u062A\u0628 \u0644\u0644\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0627\u0644\u062A\u064A \u0627\u0644\u062A\u0642\u0637\u062A\u0647\u0627 \u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u062A\u0635\u062F\u064A\u0631.","\u062A\u0646\u0632\u064A\u0644 \u062A\u0642\u0631\u064A\u0631 Markdown","\u0633\u062C\u0644 \u0627\u0644\u062A\u062F\u0642\u064A\u0642 \u0648\u0645\u0642\u0627\u0631\u0646\u0629 \u0627\u0644\u0644\u0642\u0637\u0627\u062A \u0648\u0645\u0639\u0627\u064A\u0646\u0629 \u0627\u0644\u062A\u0646\u0638\u064A\u0641.","{total} \u0645\u0646 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \xB7 \u0641\u064A \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631 {queued} \xB7 \u0645\u0639\u062A\u0645\u062F\u0629 {approved} \xB7 \u0645\u062A\u062E\u0637\u0627\u0629 {skipped}","\u0642\u0627\u0626\u0645\u0629 \u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u062A\u0646\u0638\u064A\u0641","\u0627\u0644\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0627\u0644\u0645\u062F\u0645\u0651\u0631\u0629","\u0644\u0627 \u064A\u062D\u0630\u0641 Aviary \u0623\u064A \u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0623\u0648 \u0625\u0639\u062C\u0627\u0628\u0627\u062A \u0623\u0648 \u0645\u062A\u0627\u0628\u0639\u0627\u062A. \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0641\u0642\u0637\u061B \u0648\u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629 \u0623\u0648 \u0627\u0644\u062A\u062E\u0637\u064A \u064A\u064F\u0633\u062C\u064E\u0651\u0644\u0627\u0646 \u0641\u064A \u0633\u062C\u0644 \u0627\u0644\u062A\u062F\u0642\u064A\u0642 \u0644\u0627 \u0623\u0643\u062B\u0631.","\u0625\u0636\u0627\u0641\u0629 \u0645\u0639\u0627\u064A\u0646\u0629 \u0627\u0644\u062A\u0646\u0638\u064A\u0641 \u0625\u0644\u0649 \u0627\u0644\u0642\u0627\u0626\u0645\u0629","\u064A\u0636\u064A\u0641 \u0625\u0644\u0649 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0643\u0644 \u0627\u0644\u0645\u0631\u0634\u062D\u064A\u0646 \u063A\u064A\u0631 \u0627\u0644\u0645\u062D\u0645\u064A\u064A\u0646 \u0645\u0646 \u0622\u062E\u0631 \u0645\u0639\u0627\u064A\u0646\u0629 \u062A\u0646\u0638\u064A\u0641 (\u062F\u0648\u0646 \u0623\u064A \u0625\u062C\u0631\u0627\u0621 \u0645\u062F\u0645\u0651\u0631).","\u0625\u0641\u0631\u0627\u063A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062A\u0646\u0638\u064A\u0641","\u064A\u062D\u0630\u0641 \u0643\u0644 \u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u062F\u0648\u0646 \u0627\u0644\u0645\u0633\u0627\u0633 \u0628\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u062D\u0633\u0627\u0628.","\u0627\u0633\u062A\u0648\u0631\u062F \u0623\u0631\u0634\u064A\u0641 X \u0631\u0633\u0645\u064A\u064B\u0627 \u0623\u0648 \u0642\u0627\u0631\u0646 \u0644\u0642\u0637\u0627\u062A \u0627\u0644\u0645\u062A\u0627\u0628\u0639\u064A\u0646.","\u0627\u0644\u0644\u0642\u0637\u0627\u062A \u0627\u0644\u062D\u064A\u0629","\u0627\u0644\u062A\u0633\u0644\u064A\u0645 \u0625\u0644\u0649 Aria2","\u064A\u0631\u0633\u0644 \u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0643\u0628\u064A\u0631\u0629 \u0625\u0644\u0649 \u0646\u0642\u0637\u0629 Aria2 JSON-RPC \u0645\u0633\u062A\u0636\u0627\u0641\u0629 \u0630\u0627\u062A\u064A\u064B\u0627.","\u0646\u0642\u0637\u0629 Aria2","\u200Fhttp://localhost:6800 (\u062F\u0648\u0646 \u0634\u0631\u0637\u0629 \u0645\u0627\u0626\u0644\u0629 \u0641\u064A \u0627\u0644\u0646\u0647\u0627\u064A\u0629)","\u0633\u0631 RPC \u0627\u0644\u062E\u0627\u0635 \u0628\u0640 Aria2","\u0633\u0631 \u0645\u0634\u062A\u0631\u0643 \u0627\u062E\u062A\u064A\u0627\u0631\u064A \u0644\u0645\u0635\u0627\u062F\u0642\u0629 token:.","\u0625\u0638\u0647\u0627\u0631","\u062A\u0633\u0644\u064A\u0645 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0623\u0643\u0628\u0631 \u0645\u0646 (\u0645\u064A\u063A\u0627\u0628\u0627\u064A\u062A)","\u062A\u064F\u062D\u0641\u0638 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0623\u0635\u063A\u0631 \u0639\u0628\u0631 \u0627\u0644\u0645\u062A\u0635\u0641\u062D. \u064A\u062A\u062D\u0642\u0642 Aviary \u0645\u0646 \u0627\u0644\u062D\u062C\u0645 \u0623\u0648\u0644\u064B\u0627\u060C \u0648\u0625\u0630\u0627 \u0644\u0645 \u064A\u0630\u0643\u0631\u0647 \u0627\u0644\u062E\u0627\u062F\u0645 \u0641\u0633\u064A\u062A\u0645 \u062A\u0633\u0644\u064A\u0645 \u0627\u0644\u0645\u0644\u0641 \u0639\u0644\u0649 \u0623\u064A \u062D\u0627\u0644.","\u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0628\u0640 Aria2","\u064A\u0631\u0633\u0644 \u0637\u0644\u0628 JSON-RPC \u0628\u0633\u064A\u0637\u064B\u0627.","\u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0627\u0644\u0646\u0634\u0637\u0629 \u0641\u064A Aria2","\u062D\u062F\u0651\u062B \u0644\u0639\u0631\u0636 \u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u0646\u0642\u0644 \u0627\u0644\u062C\u0627\u0631\u064A\u0629\u061B \u0627\u0636\u063A\u0637 \xAB\u0625\u0644\u063A\u0627\u0621\xBB \u0644\u0625\u064A\u0642\u0627\u0641 \u0625\u062D\u062F\u0627\u0647\u0627.","\u062A\u062D\u062F\u064A\u062B","\u062A\u0633\u0644\u064A\u0645 \u0645\u062D\u0644\u064A \u0625\u0644\u0649 yt-dlp","\u064A\u0639\u0631\u0636 \u062D\u0641\u0638\u064B\u0627 \u062A\u0643\u064A\u0651\u0641\u064A\u064B\u0627 \u0628\u062C\u0648\u062F\u0629 \u0623\u0639\u0644\u0649 \u0639\u0646\u062F\u0645\u0627 \u064A\u0639\u0645\u0644 \u0645\u0633\u0627\u0639\u062F \u0645\u062D\u0644\u064A \u0645\u0648\u062B\u064E\u0651\u0642.","\u0639\u0646\u0648\u0627\u0646 \u0645\u0633\u0627\u0639\u062F yt-dlp","\u200Fhttp://127.0.0.1:8787 (\u0627\u0644\u0627\u0633\u062A\u0631\u062C\u0627\u0639 \u0627\u0644\u0645\u062D\u0644\u064A \u0641\u0642\u0637)","\u0633\u0631 \u0645\u0633\u0627\u0639\u062F yt-dlp","\u0642\u064A\u0645\u0629 AVIARY_YTDLP_TOKEN \u0627\u0644\u0645\u0634\u062A\u0631\u0643\u0629 \u0645\u0639 \u0627\u0644\u0639\u0645\u0644\u064A\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629.","\u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0645\u062A\u0642\u0627\u0637\u0639 \u0639\u0644\u0649 Bluesky","\u064A\u0646\u0634\u0631 \u0646\u0635 \u0627\u0644\u0645\u062D\u0631\u0631 \u0639\u0644\u0649 \u062D\u0633\u0627\u0628\u0643 \u0641\u064A Bluesky \u0639\u0646\u062F \u0627\u0644\u0637\u0644\u0628.","\u0631\u0627\u0628\u0637 \u062E\u062F\u0645\u0629 Bluesky","\u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A: https://bsky.social","\u062D\u0633\u0627\u0628 Bluesky","\u0627\u0633\u0645 \u062D\u0633\u0627\u0628\u0643 (\u062F\u0648\u0646 @\u060C \u0645\u062B\u0644 you.bsky.social)","\u0643\u0644\u0645\u0629 \u0645\u0631\u0648\u0631 \u062A\u0637\u0628\u064A\u0642 Bluesky","\u0643\u0644\u0645\u0629 \u0645\u0631\u0648\u0631 \u0627\u0644\u062A\u0637\u0628\u064A\u0642 \u0645\u0646 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u062D\u0633\u0627\u0628\u0643. \u0644\u0627 \u062A\u0633\u062A\u062E\u062F\u0645 \u0643\u0644\u0645\u0629 \u0645\u0631\u0648\u0631\u0643 \u0627\u0644\u0623\u0633\u0627\u0633\u064A\u0629 \u0623\u0628\u062F\u064B\u0627.","\u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0645\u062A\u0642\u0627\u0637\u0639 \u0639\u0644\u0649 Mastodon","\u064A\u0646\u0634\u0631 \u0646\u0635 \u0627\u0644\u0645\u062D\u0631\u0631 \u0639\u0644\u0649 \u062D\u0633\u0627\u0628\u0643 \u0641\u064A Mastodon \u0639\u0646\u062F \u0627\u0644\u0637\u0644\u0628.","\u062E\u0627\u062F\u0645 Mastodon","https://mastodon.social","\u0631\u0645\u0632 \u0648\u0635\u0648\u0644 Mastodon","\u0631\u0645\u0632 Bearer \u0628\u0646\u0637\u0627\u0642 write:statuses.","\u0625\u0631\u0641\u0627\u0642 \u0622\u062E\u0631 \u062A\u0646\u0632\u064A\u0644","\u064A\u0631\u0641\u0639 \u0622\u062E\u0631 \u0648\u0633\u0627\u0626\u0637 \u0646\u0632\u0651\u0644\u0647\u0627 Aviary \u0628\u0646\u062C\u0627\u062D \u0645\u0639 \u0623\u0648\u0644 \u0645\u0646\u0634\u0648\u0631 \u0641\u064A \u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0645\u062A\u0642\u0627\u0637\u0639.","\u0627\u0644\u0646\u0634\u0631 \u0643\u0633\u0644\u0633\u0644\u0629","\u0642\u0633\u0651\u0645 \u0627\u0644\u0646\u0635 \u0639\u0646\u062F \u0627\u0644\u0623\u0633\u0637\u0631 \u0627\u0644\u0641\u0627\u0631\u063A\u0629 \u0648\u0631\u062F\u0651 \u0639\u0644\u0649 \u0643\u0644 \u0645\u0642\u0637\u0639 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0628\u0642.","\u0646\u0634\u0631 \u0627\u0644\u0645\u062D\u0631\u0631 \u0639\u0644\u0649 Bluesky","\u064A\u0633\u062A\u062E\u062F\u0645 \u0627\u0644\u0646\u0635 \u0627\u0644\u062D\u0627\u0644\u064A \u0641\u064A \u0627\u0644\u0645\u062D\u0631\u0631.","\u0646\u0634\u0631 \u0627\u0644\u0645\u062D\u0631\u0631 \u0639\u0644\u0649 Mastodon","\u062A\u0634\u063A\u064A\u0644 \u0645\u0632\u0648\u0651\u062F \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A","\u064A\u0633\u0645\u062D \u0644\u0642\u0627\u0626\u0645\u0629 \u0623\u0648\u0627\u0645\u0631 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0628\u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0637\u0644\u0628\u0627\u062A \u0625\u0644\u0649 \u0627\u0644\u0645\u0632\u0648\u0651\u062F \u0627\u0644\u0630\u064A \u0623\u0639\u062F\u062F\u062A\u0647.","\u0645\u0632\u0648\u0651\u062F \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A","Anthropic Messages API","OpenAI Chat Completions","\u0645\u062A\u0648\u0627\u0641\u0642 \u0645\u0639 OpenAI (LocalAI\u060C \u0648\u0633\u064A\u0637 Ollama\u060C \u2026)","\u0646\u0642\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A (\u0627\u062E\u062A\u064A\u0627\u0631\u064A)","\u064A\u062A\u062C\u0627\u0648\u0632 \u0627\u0644\u0646\u0642\u0637\u0629 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629 \u0644\u0644\u0645\u0632\u0648\u0651\u062F \u0627\u0644\u0645\u062E\u062A\u0627\u0631.","\u0646\u0645\u0648\u0630\u062C \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A","\u0645\u062B\u0627\u0644: claude-sonnet-4-6\u060C gpt-4o\u060C llama3.1:8b","\u0645\u0641\u062A\u0627\u062D API \u0644\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A","\u064A\u064F\u062D\u0641\u0638 \u0645\u062D\u0644\u064A\u064B\u0627 \u0641\u0642\u0637. \u0644\u0627 \u064A\u0631\u0633\u0644\u0647 Aviary \u0625\u0644\u0627 \u0643\u062A\u0631\u0648\u064A\u0633\u0629 \u0645\u0635\u0627\u062F\u0642\u0629 \u0625\u0644\u0649 \u0645\u0632\u0648\u0651\u062F\u0643.","\u0645\u0633\u0645\u0648\u062D","\u062D\u0627\u0644\u0629 \u0627\u0644\u0634\u0628\u0643\u0629","\u0648\u062C\u0647\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A","\u0625\u0641\u0635\u0627\u062D \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A","\u0642\u0628\u0644 \u0627\u0644\u0625\u0631\u0633\u0627\u0644\u060C \u064A\u0639\u0631\u0636 Aviary \u0627\u0644\u0645\u0632\u0648\u0651\u062F \u0648\u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064A\u0629 \u0648\u0627\u0644\u062D\u0642\u0648\u0644 \u0648\u062A\u0642\u062F\u064A\u0631 \u0627\u0644\u0623\u062D\u0631\u0641/\u0627\u0644\u0631\u0645\u0648\u0632 \u0648\u0627\u0644\u0627\u062D\u062A\u0641\u0627\u0638 \u0648\u062D\u0627\u0644\u0629 \u0627\u0644\u0645\u064A\u0632\u0627\u0646\u064A\u0629.","\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0627\u0644\u064A\u0648\u0645","\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0628\u0627\u064A\u062A\u0627\u062A \u0637\u0644\u0628 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A","\u0627\u0644\u062A\u0648\u0642\u0641 \u0642\u0628\u0644 \u0625\u0631\u0633\u0627\u0644 \u0623\u064A \u0637\u0644\u0628 \u0630\u0643\u0627\u0621 \u0627\u0635\u0637\u0646\u0627\u0639\u064A \u064A\u062A\u062C\u0627\u0648\u0632 \u0646\u0635\u0647 \u0628\u062A\u0631\u0645\u064A\u0632 UTF-8 \u0647\u0630\u0627 \u0627\u0644\u062D\u062C\u0645. \u0627\u0636\u0628\u0637\u0647 \u0639\u0644\u0649 0 \u0644\u062D\u0638\u0631 \u0643\u0644 \u0637\u0644\u0628\u0627\u062A \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A.","\u0628\u0627\u064A\u062A\u0627\u062A \u0637\u0644\u0628\u0627\u062A \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0627\u0644\u064A\u0648\u0645\u064A\u0629","\u0625\u064A\u0642\u0627\u0641 \u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0645\u0632\u0648\u0651\u062F \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0628\u0639\u062F \u0647\u0630\u0627 \u0627\u0644\u0639\u062F\u062F \u0645\u0646 \u0628\u0627\u064A\u062A\u0627\u062A \u0627\u0644\u0637\u0644\u0628 \u0628\u062A\u0631\u0645\u064A\u0632 UTF-8 \u062E\u0644\u0627\u0644 \u0627\u0644\u064A\u0648\u0645 \u0627\u0644\u0645\u062D\u0644\u064A. \u0627\u0636\u0628\u0637\u0647 \u0639\u0644\u0649 0 \u0644\u062D\u0638\u0631 \u0643\u0644 \u0637\u0644\u0628\u0627\u062A \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A.","\u0627\u0644\u0628\u062D\u062B \u0627\u0644\u062F\u0644\u0627\u0644\u064A","\u0623\u0631\u0633\u0644 \u0646\u0635 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629 \u0625\u0644\u0649 \u0646\u0642\u0637\u0629 \u0646\u0647\u0627\u064A\u0629 \u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0627\u0644\u0645\u0643\u0648\u0651\u0646\u0629 \u0644\u0644\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u062A\u0634\u0627\u0628\u0647. \u062A\u0638\u0647\u0631 \u0627\u0644\u0648\u062C\u0647\u0629 \u0648\u0627\u0644\u062D\u0642\u0648\u0644 \u0648\u0627\u0644\u0627\u062D\u062A\u0641\u0627\u0638 \u0648\u0645\u064A\u0632\u0627\u0646\u064A\u0629 \u0627\u0644\u0628\u0627\u064A\u062A \u0647\u0646\u0627.","\u0646\u0642\u0637\u0629 \u0627\u0644\u062A\u0636\u0645\u064A\u0646","\u0646\u0642\u0637\u0629 POST \u062A\u064F\u0639\u064A\u062F {data: [{embedding: number[]}]}","\u0646\u0645\u0648\u0630\u062C \u0627\u0644\u062A\u0636\u0645\u064A\u0646","\u0645\u062B\u0627\u0644: text-embedding-3-small","\u0645\u0641\u062A\u0627\u062D API \u0644\u0644\u062A\u0636\u0645\u064A\u0646","\u064A\u064F\u062D\u0641\u0638 \u0645\u062D\u0644\u064A\u064B\u0627\u060C \u0648\u064A\u064F\u0633\u062A\u062E\u062F\u0645 \u0641\u0642\u0637 \u0643\u062A\u0631\u0648\u064A\u0633\u0629 Authorization.","\u063A\u064A\u0631 \u0645\u0643\u0648\u0651\u0646","\u0648\u062C\u0647\u0629 \u0627\u0644\u062A\u0636\u0645\u064A\u0646","\u0625\u0641\u0635\u0627\u062D \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u062A\u0636\u0645\u064A\u0646","\u064A\u062D\u062A\u0648\u064A \u0627\u0644\u0637\u0644\u0628 \u0639\u0644\u0649 \u0627\u0644\u0646\u0645\u0648\u0630\u062C \u0648\u0646\u0635 \u0627\u0644\u0633\u062C\u0644 \u0627\u0644\u0645\u0644\u062A\u0642\u0637. \u062A\u0628\u0642\u0649 \u0627\u0644\u0645\u062A\u062C\u0647\u0627\u062A \u0648\u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u062D\u062F\u0648\u062F \u0641\u064A \u0641\u0647\u0631\u0633 Aviary \u0627\u0644\u0645\u062D\u0644\u064A\u061B \u0648\u064A\u062A\u0628\u0639 \u0627\u062D\u062A\u0641\u0627\u0638 \u0627\u0644\u0645\u0632\u0648\u0651\u062F \u0633\u064A\u0627\u0633\u062A\u0647.","\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0627\u0644\u064A\u0648\u0645","\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0628\u0627\u064A\u062A\u0627\u062A \u0633\u062C\u0644 \u0627\u0644\u062A\u0636\u0645\u064A\u0646","\u0627\u0644\u062A\u0648\u0642\u0641 \u0642\u0628\u0644 \u0625\u0631\u0633\u0627\u0644 \u0623\u064A \u0633\u062C\u0644 \u064A\u062A\u062C\u0627\u0648\u0632 \u0646\u0635\u0647 \u0628\u062A\u0631\u0645\u064A\u0632 UTF-8 \u0647\u0630\u0627 \u0627\u0644\u062D\u062C\u0645. \u0627\u0636\u0628\u0637\u0647 \u0639\u0644\u0649 0 \u0644\u062D\u0638\u0631 \u0643\u0644 \u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0627\u0644\u062A\u0636\u0645\u064A\u0646.","\u0628\u0627\u064A\u062A\u0627\u062A \u0633\u062C\u0644\u0627\u062A \u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0627\u0644\u064A\u0648\u0645\u064A\u0629","\u0625\u064A\u0642\u0627\u0641 \u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0628\u0639\u062F \u0647\u0630\u0627 \u0627\u0644\u0639\u062F\u062F \u0645\u0646 \u0628\u0627\u064A\u062A\u0627\u062A \u0627\u0644\u0633\u062C\u0644 \u0628\u062A\u0631\u0645\u064A\u0632 UTF-8 \u062E\u0644\u0627\u0644 \u0627\u0644\u064A\u0648\u0645 \u0627\u0644\u0645\u062D\u0644\u064A. \u0627\u0636\u0628\u0637\u0647 \u0639\u0644\u0649 0 \u0644\u062D\u0638\u0631 \u0643\u0644 \u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0627\u0644\u062A\u0636\u0645\u064A\u0646.","\u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0627\u0644\u062A\u0644\u0642\u0627\u0626\u064A \u0628\u0639\u062F \u0643\u0644 \u062A\u0635\u062F\u064A\u0631","\u0642\u0628\u0644 \u0627\u0644\u062A\u0641\u0639\u064A\u0644\u060C \u0631\u0627\u062C\u0639 \u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064A\u0629 \u0648\u062D\u0642\u0648\u0644 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629 \u0648\u0627\u0644\u0627\u062D\u062A\u0641\u0627\u0638 \u0627\u0644\u0645\u062D\u0644\u064A \u0648\u0645\u064A\u0632\u0627\u0646\u064A\u0629 \u0627\u0644\u0628\u0627\u064A\u062A \u0627\u0644\u064A\u0648\u0645\u064A\u0629 \u0623\u0639\u0644\u0627\u0647. \u0628\u0639\u062F \u0643\u0644 \u062A\u0635\u062F\u064A\u0631\u060C \u064A\u062A\u0645 \u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0641\u064A \u0627\u0644\u062E\u0644\u0641\u064A\u0629. \u0645\u062A\u0648\u0642\u0641 \u0627\u0641\u062A\u0631\u0627\u0636\u064A\u064B\u0627.","\u0625\u0639\u0627\u062F\u0629 \u0628\u0646\u0627\u0621 \u0627\u0644\u0641\u0647\u0631\u0633 \u0627\u0644\u062F\u0644\u0627\u0644\u064A","\u064A\u0636\u0645\u0651\u0646 \u0643\u0644 \u0633\u062C\u0644 \u0645\u062C\u0645\u0651\u0639. \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u063A\u064A\u0631 \u0645\u0643\u0644\u0641\u0629 \u0644\u0623\u0646 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u062E\u0632\u0651\u0646\u0629 \u062A\u064F\u062A\u062E\u0637\u0651\u0649.","\u0627\u0644\u062A\u0634\u0627\u0628\u0647 \u0627\u0644\u0645\u062A\u062C\u0647\u064A \u0641\u064A \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629. \u062A\u064F\u0646\u0634\u0623 \u0627\u0644\u062A\u0636\u0645\u064A\u0646\u0627\u062A \u0639\u0646\u062F \u0627\u0644\u0637\u0644\u0628.","\u0635\u0641 \u0645\u0627 \u062A\u0628\u062D\u062B \u0639\u0646\u0647\u2026","\u0645\u0633\u062D \u0627\u0644\u0641\u0647\u0631\u0633 \u0627\u0644\u062F\u0644\u0627\u0644\u064A","\u064A\u0646\u0633\u0649 \u0643\u0644 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0627\u0644\u0645\u0636\u0645\u0651\u0646\u0629.","\u0645\u0633\u062D \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0648\u0627\u0644\u062A\u0636\u0645\u064A\u0646","\u0627\u0646\u0633\u064E \u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0637\u0644\u0628\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A\u0629 \u0641\u0642\u0637. \u0644\u0627 \u064A\u0632\u064A\u0644 \u0630\u0644\u0643 \u0627\u0644\u0641\u0647\u0631\u0633 \u0627\u0644\u062F\u0644\u0627\u0644\u064A \u0623\u0648 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0639\u062A\u0645\u0627\u062F \u0627\u0644\u0645\u0632\u0648\u0651\u062F.","\u0645\u0641\u0639\u0651\u0644","\u0645\u062A\u0648\u0642\u0641","\u0645\u064F\u0647\u064A\u0651\u0623","\u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064A\u0629 \u0645\u0641\u0642\u0648\u062F\u0629","\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0627\u0639\u062A\u0645\u0627\u062F \u0645\u0641\u0642\u0648\u062F\u0629","\u0627\u0644\u0645\u0641\u062A\u0627\u062D \u0623\u0648 \u0627\u0644\u0646\u0645\u0648\u0630\u062C \u0645\u0641\u0642\u0648\u062F","\u0645\u0641\u0647\u0631\u0633","{name}: {state} \xB7 {config}","{name}: {state} \xB7 {count} {indexed}","\u062D\u0627\u0644\u0629 \u0627\u0644\u062A\u0643\u0627\u0645\u0644\u0627\u062A","\u0623\u062E\u0637\u0627\u0621 \u0627\u0644\u062A\u0643\u0627\u0645\u0644 \u0627\u0644\u0623\u062E\u064A\u0631\u0629","\u0645\u0646 \u0633\u062C\u0644 \u0627\u0644\u062A\u062F\u0642\u064A\u0642\u061B \u062A\u0638\u0647\u0631 \u0641\u0642\u0637 \u0627\u0633\u062A\u062F\u0639\u0627\u0621\u0627\u062A \u0627\u0644\u062A\u0643\u0627\u0645\u0644 \u0627\u0644\u0641\u0627\u0634\u0644\u0629.","\u0627\u0636\u0628\u0637 \u0627\u0644\u062E\u062F\u0645\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A\u0629 \u0627\u0644\u0627\u062E\u062A\u064A\u0627\u0631\u064A\u0629 \u0648\u0645\u0648\u0641\u0631\u064A \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A.","\u0627\u0644\u0630\u0643\u0627\u0621","\u0645\u0646\u0642\u062D\u0629. \u0633\u062A\u064F\u062D\u0641\u0638 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0627\u0639\u062A\u0645\u0627\u062F \u0627\u0644\u0645\u062E\u0632\u0646\u0629.","\u062A\u0648\u0642\u0641 \u0628\u0639\u062F \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629 \u0648\u0623\u0639\u062F \u0643\u0644 \u0645\u0627 \u062A\u0645\u062A \u0643\u062A\u0627\u0628\u062A\u0647 \u0628\u0627\u0644\u0641\u0639\u0644.","\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0646\u0633\u062E\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629 \u0648\u0627\u0639\u0631\u0636 \u0627\u0644\u062A\u0639\u0627\u0631\u0636\u0627\u062A \u0646\u0641\u0633\u0647\u0627 \u0645\u0646 \u062F\u0648\u0646 \u0643\u062A\u0627\u0628\u0629 \u0623\u0648 \u0625\u0632\u0627\u0644\u0629 \u0623\u064A \u0628\u064A\u0627\u0646\u0627\u062A \u0645\u062D\u0644\u064A\u0629.","\u0637\u0628\u0651\u0642 \u0645\u062C\u0645\u0648\u0639\u0627\u062A \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A \u0627\u0644\u0645\u062D\u062F\u062F\u0629. \u062A\u0624\u062F\u064A \u0627\u0644\u0643\u062A\u0627\u0628\u0629 \u0627\u0644\u0641\u0627\u0634\u0644\u0629 \u0625\u0644\u0649 \u0627\u0644\u062A\u0631\u0627\u062C\u0639 \u0639\u0646 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u063A\u064A\u0631\u062A \u0628\u0627\u0644\u0641\u0639\u0644.","\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0627\u0639\u062A\u0645\u0627\u062F \u0645\u0646\u0642\u062D\u0629\u061B \u0633\u062A\u064F\u062D\u0641\u0638 \u0627\u0644\u0642\u064A\u0645 \u0627\u0644\u0645\u062E\u0632\u0646\u0629 \u0628\u0627\u0644\u0641\u0639\u0644 \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A.","\u0625\u0639\u0627\u062F\u0629 \u0636\u0628\u0637 \u0643\u0644 \u0627\u0644\u062A\u0641\u0636\u064A\u0644\u0627\u062A","\u064A\u0639\u064A\u062F \u0625\u0639\u062F\u0627\u062F\u0627\u062A Aviary \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629: \u064A\u0628\u0642\u0649 \u0648\u0636\u0639 \u0628\u0644\u0627 \u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0645\u0641\u0639\u0651\u0644\u064B\u0627 \u0648\u062A\u0639\u0648\u062F \u0643\u0644 \u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062A\u062D\u0643\u0645 \u0627\u0644\u0645\u0631\u0626\u064A\u0629 \u0623\u0648 \u0627\u0644\u0633\u0644\u0648\u0643\u064A\u0629 \u0627\u0644\u0623\u062E\u0631\u0649 \u0625\u0644\u0649 \u0627\u0644\u0625\u064A\u0642\u0627\u0641. \u062A\u0628\u0642\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0648\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0648\u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0648\u0633\u062C\u0644 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629.","\u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A","\u064A\u0646\u0632\u0651\u0644 \u062A\u0641\u0636\u064A\u0644\u0627\u062A\u0643 \u0628\u0635\u064A\u063A\u0629 JSON. \u062A\u064F\u0633\u062A\u0628\u062F\u0644 \u0645\u0641\u0627\u062A\u064A\u062D API \u0648\u0643\u0644\u0645\u0627\u062A \u0627\u0644\u0645\u0631\u0648\u0631 \u0628\u0639\u0646\u0635\u0631 \u0646\u0627\u0626\u0628\u060C \u0641\u064A\u0635\u0628\u062D \u0627\u0644\u0645\u0644\u0641 \u0622\u0645\u0646\u064B\u0627 \u0644\u0644\u0645\u0634\u0627\u0631\u0643\u0629\u061B \u0648\u0627\u0633\u062A\u064A\u0631\u0627\u062F\u0647 \u0647\u0646\u0627 \u064A\u0628\u0642\u064A \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0627\u0639\u062A\u0645\u0627\u062F \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632.","\u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A (JSON)","\u0627\u0644\u0635\u0642 \u0645\u0644\u0641 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0645\u064F\u0635\u062F\u064E\u0651\u0631\u064B\u0627 \u0645\u0646 Aviary \u062B\u0645 \u0627\u062E\u062A\u0631 \u0627\u0633\u062A\u064A\u0631\u0627\u062F. \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0627\u0639\u062A\u0645\u0627\u062F \u0627\u0644\u0645\u062D\u062C\u0648\u0628\u0629 \u062A\u062D\u062A\u0641\u0638 \u0628\u0627\u0644\u0642\u064A\u0645 \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629 \u0647\u0646\u0627.","\u0627\u0633\u062A\u064A\u0631\u0627\u062F","\u062A\u0635\u062F\u064A\u0631 \u0646\u0633\u062E\u0629 \u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629 \u0643\u0627\u0645\u0644\u0629 \u0644\u0644\u0645\u0643\u062A\u0628\u0629","\u064A\u0646\u0632\u0651\u0644 \u0646\u0633\u062E\u0629 \u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629 JSON \u0645\u0631\u0642\u064E\u0651\u0645\u0629 \u0627\u0644\u0625\u0635\u062F\u0627\u0631 \u062A\u0634\u0645\u0644 \u0643\u0644 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0634\u062E\u0635\u064A\u0629 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632\u060C \u0644\u0627 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0645\u0641\u062A\u0648\u062D \u0648\u062D\u062F\u0647. \u062A\u064F\u0633\u062A\u062B\u0646\u0649 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0627\u0639\u062A\u0645\u0627\u062F \u0627\u0641\u062A\u0631\u0627\u0636\u064A\u064B\u0627\u060C \u0648\u0627\u0644\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u062A\u064F\u0628\u0642\u064A \u0639\u0644\u0649 \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629 \u0647\u0646\u0627 \u0628\u0627\u0644\u0641\u0639\u0644.","\u062A\u0635\u062F\u064A\u0631 \u0646\u0633\u062E\u0629 \u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629 \u0645\u0639 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0627\u0639\u062A\u0645\u0627\u062F","\u0627\u0644\u0646\u0633\u062E\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629 \u0646\u0641\u0633\u0647\u0627 \u0645\u0639 \u0645\u0641\u0627\u062A\u064A\u062D API \u0648\u0647\u0648\u064A\u0629 \u062A\u0648\u0642\u064A\u0639 WACZ \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629 \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D. \u064A\u0645\u0643\u0646 \u0644\u0623\u064A \u0634\u062E\u0635 \u064A\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0641 \u0627\u0633\u062A\u062E\u062F\u0627\u0645\u0647\u0627\u060C \u0641\u0627\u062D\u062A\u0641\u0638 \u0628\u0647 \u0643\u0645\u0627 \u062A\u062D\u062A\u0641\u0638 \u0628\u0643\u0644\u0645\u0629 \u0645\u0631\u0648\u0631.","\u0627\u062E\u062A\u064A\u0627\u0631 \u0646\u0633\u062E\u0629 \u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629 \u0644\u0644\u0645\u0643\u062A\u0628\u0629","\u0627\u062E\u062A\u0631 \u0646\u0633\u062E\u0629 JSON \u0644\u0641\u062D\u0635 \u0625\u0635\u062F\u0627\u0631\u0627\u062A\u0647\u0627 \u0648\u0623\u0639\u062F\u0627\u062F\u0647\u0627 \u0648\u062A\u0639\u0627\u0631\u0636\u0627\u062A\u0647\u0627 \u0648\u0645\u062C\u0645\u0648\u0639 \u062A\u062F\u0642\u064A\u0642\u0647\u0627 \u0642\u0628\u0644 \u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A\u0629.","\u0627\u0644\u0627\u062D\u062A\u0641\u0627\u0638 \u0628\u0633\u062C\u0644 \u0645\u062D\u0644\u064A \u0644\u0644\u0625\u062C\u0631\u0627\u0621\u0627\u062A","\u064A\u0633\u062C\u0651\u0644 \u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0648\u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0648\u062A\u063A\u064A\u064A\u0631\u0627\u062A \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632 \u0644\u062A\u062A\u0645\u0643\u0646 \u0645\u0646 \u0645\u0631\u0627\u062C\u0639\u0629 \u0645\u0627 \u0641\u0639\u0644\u0647 Aviary. \u0644\u0627 \u064A\u064F\u0631\u0633\u0644 \u0623\u064A \u0634\u064A\u0621 \u0625\u0644\u0649 \u0623\u064A \u062C\u0647\u0629. \u0625\u064A\u0642\u0627\u0641\u0647 \u064A\u0645\u0646\u0639 \u0625\u0636\u0627\u0641\u0629 \u0623\u064A \u0639\u0646\u0627\u0635\u0631 \u062C\u062F\u064A\u062F\u0629 \u0641\u0648\u0631\u064B\u0627\u060C \u0648\u062A\u0628\u0642\u0649 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062D\u0627\u0644\u064A\u0629 \u062D\u062A\u0649 \u062A\u0645\u0633\u062D\u0647\u0627.","\u0639\u0646\u0627\u0635\u0631 \u0633\u062C\u0644 \u0627\u0644\u062A\u062F\u0642\u064A\u0642","\u0645\u0633\u062D \u0633\u062C\u0644 \u0627\u0644\u062A\u062F\u0642\u064A\u0642","\u064A\u062D\u0630\u0641 \u0633\u062C\u0644 \u0627\u0644\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A.","\u0627\u0646\u0633\u062E \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A\u0629 \u0627\u062D\u062A\u064A\u0627\u0637\u064A\u064B\u0627 \u0623\u0648 \u0627\u0633\u062A\u0639\u062F\u0647\u0627 \u0623\u0648 \u0623\u0639\u062F \u0636\u0628\u0637 Aviary.","\u0627\u0644\u062A\u0641\u0636\u064A\u0644\u0627\u062A","\u0646\u0633\u062E\u0629 \u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629 \u0644\u0644\u0645\u0643\u062A\u0628\u0629","\u0633\u062C\u0644 \u0627\u0644\u062A\u062F\u0642\u064A\u0642","\u0627\u0644\u062A\u062E\u0632\u064A\u0646","\u062A\u0628\u0642\u0649 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u062F\u0627\u062E\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D.","\u0623\u0645\u0627\u0646 CSS \u0627\u0644\u0645\u062E\u0635\u0635","CSS \u0627\u0644\u0645\u062E\u0635\u0635 \u0645\u062D\u0644\u064A \u0648\u0645\u0642\u064A\u062F \u0628\u0627\u0644\u0633\u0637\u062D \u0627\u0644\u0645\u0633\u0645\u0649 \u0648\u0644\u0627 \u064A\u0631\u0633\u0644 \u0645\u0639 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u062A\u0634\u062E\u064A\u0635. \u0625\u0646\u0647 \u062A\u0639\u062F\u064A\u0644 \u0644\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u0627\u0644\u0645\u062A\u0642\u062F\u0645\u060C \u0644\u0630\u0644\u0643 \u0644\u0627 \u064A\u0633\u062A\u0637\u064A\u0639 \u0627\u0644\u062F\u0639\u0645 \u0625\u0639\u0627\u062F\u0629 \u0625\u0646\u062A\u0627\u062C \u0622\u062B\u0627\u0631\u0647 \u0627\u0644\u0645\u0631\u0626\u064A\u0629.","\u0627\u0644\u0648\u0636\u0639 \u0627\u0644\u0645\u062D\u0644\u064A \u0641\u0642\u0637","\u064A\u0645\u0646\u0639 \u0643\u0644 \u0637\u0644\u0628 \u0625\u0644\u0649 \u0623\u064A \u062A\u0643\u0627\u0645\u0644 \u0623\u0639\u062F\u062F\u062A\u0647: Aria2\u060C \u0648\u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0645\u062A\u0642\u0627\u0637\u0639\u060C \u0648\u0637\u0644\u0628\u0627\u062A \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A\u060C \u0648\u0627\u0644\u062A\u0636\u0645\u064A\u0646\u0627\u062A. \u0623\u0645\u0627 \u062D\u0641\u0638 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0641\u064A\u0638\u0644 \u064A\u062C\u0644\u0628\u0647\u0627 \u0645\u0646 \u062E\u0648\u0627\u062F\u0645 X \u0646\u0641\u0633\u0647\u0627\u060C \u0648\u0647\u064A \u0627\u0644\u0645\u0635\u062F\u0631 \u0627\u0644\u0630\u064A \u062D\u0645\u0651\u0644\u062A\u0647\u0627 \u0645\u0646\u0647 \u0627\u0644\u0635\u0641\u062D\u0629 \u0623\u0635\u0644\u064B\u0627. \u0645\u064F\u0641\u0639\u0651\u0644 \u0627\u0641\u062A\u0631\u0627\u0636\u064A\u064B\u0627\u060C \u0648\u062A\u0641\u0639\u064A\u0644 \u0623\u064A \u062A\u0643\u0627\u0645\u0644 \u0647\u0648 \u0645\u0627 \u064A\u0648\u0642\u0641\u0647.","\u0631\u0641\u0636 \u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u062A\u062D\u0644\u064A\u0644\u0627\u062A \u0645\u0646 X","\u064A\u0648\u0642\u0641 \u0646\u0628\u0636\u0627\u062A \u0627\u0644\u062A\u062A\u0628\u0639 \u0627\u0644\u062A\u064A \u064A\u0631\u0633\u0644\u0647\u0627 X \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u062A\u0645\u0631\u064A\u0631 \u0648\u0627\u0644\u0646\u0642\u0631 \u0648\u0627\u0644\u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0645\u0624\u0642\u062A. \u062A\u064F\u0631\u0641\u0636 \u0646\u0642\u0627\u0637 \u0627\u0644\u062A\u062D\u0644\u064A\u0644\u0627\u062A \u0641\u0642\u0637. \u0623\u0645\u0627 \u062D\u0631\u0643\u0629 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \u0648\u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0648\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0641\u062A\u0628\u0642\u0649 \u0643\u0645\u0627 \u0647\u064A.","\u0645\u0631\u0627\u0642\u0628\u0629 \u0635\u062D\u0629 \u0627\u0644\u0645\u062D\u062F\u062F\u0627\u062A","\u064A\u062A\u062D\u0642\u0642 \u0645\u0646 \u0633\u0637\u062D X \u0627\u0644\u062D\u0627\u0644\u064A \u0628\u062D\u062B\u064B\u0627 \u0639\u0646 \u0646\u0642\u0627\u0637 \u0627\u0644\u0627\u0631\u062A\u0633\u0627\u0621 \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629 \u0648\u0627\u0644\u0628\u062F\u064A\u0644\u0629. \u0623\u0648\u0642\u0641\u0647 \u0625\u0630\u0627 \u0644\u0645 \u062A\u0643\u0646 \u062A\u0631\u064A\u062F \u062A\u0634\u062E\u064A\u0635\u0627\u062A \u0627\u0644\u0645\u062D\u062F\u062F\u0627\u062A.","\u0645\u062A\u0635\u0644 \u0628\u0627\u0644\u0635\u0641\u062D\u0629","\u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629","\u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u0641\u0648\u0636\u0629","\u062A\u0639\u0630\u0651\u0631 \u062D\u0641\u0638 \u0628\u0639\u0636 \u0627\u0644\u062A\u063A\u064A\u064A\u0631\u0627\u062A. \u0642\u062F \u062A\u0643\u0648\u0646 \u0645\u0633\u0627\u062D\u0629 \u062A\u062E\u0632\u064A\u0646 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0645\u0645\u062A\u0644\u0626\u0629.","\u0627\u0644\u062D\u0641\u0638","\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645","\u0644\u063A\u0629 \u0627\u0644\u0644\u0648\u062D\u0629","\u0627\u0644\u0645\u0631\u0627\u0642\u0628\u0629 \u0646\u0634\u0637\u0629","\u062D\u0627\u0644\u0629 \u0627\u0644\u0645\u062D\u062F\u0650\u0651\u062F\u0627\u062A","\u0627\u0639\u0631\u0641 \u0645\u0627 \u064A\u0628\u0642\u0649 \u0645\u062D\u0644\u064A\u064B\u0627 \u0648\u062A\u062D\u0642\u0642 \u0645\u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 Aviary \u0644\u0627 \u064A\u0632\u0627\u0644 \u064A\u0639\u0645\u0644 \u0645\u0639 X.","\u062D\u062F\u0648\u062F \u0627\u0644\u062E\u0635\u0648\u0635\u064A\u0629","\u0627\u0631\u062A\u0628\u0627\u0637\u0627\u062A \u0627\u0644\u0635\u0641\u062D\u0629","\u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A\u0629","\u0627\u0644\u062A\u0648\u0627\u0641\u0642","\u062A\u063A\u064A\u064A\u0631\u0627\u062A \u063A\u064A\u0631 \u0645\u062D\u0641\u0648\u0638\u0629","\u062A\u0639\u0630\u0651\u0631 \u062D\u0641\u0638 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A. \u062D\u0627\u0648\u0644 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.","\u0627\u062D\u0641\u0638 \u062A\u063A\u064A\u064A\u0631\u0627\u062A\u0643 \u0623\u0648 \u062A\u0631\u0627\u062C\u0639 \u0639\u0646\u0647\u0627 \u0642\u0628\u0644 \u0645\u063A\u0627\u062F\u0631\u0629 \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645.","\u062C\u0627\u0631\u064D \u0627\u0644\u062D\u0641\u0638...","\u062A\u0639\u0630\u0651\u0631 \u062D\u0641\u0638 \u0647\u0630\u0627 \u0627\u0644\u062A\u063A\u064A\u064A\u0631. \u0623\u0639\u062F \u0625\u062C\u0631\u0627\u0621\u0647 \u062B\u0645 \u0627\u062D\u0641\u0638\u0647.","\u0635\u062D\u0651\u062D \u0627\u0644\u0642\u064A\u0645 \u063A\u064A\u0631 \u0627\u0644\u0635\u0627\u0644\u062D\u0629 \u0642\u0628\u0644 \u0627\u0644\u062D\u0641\u0638.","\u062A\u0645 \u0646\u0633\u062E \u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u062A\u0634\u062E\u064A\u0635 \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629.","\u062A\u0645 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u062D\u0630\u0641.","\u0641\u0634\u0644 \u0623\u0645\u0631 \u0627\u0644\u062D\u0630\u0641.","\u0627\u0644\u0648\u0636\u0639 \u0627\u0644\u0645\u062D\u0644\u064A \u0641\u0642\u0637 \u0645\u0641\u0639\u0651\u0644.","\u0627\u0644\u0648\u0636\u0639 \u0627\u0644\u0645\u062D\u0644\u064A \u0641\u0642\u0637 \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u0631\u0641\u0636 \u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u062A\u062D\u0644\u064A\u0644\u0627\u062A.","\u062A\u0645 \u0627\u0644\u0633\u0645\u0627\u062D \u0628\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u062A\u062D\u0644\u064A\u0644\u0627\u062A.","\u062A\u0645 \u062A\u0634\u063A\u064A\u0644 \u0645\u0631\u0627\u0642\u0628\u0629 \u0635\u062D\u0629 \u0627\u0644\u0645\u062D\u062F\u062F\u0627\u062A.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0645\u0631\u0627\u0642\u0628\u0629 \u0635\u062D\u0629 \u0627\u0644\u0645\u062D\u062F\u062F\u0627\u062A.","\u062A\u0645 \u0646\u0633\u062E \u0645\u0644\u0627\u062D\u0638\u0629 \u0627\u0644\u0628\u0646\u064A\u0629 \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0646\u0633\u062E \u0645\u0644\u0627\u062D\u0638\u0629 \u0627\u0644\u0628\u0646\u064A\u0629.","\u062A\u0645\u062A \u0625\u0639\u0627\u062F\u0629 \u0636\u0628\u0637 \u0645\u0642\u0627\u064A\u064A\u0633 \u0627\u0644\u0623\u062F\u0627\u0621.","\u062A\u0639\u0630\u0631 \u0625\u0639\u0627\u062F\u0629 \u0636\u0628\u0637 \u0645\u0642\u0627\u064A\u064A\u0633 \u0627\u0644\u0623\u062F\u0627\u0621.","\u062A\u0645 \u0645\u0633\u062D \u0627\u0644\u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629.","\u062A\u0639\u0630\u0631 \u0645\u0633\u062D \u0627\u0644\u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629.","\u062A\u0645\u062A \u0625\u0639\u0627\u062F\u0629 \u0636\u0628\u0637 \u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A.","\u062A\u0639\u0630\u0631\u062A \u0625\u0639\u0627\u062F\u0629 \u0636\u0628\u0637 \u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A.","\u062A\u0645 \u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A. \u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u2026","\u0641\u0634\u0644 \u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A.","\u062A\u0645 \u062A\u0639\u064A\u064A\u0646 {moved} \u0645\u062E\u0627\u0632\u0646\u061B \u0627\u0643\u062A\u0645\u0644 {completedAfterRetry} \u0628\u0639\u062F \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629\u061B \u0643\u0627\u0646 {skipped} \u0645\u0648\u062C\u0648\u062F\u064B\u0627\u061B \u062A\u0639\u0627\u0631\u0636 {conflicted}\u061B \u0648\u0641\u0634\u0644 {failed}.","\u062A\u0645 \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A. \u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u2026","\u0641\u0634\u0644 \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A.","\u062A\u0645 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u0625\u062C\u0627\u0628\u0629.","\u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u064A\u0632\u0627\u062A \u0645\u064F\u0639\u0637\u064E\u0651\u0644\u0629. \u0647\u0644 \u0645\u0627 \u0632\u0627\u0644\u062A \u0627\u0644\u0635\u0641\u062D\u0629 \u0645\u0639\u0637\u0648\u0628\u0629\u061F","\u062A\u0645 \u0645\u0633\u062D \u0627\u0644\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u0645\u064A\u0632\u0629.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u0645\u064A\u0632\u0629\u061B \u0639\u0627\u062F\u062A \u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u064A\u0632\u0627\u062A \u0644\u0644\u0639\u0645\u0644.","\u0627\u0644\u062A\u0633\u0644\u064A\u0645 \u0625\u0644\u0649 Aria2 \u0645\u0641\u0639\u0651\u0644.","\u0627\u0644\u062A\u0633\u0644\u064A\u0645 \u0625\u0644\u0649 Aria2 \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u062D\u0641\u0638 \u0646\u0642\u0637\u0629 Aria2","\u062A\u0645 \u062D\u0641\u0638 \u0633\u0631 Aria2","\u062A\u0645 \u062D\u0641\u0638 \u062D\u062F Aria2","\u064A\u0645\u0643\u0646 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 Aria2.","Aria2 \u063A\u064A\u0631 \u0645\u062A\u0627\u062D: {error}","\u0641\u0634\u0644 \u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0628\u0640 Aria2.","\u062A\u0645 \u0625\u0644\u063A\u0627\u0621 {gid}.","\u0641\u0634\u0644 \u0625\u0644\u063A\u0627\u0621 Aria2: {error}","\u0641\u0634\u0644 \u0625\u0644\u063A\u0627\u0621 Aria2.","\u062A\u0639\u0630\u0651\u0631 \u062C\u0644\u0628 \u0642\u0627\u0626\u0645\u0629 Aria2.","\u062A\u0645 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u062A\u0633\u0644\u064A\u0645 \u0625\u0644\u0649 yt-dlp.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u062A\u0633\u0644\u064A\u0645 \u0625\u0644\u0649 yt-dlp.","\u062A\u0645 \u062D\u0641\u0638 \u0639\u0646\u0648\u0627\u0646 \u0645\u0633\u0627\u0639\u062F yt-dlp.","\u062A\u0645 \u062D\u0641\u0638 \u0633\u0631 \u0645\u0633\u0627\u0639\u062F yt-dlp.","Bluesky \u0645\u0641\u0639\u0651\u0644.","Bluesky \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u062D\u0641\u0638 \u062E\u062F\u0645\u0629 Bluesky.","\u062A\u0645 \u062D\u0641\u0638 \u062D\u0633\u0627\u0628 Bluesky.","\u062A\u0645 \u062D\u0641\u0638 \u0643\u0644\u0645\u0629 \u0645\u0631\u0648\u0631 \u062A\u0637\u0628\u064A\u0642 Bluesky.","Mastodon \u0645\u0641\u0639\u0651\u0644.","Mastodon \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u062D\u0641\u0638 \u062E\u0627\u062F\u0645 Mastodon.","\u062A\u0645 \u062D\u0641\u0638 \u0631\u0645\u0632 Mastodon.","\u0625\u0631\u0641\u0627\u0642 \u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0645\u062A\u0642\u0627\u0637\u0639 \u0645\u0641\u0639\u0651\u0644.","\u0625\u0631\u0641\u0627\u0642 \u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0645\u062A\u0642\u0627\u0637\u0639 \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u0646\u0634\u0631 {posts} \u0641\u064A Bluesky.{url}","\u0641\u0634\u0644 Bluesky: {error}","\u0641\u0634\u0644 \u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0645\u062A\u0642\u0627\u0637\u0639 \u0639\u0644\u0649 Bluesky.","\u062A\u0645 \u0646\u0634\u0631 {posts} \u0641\u064A Mastodon.{url}","\u0641\u0634\u0644 Mastodon: {error}","\u0641\u0634\u0644 \u0627\u0644\u0646\u0634\u0631 \u0627\u0644\u0645\u062A\u0642\u0627\u0637\u0639 \u0639\u0644\u0649 Mastodon.","\u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0645\u0641\u0639\u0651\u0644\u0629.","\u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0645\u0639\u0637\u0651\u0644\u0629.","\u062A\u0645 \u062D\u0641\u0638 \u0646\u0642\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A.","\u062A\u0645 \u062D\u0641\u0638 \u0646\u0645\u0648\u0630\u062C \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A.","\u062A\u0645 \u062D\u0641\u0638 \u0645\u0641\u062A\u0627\u062D API \u0644\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A.","\u062A\u0645 \u062D\u0641\u0638 \u0645\u064A\u0632\u0627\u0646\u064A\u0629 \u0637\u0644\u0628\u0627\u062A \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A.","\u062A\u0645 \u062D\u0641\u0638 \u0645\u064A\u0632\u0627\u0646\u064A\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0627\u0644\u064A\u0648\u0645\u064A\u0629.","\u0627\u0644\u0628\u062D\u062B \u0627\u0644\u062F\u0644\u0627\u0644\u064A \u0645\u0641\u0639\u0651\u0644.","\u0627\u0644\u0628\u062D\u062B \u0627\u0644\u062F\u0644\u0627\u0644\u064A \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u062D\u0641\u0638 \u0646\u0642\u0637\u0629 \u0627\u0644\u062A\u0636\u0645\u064A\u0646.","\u062A\u0645 \u062D\u0641\u0638 \u0646\u0645\u0648\u0630\u062C \u0627\u0644\u062A\u0636\u0645\u064A\u0646.","\u062A\u0645 \u062D\u0641\u0638 \u0645\u0641\u062A\u0627\u062D API \u0644\u0644\u062A\u0636\u0645\u064A\u0646.","\u062A\u0645 \u062D\u0641\u0638 \u0645\u064A\u0632\u0627\u0646\u064A\u0629 \u0637\u0644\u0628\u0627\u062A \u0627\u0644\u062A\u0636\u0645\u064A\u0646.","\u062A\u0645 \u062D\u0641\u0638 \u0645\u064A\u0632\u0627\u0646\u064A\u0629 \u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0627\u0644\u064A\u0648\u0645\u064A\u0629.","\u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0627\u0644\u062A\u0644\u0642\u0627\u0626\u064A \u0645\u0641\u0639\u0651\u0644.","\u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0627\u0644\u062A\u0644\u0642\u0627\u0626\u064A \u0645\u0639\u0637\u0651\u0644.","\u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u0628\u0646\u0627\u0621 \u0627\u0644\u0641\u0647\u0631\u0633 \u0627\u0644\u062F\u0644\u0627\u0644\u064A\u2026","\u062A\u0648\u0642\u0641 \u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0639\u0646\u062F \u0627\u0644\u0645\u064A\u0632\u0627\u0646\u064A\u0629 (\u0644\u0645 \u062A\u064F\u0631\u0633\u0644 {blocked} \u0633\u062C\u0644\u0627\u062A).","\u0627\u0644\u0641\u0647\u0631\u0633\u0629: \u062C\u062F\u064A\u062F +{added} \xB7 \u0645\u062A\u062E\u0637\u0649 {skipped} \xB7 \u0623\u062E\u0637\u0627\u0621 {errors} \xB7 \u0627\u0644\u0625\u062C\u0645\u0627\u0644\u064A {total}{trimmed}.","\u0641\u0634\u0644 \u0627\u0644\u062A\u0636\u0645\u064A\u0646.","\u062A\u0645 \u0645\u0633\u062D \u0627\u0644\u0641\u0647\u0631\u0633 \u0627\u0644\u062F\u0644\u0627\u0644\u064A.","\u062A\u0639\u0630\u0651\u0631 \u0645\u0633\u062D \u0627\u0644\u0641\u0647\u0631\u0633 \u0627\u0644\u062F\u0644\u0627\u0644\u064A.","\u062A\u0645 \u0645\u0633\u062D \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0648\u0627\u0644\u062A\u0636\u0645\u064A\u0646.","\u062A\u0639\u0630\u0631 \u0645\u0633\u062D \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0648\u0627\u0644\u062A\u0636\u0645\u064A\u0646.","\u062A\u0645\u062A \u0625\u0639\u0627\u062F\u0629 \u0636\u0628\u0637 \u0627\u0644\u062A\u0641\u0636\u064A\u0644\u0627\u062A. \u0648\u0636\u0639 \u0628\u0644\u0627 \u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0645\u0641\u0639\u0651\u0644.","\u062A\u0639\u0630\u0651\u0631\u062A \u0625\u0639\u0627\u062F\u0629 \u0636\u0628\u0637 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A.","\u062A\u0645 \u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A.","\u062A\u0639\u0630\u0651\u0631 \u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A.","\u062A\u0645 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A. {warning}","\u0641\u0634\u0644 \u0627\u0644\u0627\u0633\u062A\u064A\u0631\u0627\u062F: {errors}","\u062A\u0639\u0630\u0651\u0631 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A.","\u062A\u0645 \u062A\u0646\u0632\u064A\u0644 \u0646\u0633\u062E\u0629 \u0627\u0644\u0645\u0643\u062A\u0628\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629: {filename} ({collections} \u0645\u062C\u0645\u0648\u0639\u0627\u062A\u060C {bytes}).","\u062A\u0639\u0630\u0631 \u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0646\u0633\u062E\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629 \u0627\u0644\u0643\u0627\u0645\u0644\u0629 \u0644\u0644\u0645\u0643\u062A\u0628\u0629.","\u062A\u0645 \u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0646\u0633\u062E\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629 \u0645\u0639 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0627\u0639\u062A\u0645\u0627\u062F: {filename} ({collections} \u0645\u062C\u0645\u0648\u0639\u0627\u062A\u060C {bytes}).","\u062C\u0627\u0631\u064D \u0642\u0631\u0627\u0621\u0629 \u0646\u0633\u062E\u0629 \u0627\u0644\u0645\u0643\u062A\u0628\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629\u2026","\u062A\u0645 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0646\u0633\u062E\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629: {collections} \u0645\u062C\u0645\u0648\u0639\u0627\u062A\u060C {conflicts} \u062A\u063A\u064A\u064A\u0631\u0627\u062A.","\u062A\u0639\u0630\u0631\u062A \u0642\u0631\u0627\u0621\u0629 \u0646\u0633\u062E\u0629 \u0627\u0644\u0645\u0643\u062A\u0628\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629.","\u062C\u0627\u0631\u064D \u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u0627\u0633\u062A\u0631\u062C\u0627\u0639\u2026","\u0627\u0643\u062A\u0645\u0644\u062A \u0627\u0644\u0645\u062D\u0627\u0643\u0627\u0629. \u0644\u0645 \u062A\u062A\u063A\u064A\u0631 \u0623\u064A \u0628\u064A\u0627\u0646\u0627\u062A \u0645\u062D\u0644\u064A\u0629.","\u0641\u0634\u0644\u062A \u0627\u0644\u0645\u062D\u0627\u0643\u0627\u0629: {errors}","\u062A\u0639\u0630\u0631\u062A \u0645\u062D\u0627\u0643\u0627\u0629 \u0627\u0633\u062A\u0631\u062C\u0627\u0639 \u0627\u0644\u0645\u0643\u062A\u0628\u0629.","\u062A\u0645 \u0627\u0633\u062A\u0631\u062C\u0627\u0639 \u0646\u0633\u062E\u0629 \u0627\u0644\u0645\u0643\u062A\u0628\u0629 ({collections} \u0645\u062C\u0645\u0648\u0639\u0627\u062A). \u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u2026","\u0623\u064F\u0644\u063A\u064A \u0627\u0644\u0627\u0633\u062A\u0631\u062C\u0627\u0639\u061B \u062A\u0645\u062A \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A\u0629 \u0625\u0644\u0649 \u062D\u0627\u0644\u062A\u0647\u0627 \u0627\u0644\u0633\u0627\u0628\u0642\u0629.","\u0623\u064F\u0644\u063A\u064A \u0627\u0644\u0627\u0633\u062A\u0631\u062C\u0627\u0639.","\u0641\u0634\u0644 \u0627\u0644\u0627\u0633\u062A\u0631\u062C\u0627\u0639: {errors}","\u062A\u0639\u0630\u0631 \u0627\u0633\u062A\u0631\u062C\u0627\u0639 \u0646\u0633\u062E\u0629 \u0627\u0644\u0645\u0643\u062A\u0628\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629.","\u0633\u062C\u0644 \u0627\u0644\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0645\u0641\u0639\u0651\u0644.","\u0633\u062C\u0644 \u0627\u0644\u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u0645\u0633\u062D \u0633\u062C\u0644 \u0627\u0644\u062A\u062F\u0642\u064A\u0642.","\u062A\u0639\u0630\u0651\u0631 \u0645\u0633\u062D \u0633\u062C\u0644 \u0627\u0644\u062A\u062F\u0642\u064A\u0642.","\u062A\u0645 \u0627\u0644\u062A\u0642\u0627\u0637 {count} \u0645\u0646 \u0645\u062A\u0627\u0628\u0639\u064A @{handle}. \u0643\u0627\u0646\u062A \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0642\u062F \u0627\u0646\u062A\u0647\u062A \u0645\u0646 \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u060C \u0641\u0647\u0624\u0644\u0627\u0621 \u062C\u0645\u064A\u0639\u0647\u0645.","\u062A\u0645 \u0627\u0644\u062A\u0642\u0627\u0637 {count} \u0645\u0646 \u0645\u062A\u0627\u0628\u0639\u064A @{handle}. \u0643\u0627\u0646\u062A \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0644\u0627 \u062A\u0632\u0627\u0644 \u0642\u064A\u062F \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u060C \u0641\u0647\u0630\u0627 \u0641\u0642\u0637 \u0645\u0627 \u0643\u0627\u0646 \u0638\u0627\u0647\u0631\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629. \u0645\u0631\u0650\u0651\u0631 \u062D\u062A\u0649 \u0627\u0644\u0646\u0647\u0627\u064A\u0629 \u062B\u0645 \u0627\u0644\u062A\u0642\u0637 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0644\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0643\u0627\u0645\u0644\u0629.","\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u0635\u0641\u0648\u0641 UserCell.","\u0641\u0634\u0644\u062A \u0627\u0644\u0644\u0642\u0637\u0629.","\u062A\u0645 \u0627\u0644\u062A\u0642\u0627\u0637 {count} \u0645\u0646 \u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A \u0627\u0644\u062A\u064A \u064A\u062A\u0627\u0628\u0639\u0647\u0627 @{handle}. \u0643\u0627\u0646\u062A \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0642\u062F \u0627\u0646\u062A\u0647\u062A \u0645\u0646 \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u060C \u0641\u0647\u0630\u0647 \u062C\u0645\u064A\u0639\u0647\u0627.","\u062A\u0645 \u0627\u0644\u062A\u0642\u0627\u0637 {count} \u0645\u0646 \u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A \u0627\u0644\u062A\u064A \u064A\u062A\u0627\u0628\u0639\u0647\u0627 @{handle}. \u0643\u0627\u0646\u062A \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0644\u0627 \u062A\u0632\u0627\u0644 \u0642\u064A\u062F \u0627\u0644\u062A\u062D\u0645\u064A\u0644\u060C \u0641\u0647\u0630\u0627 \u0641\u0642\u0637 \u0645\u0627 \u0643\u0627\u0646 \u0638\u0627\u0647\u0631\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629. \u0645\u0631\u0650\u0651\u0631 \u062D\u062A\u0649 \u0627\u0644\u0646\u0647\u0627\u064A\u0629 \u062B\u0645 \u0627\u0644\u062A\u0642\u0637 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0644\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0643\u0627\u0645\u0644\u0629.","\u062A\u0645 \u0645\u0633\u062D \u0627\u0644\u0644\u0642\u0637\u0627\u062A.","\u062A\u0639\u0630\u0651\u0631 \u0645\u0633\u062D \u0627\u0644\u0644\u0642\u0637\u0627\u062A.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0623\u0631\u0634\u064A\u0641 \u0645\u0624\u0642\u062A\u0627\u064B.","\u062A\u0645 \u0627\u0633\u062A\u0626\u0646\u0627\u0641 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0623\u0631\u0634\u064A\u0641.","\u062A\u0645 \u0625\u0644\u063A\u0627\u0621 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0623\u0631\u0634\u064A\u0641.","\u0628\u062F\u0623\u062A \u0625\u0639\u0627\u062F\u0629 \u0645\u062D\u0627\u0648\u0644\u0629 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0623\u0631\u0634\u064A\u0641.","\u062C\u0627\u0631\u064D \u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0623\u0631\u0634\u064A\u0641\u060C \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0643\u0628\u064A\u0631\u0629 \u062A\u0633\u062A\u063A\u0631\u0642 \u0644\u062D\u0638\u0629\u2026","\u062A\u0645\u062A \u0642\u0631\u0627\u0621\u0629 \u0623\u0631\u0634\u064A\u0641 \u0645\u0646 \u0646\u0648\u0639 {layout}. \u0627\u0633\u062A\u064F\u0648\u0631\u062F {records} \u0633\u062C\u0644\u064B\u0627. \u0627\u0644\u0625\u0635\u0644\u0627\u062D\u0627\u062A: {archiveLinks} \u0631\u0627\u0628\u0637\u064B\u0627 \u0645\u0646 \u0627\u0644\u0623\u0631\u0634\u064A\u0641\u060C \u0648{corpusLinks} \u0631\u0627\u0628\u0637\u064B\u0627 \u0645\u0644\u062A\u0642\u064E\u0637\u064B\u0627\u060C \u0648\u062D\u064F\u0644\u0651 {participants} \u0645\u0639\u0631\u0651\u0641 \u0645\u0634\u0627\u0631\u0643\u060C \u0648\u0628\u0642\u064A {unresolved} \u062F\u0648\u0646 \u062D\u0644. \u0627\u0644\u062A\u062D\u0630\u064A\u0631\u0627\u062A: {warnings}\u061B \u0627\u0644\u0623\u062E\u0637\u0627\u0621: {errors}. \u0627\u0644\u0645\u0644\u0641\u0627\u062A: {recognized} \u0645\u0639\u0631\u0648\u0641\u0629\u060C \u0648{skipped} \u0645\u062A\u062C\u0627\u0648\u064E\u0632\u0629\u060C \u0648{malformed} \u062A\u0627\u0644\u0641\u0629.{absent}","\u0641\u0634\u0644 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0623\u0631\u0634\u064A\u0641.","\u062C\u0627\u0631\u064D \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u062A\u0642\u0631\u064A\u0631\u2026","\u062A\u0645 \u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u062A\u0642\u0631\u064A\u0631.","\u062A\u0639\u0630\u0651\u0631 \u0625\u0646\u0634\u0627\u0621 \u0627\u0644\u062A\u0642\u0631\u064A\u0631.","\u062C\u0627\u0631\u064D \u0625\u0646\u0634\u0627\u0621 \u0645\u0639\u0627\u064A\u0646\u0629 \u0627\u0644\u062A\u0646\u0638\u064A\u0641\u2026","\u0623\u064F\u0636\u064A\u0641\u062A {added} \u0645\u0646 \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0625\u0644\u0649 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631 (\u062A\u0645 \u062A\u062E\u0637\u064A {protected} \u0645\u062D\u0645\u064A\u0629).","\u062A\u0639\u0630\u0651\u0631 \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u062A\u0646\u0638\u064A\u0641 \u0625\u0644\u0649 \u0627\u0644\u0642\u0627\u0626\u0645\u0629.","\u062A\u0645 \u0625\u0641\u0631\u0627\u063A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u062A\u0646\u0638\u064A\u0641.","\u062A\u0639\u0630\u0651\u0631 \u0625\u0641\u0631\u0627\u063A \u0627\u0644\u0642\u0627\u0626\u0645\u0629.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u062A\u0646\u0628\u064A\u0647 \u062D\u062F \u0627\u0644\u062A\u062E\u0632\u064A\u0646.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0646\u0628\u064A\u0647 \u062D\u062F \u0627\u0644\u062A\u062E\u0632\u064A\u0646.","\u062A\u062D\u062A\u0641\u0638 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0645\u0644\u062A\u0642\u064E\u0637\u0629 \u0628\u062D\u062C\u0645\u0647\u0627 \u0627\u0644\u0623\u0635\u0644\u064A.","\u0633\u062A\u064F\u0635\u063A\u064E\u0651\u0631 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0645\u0644\u062A\u0642\u064E\u0637\u0629.","\u0633\u062A\u064F\u0644\u062A\u0642\u064E\u0637 \u0645\u0642\u0627\u0637\u0639 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0643\u0635\u0648\u0631 \u062B\u0627\u0628\u062A\u0629.","\u0633\u062A\u064F\u0644\u062A\u0642\u064E\u0637 \u0645\u0642\u0627\u0637\u0639 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0643\u0627\u0645\u0644\u0629.","\u062C\u0627\u0631\u064D \u0642\u0631\u0627\u0621\u0629 \u062A\u0642\u0631\u064A\u0631 \u0645\u0627 \u0648\u0631\u0627\u0621 \u0627\u0644\u0643\u0648\u0627\u0644\u064A\u0633\u2026","\u062A\u0639\u0630\u0631\u062A \u0642\u0631\u0627\u0621\u0629 \u062A\u0642\u0631\u064A\u0631 \u0645\u0627 \u0648\u0631\u0627\u0621 \u0627\u0644\u0643\u0648\u0627\u0644\u064A\u0633.","\u062A\u0639\u0630\u0631 \u062A\u0635\u062F\u064A\u0631 \u062A\u0642\u0627\u0631\u064A\u0631 \u0645\u0627 \u0648\u0631\u0627\u0621 \u0627\u0644\u0643\u0648\u0627\u0644\u064A\u0633.","\u062C\u0627\u0631\u064D \u062A\u0646\u0632\u064A\u0644 {count} \u0645\u0644\u0641\u064B\u0627 \u0645\u062D\u062F\u064E\u0651\u062F\u064B\u0627.","\u062A\u0639\u0630\u0631 \u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629.","\u0641\u0634\u0644 \u0627\u0644\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0645\u0643\u062A\u0628\u0629. \u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0646\u0642\u0637\u0629 \u0646\u0647\u0627\u064A\u0629 \u0627\u0644\u062A\u0636\u0645\u064A\u0646 \u0648\u0627\u0644\u0645\u0641\u062A\u0627\u062D \u0641\u064A \u0627\u0644\u062A\u0643\u0627\u0645\u0644\u0627\u062A.","\u062A\u0645 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0625\u0634\u0627\u0631\u0629 \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629.","\u062A\u0639\u0630\u0631 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0625\u0634\u0627\u0631\u0629 \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629.","\u062A\u0645\u062A \u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0625\u0634\u0627\u0631\u0629 \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629.","\u062A\u0645\u062A \u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0625\u0634\u0627\u0631\u0629 \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0645\u0633\u0628\u0642\u064B\u0627.","\u062A\u0639\u0630\u0631\u062A \u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0625\u0634\u0627\u0631\u0629 \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629.","\u062A\u0645 \u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629: {records} \u0633\u062C\u0644\u064B\u0627 \u0641\u064A {files} \u0645\u0644\u0641\u0627\u062A.","\u062A\u0639\u0630\u0651\u0631 \u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629.","\u062A\u0645 \u0645\u0633\u062D \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629.","\u062A\u0639\u0630\u0631 \u0645\u0633\u062D \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629.","\u062A\u0645 \u062A\u0641\u0639\u064A\u0644 \u0632\u0631 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0632\u0631 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A.","\u062A\u0648\u0633\u064A\u0639 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0645\u0641\u0639\u0651\u0644.","\u062A\u0648\u0633\u064A\u0639 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0645\u0639\u0637\u0651\u0644.","\u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0645\u0641\u0639\u0651\u0644.","\u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0645\u0639\u0637\u0651\u0644.","\u0632\u0631 \u0646\u0633\u062E \u0627\u0644\u0631\u0627\u0628\u0637 \u0645\u0639\u0637\u064E\u0651\u0644.","\u0632\u0631 \u0646\u0633\u062E \u0627\u0644\u0631\u0627\u0628\u0637 \u0645\u0641\u0639\u064E\u0651\u0644.","\u062A\u0645 \u062D\u0641\u0638 \u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A.","\u062A\u0645 \u0645\u0633\u062D \u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A.","\u062A\u0639\u0630\u0651\u0631 \u0645\u0633\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A.","\u0627\u0644\u062A\u0642\u0627\u0637 \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0645\u0641\u0639\u0651\u0644.","\u0627\u0644\u062A\u0642\u0627\u0637 \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0627\u062A \u0627\u0644\u062E\u0627\u0645.","\u0627\u0644\u062A\u0642\u0627\u0637 \u0648\u062D\u062F\u0627\u062A \u0628\u0627\u064A\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0645\u0641\u0639\u0651\u0644.","\u0627\u0644\u062A\u0642\u0627\u0637 \u0648\u062D\u062F\u0627\u062A \u0628\u0627\u064A\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0645\u062A\u0648\u0642\u0641.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0643\u062A\u0634\u0627\u0641 \u0627\u0644\u0627\u0633\u062A\u0639\u0644\u0627\u0645\u0627\u062A.","\u062A\u0645 \u062A\u0641\u0639\u064A\u0644 \u0645\u0634\u0627\u0631\u0643\u0629 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0645\u064A\u0629.","\u062A\u0645 \u0627\u0633\u062A\u0628\u0639\u0627\u062F \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0645\u064A\u0629 \u0645\u0646 \u0635\u0627\u062F\u0631\u0627\u062A \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629.","\u062A\u0645 \u062A\u0641\u0639\u064A\u0644 \u0645\u0634\u0627\u0631\u0643\u0629 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0630\u0627\u062A \u0627\u0644\u062C\u0645\u0647\u0648\u0631 \u063A\u064A\u0631 \u0627\u0644\u0645\u0639\u0631\u0648\u0641.","\u062A\u0645 \u0627\u0633\u062A\u0628\u0639\u0627\u062F \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0630\u0627\u062A \u0627\u0644\u062C\u0645\u0647\u0648\u0631 \u063A\u064A\u0631 \u0627\u0644\u0645\u0639\u0631\u0648\u0641 \u0645\u0646 \u0635\u0627\u062F\u0631\u0627\u062A \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629.","\u062A\u0645 \u062D\u0641\u0638 \u0645\u062C\u0644\u062F \u0627\u0644\u062D\u0641\u0638.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0645\u0647\u0645\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0645\u0624\u0642\u062A\u0627\u064B.","\u062A\u0645 \u0627\u0633\u062A\u0626\u0646\u0627\u0641 \u0645\u0647\u0645\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631.","\u062A\u0645 \u0625\u0644\u063A\u0627\u0621 \u0645\u0647\u0645\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631.","\u062C\u0627\u0631\u064D \u062C\u0645\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0638\u0627\u0647\u0631\u0629\u2026","\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0639\u0631\u0636. \u0645\u0631\u0651\u0631 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \u0644\u062A\u062D\u0645\u064A\u0644 \u0628\u0639\u0636\u0647\u0627 \u062B\u0645 \u0635\u062F\u0651\u0631 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.","\u062A\u0645 \u062A\u0635\u062F\u064A\u0631 {records} \u0645\u0646 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0641\u064A {files} \u0645\u0646 \u0645\u0644\u0641\u0627\u062A ZIP \u2190 {filename}","\u062A\u0645 \u062A\u0635\u062F\u064A\u0631 \u0633\u062C\u0644 \u0648\u0627\u062D\u062F ({records}) \u2190 {filename}","\u062A\u0645 \u062A\u0635\u062F\u064A\u0631 {records} \u0645\u0646 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u2190 {filename}","\u0641\u0634\u0644 \u0627\u0644\u062A\u0635\u062F\u064A\u0631. \u0631\u0627\u062C\u0639 \u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u062A\u0634\u062E\u064A\u0635.","\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0645\u0644\u062A\u0642\u0637\u0629 \u0628\u0628\u064A\u0627\u0646\u0627\u062A \u0633\u0644\u0633\u0644\u0629 \u062D\u062A\u0649 \u0627\u0644\u0622\u0646.","\u062A\u0645 \u062A\u0635\u062F\u064A\u0631 \u0642\u0627\u0631\u0626 \u0627\u0644\u0633\u0644\u0627\u0633\u0644 \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629.","\u062A\u0639\u0630\u0631\u062A \u0625\u0639\u0627\u062F\u0629 \u0628\u0646\u0627\u0621 \u0627\u0644\u0633\u0644\u0627\u0633\u0644. \u0631\u0627\u062C\u0639 \u0627\u0644\u062A\u0634\u062E\u064A\u0635.","\u062A\u0639\u0630\u0651\u0631 \u0646\u0633\u062E \u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u062A\u0634\u062E\u064A\u0635.","\u062A\u0645 \u0646\u0633\u062E {records} \u0645\u0646 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629.","\u062A\u0645 \u062A\u0635\u062F\u064A\u0631 {records} \u0645\u0646 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0625\u0644\u0649 {target}.","\u0641\u0634\u0644 \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u062E\u0627\u0631\u062C\u064A.","\u062A\u0645 \u062D\u0641\u0638 \u0639\u062F\u062F \u0627\u0644\u0633\u062C\u0644\u0627\u062A \u0644\u0643\u0644 ZIP.","\u062A\u0645 \u062D\u0641\u0638 \u0645\u062F\u0629 \u0627\u0644\u0627\u062D\u062A\u0641\u0627\u0638 \u0628\u0645\u0647\u0627\u0645 \u0627\u0644\u062A\u0635\u062F\u064A\u0631.","\u062A\u0645 \u062D\u0641\u0638 \u0645\u062F\u0629 \u0627\u0644\u0627\u062D\u062A\u0641\u0627\u0638 \u0628\u0627\u0644\u0633\u062C\u0644\u0627\u062A.","\u062A\u0645 \u062D\u0641\u0638 \u0627\u0644\u0627\u062D\u062A\u0641\u0627\u0638 \u062D\u0633\u0628 \u0627\u0644\u0639\u0645\u0631.","\u062A\u0645 \u062A\u0646\u0632\u064A\u0644 WARC ({records} \u0645\u0646 \u0627\u0644\u0633\u062C\u0644\u0627\u062A).","\u0641\u0634\u0644 \u062A\u0635\u062F\u064A\u0631 WARC.","\u062A\u0645 \u062A\u0646\u0632\u064A\u0644 WACZ ({records} \u0645\u0646 \u0627\u0644\u0633\u062C\u0644\u0627\u062A\u060C {size}).","\u0641\u0634\u0644 \u062A\u0635\u062F\u064A\u0631 WACZ. \u0623\u0641\u0631\u0650\u063A \u0628\u0639\u0636 \u0645\u0633\u0627\u062D\u0629 \u0627\u0644\u0642\u0631\u0635 \u0623\u0648 \u0635\u062F\u0650\u0651\u0631 \u0633\u062C\u0644\u0627\u062A \u0623\u0642\u0644 \u062B\u0645 \u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.","\u062A\u0645 \u0627\u0633\u062A\u0628\u062F\u0627\u0644 \u0647\u0648\u064A\u0629 \u0627\u0644\u062A\u0648\u0642\u064A\u0639.","\u062A\u0639\u0630\u0631 \u0627\u0633\u062A\u0628\u062F\u0627\u0644 \u0647\u0648\u064A\u0629 \u0627\u0644\u062A\u0648\u0642\u064A\u0639.","\u062A\u0645 \u062A\u0646\u0632\u064A\u0644 \u0625\u062B\u0628\u0627\u062A WACZ \u0627\u0644\u062E\u0627\u0635 \u0628\u0640 Aviary ({records} \u0633\u062C\u0644\u0627\u062A\u060C {size}).","\u0641\u0634\u0644 \u062A\u0635\u062F\u064A\u0631 \u0625\u062B\u0628\u0627\u062A WACZ \u0627\u0644\u062E\u0627\u0635 \u0628\u0640 Aviary.","\u062A\u0645 \u062A\u0646\u0632\u064A\u0644 \u0632\u0648\u062C \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u062A\u0648\u0642\u064A\u0639: {filename}.","\u0641\u0634\u0644 \u062A\u0635\u062F\u064A\u0631 \u0632\u0648\u062C \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u062A\u0648\u0642\u064A\u0639.","\u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0645\u0641\u0639\u0651\u0644\u0629.","\u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0645\u0639\u0637\u0651\u0644\u0629.","\u062A\u0645 \u062A\u0634\u063A\u064A\u0644 \u0646\u0633\u062E \u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0646\u0633\u062E \u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u062C\u0648\u062F\u0629 \u0627\u0644\u0623\u0635\u0644\u064A\u0629.","\u0627\u0644\u0635\u0648\u0631 \u0628\u0627\u0644\u062D\u062C\u0645 \u0627\u0644\u0643\u0627\u0645\u0644 \u0645\u0641\u0639\u0651\u0644\u0629.","\u0627\u0644\u0635\u0648\u0631 \u0628\u0627\u0644\u062D\u062C\u0645 \u0627\u0644\u0643\u0627\u0645\u0644 \u0645\u0639\u0637\u0651\u0644\u0629.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u062E\u0637\u064A\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637.","\u062A\u0645 \u062D\u0641\u0638 \u0642\u0627\u0644\u0628 \u0627\u0633\u0645 \u0627\u0644\u0645\u0644\u0641.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0645\u0631\u0627\u0641\u0642.","\u062A\u0645 \u062A\u0634\u063A\u064A\u0644 \u0645\u0637\u0627\u0628\u0642\u0629 \u0627\u0644\u062A\u0643\u0631\u0627\u0631 \u0627\u0644\u0628\u0635\u0631\u064A.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0645\u0637\u0627\u0628\u0642\u0629 \u0627\u0644\u062A\u0643\u0631\u0627\u0631 \u0627\u0644\u0628\u0635\u0631\u064A.","\u0633\u062C\u0644 \u0627\u0644\u062A\u0643\u0631\u0627\u0631\u0627\u062A \u0645\u0641\u0639\u0651\u0644.","\u0633\u062C\u0644 \u0627\u0644\u062A\u0643\u0631\u0627\u0631\u0627\u062A \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u062D\u0641\u0638 \u062D\u062F \u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0627\u0644\u0645\u062A\u0632\u0627\u0645\u0646\u0629.","\u062A\u0645 \u062D\u0641\u0638 \u0648\u062A\u064A\u0631\u0629 \u0627\u0644\u062A\u0646\u0632\u064A\u0644.","\u062C\u0627\u0631\u064D \u062A\u0646\u0632\u064A\u0644 \u0648\u0633\u0627\u0626\u0637 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629\u2026","\u0641\u0634\u0644 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u062C\u0645\u0627\u0639\u064A.","\u062A\u0645 \u0645\u0633\u062D \u0627\u0644\u0633\u062C\u0644.","\u062A\u0639\u0630\u0651\u0631 \u0645\u0633\u062D \u0627\u0644\u0633\u062C\u0644.","\u062A\u0645 \u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0633\u062C\u0644: {records} \u0633\u062C\u0644\u0627\u062A \u0641\u064A {files} \u0645\u0644\u0641\u0627\u062A.","\u062A\u0639\u0630\u0631 \u062A\u0635\u062F\u064A\u0631 \u0633\u062C\u0644 \u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A.","\u0627\u0643\u062A\u0645\u0644 \u062D\u0641\u0638 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629: {downloaded} \u0645\u062D\u0641\u0648\u0638\u0629 / {duplicate} \u0645\u0643\u0631\u0631\u0629 / {failed} \u0641\u0627\u0634\u0644\u0629.","\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u0647\u0627\u0645 \u0648\u0633\u0627\u0626\u0637 \u0641\u0627\u0634\u0644\u0629 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.","\u062A\u0645 \u062A\u0637\u0628\u064A\u0642 \u0627\u0644\u0625\u0639\u062F\u0627\u062F \u0627\u0644\u0645\u0633\u0628\u0642: {preset} ({changes})","\u0627\u0644\u0625\u0639\u062F\u0627\u062F \u0627\u0644\u0645\u0633\u0628\u0642 \u0645\u0637\u0628\u0651\u0642 \u0628\u0627\u0644\u0641\u0639\u0644: {preset}","\u062A\u0639\u0630\u0651\u0631 \u062A\u0637\u0628\u064A\u0642 \u0627\u0644\u0625\u0639\u062F\u0627\u062F \u0627\u0644\u062C\u0627\u0647\u0632.","\u0647\u0630\u0627 \u0627\u0644\u0645\u0638\u0647\u0631 \u063A\u064A\u0631 \u0645\u062F\u0639\u0648\u0645.","\u062A\u0645 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0645\u0638\u0647\u0631.","\u062A\u0645 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0643\u062B\u0627\u0641\u0629.","\u062A\u0645 \u062A\u062D\u062F\u064A\u062B \u0639\u0631\u0636 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A.","\u062E\u0637 Chirp \u0645\u0641\u0639\u0651\u0644.","\u062E\u0637 Chirp \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u0625\u062E\u0641\u0627\u0621 \u0623\u0639\u062F\u0627\u062F \u0627\u0644\u062A\u0641\u0627\u0639\u0644.","\u062A\u0645 \u0625\u0638\u0647\u0627\u0631 \u0623\u0639\u062F\u0627\u062F \u0627\u0644\u062A\u0641\u0627\u0639\u0644.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u0623\u0639\u062F\u0627\u062F.","\u062A\u0645 \u0625\u062E\u0641\u0627\u0621 \u0639\u062F\u0651\u0627\u062F \u0627\u0644\u062A\u0628\u0648\u064A\u0628.","\u062A\u0645 \u0625\u0638\u0647\u0627\u0631 \u0639\u062F\u0651\u0627\u062F \u0627\u0644\u062A\u0628\u0648\u064A\u0628.","\u062A\u0645 \u062A\u0641\u0639\u064A\u0644 \u0627\u0644\u0637\u0648\u0627\u0628\u0639 \u0627\u0644\u0632\u0645\u0646\u064A\u0629 \u0627\u0644\u0645\u0637\u0644\u0642\u0629.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0637\u0648\u0627\u0628\u0639 \u0627\u0644\u0632\u0645\u0646\u064A\u0629 \u0627\u0644\u0645\u0637\u0644\u0642\u0629.","\u062A\u0645 \u062A\u0641\u0639\u064A\u0644 \u0623\u064A\u0642\u0648\u0646\u0629 \u062A\u0628\u0648\u064A\u0628 Aviary.","\u062A\u0645\u062A \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0623\u064A\u0642\u0648\u0646\u0629 \u062A\u0628\u0648\u064A\u0628 X.","\u062A\u0645 \u0625\u062E\u0641\u0627\u0621 \u062D\u062F\u0648\u062F \u0627\u0644\u0635\u0641\u0648\u0641.","\u062A\u0645\u062A \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u062D\u062F\u0648\u062F \u0627\u0644\u0635\u0641\u0648\u0641.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u062A\u0628\u0627\u064A\u0646.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u062D\u0631\u0643\u0629.","\u0648\u0636\u0639 \u0628\u0644\u0627 \u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0645\u0641\u0639\u0651\u0644.","\u0648\u0636\u0639 \u0628\u0644\u0627 \u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0645\u062A\u0648\u0642\u0641.","\u062A\u0645 \u0631\u0641\u0636 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A.","\u062A\u0645 \u0627\u0644\u0633\u0645\u0627\u062D \u0628\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u062A\u0631\u0646\u062F\u0627\u062A.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u062A\u062E\u0637\u064A\u0637.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 Grok.","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0641\u0636\u064A\u0644 \u0627\u0644\u062A\u0645\u0631\u064A\u0631.","\u062A\u0645 \u062A\u0641\u0639\u064A\u0644 \u0648\u0636\u0639 \u0627\u0644\u062A\u0631\u0643\u064A\u0632.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0648\u0636\u0639 \u0627\u0644\u062A\u0631\u0643\u064A\u0632.","\u062A\u0645 \u062D\u0641\u0638 \u0633\u0627\u0639\u0627\u062A \u0627\u0644\u0642\u0631\u0627\u0621\u0629.","\u064A\u0645\u0631\u0651 \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \u062F\u0648\u0646 \u062A\u0648\u0642\u0651\u0641.","\u064A\u062A\u0645 \u062A\u0648\u0633\u064A\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0637\u0648\u064A\u0644\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627.","\u062A\u0628\u0642\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0637\u0648\u064A\u0644\u0629 \u0645\u0637\u0648\u064A\u0629.","\u064A\u0639\u064A\u062F \u0627\u0644\u0631\u062C\u0648\u0639 \u0645\u0648\u0636\u0639\u0643 \u0627\u0644\u0633\u0627\u0628\u0642.","\u064A\u0633\u062A\u062E\u062F\u0645 \u0627\u0644\u0631\u062C\u0648\u0639 \u0645\u0648\u0636\u0639 X.","\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0645\u0641\u0639\u0644\u0629.","\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0645\u062A\u0648\u0642\u0641\u0629.","\u062A\u0645 \u062D\u0641\u0638 \u0623\u0633\u0637\u062D \u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u0642\u0631\u0627\u0621\u0629.","\u0648\u0636\u0639 \u0627\u0644\u0643\u062A\u0627\u0628\u0629 \u0645\u0641\u0639\u0651\u0644.","\u0648\u0636\u0639 \u0627\u0644\u0643\u062A\u0627\u0628\u0629 \u0645\u0639\u0637\u0651\u0644.","\u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \xAB\u0627\u0644\u0645\u062A\u0627\u0628\u064E\u0639\u0648\u0646\xBB \u0645\u0641\u0639\u0651\u0644.","\u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \xAB\u0627\u0644\u0645\u062A\u0627\u0628\u064E\u0639\u0648\u0646\xBB \u0645\u0639\u0637\u0651\u0644.","\u062A\u0645 \u0625\u062E\u0641\u0627\u0621 \u062A\u0628\u0648\u064A\u0628 \xAB\u0644\u0643\xBB.","\u062A\u0645\u062A \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u062A\u0628\u0648\u064A\u0628 \xAB\u0644\u0643\xBB.","\u062A\u064F\u0641\u062A\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0645\u0646 \u0623\u064A\u0642\u0648\u0646\u0629 \u0627\u0644\u0631\u062F.","\u062A\u064F\u0641\u062A\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0645\u0646 \u0627\u0644\u0635\u0641 \u0645\u062C\u062F\u062F\u064B\u0627.","\u062A\u0645 \u062D\u0641\u0638 \u0631\u0624\u064A\u0629 \u0627\u0644\u062A\u0646\u0642\u0644.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u062E\u0627\u0631\u062C \u0627\u0644\u0634\u0627\u0634\u0629 \u0645\u0624\u0642\u062A\u064B\u0627.","\u062A\u064F\u0631\u0643 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u062E\u0627\u0631\u062C \u0627\u0644\u0634\u0627\u0634\u0629 \u0642\u064A\u062F \u0627\u0644\u062A\u0634\u063A\u064A\u0644.","\u064A\u0633\u062A\u0645\u0631 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648.","\u064A\u062A\u0648\u0642\u0641 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0645\u0639 \u0627\u0644\u062A\u0628\u0648\u064A\u0628.","\u062A\u0645 \u062A\u0641\u0639\u064A\u0644 \u062A\u0643\u0631\u0627\u0631 \u0627\u0644\u0641\u064A\u062F\u064A\u0648.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u062A\u0643\u0631\u0627\u0631 \u0627\u0644\u0641\u064A\u062F\u064A\u0648.","\u062A\u0645 \u062A\u0641\u0639\u064A\u0644 \u062A\u062B\u0628\u064A\u062A \u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u062A\u0634\u063A\u064A\u0644.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u062A\u062B\u0628\u064A\u062A \u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u062A\u0634\u063A\u064A\u0644.","\u062A\u0645 \u062A\u0641\u0639\u064A\u0644 \u0639\u0648\u0627\u0645\u0644 \u0627\u0644\u062A\u0635\u0641\u064A\u0629.","\u062A\u0645 \u062A\u0639\u0637\u064A\u0644 \u0639\u0648\u0627\u0645\u0644 \u0627\u0644\u062A\u0635\u0641\u064A\u0629.","\u062A\u0645 \u062A\u0641\u0639\u064A\u0644 \u062A\u0639\u062A\u064A\u0645 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0648\u0621\u0629.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u062A\u0639\u062A\u064A\u0645 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0648\u0621\u0629.","\u062A\u0645 \u062D\u0641\u0638 \u0623\u0633\u0637\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0648\u0621\u0629.","\u062A\u0645 \u0646\u0633\u064A\u0627\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0648\u0621\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0645\u0633\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0648\u0621\u0629.","\u062A\u0645 \u062D\u0641\u0638 \u0642\u0648\u0627\u0639\u062F \u0627\u0644\u062A\u0635\u0641\u064A\u0629.","\u062A\u0645 \u062A\u062C\u062F\u064A\u062F {count} \u0642\u0627\u0639\u062F\u0629.","\u062A\u0645 \u062A\u062C\u062F\u064A\u062F {count} \u0642\u0627\u0639\u062F\u0629.","\u062A\u0639\u0630\u0651\u0631 \u062A\u062C\u062F\u064A\u062F \u0627\u0644\u0642\u0648\u0627\u0639\u062F \u0627\u0644\u0645\u0646\u062A\u0647\u064A\u0629.","\u062A\u0645 \u062D\u0641\u0638 \u0641\u0644\u062A\u0631 Premium.","\u062A\u0645 \u062D\u0641\u0638 \u0641\u0644\u062A\u0631 \u0627\u0644\u0627\u0642\u062A\u0628\u0627\u0633\u0627\u062A.","\u0623\u064F\u062E\u0641\u064A\u062A \u0627\u0644\u0631\u062F\u0648\u062F \u0630\u0627\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637.","\u0639\u0627\u062F\u062A \u0627\u0644\u0631\u062F\u0648\u062F \u0630\u0627\u062A \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0644\u0644\u0638\u0647\u0648\u0631.","\u062A\u0645 \u062D\u0641\u0638 \u0625\u0639\u062F\u0627\u062F \u0633\u0628\u0628 \u0627\u0644\u062A\u0635\u0641\u064A\u0629.","\u062A\u0645 \u062D\u0641\u0638 \u0641\u0644\u062A\u0631 \u0627\u0644\u062A\u0641\u0627\u0639\u0644.","\u062A\u0645 \u062D\u0641\u0638 \u0645\u0642\u064A\u0627\u0633 \u0627\u0644\u062A\u0641\u0627\u0639\u0644.","\u0639\u0648\u0627\u0645\u0644 \u0627\u0644\u062A\u0635\u0641\u064A\u0629 \u0645\u0639\u0637\u0651\u0644\u0629 \u0641\u064A \u0643\u0644 \u0627\u0644\u0645\u0633\u0627\u0631\u0627\u062A.","\u062A\u0645 \u062A\u0635\u062F\u064A\u0631 \u0645\u062C\u0645\u0648\u0639\u0629 \u0627\u0644\u0642\u0648\u0627\u0639\u062F: {filename} ({count} \u0633\u0637\u0631).","\u062A\u0639\u0630\u0631 \u062A\u0635\u062F\u064A\u0631 \u0645\u062C\u0645\u0648\u0639\u0629 \u0627\u0644\u0642\u0648\u0627\u0639\u062F.","\u062A\u062D\u062A\u0627\u062C \u0645\u062C\u0645\u0648\u0639\u0629 \u0627\u0644\u0642\u0648\u0627\u0639\u062F \u0625\u0644\u0649 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629.","\u0645\u0639\u0627\u064A\u0646\u0629 \u0645\u062C\u0645\u0648\u0639\u0629 \u0627\u0644\u0642\u0648\u0627\u0639\u062F \u062C\u0627\u0647\u0632\u0629.","\u062A\u0639\u0630\u0631\u062A \u0645\u0639\u0627\u064A\u0646\u0629 \u0645\u062C\u0645\u0648\u0639\u0629 \u0627\u0644\u0642\u0648\u0627\u0639\u062F.","\u062A\u0645\u062A \u0625\u0636\u0627\u0641\u0629 {count} \u0642\u0627\u0639\u062F\u0629.","\u062A\u0645 \u0627\u0633\u062A\u0628\u062F\u0627\u0644 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0628\u0640 {count} \u0642\u0627\u0639\u062F\u0629.","\u062A\u0639\u0630\u0631 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0645\u062C\u0645\u0648\u0639\u0629 \u0627\u0644\u0642\u0648\u0627\u0639\u062F.","\u062A\u0645 \u062A\u0637\u0628\u064A\u0642 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629.","\u062A\u0645 \u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629.","\u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u0625\u062E\u0641\u0627\u0621 \u0645\u0641\u0639\u0651\u0644\u0629.","\u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u0625\u062E\u0641\u0627\u0621 \u0645\u0639\u0637\u0651\u0644\u0629.","\u0627\u0644\u0625\u062E\u0641\u0627\u0621 \u0645\u0639\u0637\u0651\u0644 \u0641\u064A \u0643\u0644 \u0627\u0644\u0645\u0633\u0627\u0631\u0627\u062A.","\u0644\u0627 \u064A\u0648\u062C\u062F \u0634\u064A\u0621 \u0644\u0627\u0633\u062A\u0639\u0627\u062F\u062A\u0647.","\u062A\u0639\u0630\u0651\u0631 \u0627\u0644\u062A\u0631\u0627\u062C\u0639 \u0639\u0646 \u0622\u062E\u0631 \u0625\u062E\u0641\u0627\u0621.","\u062A\u0645\u062A \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u0646\u0634\u0648\u0631.","\u062A\u0645\u062A \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0645\u0646 \u0642\u0628\u0644.","\u062A\u0639\u0630\u0651\u0631\u062A \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u0646\u0634\u0648\u0631.","\u062A\u0645 \u0645\u0633\u062D \u0645\u0646\u0634\u0648\u0631 \u0645\u062E\u0641\u064A \u0648\u0627\u062D\u062F ({removed}).","\u062A\u0645 \u0645\u0633\u062D {removed} \u0645\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0645\u0633\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0625\u0633\u0646\u0627\u062F \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0642\u062F\u064A\u0645\u0629. \u0644\u0645 \u064A\u064F\u0646\u0642\u0644 \u0623\u064A \u0634\u064A\u0621\u060C \u0641\u0647\u064A \u0644\u0627 \u062A\u0632\u0627\u0644 \u0641\u064A \u0645\u0643\u0627\u0646\u0647\u0627. \u0623\u0639\u062F \u0641\u062A\u062D \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629 \u0644\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u0646 \u062C\u062F\u064A\u062F.","\u062A\u0639\u0630\u0651\u0631 \u0628\u062F\u0621 \u0627\u0644\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u0645\u064A\u0632\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0645\u0633\u062D \u0627\u0644\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u0645\u064A\u0632\u0629.","\u062A\u0639\u0630\u0651\u0631 \u062A\u0633\u062C\u064A\u0644 \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629. \u0627\u0644\u0628\u062D\u062B \u0644\u0627 \u064A\u0632\u0627\u0644 \u0643\u0645\u0627 \u0643\u0627\u0646\u060C \u0641\u0627\u0636\u063A\u0637 \u0627\u0644\u0632\u0631 \u0646\u0641\u0633\u0647 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.","\u062A\u0639\u0630\u0651\u0631 \u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u0645\u064A\u0632\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u0627\u0633\u062A\u0639\u0627\u062F\u0629. \u0633\u062A\u062A\u0648\u0642\u0641 \u0645\u0646 \u062A\u0644\u0642\u0627\u0621 \u0646\u0641\u0633\u0647\u0627 \u0639\u0646\u062F \u0627\u0646\u062A\u0647\u0627\u0621 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0645\u0624\u0642\u062A\u064B\u0627. \u0631\u0628\u0645\u0627 \u064A\u0643\u0648\u0646 \u0642\u062F \u0627\u0646\u062A\u0647\u0649 \u0628\u0627\u0644\u0641\u0639\u0644. \u0623\u0639\u062F \u0641\u062A\u062D \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645 \u0644\u062A\u0631\u0649 \u0625\u0644\u0649 \u0623\u064A\u0646 \u0648\u0635\u0644.","\u062A\u0639\u0630\u0651\u0631 \u0627\u0633\u062A\u0626\u0646\u0627\u0641 \u0627\u0644\u0627\u0633\u062A\u064A\u0631\u0627\u062F. \u0631\u0628\u0645\u0627 \u0645\u064F\u0633\u062D \u0645\u0635\u062F\u0631\u0647 \u0627\u0644\u0645\u062D\u0641\u0648\u0638. \u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0644\u0644\u0628\u062F\u0621 \u0645\u0646 \u0627\u0644\u0645\u0644\u0641 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.","\u062A\u0639\u0630\u0651\u0631 \u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u0627\u0633\u062A\u064A\u0631\u0627\u062F. \u0631\u0628\u0645\u0627 \u064A\u0643\u0648\u0646 \u0642\u062F \u0627\u0646\u062A\u0647\u0649 \u0628\u0627\u0644\u0641\u0639\u0644. \u0623\u0639\u062F \u0641\u062A\u062D \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645 \u0644\u062A\u0631\u0649 \u0625\u0644\u0649 \u0623\u064A\u0646 \u0648\u0635\u0644.","\u062A\u0639\u0630\u0651\u0631\u062A \u0625\u0639\u0627\u062F\u0629 \u0645\u062D\u0627\u0648\u0644\u0629 \u0627\u0644\u0627\u0633\u062A\u064A\u0631\u0627\u062F. \u0627\u062E\u062A\u0631 \u0645\u0644\u0641 \u0627\u0644\u0623\u0631\u0634\u064A\u0641 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0644\u0628\u062F\u0621 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u062C\u062F\u064A\u062F.","\u062A\u0639\u0630\u0651\u0631 \u0625\u064A\u0642\u0627\u0641 \u0645\u0647\u0645\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0645\u0624\u0642\u062A\u064B\u0627. \u0631\u0628\u0645\u0627 \u062A\u0643\u0648\u0646 \u0642\u062F \u0627\u0646\u062A\u0647\u062A \u0628\u0627\u0644\u0641\u0639\u0644. \u0623\u0639\u062F \u0641\u062A\u062D \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645 \u0644\u062A\u0631\u0649 \u062D\u0627\u0644\u062A\u0647\u0627 \u0627\u0644\u062D\u0627\u0644\u064A\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0627\u0633\u062A\u0626\u0646\u0627\u0641 \u0645\u0647\u0645\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631. \u0631\u0628\u0645\u0627 \u0645\u064F\u0633\u062D\u062A \u0646\u0642\u0637\u0629 \u0627\u0644\u062A\u062D\u0642\u0642 \u0627\u0644\u062E\u0627\u0635\u0629 \u0628\u0647\u0627. \u0627\u0628\u062F\u0623 \u062A\u0635\u062F\u064A\u0631\u064B\u0627 \u062C\u062F\u064A\u062F\u064B\u0627 \u0628\u062F\u0644\u064B\u0627 \u0645\u0646 \u0630\u0644\u0643.","\u062A\u0639\u0630\u0651\u0631 \u0625\u0644\u063A\u0627\u0621 \u0645\u0647\u0645\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631. \u0631\u0628\u0645\u0627 \u062A\u0643\u0648\u0646 \u0642\u062F \u0627\u0646\u062A\u0647\u062A \u0628\u0627\u0644\u0641\u0639\u0644. \u0623\u0639\u062F \u0641\u062A\u062D \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645 \u0644\u062A\u0631\u0649 \u062D\u0627\u0644\u062A\u0647\u0627 \u0627\u0644\u062D\u0627\u0644\u064A\u0629.","\u062A\u0639\u0630\u0651\u0631 \u062A\u0634\u063A\u064A\u0644 \u0647\u0630\u0647 \u0627\u0644\u062F\u0641\u0639\u0629. \u0627\u0645\u0646\u062D \u0625\u0630\u0646 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 \u0641\u064A \u0635\u0641\u062D\u0629 \u0623\u0630\u0648\u0646\u0627\u062A Aviary \u062B\u0645 \u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.","\u0644\u0645 \u062A\u0642\u0628\u0644 \u0627\u0644\u062F\u0641\u0639\u0629 \u0647\u0630\u0627 \u0627\u0644\u0623\u0645\u0631. \u0631\u0628\u0645\u0627 \u062A\u0643\u0648\u0646 \u0642\u062F \u0627\u0646\u062A\u0647\u062A \u0628\u0627\u0644\u0641\u0639\u0644. \u0623\u0639\u062F \u0641\u062A\u062D \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645 \u0644\u062A\u0631\u0649 \u062D\u0627\u0644\u062A\u0647\u0627 \u0627\u0644\u062D\u0627\u0644\u064A\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0627\u0633\u062A\u0626\u0646\u0627\u0641 \u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0627\u0644\u0645\u0646\u062A\u0638\u0631\u0629. \u0627\u0645\u0646\u062D \u0625\u0630\u0646 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 \u0641\u064A \u0635\u0641\u062D\u0629 \u0623\u0630\u0648\u0646\u0627\u062A Aviary \u062B\u0645 \u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.","\u062A\u0639\u0630\u0651\u0631\u062A \u0625\u0639\u0627\u062F\u0629 \u0645\u062D\u0627\u0648\u0644\u0629 \u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0627\u0644\u0641\u0627\u0634\u0644\u0629. \u0627\u0645\u0646\u062D \u0625\u0630\u0646 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 \u0641\u064A \u0635\u0641\u062D\u0629 \u0623\u0630\u0648\u0646\u0627\u062A Aviary \u062B\u0645 \u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0641\u062A\u062D \u0627\u0644\u0645\u0644\u062E\u0651\u0635. \u0644\u0645 \u064A\u064F\u0641\u0642\u062F \u0623\u064A \u0634\u064A\u0621\u060C \u0644\u0630\u0627 \u0623\u0639\u062F \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0635\u0641\u062D\u0629 \u062B\u0645 \u062D\u0627\u0648\u0644 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.","\u0644\u0627 \u064A\u0648\u062C\u062F \u0645\u0627 \u064A\u0637\u0627\u0628\u0642 \u0647\u0630\u0627 \u0627\u0644\u0628\u062D\u062B.","\u062C\u0631\u0651\u0628 \u0643\u0644\u0645\u0629 \u0623\u0642\u0635\u0631\u060C \u0623\u0648 \u0627\u062E\u062A\u0631 \u0642\u0633\u0645\u064B\u0627 \u0645\u0646 \u0627\u0644\u064A\u0645\u064A\u0646.","\u0645\u062D\u0641\u0648\u0638\u0629: \u0644\u0646 \u064A\u0645\u0633\u062D \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0647\u0630\u0647 \u0627\u0644\u0645\u0643\u062A\u0628\u0629 \u0644\u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u0633\u0627\u062D\u0629.","\u0623\u0641\u0636\u0644 \u062C\u0647\u062F: \u0642\u062F \u064A\u0645\u0633\u062D \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0647\u0630\u0647 \u0627\u0644\u0645\u0643\u062A\u0628\u0629 \u0639\u0646\u062F \u0627\u0646\u062E\u0641\u0627\u0636 \u0645\u0633\u0627\u062D\u0629 \u0627\u0644\u0642\u0631\u0635. \u0627\u062D\u062A\u0641\u0638 \u0628\u0646\u0633\u062E\u0629 \u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629.","\u0644\u0645 \u064A\u0648\u0636\u062D \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0633\u064A\u062D\u062A\u0641\u0638 \u0628\u0647\u0630\u0647 \u0627\u0644\u0645\u0643\u062A\u0628\u0629. \u0627\u062D\u062A\u0641\u0638 \u0628\u0646\u0633\u062E\u0629 \u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629.","\u0645\u062F\u064A\u0631 \u0633\u0643\u0631\u0628\u062A\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u0647\u0630\u0627 \u0644\u0627 \u064A\u0645\u0646\u062D Aviary \u0648\u0635\u0648\u0644\u0627\u064B \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0646\u0641\u0633\u0647\u0627.","\u0644\u0645 \u064A\u062D\u0645\u0651\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0633\u0643\u0631\u0628\u062A \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u062E\u0627\u0635 \u0628\u0640 Aviary.","\u0633\u0643\u0631\u0628\u062A \u0635\u0641\u062D\u0629 Aviary \u0645\u064F\u062D\u0645\u064E\u0651\u0644\u060C \u0644\u0643\u0646 \u0634\u064A\u0626\u064B\u0627 \u0622\u062E\u0631 \u0623\u062C\u0627\u0628 \u0623\u0648\u0644\u064B\u0627\u060C \u0639\u0644\u0649 \u0627\u0644\u0623\u0631\u062C\u062D \u0625\u0636\u0627\u0641\u0629 \u0623\u062E\u0631\u0649. \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629 \u0644\u0627 \u062A\u0643\u0648\u0646 \u0627\u0644\u062D\u0645\u0627\u064A\u0629 \u0645\u0646 \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0639\u0644\u0649 \u0645\u0633\u062A\u0648\u0649 \u0627\u0644\u0634\u0628\u0643\u0629 \u062A\u062D\u062A \u0633\u064A\u0637\u0631\u0629 Aviary.","\u063A\u064A\u0631 \u0645\u062A\u0627\u062D \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D.","\u062A\u0637\u0627\u0628\u0642\u0627\u062A \u0627\u0644\u0645\u062D\u062F\u062F\u0627\u062A","\u0627\u0644\u0623\u0633\u0637\u062D \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629 \u0645\u0641\u0642\u0648\u062F\u0629","\u0627\u0644\u0623\u0633\u0637\u062D \u0627\u0644\u0627\u062E\u062A\u064A\u0627\u0631\u064A\u0629 \u0645\u0641\u0642\u0648\u062F\u0629","\u0627\u0644\u0645\u062D\u062F\u062F\u0627\u062A \u0627\u0644\u0628\u062F\u064A\u0644\u0629 \u0642\u064A\u062F \u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645","\u0627\u0644\u0645\u064A\u0632\u0627\u062A \u0627\u0644\u0645\u062A\u0623\u062B\u0631\u0629","\u0622\u062E\u0631 \u0627\u0646\u062A\u0642\u0627\u0644 \u0644\u0644\u0645\u062D\u062F\u062F","\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A","\u0623\u0639\u062F\u0627\u062F \u0639\u0644\u0627\u0645\u0627\u062A \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A","\u0627\u0646\u062D\u0631\u0627\u0641 \u0639\u0642\u062F \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A","\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u062D\u062A\u0641\u0638 \u0628\u0647\u0627","\u0645\u062F\u0645\u062C","\u0631\u0627\u0626\u062C","\u062A\u0631\u0648\u064A\u062C \u062F\u0627\u062E\u0644\u064A","\u0641\u064A\u062F\u064A\u0648","\u0633\u062C\u0651\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0625\u0644\u0649 X \u0642\u0628\u0644 \u0627\u0644\u062A\u0634\u063A\u064A\u0644.","\u062D\u062F\u062F \u0646\u0648\u0639\u064B\u0627 \u0648\u0627\u062D\u062F\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644 \u0645\u0646 \u0627\u0644\u0646\u0634\u0627\u0637 \u0644\u062A\u0641\u0639\u064A\u0644 \u062A\u0634\u063A\u064A\u0644.","\u062C\u0627\u0631\u064D \u0628\u062F\u0621 \u0627\u0644\u062D\u0630\u0641\u2026","Long Animation Frame \u063A\u064A\u0631 \u0645\u062A\u0627\u062D","\u0644\u0627 \u062A\u0648\u062C\u062F \u0639\u064A\u0646\u0627\u062A \u062A\u0637\u0628\u064A\u0642 \u0628\u0639\u062F","\u062E\u0637\u0623","\u0623\u062E\u0637\u0627\u0621","\u0638\u0644\u062A \u0627\u0644\u0635\u0641\u062D\u0629 \u0645\u0639\u0637\u0648\u0628\u0629 \u0645\u0639 \u062A\u0639\u0637\u064A\u0644 \u062C\u0645\u064A\u0639 \u0645\u064A\u0632\u0627\u062A Aviary\u060C \u0644\u0630\u0627 \u0641\u0644\u0627 \u0634\u064A\u0621 \u064A\u0641\u0639\u0644\u0647 Aviary \u0647\u0648 \u0627\u0644\u0633\u0628\u0628. \u0627\u0644\u0645\u0643\u0627\u0646 \u0627\u0644\u062A\u0627\u0644\u064A \u0644\u0644\u0628\u062D\u062B \u0647\u0648 \u0625\u0636\u0627\u0641\u0629 \u0623\u062E\u0631\u0649 \u0623\u0648 \u0633\u0643\u0631\u0628\u062A \u0645\u0633\u062A\u062E\u062F\u0645 \u0623\u0648 X \u0646\u0641\u0633\u0647.","\u0644\u0645 \u062A\u0643\u0646 \u0623\u064A \u0645\u064A\u0632\u0629 \u0645\u0646 Aviary \u0642\u064A\u062F \u0627\u0644\u062A\u0634\u063A\u064A\u0644\u060C \u0641\u0644\u0645 \u064A\u0643\u0646 \u0647\u0646\u0627\u0643 \u0645\u0627 \u064A\u064F\u0628\u062D\u062B \u0641\u064A\u0647.","\u0644\u0627 \u062A\u0648\u062C\u062F \u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0646\u0634\u0637\u0629.","\u0645\u062D\u0638\u0648\u0631 \u0628\u0633\u0628\u0628 \u0648\u0636\u0639 \u0627\u0644\u0645\u062D\u0644\u064A \u0641\u0642\u0637","\u0645\u062D\u0638\u0648\u0631 (\u0627\u0644\u0645\u064A\u0632\u0627\u0646\u064A\u0629 0)","\u0644\u0627 \u062A\u0648\u062C\u062F \u0646\u062A\u0627\u0626\u062C \u0645\u0637\u0627\u0628\u0642\u0629 (\u0623\u0648 \u0623\u0646 \u0627\u0644\u062A\u0643\u0627\u0645\u0644 \u0645\u0639\u0637\u0651\u0644).","\u0627\u0641\u062A\u062D \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u062A\u0627\u0628\u0650\u0639\u064A\u0646 \u0623\u0648 \u0627\u0644\u0645\u062A\u0627\u0628\u064E\u0639\u064A\u0646 \u0644\u0623\u062D\u062F \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0634\u062E\u0635\u064A\u0629\u060C \u062B\u0645 \u0627\u0633\u062A\u062E\u062F\u0645 \xAB\u0627\u0644\u062A\u0642\u0627\u0637 \u0644\u0642\u0637\u0629\xBB \u0644\u062A\u0633\u062C\u064A\u0644\u0647\u0627.","\u063A\u064A\u0631 \u0645\u0648\u062C\u0648\u062F \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0646\u0648\u0639:","\u0644\u0627 \u062A\u0648\u062C\u062F \u0633\u062C\u0644\u0627\u062A \u0645\u0644\u062A\u0642\u0637\u0629 \u062A\u0637\u0627\u0628\u0642 \xAB{query}\xBB.","\u0645\u0627 \u0648\u0631\u0627\u0621 \u0643\u0648\u0627\u0644\u064A\u0633 X","\u0627\u0642\u0631\u0623 \u0645\u0644\u062E\u0635 X \u0627\u0644\u0634\u0647\u0631\u064A \u0644\u0644\u0631\u0624\u064A\u0629 \u0645\u062D\u0644\u064A\u064B\u0627. \u064A\u0639\u0631\u0636 \u0627\u0644\u062A\u0635\u0646\u064A\u0641\u0627\u062A \u0627\u0644\u0645\u062C\u0645\u0639\u0629\u060C \u0648\u0644\u064A\u0633 \u0623\u0648\u0632\u0627\u0646 \u0627\u0644\u062A\u0631\u062A\u064A\u0628 \u0641\u064A \u0627\u0644\u0625\u0646\u062A\u0627\u062C \u0623\u0648 \u062A\u062F\u0642\u064A\u0642\u064B\u0627 \u0643\u0627\u0645\u0644\u064B\u0627 \u0644\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A.","\u0627\u0633\u062A\u064A\u0631\u0627\u062F JSON \u0644\u0645\u0627 \u0648\u0631\u0627\u0621 \u0643\u0648\u0627\u0644\u064A\u0633 X","\u062A\u0645 \u062D\u0641\u0638 \u062A\u0642\u0631\u064A\u0631 \u0645\u0627 \u0648\u0631\u0627\u0621 \u0627\u0644\u0643\u0648\u0627\u0644\u064A\u0633 \u0645\u062D\u0644\u064A\u064B\u0627.","\u0644\u0645 \u062A\u064F\u0633\u062C\u0644 \u062A\u0635\u0646\u064A\u0641\u0627\u062A \u0631\u0624\u064A\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u0634\u0647\u0631.","\u0644\u0645 \u064A\u064F\u0633\u062A\u0648\u0631\u062F \u062A\u0642\u0631\u064A\u0631 X \u0628\u0639\u062F.","\u0627\u0633\u062A\u0648\u0631\u062F \u0634\u0647\u0631\u064B\u0627 \u0622\u062E\u0631 \u0644\u0645\u0642\u0627\u0631\u0646\u0629 \u0627\u0644\u062A\u0642\u0627\u0631\u064A\u0631.","\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0645\u062D\u062F\u064E\u0651\u062F","\u062D\u064F\u062F\u0650\u0651\u062F {selected} \u0645\u0646 {total} \u0645\u0644\u0641\u064B\u0627. \u062A\u0639\u0630\u0651\u0631 \u062A\u0646\u0632\u064A\u0644 {unavailable} \u0645\u0646\u0647\u0627.","\u0646\u0648\u0639 \u0627\u0644\u0648\u0633\u0627\u0626\u0637","\u0643\u0644 \u0627\u0644\u0623\u0646\u0648\u0627\u0639","\u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0643\u0644","\u063A\u064A\u0631 \u0645\u062A\u0627\u062D.","\u064A\u0636\u0645 \u0647\u0630\u0627 \u0627\u0644\u0628\u062D\u062B \u0623\u0643\u062B\u0631 \u0645\u0646 {limit} \u0645\u0644\u0641\u064B\u0627 \u0642\u0627\u0628\u0644\u064B\u0627 \u0644\u0644\u062A\u0646\u0632\u064A\u0644. \u0636\u064A\u0651\u0642\u0647 \u0623\u0648\u0644\u064B\u0627.","\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u062C\u0645\u0648\u0639\u0627\u062A \u0645\u062D\u0644\u064A\u0629 \u062A\u0637\u0627\u0628\u0642 \u0647\u0630\u0627 \u0627\u0644\u0628\u062D\u062B.","\u0645\u0637\u0627\u0628\u0642\u0629 \u0646\u0635\u064A\u0629 \u0648\u062F\u0644\u0627\u0644\u064A\u0629","\u0645\u0637\u0627\u0628\u0642\u0629 \u062F\u0644\u0627\u0644\u064A\u0629","\u0645\u0637\u0627\u0628\u0642\u0629 \u0646\u0635\u064A\u0629","(\u0628\u0644\u0627 \u0646\u0635)","\u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629","\u0627\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629 \u0628\u0627\u0644\u0646\u0635 \u0623\u0648 \u0627\u0644\u0645\u0639\u0631\u0651\u0641 \u0623\u0648 \u0627\u0644\u0648\u0633\u0648\u0645 \u0623\u0648 \u0627\u0644\u0645\u062C\u0644\u062F \u0623\u0648 \u0627\u0644\u0631\u0642\u0645. \u062A\u062A\u0636\u0645\u0646 \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u0623\u0631\u0633\u0644\u0647\u0627 X \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0623\u062B\u0646\u0627\u0621 \u062A\u0645\u0631\u064A\u0631\u0643 \u0639\u0644\u064A\u0647\u0627 \u0641\u0642\u0637.","\u0627\u0644\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629","\u0644\u0645 \u064A\u064F\u062D\u0641\u0638 \u0634\u064A\u0621 \u0628\u0639\u062F. \u0627\u0633\u062A\u062E\u062F\u0645 \xAB\u062D\u0641\u0638 \u0645\u062D\u0644\u064A\u064B\u0627\xBB \u0639\u0644\u0649 \u0623\u064A \u0645\u0646\u0634\u0648\u0631 \u0644\u0644\u0627\u062D\u062A\u0641\u0627\u0638 \u0628\u0646\u0633\u062E\u0629 \u0647\u0646\u0627.","\u0644\u0627 \u062A\u0648\u062C\u062F \u0625\u0634\u0627\u0631\u0627\u062A \u0645\u0631\u062C\u0639\u064A\u0629 \u0645\u062D\u0644\u064A\u0629 \u062A\u0637\u0627\u0628\u0642 \u0647\u0630\u0627 \u0627\u0644\u0628\u062D\u062B.","\u0645\u0644\u0627\u062D\u0638\u0627\u062A","\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0625\u0634\u0627\u0631\u0629 \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629","\u0625\u0632\u0627\u0644\u0629","\u0623\u0636\u0641 \u0648\u0627\u062D\u062F\u0629 \u0623\u062F\u0646\u0627\u0647 \u0628\u0635\u064A\u063A\u0629 \u0627\u0644\u0645\u0639\u0631\u0651\u0641: \u0645\u0644\u0627\u062D\u0638\u0629. \u062A\u0638\u0647\u0631 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0628\u062C\u0648\u0627\u0631 \u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0630\u0644\u0643 \u0627\u0644\u062D\u0633\u0627\u0628.","\u0641\u0639\u0651\u0644 \u0627\u0644\u0627\u0644\u062A\u0642\u0627\u0637\u060C \u0648\u0645\u0631\u0651\u0631 \u0639\u0628\u0631 \u062E\u0637 \u0632\u0645\u0646\u064A\u060C \u062B\u0645 \u0635\u062F\u0651\u0631. \u0633\u062A\u0638\u0647\u0631 \u0627\u0644\u0645\u0647\u0627\u0645 \u0648\u0633\u062C\u0644\u0627\u062A\u0647\u0627 \u0647\u0646\u0627.","\u062C\u0627\u0631\u064D \u0625\u0646\u0634\u0627\u0621 \u0623\u0631\u0634\u064A\u0641 WARC\u2026","\u062C\u0627\u0631\u064D \u0625\u0646\u0634\u0627\u0621 \u0623\u0631\u0634\u064A\u0641 WACZ\u2026","\u0632\u0648\u062C \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u0645\u062E\u0632\u0646 \u063A\u064A\u0631 \u0635\u0627\u0644\u062D. \u0627\u0633\u062A\u0628\u062F\u0644\u0647 \u0642\u0628\u0644 \u062A\u0648\u0642\u064A\u0639 \u0623\u0631\u0634\u064A\u0641 \u0622\u062E\u0631.","\u064A\u0646\u0634\u0626 \u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u0623\u0648\u0644 \u0647\u0648\u064A\u0629 P-384 \u0645\u062D\u0644\u064A\u0629. \u064A\u0638\u0644 \u0627\u0644\u062A\u0648\u0642\u064A\u0639 \u0645\u062A\u0648\u0642\u0641\u064B\u0627 \u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A WACZ \u0627\u0644\u0639\u0627\u062F\u064A\u0629.","\u062C\u0627\u0631\u064D \u0625\u0646\u0634\u0627\u0621 \u0647\u0648\u064A\u0629 \u062A\u0648\u0642\u064A\u0639 \u062C\u062F\u064A\u062F\u0629\u2026","\u062C\u0627\u0631\u064D \u0625\u0646\u0634\u0627\u0621 \u0625\u062B\u0628\u0627\u062A WACZ \u062E\u0627\u0635 \u0628\u0640 Aviary\u2026","\u062C\u0627\u0631\u064D \u0625\u0639\u062F\u0627\u062F \u0632\u0648\u062C \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u062A\u0648\u0642\u064A\u0639\u2026","\u062A\u0635\u062F\u064A\u0631 \u0633\u062C\u0644 \u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A","\u0635\u062F\u0651\u0631 \u0633\u062C\u0644\u0627\u062A \u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u062A\u0643\u0631\u0627\u0631 \u0627\u0644\u0645\u062D\u0644\u064A\u0629 \u0628\u0635\u064A\u063A\u062A\u064A JSON \u0648CSV \u0644\u0646\u0637\u0627\u0642 \u0632\u0645\u0646\u064A \u0645\u062D\u062F\u062F. \u0644\u0627 \u062A\u064F\u062F\u0631\u062C \u0639\u0646\u0627\u0648\u064A\u0646 URL \u0644\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u0635\u062F\u0631.","\u062A\u0627\u0631\u064A\u062E \u0628\u062F\u0621 \u0627\u0644\u0633\u062C\u0644","\u062A\u0627\u0631\u064A\u062E \u0627\u0646\u062A\u0647\u0627\u0621 \u0627\u0644\u0633\u062C\u0644","\u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0646\u0637\u0627\u0642","\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0635\u0648\u062A \u0627\u0644\u0645\u0644\u062A\u0642\u0637","\u0646\u0632\u0651\u0644 \u0645\u0633\u0627\u0631\u0627\u062A \u0627\u0644\u0635\u0648\u062A \u0627\u0644\u0645\u0648\u062C\u0648\u062F\u0629 \u0641\u064A \u0627\u0644\u0627\u0644\u062A\u0642\u0627\u0637\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A\u0629. \u0644\u0627 \u064A\u062A\u0645 \u0637\u0644\u0628 \u0627\u0643\u062A\u0634\u0627\u0641 \u0628\u064A\u0627\u0646\u0627\u062A \u0648\u0635\u0641\u064A\u0629.","\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u062A\u0631\u062C\u0645\u0627\u062A \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629","\u0646\u0632\u0651\u0644 \u0645\u0633\u0627\u0631\u0627\u062A \u0627\u0644\u062A\u0631\u062C\u0645\u0629 \u0627\u0644\u0645\u0648\u062C\u0648\u062F\u0629 \u0641\u064A \u0627\u0644\u0627\u0644\u062A\u0642\u0627\u0637\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A\u0629. \u0644\u0627 \u064A\u062A\u0645 \u0637\u0644\u0628 \u0627\u0643\u062A\u0634\u0627\u0641 \u0628\u064A\u0627\u0646\u0627\u062A \u0648\u0635\u0641\u064A\u0629.","\u0627\u0644\u0633\u0637\u0631","\u0644\u0645 \u062A\u0639\u062F \u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u0645\u062A \u0645\u0644\u0627\u062D\u0638\u062A\u0647\u0627 \u0633\u0627\u0628\u0642\u064B\u0627 \u0645\u0643\u062A\u0634\u0641\u0629: {markers}.","\u062C\u0627\u0647\u0632 \u0644\u0644\u062A\u0634\u063A\u064A\u0644 \u0639\u0644\u0649 @{handle}.","{feature}: \u200F{count} \u062A\u0634\u063A\u064A\u0644\u0627\u062A \xB7 \u0625\u062C\u0645\u0627\u0644\u064A {total} \u0645\u0644\u0644\u064A \u062B\u0627\u0646\u064A\u0629 \xB7 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 {max} \u0645\u0644\u0644\u064A \u062B\u0627\u0646\u064A\u0629 \xB7 \u0643\u0627\u0645\u0644\u0629 {full} / \u062A\u0632\u0627\u064A\u062F\u064A\u0629 {incremental}","{observed} \u0625\u0637\u0627\u0631\u0627\u062A \u0637\u0648\u064A\u0644\u0629 \xB7 \u0645\u062A\u0631\u0627\u0628\u0637\u0629 {correlated}","{count} \u0645\u064A\u0632\u0627\u062A","\u064A\u0639\u0645\u0644 X \u0628\u0627\u0644\u0644\u063A\u0629 {language}\u060C \u0648\u0647\u064A \u0644\u063A\u0629 \u0644\u0627 \u064A\u0645\u0644\u0643 Aviary \u062A\u0633\u0645\u064A\u0627\u062A \u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0644\u0647\u0627. \u0644\u0627 \u062A\u064F\u062E\u0641\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0645\u0648\u064E\u0651\u0644\u0629 \u0647\u0646\u0627 \u0627\u0639\u062A\u0645\u0627\u062F\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u062A\u0633\u0645\u064A\u0629.","{feature} \u0647\u0648 \u0645\u0627 \u063A\u064A\u0651\u0631 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629. \u0627\u0633\u062A\u063A\u0631\u0642 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u064A\u0647 {rounds} \u062C\u0648\u0644\u0627\u062A. \u0643\u0644 \u0627\u0644\u0645\u064A\u0632\u0627\u062A \u062A\u0639\u0645\u0644 \u0645\u0646 \u062C\u062F\u064A\u062F\u060C \u0644\u0630\u0627 \u0639\u0637\u0650\u0651\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u064A\u0632\u0629 \u0645\u0646 \u0625\u0639\u062F\u0627\u062F\u0647\u0627 \u0627\u0644\u062E\u0627\u0635 \u0625\u0646 \u0623\u0631\u062F\u062A \u0628\u0642\u0627\u0621\u0647\u0627 \u0645\u0639\u0637\u0651\u0644\u0629.","\u0627\u0644\u062C\u0648\u0644\u0629 {round} \u0645\u0646 {total}. \u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u064A\u0632\u0627\u062A \u0627\u0644\u0640 {off} \u0645\u064F\u0639\u0637\u064E\u0651\u0644\u0629.","\u0627\u0644\u062C\u0648\u0644\u0629 {round} \u0645\u0646 {total}. \u200F{off} \u0645\u0646 {suspect} \u0645\u064A\u0632\u0629 \u0644\u0627 \u062A\u0632\u0627\u0644 \u0645\u0634\u062A\u0628\u0647\u064B\u0627 \u0628\u0647\u0627 \u0645\u064F\u0639\u0637\u064E\u0651\u0644\u0629.","\u0627\u0644\u0645\u0639\u0631\u0651\u0641 {gid} \xB7 {status}","{count} \u0645\u0646 \u0627\u0644\u0625\u062F\u062E\u0627\u0644\u0627\u062A","{posts} \u0645\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \xB7 {likes} \u0645\u0646 \u0627\u0644\u0625\u0639\u062C\u0627\u0628\u0627\u062A \xB7 {messages} \u0645\u0646 \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u0645\u0628\u0627\u0634\u0631\u0629 (\u062E\u0627\u0631\u062C \u0627\u0644\u0628\u062D\u062B \u0627\u0644\u0639\u0627\u0645) \xB7 {media} \u0645\u0646 \u0645\u0631\u0627\u062C\u0639 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \xB7 {followers} \u0645\u0646 \u0627\u0644\u0645\u062A\u0627\u0628\u0639\u064A\u0646 \xB7 {following} \u0645\u0645\u0646 \u062A\u062A\u0627\u0628\u0639\u0647\u0645 \xB7 {lists} \u0645\u0646 \u0627\u0644\u0642\u0648\u0627\u0626\u0645","\u062A\u0645 \u062A\u0648\u0633\u064A\u0639 {archiveLinks} \u0645\u0646 \u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u0623\u0631\u0634\u064A\u0641 + {corpusLinks} \u0645\u0646 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629 \xB7 \u062A\u0645 \u062A\u062D\u062F\u064A\u062F {participants} \u0645\u0646 \u0645\u0639\u0631\u0651\u0641\u0627\u062A \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u064A\u0646 \xB7 \u062A\u0645 \u0627\u0644\u0627\u062D\u062A\u0641\u0627\u0638 \u0628\u0640 {unresolved} \u0643\u0645\u0639\u0631\u0651\u0641\u0627\u062A \u063A\u064A\u0631 \u0645\u062D\u062F\u062F\u0629 \xB7 \u0644\u0645 \u062A\u064F\u0631\u0633\u0644 \u0623\u064A \u0637\u0644\u0628\u0627\u062A","{status} \xB7 {filename} \xB7 {records} \u0645\u0646 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \xB7 {files} \u0645\u0646 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \xB7 {warnings} \u0645\u0646 \u0627\u0644\u062A\u062D\u0630\u064A\u0631\u0627\u062A","{saved} \u0645\u062D\u0641\u0648\u0638 \xB7 {mirrored} \u0645\u0639\u0643\u0648\u0633 \xB7 {due} \u0645\u0633\u062A\u062D\u0642 \xB7 {tags} \u0648\u0633\u0645 \xB7 {folders} \u0645\u062C\u0644\u062F","{public} \u0639\u0627\u0645\u0629 \xB7 {protected} \u0645\u062D\u0645\u064A\u0629 \xB7 {unknown} \u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641\u0629 \xB7 {excluded} \u0645\u0633\u062A\u0628\u0639\u062F\u0629 \u0645\u0646 \u0635\u0627\u062F\u0631\u0627\u062A \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629","{status} \xB7 {records} \u0645\u0646 \u0627\u0644\u0633\u062C\u0644\u0627\u062A \xB7 {surface}","\u0627\u0644\u0647\u0648\u064A\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629 {fingerprint}. \u062A\u062B\u0628\u062A \u0627\u0633\u062A\u0645\u0631\u0627\u0631\u064A\u0629 \u0647\u0630\u0627 \u0627\u0644\u0645\u0641\u062A\u0627\u062D\u060C \u0648\u0644\u064A\u0633 \u0645\u0627 \u0642\u062F\u0645\u062A\u0647 X.","{count} \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u062C\u0644\u0633\u0629","\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 {imported} \u0642\u0627\u0639\u062F\u0629. \u0627\u0644\u0627\u0633\u062A\u0628\u062F\u0627\u0644 \u062C\u0627\u0647\u0632. \u0627\u0644\u0625\u0636\u0627\u0641\u0629 \u0645\u062D\u0638\u0648\u0631\u0629 \u0639\u0646\u062F \u0627\u0644\u0633\u0637\u0631 {line}: {error}","\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 {imported} \u0642\u0627\u0639\u062F\u0629. \u0633\u062A\u062A\u0645 \u0625\u0636\u0627\u0641\u0629 {added}\u061B \u062A\u0648\u062C\u062F {duplicates} \u0645\u0633\u0628\u0642\u064B\u0627. \u0633\u064A\u062A\u0645 \u0627\u0633\u062A\u0628\u062F\u0627\u0644 {replaced} \u0628\u0640 {total}.","\u064A\u062A\u062C\u0627\u0647\u0644 \u0627\u0644\u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0648\u0627\u0644\u0623\u062E\u0637\u0627\u0621 \u0627\u0644\u0645\u062E\u0632\u0646\u0629. \u0644\u0627 \u064A\u064F\u0643\u062A\u0628 \u0647\u0646\u0627 \u0633\u0648\u0649 \u0646\u0635 \u0631\u0633\u0627\u0626\u0644 Aviary \u0646\u0641\u0633\u0647 \u0648\u0627\u0644\u0648\u0642\u062A \u0648\u0623\u0633\u0645\u0627\u0621 \u062D\u0642\u0648\u0644 \u0627\u0644\u062A\u0641\u0627\u0635\u064A\u0644.","\u0627\u0645\u0633\u062D \u0633\u062C\u0644 \u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A \u0627\u0644\u0645\u062D\u062F\u0648\u062F \u0648\u062A\u062D\u0630\u064A\u0631 \u0627\u0644\u0627\u0646\u062D\u0631\u0627\u0641 \u0627\u0644\u062E\u0627\u0635 \u0628\u0647. \u0644\u0627 \u064A\u062A\u0645 \u062A\u062E\u0632\u064A\u0646 \u0646\u0635\u0648\u0635 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0623\u0648 \u0627\u0644\u0645\u0639\u0631\u0651\u0641\u0627\u062A \u0623\u0648 \u0639\u0646\u0627\u0648\u064A\u0646 URL \u0623\u0648 \u0646\u0635\u0648\u0635 \u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0629 \u0647\u0646\u0627.","\u064A\u0639\u0637\u0651\u0644 \u0643\u0644 \u0645\u064A\u0632\u0629 \u0641\u064A Aviary \u062B\u0645 \u064A\u0639\u064A\u062F\u0647\u0627 \u062A\u0634\u063A\u064A\u0644\u064B\u0627 \u0639\u0644\u0649 \u0623\u0646\u0635\u0627\u0641\u060C \u0648\u064A\u0633\u0623\u0644 \u0628\u0639\u062F \u0643\u0644 \u062C\u0648\u0644\u0629 \u0625\u0646 \u0643\u0627\u0646\u062A \u0627\u0644\u0635\u0641\u062D\u0629 \u0645\u0627 \u0632\u0627\u0644\u062A \u0645\u0639\u0637\u0648\u0628\u0629. \u064A\u0633\u0645\u0651\u064A \u0627\u0644\u0645\u064A\u0632\u0629 \u0627\u0644\u0645\u0633\u0624\u0648\u0644\u0629 \u0641\u064A \u062E\u0645\u0633 \u062C\u0648\u0644\u0627\u062A \u062A\u0642\u0631\u064A\u0628\u064B\u0627. \u0644\u0627 \u064A\u064F\u0643\u062A\u0628 \u0634\u064A\u0621 \u0641\u064A \u0625\u0639\u062F\u0627\u062F\u0627\u062A\u0643\u060C \u0644\u0630\u0627 \u0641\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u062A\u062D\u0645\u064A\u0644 \u062A\u0633\u062A\u0639\u064A\u062F \u0643\u0644 \u0634\u064A\u0621 \u0645\u0647\u0645\u0627 \u0641\u0639\u0644\u062A\u060C \u0628\u0645\u0627 \u0641\u064A \u0630\u0644\u0643 \u0627\u0644\u062A\u0648\u0642\u0651\u0641 \u0641\u064A \u0627\u0644\u0645\u0646\u062A\u0635\u0641. \u064A\u0628\u0642\u0649 \u0645\u0631\u0643\u0632 \u0627\u0644\u062A\u062D\u0643\u0645 \u0648\u0644\u063A\u062A\u0647 \u064A\u0639\u0645\u0644\u0627\u0646 \u0637\u0648\u0627\u0644 \u0627\u0644\u0648\u0642\u062A\u060C \u0641\u0644\u0627 \u064A\u0645\u0643\u0646 \u0623\u0646 \u064A\u064F\u0633\u0645\u0651\u0649 \u0623\u064A \u0645\u0646\u0647\u0645\u0627.","\u0627\u0628\u062F\u0623 \u0645\u0646 \u062C\u062F\u064A\u062F \u0645\u0639 \u062A\u0639\u0637\u064A\u0644 \u0643\u0644 \u0627\u0644\u0645\u064A\u0632\u0627\u062A.","\u0623\u063A\u0644\u0642 \u0627\u0644\u0628\u062D\u062B. \u0644\u0627 \u064A\u062A\u063A\u064A\u0651\u0631 \u0634\u064A\u0621\u061B \u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u064A\u0632\u0627\u062A \u062A\u0639\u0645\u0644 \u0628\u0627\u0644\u0641\u0639\u0644.","\u0627\u0633\u062A\u0645\u0631\u0651\u062A \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0645\u0639 \u062A\u0639\u0637\u064A\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u064A\u0632\u0627\u062A\u060C \u0625\u0630\u064B\u0627 \u0627\u0644\u0633\u0628\u0628 \u0648\u0627\u062D\u062F\u0629 \u0645\u0646 \u0627\u0644\u0623\u062E\u0631\u0649.","\u0627\u062E\u062A\u0641\u062A \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0645\u0639 \u062A\u0639\u0637\u064A\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u064A\u0632\u0627\u062A\u060C \u0625\u0630\u064B\u0627 \u0627\u0644\u0633\u0628\u0628 \u0648\u0627\u062D\u062F\u0629 \u0645\u0646\u0647\u0627.","\u0623\u0639\u0650\u062F \u062A\u0634\u063A\u064A\u0644 \u0643\u0644 \u0627\u0644\u0645\u064A\u0632\u0627\u062A \u0648\u062A\u062C\u0627\u0647\u0644 \u0627\u0644\u0628\u062D\u062B. \u0644\u0627 \u062A\u064F\u0633\u062C\u064E\u0651\u0644 \u0623\u064A \u0625\u062C\u0627\u0628\u0629.","\u0625\u064A\u0642\u0627\u0641 {filename} \u0645\u0624\u0642\u062A\u064B\u0627.","\u0627\u0633\u062A\u0626\u0646\u0627\u0641 {filename}.","\u0625\u0644\u063A\u0627\u0621 {filename}.","\u0625\u0639\u0627\u062F\u0629 \u0645\u062D\u0627\u0648\u0644\u0629 {filename}.","\u0625\u064A\u0642\u0627\u0641 {jobId} \u0645\u0624\u0642\u062A\u064B\u0627.","\u0627\u0633\u062A\u0626\u0646\u0627\u0641 {jobId}.","\u0625\u0644\u063A\u0627\u0621 {jobId}.","\u0646\u0633\u062E \u0645\u0644\u0627\u062D\u0638\u0629 \u0627\u0644\u0628\u0646\u064A\u0629","\u0623\u062F\u0627\u0621 \u0627\u0644\u062A\u063A\u064A\u064A\u0631\u0627\u062A","\u0625\u0639\u0627\u062F\u0629 \u0636\u0628\u0637 \u0645\u0642\u0627\u064A\u064A\u0633 \u0627\u0644\u0623\u062F\u0627\u0621","\u062A\u0633\u0645\u064A\u0627\u062A \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0644\u0647\u0630\u0647 \u0627\u0644\u0644\u063A\u0629","\u0627\u0644\u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629","\u0645\u0633\u062D \u0627\u0644\u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629","\u0625\u0639\u0627\u062F\u0629 \u0636\u0628\u0637 \u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A","\u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A \u0627\u0644\u0646\u0634\u0637","\u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A","\u062A\u0639\u064A\u064A\u0646 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0642\u062F\u064A\u0645\u0629 \u0647\u0646\u0627","\u0645\u0644\u0641 \u0634\u062E\u0635\u064A \u062C\u062F\u064A\u062F","\u0627\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u0645\u064A\u0632\u0629 \u0627\u0644\u062A\u064A \u062A\u0639\u0637\u0628 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629","\u0627\u0644\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u0645\u064A\u0632\u0629","\u0627\u0628\u062D\u062B \u0645\u0631\u0629 \u0623\u062E\u0631\u0649","\u0627\u0645\u0633\u062D \u0627\u0644\u0646\u062A\u064A\u062C\u0629","\u0644\u0627 \u062A\u0632\u0627\u0644 \u0645\u0634\u062A\u0628\u0647\u064B\u0627 \u0628\u0647\u0627","\u0627\u0644\u0635\u0641\u062D\u0629 \u0645\u0627 \u0632\u0627\u0644\u062A \u0645\u0639\u0637\u0648\u0628\u0629","\u062A\u0628\u062F\u0648 \u0627\u0644\u0635\u0641\u062D\u0629 \u0633\u0644\u064A\u0645\u0629 \u0627\u0644\u0622\u0646","\u0623\u0648\u0642\u0641 \u0627\u0644\u0628\u062D\u062B","\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u0646\u0633\u062E\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629","\u0645\u062C\u0645\u0648\u0639\u0627\u062A \u0627\u0644\u0646\u0633\u062E\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629","\u062A\u063A\u064A\u064A\u0631\u0627\u062A \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0627\u062A","\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0627\u0639\u062A\u0645\u0627\u062F","\u062A\u062D\u0630\u064A\u0631\u0627\u062A \u0627\u0644\u0646\u0633\u062E\u0629 \u0627\u0644\u0627\u062D\u062A\u064A\u0627\u0637\u064A\u0629","\u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u0627\u0633\u062A\u0631\u062C\u0627\u0639","\u0645\u062D\u0627\u0643\u0627\u0629 \u0627\u0644\u0627\u0633\u062A\u0631\u062C\u0627\u0639","\u0627\u0633\u062A\u0631\u062C\u0627\u0639 \u0646\u0633\u062E\u0629 \u0627\u0644\u0645\u0643\u062A\u0628\u0629 \u0647\u0630\u0647","\u0644\u0627 \u062A\u0648\u062C\u062F \u0644\u0642\u0637\u0627\u062A \u0628\u0639\u062F","\u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u0648\u0631\u062F\u0629","\u0625\u0635\u0644\u0627\u062D\u0627\u062A \u0645\u062D\u0644\u064A\u0629 \u0644\u0644\u0623\u0631\u0634\u064A\u0641","\u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0623\u0631\u0634\u064A\u0641","\u0625\u064A\u0642\u0627\u0641 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0623\u0631\u0634\u064A\u0641 \u0645\u0624\u0642\u062A\u064B\u0627","\u0627\u0633\u062A\u0626\u0646\u0627\u0641 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0623\u0631\u0634\u064A\u0641","\u0625\u0644\u063A\u0627\u0621 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0623\u0631\u0634\u064A\u0641","\u0625\u0639\u0627\u062F\u0629 \u0645\u062D\u0627\u0648\u0644\u0629 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0627\u0644\u0623\u0631\u0634\u064A\u0641","\u0623\u062D\u062F\u062B \u062A\u0642\u0631\u064A\u0631 \u0644\u0645\u0627 \u0648\u0631\u0627\u0621 \u0643\u0648\u0627\u0644\u064A\u0633 X","\u0627\u0644\u062A\u0635\u0646\u064A\u0641\u0627\u062A \u0641\u064A \u0623\u062D\u062F\u062B \u062A\u0642\u0631\u064A\u0631","\u062A\u0642\u0627\u0631\u064A\u0631 \u0645\u0627 \u0648\u0631\u0627\u0621 \u0627\u0644\u0643\u0648\u0627\u0644\u064A\u0633","\u0645\u0642\u0627\u0631\u0646\u0629 \u0634\u0647\u0631\u064A\u0629","\u062A\u0635\u062F\u064A\u0631 \u062A\u0642\u0627\u0631\u064A\u0631 \u0645\u0627 \u0648\u0631\u0627\u0621 \u0627\u0644\u0643\u0648\u0627\u0644\u064A\u0633 \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629","\u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629","\u062A\u0635\u062F\u064A\u0631 \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629","\u062A\u0635\u062F\u064A\u0631 \u0644\u0645\u062F\u064A\u0631\u064A \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629","\u0645\u0633\u062D \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629","\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u0644\u0627\u062D\u0638\u0627\u062A \u062D\u0633\u0627\u0628\u0627\u062A \u0628\u0639\u062F","\u062A\u063A\u0637\u064A\u0629 \u0627\u0644\u062C\u0645\u0647\u0648\u0631","\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u0647\u0627\u0645 \u062A\u0635\u062F\u064A\u0631 \u0628\u0639\u062F","\u0645\u0647\u0645\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631","\u0625\u064A\u0642\u0627\u0641 \u0645\u0647\u0645\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631 \u0645\u0624\u0642\u062A\u064B\u0627","\u0627\u0633\u062A\u0626\u0646\u0627\u0641 \u0645\u0647\u0645\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631","\u0625\u0644\u063A\u0627\u0621 \u0645\u0647\u0645\u0629 \u0627\u0644\u062A\u0635\u062F\u064A\u0631","\u0625\u0639\u0627\u062F\u0629 \u0628\u0646\u0627\u0621 \u0627\u0644\u0633\u0644\u0627\u0633\u0644 \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629","\u062F\u0641\u0639\u0629 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0646\u0634\u0637\u0629","\u062A\u0637\u0627\u0628\u0642\u0627\u062A \u0645\u0643\u0631\u0631\u0629","\u0625\u064A\u0635\u0627\u0644\u0627\u062A \u0627\u0644\u062C\u0648\u062F\u0629","\u0622\u062E\u0631 \u062A\u0637\u0627\u0628\u0642 \u0645\u0643\u0631\u0631","\u0645\u0633\u062D \u0633\u062C\u0644 \u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A","\u0627\u0633\u062A\u0626\u0646\u0627\u0641 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0641\u064A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631","\u0625\u0639\u0627\u062F\u0629 \u0645\u062D\u0627\u0648\u0644\u0629 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0641\u0627\u0634\u0644\u0629","\u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0645\u0639\u0627\u062F \u0643\u062A\u0627\u0628\u062A\u0647\u0627","\u0646\u0633\u064A\u0627\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0648\u0621\u0629","\u0642\u0648\u0627\u0639\u062F \u062A\u0639\u0630\u0651\u0631\u062A \u0642\u0631\u0627\u0621\u062A\u0647\u0627","\u0627\u0644\u0642\u0648\u0627\u0639\u062F \u0627\u0644\u0645\u0646\u062A\u0647\u064A\u0629","\u062A\u062C\u062F\u064A\u062F \u0627\u0644\u0642\u0648\u0627\u0639\u062F \u0627\u0644\u0645\u0646\u062A\u0647\u064A\u0629","\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062A\u0627\u062D\u0629","\u0641\u062A\u062D \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629","\u0625\u064A\u0642\u0627\u0641 \u0645\u0624\u0642\u062A","\u0627\u0633\u062A\u0626\u0646\u0627\u0641","\u0625\u064A\u0642\u0627\u0641","\u0627\u0633\u062A\u0628\u062F\u0627\u0644 \u0632\u0648\u062C \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D","\u064A\u0639\u0645\u0644 \u0628\u0634\u0643\u0644 \u0633\u0644\u064A\u0645. \u062A\u0645 \u062D\u0641\u0638 \u0643\u0644 \u0627\u0644\u062A\u063A\u064A\u064A\u0631\u0627\u062A.","\u064A\u0646\u0633\u062E \u0637\u0631\u064A\u0642\u0629 \u0628\u0646\u0627\u0621 X \u0644\u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629 (\u0639\u062F\u062F \u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0648\u0627\u0644\u062A\u062F\u0627\u062E\u0644 \u0648\u0627\u0644\u062A\u062E\u0637\u064A\u0637) \u0644\u062A\u062D\u062F\u064A\u062B \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u062E\u062A\u0628\u0627\u0631 Aviary. \u0644\u0627 \u064A\u062A\u0636\u0645\u0646 \u0646\u0635\u0648\u0635 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0623\u0648 \u0627\u0644\u0623\u0633\u0645\u0627\u0621 \u0623\u0648 \u0623\u0633\u0645\u0627\u0621 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645\u064A\u0646 \u0623\u0648 \u0627\u0644\u0631\u0648\u0627\u0628\u0637 \u0623\u0648 \u0627\u0644\u0645\u0639\u0631\u0651\u0641\u0627\u062A.","\u064A\u0628\u0642\u0649 \u062A\u0648\u0642\u064A\u062A \u0627\u0644\u062A\u063A\u064A\u064A\u0631\u0627\u062A \u0645\u062D\u0644\u064A\u064B\u0627 \u0648\u0644\u0627 \u064A\u062E\u0632\u0646 \u0625\u0644\u0627 \u0645\u0639\u0631\u0651\u0641\u0627\u062A \u0627\u0644\u0645\u064A\u0632\u0627\u062A \u0648\u0645\u062F\u062F\u064B\u0627 \u0645\u062D\u062F\u0648\u062F\u0629.","\u064A\u0646\u0642\u0644 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0648\u0645\u062E\u0627\u0632\u0646 \u0627\u0644\u0645\u0643\u062A\u0628\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629 \u0644\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0634\u062E\u0635\u064A\u0629 \u0648\u063A\u064A\u0631 \u0627\u0644\u0645\u0633\u0646\u064E\u062F\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0634\u062E\u0635\u064A \u0627\u0644\u0646\u0634\u0637. \u0644\u0627 \u064A\u064F\u0633\u062A\u0646\u062A\u062C \u0623\u064A \u0634\u064A\u0621 \u0645\u0646 \u0645\u0633\u0627\u0631 X \u0627\u0644\u062D\u0627\u0644\u064A.","\u0623\u0646\u0634\u0626 \u0645\u0644\u0641\u064B\u0627 \u0634\u062E\u0635\u064A\u064B\u0627 \u0641\u0627\u0631\u063A\u064B\u0627 \u062F\u0648\u0646 \u0627\u062A\u0635\u0627\u0644 \u0642\u0628\u0644 \u062A\u0628\u062F\u064A\u0644 \u0627\u0644\u062D\u0633\u0627\u0628\u0627\u062A \u0623\u0648 \u0627\u0633\u062A\u064A\u0631\u0627\u062F \u0623\u0631\u0634\u064A\u0641 \u0622\u062E\u0631.","\u0644\u0627 \u062A\u0648\u062C\u062F \u0623\u064A \u0633\u062C\u0644\u0627\u062A.","\u062C\u0627\u0631\u064D \u0627\u0644\u0642\u064A\u0627\u0633\u2026","\u0644\u0627 \u064A\u0645\u0643\u0646 \u0642\u064A\u0627\u0633 \u0645\u062E\u0632\u0646 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0647\u0630\u0627 \u0645\u0646 \u0647\u0646\u0627\u060C \u0644\u0630\u0627 \u0644\u0627 \u064A\u0630\u0643\u0631 Aviary \u062D\u062C\u0645\u064B\u0627 \u0644\u0647.","\u0644\u0627 \u064A\u0641\u0635\u0651\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u062A\u0642\u0631\u064A\u0631 \u0627\u0644\u062A\u062E\u0632\u064A\u0646 \u062D\u0633\u0628 \u0627\u0644\u0646\u0648\u0639\u060C \u0644\u0630\u0627 \u064A\u064F\u0639\u0631\u0636 \u0642\u064A\u0627\u0633 Aviary \u0648\u062D\u062F\u0647.","\u064A\u0646\u0632\u0651\u0644 \u0627\u0644\u062A\u0642\u0627\u0631\u064A\u0631 \u0627\u0644\u0645\u0648\u062D\u0651\u062F\u0629 \u0628\u0635\u064A\u063A\u0629 JSON \u0645\u062D\u0644\u064A\u0629. \u0647\u0630\u0647 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \u0645\u0646 X\u061B \u0644\u0627 \u064A\u0636\u064A\u0641 Aviary \u0623\u0648\u0632\u0627\u0646 \u062A\u0631\u062A\u064A\u0628 \u0648\u0644\u0627 \u064A\u0633\u062A\u0646\u062A\u062C \u0646\u062A\u064A\u062C\u0629.","\u0646\u0632\u0651\u0644 JSON \u0648CSV \u0644\u0643\u0644 \u0625\u0634\u0627\u0631\u0629 \u0645\u0631\u062C\u0639\u064A\u0629 \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u0641. \u0644\u0627 \u064A\u062D\u062A\u0641\u0638 \u0627\u0644\u0627\u0646\u0639\u0643\u0627\u0633 \u0625\u0644\u0627 \u0628\u0645\u0627 \u0623\u0631\u0633\u0644\u0647 X \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0623\u062B\u0646\u0627\u0621 \u062A\u0645\u0631\u064A\u0631\u0643 \u0639\u0644\u064A\u0647.","\u0646\u0632\u0651\u0644 \u0645\u0644\u0641 \u0625\u0634\u0627\u0631\u0627\u062A \u0645\u0631\u062C\u0639\u064A\u0629 \u0644\u0644\u0645\u062A\u0635\u0641\u062D \u064A\u0633\u062A\u0648\u0631\u062F\u0647 Karakeep \u0648Linkwarden \u0648linkding \u0648\u0623\u064A \u0645\u062A\u0635\u0641\u062D\u060C \u0625\u0636\u0627\u0641\u0629\u064B \u0625\u0644\u0649 \u0645\u0644\u0641 CSV \u0627\u0644\u0630\u064A \u064A\u0633\u062A\u0648\u0631\u062F\u0647 Raindrop.io.","\u064A\u0632\u064A\u0644 \u0643\u0644 \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629 \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629.","\u0627\u0642\u0631\u0623 \u0627\u0644\u0631\u062F\u0648\u062F \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629 \u0628\u062A\u0631\u062A\u064A\u0628 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u0623\u0635\u0644. \u062A\u0628\u0642\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0623\u0635\u0644\u064A\u0629 \u0627\u0644\u0645\u0641\u0642\u0648\u062F\u0629 \u0638\u0627\u0647\u0631\u0629 \u0643\u0641\u062C\u0648\u0627\u062A \u0645\u062D\u0644\u064A\u0629.","\u064A\u0639\u064A\u062F \u0636\u0628\u0637 \u0641\u0647\u0631\u0633 \u0627\u0644\u062A\u0643\u0631\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0644\u064A.","\u064A\u0633\u062A\u0639\u064A\u062F \u0627\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0627\u0644\u0645\u0648\u0642\u0648\u0641\u0629 \u0645\u0624\u0642\u062A\u064B\u0627 \u0623\u0648 \u0627\u0644\u0645\u0646\u062A\u0638\u0631\u0629 \u0645\u0646 \u062C\u0644\u0633\u0629 \u0633\u0627\u0628\u0642\u0629.","\u064A\u0639\u064A\u062F \u0645\u062D\u0627\u0648\u0644\u0629 \u0643\u0644 \u0645\u0647\u0627\u0645 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0641\u0627\u0634\u0644\u0629 \u0623\u0648 \u0627\u0644\u0645\u0644\u063A\u0627\u0629 \u0641\u064A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u062F\u0627\u0626\u0645\u0629.","\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u062C\u0627\u0647\u0632\u0629 \u063A\u064A\u0631 \u0645\u062A\u0648\u0641\u0631\u0629 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0646\u0633\u062E\u0629.","\u064A\u0645\u0633\u062D \u0645\u0639\u0631\u0651\u0641\u0627\u062A \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629 \u0644\u064A\u0639\u0648\u062F \u0643\u0644 \u0634\u064A\u0621 \u063A\u064A\u0631 \u0645\u064F\u0634\u0627\u0647\u064E\u062F.","\u064A\u0639\u064A\u062F \u0628\u062F\u0621 \u0645\u062F\u0629 \u0643\u0644 \u0642\u0627\u0639\u062F\u0629 \u0645\u0646\u062A\u0647\u064A\u0629 \u0627\u0639\u062A\u0628\u0627\u0631\u064B\u0627 \u0645\u0646 \u0627\u0644\u0622\u0646. \u0644\u0627 \u064A\u064F\u062D\u0630\u0641 \u0634\u064A\u0621 \u0639\u0646\u062F \u0627\u0644\u0627\u0646\u062A\u0647\u0627\u0621\u060C \u0644\u0630\u0627 \u064A\u0645\u0643\u0646 \u062F\u0627\u0626\u0645\u064B\u0627 \u0627\u0633\u062A\u0631\u062C\u0627\u0639 \u0623\u064A \u0642\u0627\u0639\u062F\u0629.","\u0631\u0627\u062C\u0639 \u0641\u062A\u0631\u0629 \u0632\u0645\u0646\u064A\u0629\u060C \u0648\u0635\u0641\u0651\u0650 \u062D\u0633\u0628 \u0646\u0648\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u060C \u0648\u0627\u062C\u0645\u0639 \u062D\u0633\u0628 \u0627\u0644\u0643\u0627\u062A\u0628\u060C \u0648\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u0623\u0635\u0644\u064A. \u0644\u0627 \u062A\u064F\u062C\u0631\u0649 \u0623\u064A \u0637\u0644\u0628\u0627\u062A.","\u0645\u062E\u0632\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629 \u063A\u064A\u0631 \u0645\u062A\u0648\u0641\u0631 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0646\u0633\u062E\u0629.","\u062C\u0627\u0647\u0632.","\u0627\u0643\u062A\u0645\u0644 \u0627\u0644\u062D\u0630\u0641.","\u062A\u0645 \u0628\u0644\u0648\u063A \u062D\u062F \u0627\u0644\u0625\u062C\u0631\u0627\u0621\u0627\u062A. \u0627\u0633\u062A\u0623\u0646\u0641 \u0644\u062A\u0634\u063A\u064A\u0644 \u062F\u0641\u0639\u0629 \u0623\u062E\u0631\u0649.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u062D\u0630\u0641 \u0645\u0624\u0642\u062A\u064B\u0627.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u062D\u0630\u0641.","\u0627\u0644\u0645\u0639\u0627\u064A\u0646\u0629 \u0642\u064A\u062F \u0627\u0644\u062A\u0634\u063A\u064A\u0644.","\u0627\u0644\u062D\u0630\u0641 \u0642\u064A\u062F \u0627\u0644\u062A\u0634\u063A\u064A\u0644.","\u062A\u063A\u064A\u0651\u0631 \u0627\u0644\u062D\u0633\u0627\u0628 \u0627\u0644\u0645\u0633\u062C\u064E\u0651\u0644 \u0627\u0644\u062F\u062E\u0648\u0644. \u0644\u0645 \u062A\u064F\u062A\u062E\u0630 \u0623\u064A \u0625\u062C\u0631\u0627\u0621\u0627\u062A \u0623\u062E\u0631\u0649.","\u0647\u0646\u0627\u0643 \u0639\u0644\u0627\u0645\u0629 \u062A\u0628\u0648\u064A\u0628 \u0623\u062E\u0631\u0649 \u0641\u064A X \u062A\u0634\u063A\u0651\u0644 \u0647\u0630\u0627 \u0627\u0644\u062D\u0630\u0641 \u0628\u0627\u0644\u0641\u0639\u0644.","\u0639\u0644\u0627\u0645\u0629 \u0627\u0644\u062A\u0628\u0648\u064A\u0628 \u0647\u0630\u0647 \u062A\u0634\u063A\u0651\u0644 \u0639\u0645\u0644\u064A\u0629 \u062D\u0630\u0641 \u0628\u0627\u0644\u0641\u0639\u0644.","\u0639\u0631\u0636 X \u062A\u062D\u0642\u0642\u064B\u0627 \u0644\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0623\u0648 \u0644\u0645\u0643\u0627\u0641\u062D\u0629 \u0625\u0633\u0627\u0621\u0629 \u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645. \u0623\u0643\u0645\u0644\u0647 \u062B\u0645 \u0627\u0633\u062A\u0623\u0646\u0641.","\u062D\u062F\u062F \u0641\u0626\u0629 \u0648\u0627\u062D\u062F\u0629 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644 \u0645\u0646 \u0627\u0644\u062D\u0633\u0627\u0628.","\u0644\u0627 \u062A\u0648\u062C\u062F \u0639\u0645\u0644\u064A\u0629 \u062D\u0630\u0641 \u0642\u064A\u062F \u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u0644\u0625\u064A\u0642\u0627\u0641\u0647\u0627 \u0645\u0624\u0642\u062A\u064B\u0627.","\u0644\u0627 \u062A\u0648\u062C\u062F \u0639\u0645\u0644\u064A\u0629 \u062D\u0630\u0641 \u0645\u062A\u0648\u0642\u0641\u0629 \u0645\u0624\u0642\u062A\u064B\u0627 \u0644\u0627\u0633\u062A\u0626\u0646\u0627\u0641\u0647\u0627.","\u0644\u0627 \u062A\u0648\u062C\u062F \u0639\u0645\u0644\u064A\u0629 \u062D\u0630\u0641 \u0644\u0625\u064A\u0642\u0627\u0641\u0647\u0627.","\u0644\u0627 \u064A\u0632\u0627\u0644 \u062D\u0630\u0641 \u0646\u0634\u0627\u0637 X \u0642\u064A\u062F \u0627\u0644\u062A\u062D\u0645\u064A\u0644.","\u0627\u0633\u062A\u0623\u0646\u0641 \u0639\u0645\u0644\u064A\u0629 \u0627\u0644\u062D\u0630\u0641 \u0647\u0630\u0647 \u0645\u0646 \u0639\u0644\u0627\u0645\u0629 \u062A\u0628\u0648\u064A\u0628 X \u0627\u0644\u062A\u064A \u0628\u062F\u0623\u062A\u0647\u0627.","\u0644\u0645 \u064A\u0637\u0628\u0651\u0642 X \u0627\u0644\u0625\u062C\u0631\u0627\u0621 \u0628\u0639\u062F \u062E\u0645\u0633 \u0639\u0645\u0644\u064A\u0627\u062A \u0625\u0639\u0627\u062F\u0629 \u062A\u062D\u0645\u064A\u0644 \u062A\u0644\u0642\u0627\u0626\u064A\u0629 \u0644\u0644\u0635\u0641\u062D\u0629. \u0627\u0633\u062A\u0623\u0646\u0641 \u0644\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.","\u0623\u0648\u0642\u0641 \u062E\u0637\u0623 \u063A\u064A\u0631 \u0645\u062A\u0648\u0642\u0639 \u0639\u0645\u0644\u064A\u0629 \u0627\u0644\u062D\u0630\u0641.","\u062A\u0639\u0630\u0651\u0631 \u0625\u0643\u0645\u0627\u0644 \u0623\u0645\u0631 \u0627\u0644\u062D\u0630\u0641.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u062D\u0633\u0627\u0628 \u0645\u0624\u0642\u062A\u064B\u0627.","\u062A\u0645 \u0625\u064A\u0642\u0627\u0641 \u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u062D\u0633\u0627\u0628.","\u062A\u0645 \u0645\u0633\u062D \u0633\u062C\u0644 \u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u062D\u0633\u0627\u0628.","\u0627\u0646\u062A\u0642\u0644 \u0647\u0630\u0627 \u0627\u0644\u062A\u0646\u0638\u064A\u0641 \u0625\u0644\u0649 \u0639\u0644\u0627\u0645\u0629 \u062A\u0628\u0648\u064A\u0628 \u0623\u062E\u0631\u0649 \u0641\u064A X.","\u062C\u0627\u0631\u064D \u0641\u062A\u062D {category}.","\u062C\u0627\u0631\u064D \u0645\u0639\u0627\u064A\u0646\u0629 {category}.","\u062C\u0627\u0631\u064D \u062A\u0646\u0638\u064A\u0641 {category}.","\u0627\u0643\u062A\u0645\u0644\u062A \u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u0645\u062D\u062F\u062F\u0629.","\u062C\u0627\u0631\u064D \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 {category}.","\u062A\u0645 \u062A\u062D\u0645\u064A\u0644 {count} \u0639\u0646\u0635\u0631\u064B\u0627 \u0625\u0636\u0627\u0641\u064A\u064B\u0627 \u0645\u0646 {category}.","\u0644\u0627 \u064A\u0632\u0627\u0644 X \u064A\u062D\u0645\u0651\u0644 \u0639\u0646\u0627\u0635\u0631 \u0623\u0642\u062F\u0645 \u0645\u0646 {category}.","\u062C\u0627\u0631\u064D \u0627\u0644\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 {category} ({checks}/{limit}).","{category}: \u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 {count}.","{category}: \u062A\u0645\u062A \u0625\u0632\u0627\u0644\u0629 {count}.","\u0627\u0633\u062A\u0631\u0627\u062D\u0629 \u0644\u0645\u062F\u0629 {seconds} \u062B\u0627\u0646\u064A\u0629 \u0628\u0639\u062F {count} \u0625\u062C\u0631\u0627\u0621. \u064A\u0633\u062A\u0645\u0631 \u0627\u0644\u062D\u0630\u0641 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627.","\u0645\u062A\u0627\u0628\u0639\u0629 {category}.","\u062A\u0645 \u062A\u062E\u0637\u064A \u0639\u0646\u0635\u0631 \u0648\u0627\u062D\u062F \u0644\u0623\u0646 \u0639\u0646\u0635\u0631 \u0627\u0644\u062A\u062D\u0643\u0645 \u0627\u0644\u0645\u062A\u0648\u0642\u0639 \u0644\u0645 \u064A\u0643\u0646 \u0645\u0648\u062C\u0648\u062F\u064B\u0627.","\u0644\u0645 \u064A\u064F\u0637\u0628\u064E\u0651\u0642 \u0625\u062C\u0631\u0627\u0621 \u0639\u0644\u0649 \u0627\u0644\u062D\u0633\u0627\u0628. \u0633\u064A\u062D\u0627\u0648\u0644 Aviary \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.","\u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u062A\u062D\u0645\u064A\u0644 {category} \u0645\u0646 \u0627\u0644\u0628\u062F\u0627\u064A\u0629 \u0644\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0639\u062F\u0645 \u062A\u0641\u0648\u064A\u062A \u0623\u064A \u0634\u064A\u0621.","\u0644\u0645 \u064A\u0639\u062B\u0631 \u0627\u0644\u062A\u062D\u0642\u0642 \u0627\u0644\u062C\u062F\u064A\u062F \u0639\u0644\u0649 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 {category}.","\u0644\u0645 \u064A\u064F\u0639\u062B\u0631 \u0639\u0644\u0649 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 {category}.","\u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0625\u0639\u062C\u0627\u0628\u0627\u062A \u0644\u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u062D\u062F \u0627\u0644\u062A\u0627\u0644\u064A\u0629 \u0641\u064A X.","\u0644\u0645 \u064A\u0637\u0628\u0651\u0642 X \u0627\u0644\u0625\u062C\u0631\u0627\u0621 \u0645\u0631\u062A\u064A\u0646. \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631 {seconds} \u062B\u0627\u0646\u064A\u0629 \u0642\u0628\u0644 \u0625\u0639\u0627\u062F\u0629 \u062A\u062D\u0645\u064A\u0644 {category} ({attempt}/{max}).","\u062C\u0627\u0631\u064D \u0625\u0639\u0627\u062F\u0629 \u062A\u062D\u0645\u064A\u0644 {category} \u0627\u0644\u0622\u0646. \u064A\u0633\u062A\u0645\u0631 \u0627\u0644\u062D\u0630\u0641 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627.","\u062A\u0639\u0630\u0651\u0631 \u062A\u062C\u062F\u064A\u062F \u0642\u0641\u0644 \u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u062D\u0633\u0627\u0628.","\u0633\u062C\u0651\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0625\u0644\u0649 X \u062B\u0645 \u0627\u0633\u062A\u0623\u0646\u0641.","\u0623\u0648\u0642\u0641 \u062E\u0637\u0623 \u063A\u064A\u0631 \u0645\u062A\u0648\u0642\u0639 \u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u062D\u0633\u0627\u0628.","\u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u062D\u0633\u0627\u0628 \u0645\u062D\u0638\u0648\u0631 \u0648\u064A\u062D\u062A\u0627\u062C \u0625\u0644\u0649 \u0627\u0646\u062A\u0628\u0627\u0647\u0643.","\u062A\u0645 \u0628\u0644\u0648\u063A \u062D\u062F X \u0627\u0644\u0628\u0627\u0644\u063A 500 \u0625\u062C\u0631\u0627\u0621 \u0625\u0639\u062C\u0627\u0628. \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631 {seconds} \u062B\u0627\u0646\u064A\u0629 \u062D\u062A\u0649 \u0627\u0644\u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629. \u064A\u0633\u062A\u0645\u0631 \u0627\u0644\u062D\u0630\u0641 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627.","\u062A\u0645 \u0628\u0644\u0648\u063A \u062D\u062F X \u0627\u0644\u0628\u0627\u0644\u063A 500 \u0625\u062C\u0631\u0627\u0621 \u0625\u0639\u062C\u0627\u0628. \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631 \u062F\u0642\u064A\u0642\u0629 \u0648\u0627\u062D\u062F\u0629 \u062D\u062A\u0649 \u0627\u0644\u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629. \u064A\u0633\u062A\u0645\u0631 \u0627\u0644\u062D\u0630\u0641 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627.","\u062A\u0645 \u0628\u0644\u0648\u063A \u062D\u062F X \u0627\u0644\u0628\u0627\u0644\u063A 500 \u0625\u062C\u0631\u0627\u0621 \u0625\u0639\u062C\u0627\u0628. \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631 {minutes} \u062F\u0642\u064A\u0642\u0629 \u062D\u062A\u0649 \u0627\u0644\u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629. \u064A\u0633\u062A\u0645\u0631 \u0627\u0644\u062D\u0630\u0641 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627.","\u0641\u062A\u062D \u0642\u0627\u0626\u0645\u0629 \u0623\u0648\u0627\u0645\u0631 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0641\u064A Aviary","\u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u0639\u0628\u0631 \u0627\u0644\u0645\u0632\u0648\u0651\u062F","\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u0646\u0641\u064A\u0630\u2026","\u062A\u0645 \u0646\u0633\u062E \u0627\u0644\u0646\u062A\u064A\u062C\u0629 \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0646\u0633\u062E \u0627\u0644\u0646\u062A\u064A\u062C\u0629. \u062D\u0638\u0631 \u0645\u062A\u0635\u0641\u062D\u0643 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629.","\u0644\u0645 \u064A\u0633\u062A\u062C\u0628 \u0627\u0644\u0645\u0632\u0648\u0651\u062F","\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0645\u0641\u062A\u0627\u062D \u0648\u0627\u0644\u0646\u0645\u0648\u0630\u062C \u0641\u064A \u0627\u0644\u062A\u0643\u0627\u0645\u0644\u0627\u062A.","\u062A\u0645 \u0646\u0633\u062E \u0627\u0644\u0645\u0637\u0627\u0644\u0628\u0629 \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629. \u0627\u0644\u0635\u0642\u0647\u0627 \u0641\u064A \u0645\u0633\u0627\u0639\u062F\u0643.","\u062A\u0639\u0630\u0651\u0631 \u0646\u0633\u062E \u0627\u0644\u0645\u0637\u0627\u0644\u0628\u0629. \u062D\u0638\u0631 \u0645\u062A\u0635\u0641\u062D\u0643 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062D\u0627\u0641\u0638\u0629.","\u0645\u0631\u0627\u062C\u0639\u0629 \u0637\u0644\u0628 \u0630\u0643\u0627\u0621 \u0627\u0635\u0637\u0646\u0627\u0639\u064A \u062E\u0627\u0631\u062C\u064A","\u0644\u0646 \u064A\u064F\u0631\u0633\u0644 \u0634\u064A\u0621 \u062D\u062A\u0649 \u062A\u062E\u062A\u0627\u0631 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0637\u0644\u0628.","\u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F","\u064A\u062E\u0632\u0646 Aviary \u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0641\u0642\u0637\u061B \u0648\u062A\u062E\u0636\u0639 \u0645\u062F\u0629 \u0627\u062D\u062A\u0641\u0627\u0638 \u0627\u0644\u0645\u0632\u0648\u0651\u062F \u0644\u0633\u064A\u0627\u0633\u0627\u062A\u0647.","\u062D\u0638\u0631\u062A \u0627\u0644\u0645\u064A\u0632\u0627\u0646\u064A\u0629 \u0647\u0630\u0627 \u0627\u0644\u0637\u0644\u0628.","\u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0637\u0644\u0628","\u062A\u0631\u062C\u0645\u0629","\u064A\u062A\u0631\u062C\u0645 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u0645\u062D\u062F\u062F \u0625\u0644\u0649 \u0644\u063A\u062A\u0643 \u0627\u0644\u062D\u0627\u0644\u064A\u0629.","\u062A\u0644\u062E\u064A\u0635","\u064A\u0644\u062E\u0651\u0635 \u0633\u0644\u0633\u0644\u0629 \u0623\u0648 \u0645\u0646\u0634\u0648\u0631\u064B\u0627 \u0637\u0648\u064A\u0644\u064B\u0627 \u0641\u064A \u062B\u0644\u0627\u062B \u0646\u0642\u0627\u0637.","\u0634\u0631\u062D","\u064A\u0634\u0631\u062D \u0627\u0644\u0633\u064A\u0627\u0642 \u0648\u0627\u0644\u0645\u0635\u0637\u0644\u062D\u0627\u062A \u0648\u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062A \u0627\u0644\u0648\u0627\u0631\u062F\u0629 \u0641\u064A \u0627\u0644\u0645\u0646\u0634\u0648\u0631.","\u0645\u0637\u0627\u0644\u0628\u0629 \u0644\u0644\u062A\u062D\u0642\u0642","\u064A\u0646\u0634\u0626 \u0645\u0637\u0627\u0644\u0628\u0629 \u0644\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 (\u0628\u0644\u0627 \u0627\u062A\u0635\u0627\u0644 \u0628\u0627\u0644\u0634\u0628\u0643\u0629 \u0645\u0646 \u062F\u0648\u0646 \u0645\u0641\u062A\u0627\u062D\u0643).","\u0627\u0644\u0645\u0642\u062A\u0637\u0641\u0627\u062A","\u0641\u062A\u062D \u0645\u0642\u062A\u0637\u0641\u0627\u062A \u0645\u062D\u0631\u0651\u0631 Aviary","\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u0642\u062A\u0637\u0641\u0627\u062A \u0628\u0639\u062F. \u0623\u0636\u0650\u0641\u0647\u0627 \u0645\u0646 \u0645\u0631\u0643\u0632 \u0627\u0644\u062A\u062D\u0643\u0645 \u2190 \u0627\u0644\u0645\u0643\u062A\u0628\u0629.","\u0627\u0646\u0642\u0631 \u062F\u0627\u062E\u0644 \u0627\u0644\u0645\u062D\u0631\u0651\u0631 \u0623\u0648\u0644\u064B\u0627\u060C \u062B\u0645 \u0627\u062E\u062A\u0631 \u0645\u0642\u062A\u0637\u0641\u064B\u0627.","Aviary \u0645\u064F\u0641\u0639\u064E\u0651\u0644","\u0647\u0646\u0627\u0643 \u0623\u0645\u0631\u0627\u0646 \u0645\u064F\u0641\u0639\u064E\u0651\u0644\u0627\u0646 \u0645\u0646\u0630 \u0627\u0644\u0628\u062F\u0627\u064A\u0629. \u064A\u0628\u0642\u0649 \u0643\u0644 \u0645\u0627 \u0639\u062F\u0627\u0647\u0645\u0627 \u0645\u062A\u0648\u0642\u0641\u064B\u0627 \u062D\u062A\u0649 \u062A\u064F\u0641\u0639\u0650\u0651\u0644\u0647 \u0628\u0646\u0641\u0633\u0643.","\u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u0645\u0645\u0648\u064E\u0651\u0644\u0629 \u0648\u0627\u0644\u0627\u062A\u062C\u0627\u0647\u0627\u062A \u0627\u0644\u0645\u064F\u0631\u0648\u064E\u0651\u062C\u0629 \u0648\u0627\u0644\u0625\u0639\u0644\u0627\u0646\u0627\u062A \u0627\u0644\u062A\u0645\u0647\u064A\u062F\u064A\u0629 \u0645\u062E\u0641\u064A\u0629.","\u062A\u062D\u0635\u0644 \u0627\u0644\u0635\u0648\u0631 \u0648\u0645\u0642\u0627\u0637\u0639 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0639\u0644\u0649 \u0632\u0631 \u062A\u0646\u0632\u064A\u0644 \u0644\u0627 \u064A\u0639\u0645\u0644 \u0625\u0644\u0627 \u0639\u0646\u062F \u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u064A\u0647.","\u0627\u0641\u062A\u062D Aviary \u0645\u0646 \u0622\u062E\u0631 \u0635\u0641 \u0641\u064A \u0634\u0631\u064A\u0637 \u0627\u0644\u062A\u0646\u0642\u0644 \u0627\u0644\u0623\u064A\u0633\u0631 \u0641\u064A X \u0644\u062A\u063A\u064A\u064A\u0631 \u0623\u064A \u0645\u0646 \u0630\u0644\u0643.","\u062D\u0633\u0646\u064B\u0627","\u062A\u062C\u0627\u0648\u0632\u062A \u0645\u0643\u062A\u0628\u062A\u0643 \u0627\u0644\u0645\u062D\u0644\u064A\u0629 \u0628\u0627\u0644\u0641\u0639\u0644 \u062D\u062F \u0627\u0644\u062A\u062E\u0632\u064A\u0646 \u0627\u0644\u0630\u064A \u062D\u062F\u0651\u062F\u062A\u0647. \u0644\u0645 \u064A\u064F\u062D\u0630\u0641 \u0634\u064A\u0621.","\u064A\u062A\u062C\u0627\u0648\u0632 \u0647\u0630\u0627 \u0627\u0644\u0627\u0644\u062A\u0642\u0627\u0637\u064F \u0628\u0645\u0643\u062A\u0628\u062A\u0643 \u0627\u0644\u0645\u062D\u0644\u064A\u0629 \u062D\u062F\u064E\u0651 \u0627\u0644\u062A\u062E\u0632\u064A\u0646 \u0627\u0644\u0630\u064A \u062D\u062F\u0651\u062F\u062A\u0647. \u0644\u0645 \u064A\u064F\u062D\u0630\u0641 \u0634\u064A\u0621.","\u0623\u0635\u0644\u064A\u0629","\u0627\u0642\u062A\u0628\u0627\u0633\u0627\u062A","\u0645\u064F\u0635\u0641\u0651\u0627\u0629","\u0627\u0644\u0643\u0644","\u0641\u0626\u0627\u062A \u0627\u0644\u0645\u0644\u062E\u0651\u0635","\u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629","\u0625\u063A\u0644\u0627\u0642 \u0627\u0644\u0645\u0644\u062E\u0651\u0635","\u0627\u0644\u0645\u062F\u0629","\u0627\u0644\u062A\u0631\u062A\u064A\u0628","\u0627\u0644\u0623\u062D\u062F\u062B \u0623\u0648\u0644\u0627\u064B","\u0627\u0644\u0623\u0642\u062F\u0645 \u0623\u0648\u0644\u0627\u064B","\u0627\u0644\u0623\u0642\u0644 \u0643\u062B\u0627\u0641\u0629 \u0623\u0648\u0644\u0627\u064B","\u0627\u0644\u062A\u062C\u0645\u064A\u0639 \u062D\u0633\u0628 \u0627\u0644\u062D\u0633\u0627\u0628","\u0645\u062F\u0629 \u0647\u0627\u062F\u0626\u0629. \u0644\u0627 \u062C\u062F\u064A\u062F \u0644\u0645\u0631\u0627\u062C\u0639\u062A\u0647.","\u0644\u0627 \u0634\u064A\u0621 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0645\u062F\u0629.","\u0644\u0627 \u064A\u062A\u0636\u0645\u0646 \u0627\u0644\u0645\u0644\u062E\u0651\u0635 \u0625\u0644\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u0639\u0631\u0636\u0647\u0627 Aviary \u0628\u0627\u0644\u0641\u0639\u0644. \u0648\u0644\u0627 \u064A\u0637\u0644\u0628 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 X.","\u0647\u0630\u0627 \u0643\u0644 \u0634\u064A\u0621.","\u062D\u0633\u0627\u0628 \u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641","\u0635\u0648\u0631\u0629","\u0635\u0648\u062A","\u062A\u0631\u062C\u0645\u0627\u062A","\u0635\u0648\u0631\u0629 \u0645\u0635\u063A\u0651\u0631\u0629","\u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0645\u0639\u0627\u064A\u0646\u0629","\u0641\u062A\u062D \u0627\u0644\u062A\u0631\u062C\u0645\u0627\u062A","\u0641\u062A\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631","\u0623\u0647\u0645 \u0627\u0644\u0631\u0648\u0627\u0628\u0637","\u0645\u0646\u0634\u0648\u0631 \u0631\u0622\u0647 Aviary \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0645\u062F\u0629","\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0631\u0622\u0647\u0627 Aviary \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0645\u062F\u0629","\u0645\u0634\u0627\u0631\u0643\u0629","\u0645\u0634\u0627\u0631\u0643\u0627\u062A","\u062F\u0648\u0646 \u062D\u062F\u0651\u0643 \u0627\u0644\u0623\u062F\u0646\u0649 \u0644\u0644\u062A\u0641\u0627\u0639\u0644","\u0645\u062E\u0641\u064A: \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0635\u0648\u0631\u0629","\u0645\u062E\u0641\u064A: \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0645\u0642\u0637\u0639 \u0641\u064A\u062F\u064A\u0648","\u0645\u062E\u0641\u064A: \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0635\u0648\u0631\u0629 GIF","\u0645\u062E\u0641\u064A: \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0645\u0646 \u062D\u0633\u0627\u0628 \u0645\u0648\u062B\u064E\u0651\u0642","\u0645\u062E\u0641\u064A: \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u064A\u0642\u062A\u0628\u0633 \u0645\u0646\u0634\u0648\u0631\u064B\u0627 \u0622\u062E\u0631","\u0645\u064F\u0639\u062A\u064E\u0651\u0645 \u0628\u0642\u0627\u0639\u062F\u062A\u0643","\u0645\u062E\u0641\u064A \u0628\u0642\u0627\u0639\u062F\u062A\u0643","\u0645\u064F\u0639\u062A\u064E\u0651\u0645 \u0628\u0643\u0644\u0645\u062A\u0643 \u0627\u0644\u0645\u0641\u062A\u0627\u062D\u064A\u0629","\u0645\u062E\u0641\u064A \u0628\u0643\u0644\u0645\u062A\u0643 \u0627\u0644\u0645\u0641\u062A\u0627\u062D\u064A\u0629","\u0645\u064F\u0639\u062A\u064E\u0651\u0645 \u0628\u0646\u0645\u0637\u0643","\u0645\u062E\u0641\u064A \u0628\u0646\u0645\u0637\u0643","\u0625\u062E\u0641\u0627\u0621 \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631","\u062A\u0645 \u0625\u062E\u0641\u0627\u0621 \u0627\u0644\u0645\u0646\u0634\u0648\u0631","\u062A\u0639\u0630\u0651\u0631 \u062D\u0641\u0638 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u0645\u062E\u0641\u064A. \u0631\u0641\u0636 \u0627\u0644\u062A\u062E\u0632\u064A\u0646 \u0639\u0645\u0644\u064A\u0629 \u0627\u0644\u0643\u062A\u0627\u0628\u0629.","\u062A\u0631\u0627\u062C\u0639","\u062A\u0639\u0630\u0651\u0631\u062A \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0630\u0644\u0643 \u0627\u0644\u0645\u0646\u0634\u0648\u0631.","\u062E\u0627\u0631\u062C \u0633\u0627\u0639\u0627\u062A \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u062E\u0627\u0635\u0629 \u0628\u0643","\u064A\u063A\u0637\u064A Aviary \u0627\u0644\u062E\u0637 \u0627\u0644\u0632\u0645\u0646\u064A \u062D\u062A\u0649 \u0641\u062A\u0631\u062A\u0643 \u0627\u0644\u062A\u0627\u0644\u064A\u0629. \u0644\u0645 \u064A\u064F\u062D\u062C\u0628 \u0634\u064A\u0621 \u0648\u0644\u0645 \u064A\u063A\u0627\u062F\u0631 \u0634\u064A\u0621 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632.","\u062F\u0639\u0646\u064A \u0623\u0645\u0631\u0651 \u0644\u062E\u0645\u0633 \u062F\u0642\u0627\u0626\u0642","\u0627\u0644\u0636\u063A\u0637 \u0639\u0644\u0649 \u0627\u0644\u0635\u0641 \u0645\u0639\u0637\u064E\u0651\u0644. \u0623\u064A\u0642\u0648\u0646\u0629 \u0627\u0644\u0631\u062F \u0647\u064A \u0627\u0644\u062A\u064A \u062A\u0641\u062A\u062D \u0627\u0644\u0645\u0646\u0634\u0648\u0631.","\u0639\u0631\u0636 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A","\u0641\u0634\u0644 \u062D\u0641\u0638 \u0627\u0644\u0625\u0634\u0627\u0631\u0629 \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629.","\u062D\u0641\u0638 \u0645\u062D\u0644\u064A\u064B\u0627","\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0625\u0634\u0627\u0631\u0629 \u0627\u0644\u0645\u0631\u062C\u0639\u064A\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629","\u0646\u0633\u062E \u0627\u0644\u0631\u0627\u0628\u0637","\u0627\u0646\u0633\u062E \u0631\u0627\u0628\u0637 \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631","\u0644\u0627 \u064A\u062D\u062A\u0648\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0639\u0644\u0649 \u0631\u0627\u0628\u0637 \u064A\u0645\u0643\u0646 \u0644\u0640 Aviary \u0646\u0633\u062E\u0647.","\u062A\u0645 \u0627\u0644\u0646\u0633\u062E","\u0641\u0634\u0644","\u0631\u0641\u0636\u062A \u0627\u0644\u062D\u0627\u0641\u0638\u0629 \u0647\u0630\u0647 \u0627\u0644\u0646\u0633\u062E\u0629.","\u0645\u0644\u0627\u062D\u0638\u0629","\u0648\u0633\u0645","\u0623\u0641\u0636\u0644 \u062C\u0648\u062F\u0629 \u0645\u0628\u0627\u0634\u0631\u0629","\u0644\u0645 \u064A\u062A\u0645 \u0645\u0646\u062D \u0625\u0630\u0646 \u0627\u0644\u062A\u0646\u0632\u064A\u0644. \u0627\u0641\u062A\u062D \u062E\u064A\u0627\u0631\u0627\u062A Aviary \u0644\u062A\u0645\u0643\u064A\u0646 \u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0627\u0644\u0645\u062A\u0635\u0641\u062D.","\u0641\u0634\u0644 \u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0648\u0633\u0627\u0626\u0637. \u062D\u0627\u0648\u0644 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u0632\u0631 \u0627\u0644\u0645\u0648\u062C\u0648\u062F \u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631.","\u0627\u0646\u0642\u0631 \u0628\u0632\u0631 \u0627\u0644\u0645\u0627\u0648\u0633 \u0627\u0644\u0623\u064A\u0645\u0646 \u0639\u0644\u0649 \u0635\u0648\u0631\u0629 \u0623\u0648 \u0641\u064A\u062F\u064A\u0648 \u0623\u0648\u0644\u0627\u064B\u060C \u062B\u0645 \u0627\u062E\u062A\u0631 \u062A\u0646\u0632\u064A\u0644 Aviary.","\u062A\u0646\u0632\u064A\u0644 \xB7 \u0623\u0641\u0636\u0644 \u0645\u0644\u0641 MP4 \u0645\u0628\u0627\u0634\u0631","\u062A\u0646\u0632\u064A\u0644","\u064A\u0646\u0632\u0651\u0644 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u062E\u0627\u0635\u0629 \u0628\u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631. \u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u0645\u0642\u062A\u0628\u0633 \u0648\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0644\u0647\u0627 \u0632\u0631 \u062A\u0646\u0632\u064A\u0644 \u062E\u0627\u0635 \u0628\u0647\u0627.","\u062A\u0646\u0632\u064A\u0644 \u0643\u0644 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631","\u0644\u0627 \u064A\u0632\u0627\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u0645\u0628\u0627\u0634\u0631 \u0642\u064A\u062F \u0627\u0644\u062A\u062D\u0645\u064A\u0644. \u062D\u0627\u0648\u0644 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0628\u0639\u062F \u0642\u0644\u064A\u0644.","\u0646\u0633\u062E \u0627\u0644\u0631\u0648\u0627\u0628\u0637","\u0646\u0633\u062E \u0623\u0641\u0636\u0644 \u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0645\u0628\u0627\u0634\u0631\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631","\u062A\u0643\u064A\u0651\u0641\u064A","\u0625\u0631\u0633\u0627\u0644 \u0625\u0644\u0649 yt-dlp","\u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u062A\u0643\u064A\u0651\u0641\u064A \u0627\u0644\u0645\u0631\u0635\u0648\u062F \u0625\u0644\u0649 yt-dlp \u0627\u0644\u0645\u062D\u0644\u064A","\u0646\u0633\u062E \u0623\u0645\u0631 yt-dlp","\u0646\u0633\u062E \u0623\u0645\u0631 yt-dlp \u0644\u0644\u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u062A\u0643\u064A\u0651\u0641\u064A \u0627\u0644\u0645\u0631\u0635\u0648\u062F","\u0641\u064A\u062F\u064A\u0648 \u062A\u0643\u064A\u0651\u0641\u064A \u0628\u062C\u0648\u062F\u0629 \u0623\u0639\u0644\u0649","\u062C\u0627\u0631\u064D \u0627\u0644\u0625\u0631\u0633\u0627\u0644\u2026","\u0645\u0631\u0641\u0648\u0636","\u0631\u0641\u0636 \u0645\u0633\u0627\u0639\u062F yt-dlp \u0627\u0644\u0645\u062D\u0644\u064A \u0647\u0630\u0647 \u0627\u0644\u0645\u0647\u0645\u0629.","\u0623\u062E\u0641\u0642 \u0645\u0633\u0627\u0639\u062F yt-dlp \u0627\u0644\u0645\u062D\u0644\u064A.","\u062A\u0645 \u0627\u0644\u062D\u0641\u0638","\u062D\u0641\u0638 yt-dlp \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u062A\u0643\u064A\u0651\u0641\u064A.","\u0645\u0641\u0642\u0648\u062F","\u0644\u0645 \u062A\u0639\u062F \u0645\u0647\u0645\u0629 yt-dlp \u0645\u062A\u0627\u062D\u0629. \u0627\u0646\u0633\u062E \u0627\u0644\u0623\u0645\u0631 \u0644\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.","\u062A\u0639\u0630\u0651\u0631 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0645\u0633\u0627\u0639\u062F yt-dlp \u0627\u0644\u0645\u062D\u0644\u064A.","\u062A\u0645 \u0646\u0633\u062E \u0623\u0645\u0631 yt-dlp.","\u062A\u0639\u0630\u0651\u0631 \u0646\u0633\u062E \u0623\u0645\u0631 yt-dlp.","\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u0646\u0632\u064A\u0644\u2026","\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629","\u063A\u064A\u0631 \u0645\u062A\u0627\u062D","\u0628\u062F\u0623","\u0644\u0627 \u064A\u0632\u0627\u0644 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u064A\u0646\u0642\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u0641. \u0631\u0627\u062C\u0639 \u062A\u0646\u0632\u064A\u0644\u0627\u062A\u0643 \u0644\u0645\u0639\u0631\u0641\u0629 \u0627\u0644\u0646\u062A\u064A\u062C\u0629.","\u0641\u062A\u062D \u0645\u062A\u0635\u0641\u062D\u0643 \u0627\u0644\u0645\u0644\u0641 \u0628\u062F\u0644 \u062D\u0641\u0638\u0647. \u0627\u0645\u0646\u062D Aviary \u0625\u0630\u0646 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 \u0644\u064A\u062D\u0641\u0638\u0647 \u0641\u0639\u0644\u064A\u064B\u0627.","\u062A\u0645 \u0627\u0644\u062A\u062E\u0637\u064A \u0644\u0623\u0646 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0646\u0632\u0644\u0629 \u062A\u0637\u0627\u0628\u0642 \u0639\u0646\u0635\u0631\u064B\u0627 \u0641\u064A \u0627\u0644\u0633\u062C\u0644.","\u062A\u0645 \u0627\u0644\u062A\u062E\u0637\u064A \u0644\u0623\u0646 \u0627\u0644\u0635\u0648\u0631\u0629 \u062A\u0634\u0628\u0647 \u0639\u0646\u0635\u0631\u064B\u0627 \u0641\u064A \u0627\u0644\u0633\u062C\u0644.","\u062A\u0645 \u0627\u0644\u062A\u062E\u0637\u064A \u0644\u0623\u0646 \u0647\u0630\u0627 \u0647\u0648 \u0648\u0633\u064A\u0637 X \u0646\u0641\u0633\u0647 \u0628\u062D\u062C\u0645 \u0622\u062E\u0631.","\u064A\u062D\u062A\u0627\u062C Aviary \u0625\u0644\u0649 \u0625\u0630\u0646 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 \u0645\u0646 \u0627\u0644\u0645\u062A\u0635\u0641\u062D. \u064A\u062C\u0631\u064A \u0641\u062A\u062D \u0635\u0641\u062D\u0629 \u0627\u0644\u062E\u064A\u0627\u0631\u0627\u062A.","\u0625\u0639\u0627\u062F\u0629 \u0645\u062D\u0627\u0648\u0644\u0629 \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0623\u0635\u0644\u064A\u0629","\u062A\u0645 \u062A\u0646\u0632\u064A\u0644\u0647 \u0633\u0627\u0628\u0642\u064B\u0627","\u0627\u0644\u062C\u0648\u062F\u0629 \u0627\u0644\u0623\u0635\u0644\u064A\u0629","\u062C\u0648\u062F\u0629 \u0628\u062F\u064A\u0644\u0629. \u0627\u0646\u0642\u0631 \u0644\u0625\u0639\u0627\u062F\u0629 \u0645\u062D\u0627\u0648\u0644\u0629 \u0627\u0644\u0623\u0635\u0644\u064A\u0629","\u0623\u0641\u0636\u0644 \u062C\u0648\u062F\u0629 \u0645\u0628\u0627\u0634\u0631\u0629","\u0627\u0644\u062C\u0648\u062F\u0629 \u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641\u0629","\u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u063A\u064A\u0631 \u0645\u062A\u0627\u062D\u0629 \u0644\u0644\u062A\u0646\u0632\u064A\u0644.","\u0627\u0644\u0633\u0645\u0627\u062D","\u0627\u0644\u0623\u0630\u0648\u0646\u0627\u062A","\u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062A\u0646\u0632\u064A\u0644","\u0641\u0639\u0651\u0644 \u0627\u0644\u0623\u0630\u0648\u0646\u0627\u062A \u0627\u0644\u062A\u064A \u064A\u062D\u062A\u0627\u062C\u0647\u0627 Aviary \u0644\u062A\u0646\u0632\u064A\u0644 \u0645\u0642\u0627\u0637\u0639 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0648\u0627\u0644\u0635\u0648\u0631 \u0628\u0623\u0641\u0636\u0644 \u062C\u0648\u062F\u0629. \u0644\u0627 \u064A\u063A\u0627\u062F\u0631 \u0623\u064A \u0634\u064A\u0621 \u0645\u062A\u0635\u0641\u062D\u0643.","\u062C\u0627\u0647\u0632\u064A\u0629 \u0627\u0644\u062A\u0646\u0632\u064A\u0644","\u0645\u0645\u0646\u0648\u062D","\u0627\u062E\u062A\u064A\u0627\u0631\u064A","\u0643\u0644\u0647\u0627 \u0627\u062E\u062A\u064A\u0627\u0631\u064A\u0629. \u0623\u0646\u062A \u0627\u0644\u0645\u062A\u062D\u0643\u0645.","\u062D\u0641\u0638 \u0645\u0642\u0627\u0637\u0639 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0648\u0627\u0644\u0635\u0648\u0631","\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0642\u0642\u2026","\u064A\u062D\u0641\u0638 \u0623\u0641\u0636\u0644 \u0641\u064A\u062F\u064A\u0648 \u0623\u0648 \u0635\u0648\u0631\u0629 \u0645\u062A\u0627\u062D\u0629 \u0639\u0628\u0631 \u0645\u062A\u0635\u0641\u062D\u0643 \u0648\u0641\u0642 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0633\u0645 \u0627\u0644\u0645\u0644\u0641 \u0648\u0627\u0644\u062A\u0643\u0631\u0627\u0631.","\u0645\u0646\u062D \u0625\u0630\u0646 \u0627\u0644\u062A\u0646\u0632\u064A\u0644","\u0633\u062D\u0628 \u0627\u0644\u0625\u0630\u0646","\u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0623\u0635\u0644\u064A\u0629 \u0645\u0628\u0627\u0634\u0631\u0629","\u064A\u062A\u064A\u062D \u0644\u0640 Aviary \u062C\u0644\u0628 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0628\u0627\u0644\u062D\u062C\u0645 \u0627\u0644\u0643\u0627\u0645\u0644 \u0645\u0628\u0627\u0634\u0631\u0629. \u062A\u0638\u0644 \u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 \u0639\u0627\u0645\u0644\u0629 \u0645\u0646 \u062F\u0648\u0646 \u0647\u0630\u0627 \u0627\u0644\u0625\u0630\u0646.","\u0645\u0646\u062D \u062E\u0648\u0627\u062F\u0645 \u0627\u0644\u0648\u0633\u0627\u0626\u0637","\u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0645\u0633\u0627\u0639\u062F yt-dlp \u0627\u0644\u0645\u062D\u0644\u064A","\u0644\u0645\u0633\u0627\u0639\u062F yt-dlp \u0627\u0644\u0627\u062E\u062A\u064A\u0627\u0631\u064A \u0641\u0642\u0637. \u064A\u062A\u0648\u0627\u0635\u0644 Aviary \u0645\u0639\u0647 \u0645\u0646 \u0627\u0644\u0625\u0636\u0627\u0641\u0629\u060C \u0644\u0630\u0644\u0643 \u0644\u0627 \u064A\u0637\u0644\u0628 Chrome \u0645\u0646 x.com \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0645\u062D\u0644\u064A\u0629.","\u0645\u0646\u062D \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u0633\u0627\u0639\u062F","\u0628\u062F\u0621 \u0627\u0644\u062A\u0646\u0632\u064A\u0644","\u0641\u0639\u0651\u0644 \u0627\u0644\u062D\u0641\u0638 \u0628\u0646\u0642\u0631\u0629 \u0648\u0627\u062D\u062F\u0629 \u0639\u0628\u0631 \u0645\u062A\u0635\u0641\u062D\u0643.","\u0641\u062A\u062D X","\u064A\u0636\u064A\u0641 Aviary \u0632\u0631 \u062A\u0646\u0632\u064A\u0644 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627 \u0625\u0644\u0649 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0648\u0633\u0627\u0626\u0637.","\u0627\u062E\u062A\u0631 \u062A\u0646\u0632\u064A\u0644","\u064A\u062E\u062A\u0627\u0631 Aviary \u0623\u0641\u0636\u0644 \u062C\u0648\u062F\u0629 \u0645\u062A\u0627\u062D\u0629.","\u0641\u062A\u062D X \u0644\u0644\u062A\u0646\u0632\u064A\u0644","\u062E\u0627\u0635 \u0627\u0641\u062A\u0631\u0627\u0636\u064A\u064B\u0627","\u0644\u0627 \u064A\u063A\u0627\u062F\u0631 \u0623\u064A \u0634\u064A\u0621 \u0645\u062A\u0635\u0641\u062D\u0643.","\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0648\u0639\u0648\u0627\u0645\u0644 \u0627\u0644\u062A\u0635\u0641\u064A\u0629 \u0648\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0648\u0627\u0644\u0623\u0631\u0634\u064A\u0641 \u0645\u0648\u062C\u0648\u062F\u0629 \u0641\u064A \u0645\u0631\u0643\u0632 \u0627\u0644\u062A\u062D\u0643\u0645 \u0639\u0644\u0649 x.com. \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629 \u062A\u062F\u064A\u0631 \u0623\u0630\u0648\u0646\u0627\u062A \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0641\u0642\u0637.","\u0644\u0627 \u064A\u0648\u0641\u0651\u0631 \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0623\u0630\u0648\u0646\u0627\u062A.","\u062A\u0645 \u062A\u062C\u0627\u0647\u0644 \u0627\u0644\u0637\u0644\u0628. \u0644\u0645 \u064A\u062A\u063A\u064A\u0651\u0631 \u0634\u064A\u0621.","\u062A\u0645 \u0633\u062D\u0628 \u0627\u0644\u0625\u0630\u0646.","\u0644\u0627 \u064A\u0648\u062C\u062F \u0625\u0630\u0646 \u0644\u0633\u062D\u0628\u0647.","\u063A\u064A\u0631 \u0645\u0645\u0646\u0648\u062D","\u062A\u0645 \u0627\u0644\u0645\u0646\u062D. \u062A\u064F\u062D\u0641\u0638 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u0622\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u062A\u0635\u0641\u062D.","\u062A\u0645 \u0627\u0644\u0645\u0646\u062D. \u064A\u0645\u0643\u0646 \u0644\u0640 Aviary \u0627\u0644\u0622\u0646 \u0642\u0631\u0627\u0621\u0629 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0628\u0627\u0644\u062D\u062C\u0645 \u0627\u0644\u0643\u0627\u0645\u0644 \u0645\u0628\u0627\u0634\u0631\u0629\u064B \u0644\u0623\u063A\u0631\u0627\u0636 \u0627\u0644\u062A\u0635\u062F\u064A\u0631.","\u062A\u0645 \u0627\u0644\u0645\u0646\u062D. \u064A\u0635\u0644 Aviary \u0625\u0644\u0649 \u0627\u0644\u0645\u0633\u0627\u0639\u062F \u0627\u0644\u0645\u062D\u0644\u064A \u062F\u0648\u0646 \u0637\u0644\u0628 \u0645\u0646 \u0627\u0644\u0645\u062A\u0635\u0641\u062D.","Aviary \u0644\u0640 X","\u0645\u062D\u0633\u0651\u0646 \u0645\u062D\u0644\u064A \u0644\u0640 X/Twitter \u0645\u0639 \u0639\u0646\u0627\u0635\u0631 \u062A\u062D\u0643\u0645 \u0642\u0627\u0628\u0644\u0629 \u0644\u0644\u0639\u0643\u0633 \u0648\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u062E\u0635\u0648\u0635\u064A\u0629 \u0627\u0641\u062A\u0631\u0627\u0636\u064A\u0629.","\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 Aviary","\u0623\u0631\u0634\u064A\u0641 Aviary","\u0639\u0627\u0631\u0636 \u0623\u0631\u0634\u064A\u0641 \u0645\u062D\u0644\u064A. \u0644\u0627 \u064A\u062A\u0645 \u062C\u0644\u0628 \u0627\u0644\u0645\u0631\u0627\u062C\u0639 \u0627\u0644\u0628\u0639\u064A\u062F\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u0627\u064B.","\u0627\u0644\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0633\u062C\u0644\u0627\u062A","\u062D\u0627\u0644\u0629 \u0627\u0644\u0648\u0633\u0627\u0626\u0637","\u0643\u0644 \u0627\u0644\u0648\u0633\u0627\u0626\u0637","\u0627\u0644\u0628\u0627\u064A\u062A\u0627\u062A \u0627\u0644\u0645\u0644\u062A\u0642\u0637\u0629","\u0645\u0631\u062C\u0639 \u0628\u0639\u064A\u062F","\u0627\u0644\u0645\u0639\u0631\u0651\u0641","\u0639\u0631\u0636 \u0633\u0644\u0627\u0633\u0644 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629","\u0627\u0644\u0648\u0633\u0627\u0626\u0637","\u0633\u062C\u0644\u0627\u062A","\u0645\u0639\u0631\u0648\u0636\u0629","\u0644\u0627 \u062A\u0648\u062C\u062F \u0633\u062C\u0644\u0627\u062A \u0645\u0637\u0627\u0628\u0642\u0629.","\u0627\u0644\u0645\u0635\u062F\u0631","\u0628\u0627\u064A\u062A","SHA-256","\u0641\u062A\u062D \u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0645\u0635\u062F\u0631","\u0645\u0646\u0634\u0648\u0631\u0627\u062A","\u062C\u0627\u0647\u0632 \u0644\u0644\u0639\u0645\u0644 \u062F\u0648\u0646 \u0627\u062A\u0635\u0627\u0644","\u0642\u062F \u062A\u062A\u0637\u0644\u0628 \u0627\u0644\u0634\u0628\u0643\u0629","\u0645\u0646\u0634\u0648\u0631 \u063A\u064A\u0631 \u0645\u0644\u062A\u0642\u0637","\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u062A\u0642\u0627\u0637 \u0627\u0644\u0645\u0646\u0634\u0648\u0631 \u0627\u0644\u0623\u0635\u0644 \u0645\u062D\u0644\u064A\u064B\u0627.","\u0645\u062D\u0627\u062F\u062B\u0629","{count} \u0645\u0646\u0634\u0648\u0631 \u0628\u0648\u0627\u0633\u0637\u0629 {author}","\u0627\u0644\u0628\u062F\u0627\u064A\u0629","\u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u062D\u0633\u0627\u0628","\u0633\u062C\u0644","\u0623\u0630\u0648\u0646\u0627\u062A \u0627\u062E\u062A\u064A\u0627\u0631\u064A\u0629","\u0641\u0634\u0644 \u0627\u0644\u0625\u062C\u0631\u0627\u0621.","\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062A\u062D\u0643\u0645 \u0641\u064A \u0627\u0644\u0645\u0646\u0634\u0648\u0631","\u062A\u0633\u0645\u064A\u0629 \u0627\u0644\u0645\u0644\u0641\u0627\u062A","\u0633\u0644\u0648\u0643 \u0627\u0644\u062F\u064F\u0641\u0639\u0627\u062A","\u062D\u0627\u0644\u0629 \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631","\u0641\u064A \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631","\u062A\u064F\u0637\u0628\u0651\u0642 \u0627\u0644\u062C\u0648\u062F\u0629 \u0627\u0644\u0623\u0635\u0644\u064A\u0629 \u0639\u0646\u062F \u062A\u0641\u0639\u064A\u0644 \u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062A\u062D\u0643\u0645 \u0641\u064A \u0627\u0644\u062A\u0646\u0632\u064A\u0644.","\u062D\u0641\u0638 \u0627\u0644\u0642\u0627\u0626\u0645\u0629"],"he":["\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA Aviary","X \u05E9\u05E7\u05D8 \u05D9\u05D5\u05EA\u05E8. \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD.","\u05E1\u05D2\u05D9\u05E8\u05D4","Aviary","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D1\u05DE\u05D5\u05D3\u05E2\u05D5\u05EA, \u05D4\u05D5\u05E8\u05D3\u05D5\u05EA, \u05DE\u05E1\u05E0\u05E0\u05D9\u05DD \u05D5\u05E2\u05D5\u05D3","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D1\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA","\u05D1\u05D9\u05D8\u05D5\u05DC","\u05E9\u05DE\u05D9\u05E8\u05D4","\u05DE\u05EA\u05D2\u05D9\u05DD \u05D5\u05E9\u05D3\u05D5\u05EA \u05DE\u05DE\u05EA\u05D9\u05E0\u05D9\u05DD \u05DC\u05E9\u05DE\u05D9\u05E8\u05D4. \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9\u05DD \u05E4\u05D5\u05E2\u05DC\u05D9\u05DD \u05DE\u05D9\u05D3.","\u05E0\u05E9\u05DE\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA","\u05DE\u05E7\u05D8\u05E2\u05D9 \u05D4\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA","\u05DE\u05EA\u05D7\u05D9\u05DC\u05D9\u05DD \u05DB\u05D0\u05DF","\u05D4\u05D2\u05D3\u05E8\u05D4 \u05DE\u05D4\u05D9\u05E8\u05D4","\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D9\u05D5\u05DE\u05D9\u05D5\u05DE\u05D9","\u05DE\u05E8\u05D0\u05D4","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D3\u05E3","\u05DE\u05E1\u05E0\u05E0\u05D9 \u05EA\u05D5\u05DB\u05DF","\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA","\u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05DA","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DE\u05D5\u05E8\u05D9\u05DD","\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D5\u05D9\u05D9\u05E6\u05D5\u05D0","\u05DE\u05D7\u05D9\u05E7\u05EA \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D1-X","\u05DB\u05DC\u05D9\u05DD \u05E0\u05D5\u05E1\u05E4\u05D9\u05DD","\u05D4\u05E9\u05DC\u05DE\u05EA \u05E4\u05E2\u05E8\u05D9\u05DD","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD","\u05D4\u05E4\u05E2\u05DC\u05EA \u05D5\u05D9\u05D3\u05D0\u05D5","\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF X","\u05D7\u05D9\u05D1\u05D5\u05E8\u05D9\u05DD","\u05D2\u05D9\u05D1\u05D5\u05D9 \u05D5\u05D0\u05D9\u05E4\u05D5\u05E1","\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA \u05D5\u05D0\u05D1\u05D7\u05D5\u05DF","\u05D0\u05D9\u05DA \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05E4\u05D5\u05E2\u05DC\u05EA","\u05DE\u05EA\u05D2\u05D9\u05DD \u05D5\u05E9\u05D3\u05D5\u05EA \u05DE\u05DE\u05EA\u05D9\u05E0\u05D9\u05DD \u05DC\u05E9\u05DE\u05D9\u05E8\u05D4. \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9\u05DD \u05DB\u05DE\u05D5 \u05D4\u05D7\u05DC\u05D4, \u05D9\u05D9\u05E6\u05D5\u05D0, \u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05D5\u05DE\u05D7\u05D9\u05E7\u05D4 \u05E4\u05D5\u05E2\u05DC\u05D9\u05DD \u05DE\u05D9\u05D3.","\u05E4\u05EA\u05D9\u05D7\u05EA \u05D4\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA","\u05DC\u05D4\u05E4\u05D5\u05DA \u05D0\u05EA X \u05DC\u05E9\u05E7\u05D8 \u05D9\u05D5\u05EA\u05E8","\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05D5\u05D3\u05E2\u05D5\u05EA, \u05E0\u05D5\u05E9\u05D0\u05D9\u05DD \u05D7\u05DE\u05D9\u05DD, \u05D4\u05E6\u05E2\u05D5\u05EA \u05D5\u05E4\u05E8\u05D9\u05D8\u05D9 \u05E0\u05D9\u05D5\u05D5\u05D8 \u05E9\u05D0\u05D9\u05E0\u05DD \u05D1\u05E9\u05D9\u05DE\u05D5\u05E9.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DC\u05D0 \u05E8\u05E6\u05D5\u05D9\u05D9\u05DD","\u05E1\u05D9\u05E0\u05D5\u05DF \u05DC\u05E4\u05D9 \u05DE\u05D9\u05DC\u05D9\u05DD, \u05DE\u05D3\u05D9\u05D4, \u05EA\u05D2\u05D9\u05DD \u05D0\u05D5 \u05D3\u05E3.","\u05E9\u05DE\u05D9\u05E8\u05EA \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05D5\u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD","\u05D1\u05D7\u05D9\u05E8\u05EA \u05D0\u05D9\u05DB\u05D5\u05EA, \u05E9\u05DE\u05D5\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD, \u05D1\u05D3\u05D9\u05E7\u05EA \u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05D5\u05D4\u05EA\u05E0\u05D4\u05D2\u05D5\u05EA \u05D4\u05EA\u05D5\u05E8.","\u05DE\u05D7\u05D9\u05E7\u05EA \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF","\u05D4\u05E1\u05E8 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD, \u05EA\u05D2\u05D5\u05D1\u05D5\u05EA, \u05E4\u05E8\u05E1\u05D5\u05DE\u05D9\u05DD \u05DE\u05D7\u05D3\u05E9, \u05DC\u05D9\u05D9\u05E7\u05D9\u05DD \u05D0\u05D5 \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA.","\u05E7\u05E8\u05D9\u05D0\u05D4 \u05E9\u05E7\u05D8\u05D4","\u05DE\u05E1\u05EA\u05D9\u05E8 \u05DE\u05D2\u05DE\u05D5\u05EA, \u05D2\u05D1\u05D5\u05DC\u05D5\u05EA \u05E9\u05D5\u05E8\u05D4 \u05D5\u05DE\u05D5\u05E0\u05D9 \u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA, \u05DE\u05E2\u05DE\u05E2\u05DD \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DC \u05E4\u05E8\u05D9\u05DE\u05D9\u05D5\u05DD, \u05DE\u05E0\u05E7\u05D4 \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 t.co, \u05E2\u05E8\u05DB\u05D4 \u05E6\u05E4\u05D5\u05E4\u05D4 \u05D5\u05DB\u05D4\u05D4.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05E1\u05E8\u05D2\u05DC \u05D4\u05E6\u05D3","\u05DE\u05D5\u05E4\u05E2\u05DC","\u05D3\u05D9\u05DB\u05D5\u05D9 \u05EA\u05E6\u05D5\u05D2\u05D5\u05EA \u05DE\u05E7\u05D3\u05D9\u05DE\u05D5\u05EA \u05D1\u05E8\u05D9\u05D7\u05D5\u05E3","\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05D5\u05E0\u05D9 \u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA","\u05E2\u05E8\u05DB\u05EA \u05E0\u05D5\u05E9\u05D0","\u05E2\u05DE\u05D5\u05DD","\u05D4\u05D7\u05DC\u05D4","\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05DE\u05D3\u05D9\u05D4","\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05D1\u05D0\u05D9\u05DB\u05D5\u05EA \u05DE\u05E7\u05D5\u05E8\u05D9\u05EA, \u05E9\u05DE\u05D5\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD \u05E2\u05E7\u05D1\u05D9\u05D9\u05DD, \u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4 \u05DC\u05DC\u05D0 \u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA, \u05DE\u05D3\u05D9\u05D4 \u05D1\u05E4\u05E8\u05D9\u05E1\u05D4 \u05DE\u05D5\u05E2\u05E8\u05DE\u05EA.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D0\u05D9\u05DB\u05D5\u05EA \u05DE\u05E7\u05D5\u05E8\u05D9\u05EA","\u05E4\u05E8\u05D9\u05E1\u05EA \u05DE\u05D3\u05D9\u05D4","\u05DE\u05D5\u05E2\u05E8\u05DD","\u05D4\u05E6\u05D2\u05EA \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05D4\u05D5\u05E8\u05D3\u05D4","\u05D9\u05D5\u05E6\u05E8","\u05DE\u05E6\u05D1 \u05DB\u05EA\u05D9\u05D1\u05D4, \u05E7\u05D8\u05E2\u05D9 \u05D8\u05E7\u05E1\u05D8 \u05D1\u05E2\u05D5\u05E8\u05DA, \u05E0\u05D9\u05E7\u05D5\u05D9 \u05DB\u05E4\u05EA\u05D5\u05E8 \u05D4\u05E9\u05D9\u05EA\u05D5\u05E3, \u05D4\u05E1\u05EA\u05E8\u05EA \u05E1\u05E8\u05D2\u05DC \u05E6\u05D3 \u05D5\u05DE\u05D2\u05DE\u05D5\u05EA.","\u05DE\u05E6\u05D1 \u05DB\u05EA\u05D9\u05D1\u05D4","\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05D2\u05DE\u05D5\u05EA","\u05E8\u05E9\u05EA \u05D0\u05D7\u05D9\u05D3\u05D4","\u05DE\u05D7\u05E7\u05E8","\u05DC\u05DB\u05D9\u05D3\u05D4 \u05DC\u05D9\u05D9\u05E6\u05D5\u05D0 \u05E4\u05E2\u05D9\u05DC\u05D4, \u05E4\u05D5\u05E8\u05DE\u05D8\u05D9\u05DD JSON+CSV+HTML+MD, \u05D6\u05D9\u05D4\u05D5\u05D9 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9 \u05E9\u05DC \u05DE\u05D6\u05D4\u05D9 \u05E9\u05D0\u05D9\u05DC\u05EA\u05D4, \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D2\u05D5\u05DC\u05DE\u05D9\u05D9\u05DD.","\u05D0\u05D9\u05E1\u05D5\u05E3 \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E6\u05D2\u05D9\u05DD","\u05E9\u05DE\u05D9\u05E8\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D5\u05EA \u05D4\u05D2\u05D5\u05DC\u05DE\u05D9\u05D5\u05EA","\u05E4\u05D5\u05E8\u05DE\u05D8\u05D9 \u05D9\u05D9\u05E6\u05D5\u05D0","JSON, CSV, HTML, Markdown","\u05E7\u05DC\u05D0\u05E1\u05D9","\u05DE\u05D7\u05D6\u05D9\u05E8 \u05D0\u05EA \u05D4\u05E2\u05E8\u05DB\u05D4 \u05D4\u05DE\u05E2\u05D5\u05DE\u05E2\u05DE\u05EA, \u05E9\u05D5\u05DE\u05E8 \u05E2\u05DC \u05E1\u05E8\u05D2\u05DC \u05D4\u05E6\u05D3, \u05DE\u05E1\u05EA\u05D9\u05E8 \u05E8\u05E7 \u05D0\u05EA Grok, \u05D1\u05DC\u05D9 \u05E1\u05D9\u05E0\u05D5\u05DF \u05E4\u05E8\u05D9\u05DE\u05D9\u05D5\u05DD.","\u05DE\u05E6\u05D1 \u05E6\u05E4\u05D5\u05E3","\u05DE\u05D5\u05E9\u05D1\u05EA","\u05D4\u05E1\u05EA\u05E8\u05EA \u05E8\u05DB\u05D9\u05D1\u05D9 Grok","\u05DE\u05D9\u05E0\u05D9\u05DE\u05DC\u05D9","\u05E0\u05D9\u05E7\u05D9\u05D5\u05DF \u05DE\u05E8\u05D1\u05D9: \u05D1\u05DC\u05D9 \u05DE\u05D5\u05E0\u05D9\u05DD, \u05D1\u05DC\u05D9 \u05D2\u05D1\u05D5\u05DC\u05D5\u05EA, \u05D1\u05DC\u05D9 \u05DE\u05D2\u05DE\u05D5\u05EA, \u05D0\u05D6\u05D5\u05E8\u05D9\u05DD \u05D1\u05D8\u05D5\u05D7\u05D9\u05DD \u05DC\u05D8\u05E7\u05E1\u05D8 \u05D2\u05D3\u05D5\u05DC.","\u05E0\u05D5\u05D0\u05E8","\u05E9\u05E4\u05D4","\u05DE\u05EA\u05E8\u05D2\u05DD \u05D0\u05EA \u05D4\u05E4\u05D0\u05E0\u05DC \u05D5\u05E7\u05D5\u05D1\u05E2 \u05D0\u05EA \u05DB\u05D9\u05D5\u05D5\u05DF \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4, \u05DE\u05D9\u05DE\u05D9\u05DF \u05DC\u05E9\u05DE\u05D0\u05DC \u05D1\u05E2\u05E8\u05D1\u05D9\u05EA \u05D5\u05D1\u05E2\u05D1\u05E8\u05D9\u05EA. \u05D1\u05DE\u05E7\u05D8\u05E2 \u05D4\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA \u05DE\u05D5\u05E6\u05D2 \u05DB\u05DE\u05D4 \u05DE\u05D4\u05E9\u05E4\u05D4 \u05D4\u05E0\u05D1\u05D7\u05E8\u05EA \u05DE\u05EA\u05D5\u05E8\u05D2\u05DD; \u05DE\u05D4 \u05E9\u05D7\u05E1\u05E8 \u05E0\u05E9\u05D0\u05E8 \u05D1\u05D0\u05E0\u05D2\u05DC\u05D9\u05EA.","\u05D1\u05D7\u05D9\u05E8\u05EA \u05D4\u05D2\u05D3\u05E8\u05D4 \u05DE\u05D5\u05DB\u05E0\u05D4 \u05D0\u05D5 \u05DE\u05E2\u05D1\u05E8 \u05D9\u05E9\u05D9\u05E8 \u05DC\u05DE\u05E9\u05D9\u05DE\u05D4 \u05E0\u05E4\u05D5\u05E6\u05D4.","\u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05E0\u05E4\u05D5\u05E6\u05D5\u05EA","\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05DE\u05D5\u05DB\u05E0\u05D5\u05EA","\u05E9\u05E4\u05D4","Noir \u05DE\u05D5\u05D7\u05DC \u05D1\u05D0\u05D5\u05E4\u05DF \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9. \u05D1\u05D7\u05E8 \u05DB\u05D1\u05D5\u05D9 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05E2\u05D9\u05E6\u05D5\u05D1 \u05E9\u05DC X \u05E2\u05E6\u05DE\u05D5.","\u05DB\u05D1\u05D5\u05D9 (\u05E2\u05E8\u05DB\u05EA \u05D4\u05E0\u05D5\u05E9\u05D0 \u05E9\u05DC X \u05E2\u05E6\u05DE\u05D5)","\u05DB\u05D9\u05D1\u05D5\u05D9 \u05D0\u05D5\u05E8\u05D5\u05EA","\u05D2\u05E8\u05E4\u05D9\u05D8","\u05E9\u05D6\u05D9\u05E3","\u05D7\u05E6\u05D5\u05EA","\u05E0\u05D5\u05D0\u05E8 (\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC)","\u05DE\u05E6\u05DE\u05E6\u05DD \u05D0\u05EA \u05D4\u05E8\u05D9\u05D5\u05D5\u05D7 \u05D1\u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF \u05DC\u05E1\u05E8\u05D9\u05E7\u05D4 \u05DE\u05D4\u05D9\u05E8\u05D4.","\u05E8\u05D5\u05D7\u05D1 \u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF","\u05DE\u05E6\u05D1 \u05E8\u05D7\u05D1 \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D1\u05DB\u05DC \u05D4\u05E9\u05D8\u05D7 \u05E9\u05DC\u05D9\u05D3 \u05D4\u05E0\u05D9\u05D5\u05D5\u05D8 \u05D5\u05DE\u05E1\u05EA\u05D9\u05E8 \u05D0\u05EA \u05E1\u05E8\u05D2\u05DC \u05D4\u05D2\u05D9\u05DC\u05D5\u05D9. \u05DE\u05E6\u05D1 \u05E0\u05D5\u05D7 \u05DE\u05E9\u05D0\u05D9\u05E8 \u05D0\u05EA \u05D4\u05E1\u05E8\u05D2\u05DC.","\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC","\u05E0\u05D5\u05D7","\u05E8\u05D7\u05D1 (\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC)","\u05E9\u05D7\u05D6\u05D5\u05E8 \u05D4\u05D2\u05D5\u05E4\u05DF Chirp","\u05DB\u05D5\u05E4\u05D4 \u05D0\u05EA \u05D4\u05D2\u05D5\u05E4\u05DF Chirp \u05E9\u05DC X \u05D1\u05DE\u05E7\u05D5\u05DE\u05D5\u05EA \u05E9\u05D1\u05D4\u05DD \u05D4\u05D0\u05EA\u05E8 \u05D7\u05D6\u05E8 \u05DC\u05D2\u05D5\u05E4\u05DF \u05DE\u05E2\u05E8\u05DB\u05EA.","\u05DE\u05EA\u05D2 \u05E8\u05D0\u05E9\u05D9 \u05DC\u05D0\u05E8\u05D1\u05E2\u05EA \u05D4\u05DE\u05E1\u05E4\u05E8\u05D9\u05DD \u05E9\u05DC\u05D4\u05DC\u05DF. \u05D4\u05E4\u05E7\u05D3\u05D9\u05DD \u05DE\u05DE\u05E9\u05D9\u05DB\u05D9\u05DD \u05DC\u05E4\u05E2\u05D5\u05DC \u05D5\u05E7\u05D5\u05E8\u05D0\u05D9 \u05DE\u05E1\u05DA \u05DE\u05DE\u05E9\u05D9\u05DB\u05D9\u05DD \u05DC\u05D4\u05DB\u05E8\u05D9\u05D6 \u05E2\u05DC \u05D4\u05E1\u05DB\u05D5\u05DE\u05D9\u05DD.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05E1\u05E4\u05E8 \u05D4\u05EA\u05D2\u05D5\u05D1\u05D5\u05EA","\u05D7\u05DC \u05DB\u05D0\u05E9\u05E8 \\"\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05D5\u05E0\u05D9 \u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA\\" \u05E4\u05E2\u05D9\u05DC.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05E1\u05E4\u05E8 \u05D4\u05E9\u05D9\u05EA\u05D5\u05E4\u05D9\u05DD","\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05E1\u05E4\u05E8 \u05D4\u05DC\u05D9\u05D9\u05E7\u05D9\u05DD","\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05E1\u05E4\u05E8 \u05D4\u05E6\u05E4\u05D9\u05D5\u05EA","\u05D7\u05DC \u05DB\u05D0\u05E9\u05E8 \\"\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05D5\u05E0\u05D9 \u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA\\" \u05E4\u05E2\u05D9\u05DC. \u05E1\u05DA \u05D4\u05E6\u05E4\u05D9\u05D5\u05EA \u05E0\u05DE\u05E6\u05D0 \u05D1\u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05E0\u05D9\u05EA\u05D5\u05D7\u05D9\u05DD \u05D5\u05DC\u05D0 \u05D1\u05DB\u05E4\u05EA\u05D5\u05E8 \u05E4\u05E2\u05D5\u05DC\u05D4.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05D4\u05DE\u05D5\u05E0\u05D4 \u05D1\u05DB\u05D5\u05EA\u05E8\u05EA \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA","\u05DE\u05E1\u05D9\u05E8 \u05D0\u05EA \u05DE\u05D5\u05E0\u05D4 \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E9\u05DC\u05D0 \u05E0\u05E7\u05E8\u05D0\u05D5 \u05E9\u05DC X \u05DE\u05DB\u05D5\u05EA\u05E8\u05EA \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA, \u05DB\u05D3\u05D9 \u05E9\u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA \u05DC\u05D0 \u05EA\u05D7\u05D6\u05D9\u05E8 \u05D4\u05EA\u05E8\u05D0\u05D4 \u05E9\u05DB\u05D1\u05E8 \u05D4\u05E1\u05EA\u05E8\u05EA.","\u05D7\u05D5\u05EA\u05DE\u05D5\u05EA \u05D6\u05DE\u05DF \u05DE\u05D5\u05D7\u05DC\u05D8\u05D5\u05EA","\u05DE\u05E6\u05D9\u05D2 \u05D1\u05DB\u05DC \u05E4\u05D5\u05E1\u05D8 \u05D0\u05EA \u05D4\u05EA\u05D0\u05E8\u05D9\u05DA \u05D5\u05D4\u05E9\u05E2\u05D4 \u05D4\u05DE\u05D3\u05D5\u05D9\u05E7\u05D9\u05DD \u05D1\u05DE\u05E7\u05D5\u05DD \u05D4\u05D8\u05E7\u05E1\u05D8 \u05D4\u05D9\u05D7\u05E1\u05D9 \u05E9\u05DC X.","\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1\u05E1\u05DE\u05DC \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA \u05E9\u05DC Aviary","\u05DE\u05D7\u05DC\u05D9\u05E3 \u05D0\u05EA \u05E1\u05DE\u05DC \u05D4\u05D0\u05EA\u05E8 \u05E9\u05DC X \u05D1\u05E1\u05D9\u05DE\u05DF \u05E9\u05DC Aviary \u05DB\u05D3\u05D9 \u05DC\u05D6\u05D4\u05D5\u05EA \u05D0\u05EA \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05D5\u05EA \u05E9\u05DC\u05D5 \u05D1\u05E7\u05DC\u05D5\u05EA. \u05D1\u05DB\u05D9\u05D1\u05D5\u05D9 \u05D4\u05E1\u05DE\u05DC \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9 \u05E9\u05DC X \u05D7\u05D5\u05D6\u05E8.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05D2\u05D1\u05D5\u05DC\u05D5\u05EA \u05E9\u05D5\u05E8\u05D5\u05EA","\u05DE\u05E1\u05D9\u05E8 \u05D0\u05EA \u05E7\u05D5 \u05D4\u05D4\u05E4\u05E8\u05D3\u05D4 \u05D1\u05E2\u05D5\u05D1\u05D9 \u05E4\u05D9\u05E7\u05E1\u05DC \u05DE\u05EA\u05D7\u05EA \u05DC\u05DB\u05DC \u05E4\u05D5\u05E1\u05D8, \u05D5\u05D0\u05EA \u05D4\u05E7\u05D5\u05D5\u05D9\u05DD \u05D1\u05E6\u05D3\u05D9 \u05D4\u05E2\u05DE\u05D5\u05D3\u05D4 \u05D4\u05E8\u05D0\u05E9\u05D9\u05EA.","\u05E0\u05D9\u05D2\u05D5\u05D3\u05D9\u05D5\u05EA \u05D2\u05D1\u05D5\u05D4\u05D4","\u05DE\u05E9\u05EA\u05DE\u05E9 \u05D1\u05D2\u05D1\u05D5\u05DC\u05D5\u05EA \u05D5\u05D1\u05E0\u05D9\u05D2\u05D5\u05D3\u05D9\u05D5\u05EA \u05D8\u05E7\u05E1\u05D8 \u05D7\u05D6\u05E7\u05D9\u05DD \u05D9\u05D5\u05EA\u05E8.","\u05E6\u05DE\u05E6\u05D5\u05DD \u05EA\u05E0\u05D5\u05E2\u05D4","\u05DC\u05E4\u05D9 \u05D4\u05D2\u05D3\u05E8\u05EA \u05D4\u05DE\u05E2\u05E8\u05DB\u05EA","\u05DC\u05E6\u05DE\u05E6\u05DD \u05EA\u05DE\u05D9\u05D3","\u05DC\u05D0 \u05DC\u05E6\u05DE\u05E6\u05DD","CSS \u05DE\u05D5\u05EA\u05D0\u05DD \u05D0\u05D9\u05E9\u05D9\u05EA","\u05E2\u05E7\u05D9\u05E4\u05D5\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA \u05DC\u05D1\u05D7\u05D9\u05E8\u05D4 \u05E2\u05D1\u05D5\u05E8 \u05D4\u05DE\u05E9\u05D8\u05D7\u05D9\u05DD \u05D4\u05DE\u05D5\u05D2\u05D3\u05E8\u05D9\u05DD \u05DC\u05DE\u05D8\u05D4. \u05D4-CSS \u05DC\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05D9\u05D5\u05E6\u05D0 \u05DE\u05D4\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05D6\u05D4 \u05D5\u05D0\u05D9\u05E0\u05D5 \u05E0\u05DB\u05DC\u05DC \u05D1\u05E6\u05D9\u05E4\u05D9\u05D5\u05EA \u05DE\u05D3\u05D9\u05D5\u05D5\u05D7\u05D9 \u05D1\u05D0\u05D2\u05D9\u05DD.","CSS \u05DC\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD","\u05D7\u05DC \u05E8\u05E7 \u05E2\u05DC \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05D5\u05E6\u05D2\u05D9\u05DD. \u05D3\u05D5\u05D2\u05DE\u05D4: article { border-radius: 18px; }","CSS \u05DC\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05DE\u05D3\u05D9\u05D4","\u05D7\u05DC \u05E8\u05E7 \u05E2\u05DC \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05D4\u05DE\u05D3\u05D9\u05D4 \u05E9\u05DC Aviary \u05D5\u05D4\u05EA\u05D5\u05DB\u05DF \u05E9\u05DC\u05D4\u05DD.","CSS \u05DC\u05E0\u05D9\u05D5\u05D5\u05D8","\u05D7\u05DC \u05E8\u05E7 \u05E2\u05DC \u05E1\u05E8\u05D2\u05DC \u05D4\u05E0\u05D9\u05D5\u05D5\u05D8 \u05E9\u05DC X.","CSS \u05DC\u05E1\u05E8\u05D2\u05DC \u05D4\u05E6\u05D3","\u05D7\u05DC \u05E8\u05E7 \u05E2\u05DC \u05E1\u05E8\u05D2\u05DC \u05D4\u05D2\u05D9\u05DC\u05D5\u05D9 \u05E9\u05DC X.","CSS \u05DC\u05E2\u05D5\u05E8\u05DA","\u05D7\u05DC \u05E8\u05E7 \u05E2\u05DC \u05E1\u05E8\u05D2\u05DC \u05D4\u05DB\u05DC\u05D9\u05DD \u05D5\u05D0\u05D6\u05D5\u05E8 \u05D4\u05D8\u05E7\u05E1\u05D8 \u05E9\u05DC \u05D4\u05E2\u05D5\u05E8\u05DA.","\u05E9\u05D9\u05E0\u05D5\u05D9 \u05D4\u05E6\u05D1\u05E2\u05D9\u05DD, \u05D4\u05DE\u05E8\u05D5\u05D5\u05D7\u05D9\u05DD, \u05D4\u05D8\u05E7\u05E1\u05D8 \u05D5\u05D4\u05DE\u05E1\u05E4\u05E8\u05D9\u05DD \u05E9\u05DE\u05D5\u05E6\u05D2\u05D9\u05DD \u05D1\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD.","\u05DE\u05E8\u05D0\u05D4 \u05D5\u05E4\u05E8\u05D9\u05E1\u05D4","\u05E4\u05E8\u05D8\u05D9 \u05D4\u05E4\u05D5\u05E1\u05D8","\u05E0\u05D2\u05D9\u05E9\u05D5\u05EA","\u05E2\u05D9\u05E6\u05D5\u05D1 \u05DE\u05EA\u05E7\u05D3\u05DD","\u05D4\u05D4\u05D2\u05E0\u05D4 \u05DE\u05EA\u05D7\u05D9\u05DC\u05D4 \u05D1\u05E2\u05EA \u05D8\u05E2\u05D9\u05E0\u05EA \u05D4\u05DE\u05E1\u05DE\u05DA.","\u05DE\u05E6\u05D1 \u05DC\u05DC\u05D0 \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA","\u05DE\u05DB\u05D5\u05D5\u05E5 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05DE\u05D5\u05DE\u05E0\u05D9\u05DD, \u05E9\u05D5\u05EA\u05E4\u05D5\u05D9\u05D5\u05EA \u05D1\u05EA\u05E9\u05DC\u05D5\u05DD, \u05DE\u05D2\u05DE\u05D5\u05EA \u05DE\u05E7\u05D5\u05D3\u05DE\u05D5\u05EA, \u05E7\u05D9\u05D3\u05D5\u05DD \u05E4\u05E0\u05D9\u05DE\u05D9 \u05D5\u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA \u05E7\u05D3\u05DD\u05BE\u05D5\u05D9\u05D3\u05D0\u05D5 \u05D2\u05DC\u05D5\u05D9\u05D5\u05EA. Aviary \u05D2\u05DD \u05DE\u05E1\u05E8\u05D1 \u05DC\u05D1\u05E7\u05E9\u05EA \u05D4\u05E8\u05D9\u05E9\u05D5\u05DD \u05D4\u05E0\u05E4\u05E8\u05D3\u05EA \u05E9\u05DC X \u05DC\u05EA\u05D5\u05DB\u05DF \u05DE\u05E7\u05D5\u05D3\u05DD \u05D1\u05DC\u05D9 \u05DC\u05D7\u05E1\u05D5\u05DD \u05D0\u05EA \u05D8\u05E2\u05D9\u05E0\u05EA \u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF.","\u05D3\u05D7\u05D9\u05D9\u05EA \u05E7\u05E8\u05D9\u05D0\u05EA \u05E8\u05D9\u05E9\u05D5\u05DD \u05D4\u05DE\u05D5\u05D3\u05E2\u05D5\u05EA \u05E9\u05DC X","\u05D7\u05DC \u05E8\u05E7 \u05DB\u05D0\u05E9\u05E8 \u05DE\u05E6\u05D1 \u05DC\u05DC\u05D0 \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA \u05E4\u05E2\u05D9\u05DC. Aviary \u05D3\u05D5\u05D7\u05D4 \u05D1\u05E7\u05E9\u05D4 \u05D0\u05D7\u05EA \u05D1\u05DC\u05D1\u05D3 (\u05D1\u05E7\u05E9\u05EA \u05E8\u05D9\u05E9\u05D5\u05DD \u05D4\u05EA\u05D5\u05DB\u05DF \u05D4\u05DE\u05DE\u05D5\u05DE\u05DF \u05E9\u05DC X) \u05D5\u05DC\u05D0 \u05E9\u05D5\u05DD \u05D1\u05E7\u05E9\u05D4 \u05D0\u05D7\u05E8\u05EA, \u05DB\u05D5\u05DC\u05DC \u05D4\u05D1\u05D3\u05D9\u05E7\u05D5\u05EA \u05E9-X \u05DE\u05E9\u05EA\u05DE\u05E9\u05EA \u05D1\u05D4\u05DF \u05DB\u05D3\u05D9 \u05DC\u05D6\u05D4\u05D5\u05EA \u05D7\u05D5\u05E1\u05DD \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA. \u05DB\u05D1\u05D4 \u05D6\u05D0\u05EA \u05D0\u05DD X \u05DE\u05EA\u05DC\u05D5\u05E0\u05E0\u05EA \u05D1\u05DB\u05DC \u05D6\u05D0\u05EA: \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05DE\u05D5\u05DE\u05E0\u05D9\u05DD \u05D9\u05D9\u05E9\u05D0\u05E8\u05D5 \u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD \u05D5-Aviary \u05D9\u05E4\u05E1\u05D9\u05E7 \u05DC\u05D3\u05D7\u05D5\u05EA \u05D1\u05E7\u05E9\u05D5\u05EA \u05DB\u05DC\u05E9\u05D4\u05DF.","\u05DE\u05E6\u05D1 \u05D4\u05D4\u05D2\u05E0\u05D4 \u05DE\u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA","\u05DE\u05E4\u05D7\u05D9\u05EA \u05E8\u05E2\u05E9 \u05E9\u05DC \u05DE\u05D2\u05DE\u05D5\u05EA, \u05D4\u05DE\u05DC\u05E6\u05D5\u05EA \u05D5\u05DB\u05D5\u05EA\u05E8\u05EA \u05EA\u05D7\u05EA\u05D5\u05E0\u05D4.","\u05DE\u05E1\u05D9\u05E8 \u05D0\u05EA \u05D4\u05E0\u05D5\u05E9\u05D0\u05D9\u05DD \u05D4\u05D7\u05DE\u05D9\u05DD \u05D5\u05DE\u05D5\u05D3\u05D5\u05DC\u05D9 \u05D4\u05D7\u05D3\u05E9\u05D5\u05EA.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05D4\u05E6\u05E2\u05D5\u05EA \u05DC\u05DE\u05E2\u05E7\u05D1","\u05DE\u05E1\u05D9\u05E8 \u05DB\u05E8\u05D8\u05D9\u05E1\u05D9 \u201E\u05D0\u05D7\u05E8\u05D9 \u05DE\u05D9 \u05DC\u05E2\u05E7\u05D5\u05D1\u201D \u05D1\u05DC\u05D9 \u05DC\u05D4\u05E1\u05EA\u05D9\u05E8 \u05D0\u05EA \u05E9\u05D0\u05E8 \u05E1\u05E8\u05D2\u05DC \u05D4\u05E6\u05D3.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05E2\u05D5\u05E8\u05DA \u05D4\u05D1\u05D9\u05EA","\u05DE\u05E1\u05D9\u05E8 \u05D0\u05EA \u05E2\u05D5\u05E8\u05DA \u05D4\u05E4\u05E8\u05E1\u05D5\u05DD \u05D4\u05DE\u05D4\u05D9\u05E8 \u05DE\u05D3\u05E3 \u05D4\u05D1\u05D9\u05EA. \u05D4\u05DB\u05E4\u05EA\u05D5\u05E8 \u201E\u05E4\u05E8\u05E1\u05D5\u05DD\u201D \u05E2\u05D3\u05D9\u05D9\u05DF \u05E4\u05D5\u05EA\u05D7 \u05D0\u05D5\u05EA\u05D5 \u05D1\u05E2\u05EA \u05D4\u05E6\u05D5\u05E8\u05DA.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05D4\u05DE\u05DC\u05E6\u05D5\u05EA \u05D1\u05E9\u05E8\u05E9\u05D5\u05E8","\u05DE\u05E1\u05D9\u05D9\u05DD \u05D0\u05EA \u05D4\u05E9\u05D9\u05D7\u05D4 \u05D1\u05EA\u05D2\u05D5\u05D1\u05D4 \u05D4\u05D0\u05DE\u05D9\u05EA\u05D9\u05EA \u05D4\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4 \u05E2\u05DC \u05D9\u05D3\u05D9 \u05DB\u05D9\u05D5\u05D5\u05E5 \u05D1\u05DC\u05D5\u05E7 \\"\u05D2\u05DC\u05D4 \u05E2\u05D5\u05D3\\" \u05D5\u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E6\u05E2\u05D9\u05DD \u05DE\u05EA\u05D7\u05EA\u05D9\u05D5.","\u05DE\u05E1\u05EA\u05D9\u05E8 \u05D0\u05EA \u05DE\u05D2\u05D9\u05E8\u05EA Grok \u05D5\u05E7\u05D9\u05E9\u05D5\u05E8 \u05D4\u05E0\u05D9\u05D5\u05D5\u05D8, \u05D0\u05EA \u05DB\u05E0\u05D9\u05E1\u05D5\u05EA \u05D9\u05E6\u05D9\u05E8\u05EA \u05D4\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05D5\u05D0\u05EA \u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8.","\u05DE\u05D5\u05E0\u05E2 \u05DE-X \u05DC\u05E4\u05EA\u05D5\u05D7 \u05DB\u05E8\u05D8\u05D9\u05E1 \u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D0\u05D5 \u05D1\u05D5\u05E2\u05EA \u05D4\u05E1\u05D1\u05E8 \u05DB\u05E9\u05D4\u05DE\u05E6\u05D1\u05D9\u05E2 \u05E0\u05D7 \u05E2\u05DC \u05E9\u05DD, \u05D0\u05D5\u05D5\u05D8\u05D0\u05E8 \u05D0\u05D5 \u05E4\u05E7\u05D3. \u05D4\u05EA\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD \u05E9\u05E2\u05DC\u05D9\u05D4\u05DD \u05DC\u05D5\u05D7\u05E6\u05D9\u05DD, \u05D4\u05EA\u05D5\u05D5\u05D9\u05D5\u05EA \u05D5\u05E9\u05DE\u05D5\u05EA \u05E7\u05D5\u05E8\u05D0\u05D9 \u05D4\u05DE\u05E1\u05DA \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05DC\u05DC\u05D0 \u05E9\u05D9\u05E0\u05D5\u05D9.","\u05DE\u05E6\u05D1 \u05E8\u05D9\u05DB\u05D5\u05D6","\u05DE\u05D7\u05D5\u05E5 \u05DC\u05E9\u05E2\u05D5\u05EA \u05E9\u05DC\u05D4\u05DC\u05DF, \u05DE\u05DB\u05E1\u05D4 \u05D0\u05EA \u05E2\u05DE\u05D5\u05D3\u05EA \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4 \u05D1\u05DC\u05D5\u05D7 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05E8\u05D2\u05D5\u05E2. \u05D4\u05E0\u05D9\u05D5\u05D5\u05D8 \u05E0\u05E9\u05D0\u05E8 \u05D6\u05DE\u05D9\u05DF \u05D5\u05D7\u05E8\u05D9\u05D2\u05D4 \u05E9\u05DC \u05D7\u05DE\u05E9 \u05D3\u05E7\u05D5\u05EA \u05DE\u05E8\u05D5\u05D7\u05E7\u05EA \u05E7\u05DC\u05D9\u05E7 \u05D0\u05D7\u05D3. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05D7\u05E1\u05DD \u05D5\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D9\u05D5\u05E6\u05D0 \u05DE\u05D4\u05DE\u05DB\u05E9\u05D9\u05E8 \u05D4\u05D6\u05D4.","\u05EA\u05D7\u05D9\u05DC\u05EA \u05E9\u05E2\u05D5\u05EA \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4","\u05E9\u05E2\u05D4 \u05D1\u05E4\u05D5\u05E8\u05DE\u05D8 24 \u05E9\u05E2\u05D5\u05EA, \u05DC\u05DE\u05E9\u05DC 09:00.","\u05E1\u05D9\u05D5\u05DD \u05E9\u05E2\u05D5\u05EA \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4","\u05E9\u05E2\u05D4 \u05D1\u05E4\u05D5\u05E8\u05DE\u05D8 24 \u05E9\u05E2\u05D5\u05EA. \u05E1\u05D9\u05D5\u05DD \u05DE\u05D5\u05E7\u05D3\u05DD \u05DE\u05D4\u05D4\u05EA\u05D7\u05DC\u05D4 \u05D7\u05D5\u05E6\u05D4 \u05D0\u05EA \u05D7\u05E6\u05D5\u05EA.","\u05DC\u05E2\u05E6\u05D5\u05E8 \u05D0\u05EA \u05D4\u05E4\u05D9\u05D3 \u05D0\u05D7\u05E8\u05D9","\u05DE\u05E1\u05E4\u05E8 \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05D9\u05D5\u05E6\u05D2\u05D5 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D4\u05E4\u05D9\u05D3 \u05DE\u05E4\u05E1\u05D9\u05E7 \u05DC\u05D4\u05EA\u05D0\u05E8\u05DA, \u05E2\u05DD \u05DB\u05E4\u05EA\u05D5\u05E8 \u05DC\u05D4\u05DE\u05E9\u05DA. \u05D0\u05E4\u05E1 \u05DE\u05E9\u05D0\u05D9\u05E8 \u05D0\u05EA \u05D4\u05D2\u05DC\u05D9\u05DC\u05D4 \u05D4\u05D0\u05D9\u05E0\u05E1\u05D5\u05E4\u05D9\u05EA \u05E9\u05DC X \u05DB\u05DE\u05D5 \u05E9\u05D4\u05D9\u05D0. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05E9\u05DB\u05D1\u05E8 \u05E2\u05DC \u05D4\u05DE\u05E1\u05DA \u05DC\u05D0 \u05D6\u05D6, \u05D5\u05D4\u05DB\u05E4\u05EA\u05D5\u05E8 \u05DE\u05D5\u05E4\u05D9\u05E2 \u05DE\u05EA\u05D7\u05EA \u05DC\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D0\u05D7\u05E8\u05D5\u05DF \u05D5\u05DC\u05D0 \u05DE\u05E2\u05DC\u05D9\u05D5.","\u05D4\u05E8\u05D7\u05D1\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D0\u05E8\u05D5\u05DB\u05D9\u05DD \u05D1\u05D0\u05D5\u05E4\u05DF \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9","\u05DC\u05D5\u05D7\u05E5 \u05E8\u05E7 \u05E2\u05DC \u05D4\u05E6\u05D2 \u05E2\u05D5\u05D3 \u05E9\u05DC \u05D4\u05E4\u05D5\u05E1\u05D8 \u05E2\u05E6\u05DE\u05D5 \u05DC\u05D0\u05D7\u05E8 \u05E9\u05D4\u05D2\u05DC\u05D9\u05DC\u05D4 \u05E0\u05E2\u05E6\u05E8\u05EA. \u05EA\u05E9\u05D5\u05D1\u05D5\u05EA, \u05E1\u05E8\u05D2\u05DC\u05D9 \u05E6\u05D3, \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05E6\u05D5\u05D8\u05D8\u05D9\u05DD \u05D5\u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 \u05D4\u05E6\u05D2 \u05E2\u05D5\u05D3 \u05D0\u05D7\u05E8\u05D9\u05DD \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05DC\u05DC\u05D0 \u05E9\u05D9\u05E0\u05D5\u05D9.","\u05E9\u05D7\u05D6\u05D5\u05E8 \u05D4\u05DE\u05D9\u05E7\u05D5\u05DD \u05DC\u05D0\u05D7\u05E8 \u05D7\u05D6\u05E8\u05D4","\u05D7\u05D5\u05D6\u05E8 \u05DC\u05D0\u05D5\u05EA\u05D5 \u05E4\u05D5\u05E1\u05D8 \u05D2\u05DC\u05D5\u05D9 \u05DC\u05D0\u05D7\u05E8 \u05E4\u05EA\u05D9\u05D7\u05EA \u05E4\u05D5\u05E1\u05D8 \u05D0\u05D5 \u05E2\u05DE\u05D5\u05D3 X \u05D0\u05D7\u05E8 \u05D5\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1\u05DB\u05E4\u05EA\u05D5\u05E8 \u05D7\u05D6\u05E8\u05D4 \u05E9\u05DC \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF. \u05D2\u05DC\u05D9\u05DC\u05D4 \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA \u05D2\u05DC\u05D2\u05DC\u05EA, \u05DE\u05D2\u05E2, \u05DE\u05E6\u05D1\u05D9\u05E2 \u05D0\u05D5 \u05DE\u05E7\u05DC\u05D3\u05EA \u05DE\u05D1\u05D8\u05DC\u05EA \u05DE\u05D9\u05D3 \u05D0\u05EA \u05D4\u05E9\u05D7\u05D6\u05D5\u05E8.","\u05D4\u05E6\u05D2\u05EA \u05E1\u05DE\u05DF \u05E7\u05E8\u05D9\u05D0\u05D4","\u05E9\u05D5\u05DE\u05E8 \u05DE\u05D9\u05E7\u05D5\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9 \u05DC\u05DB\u05DC \u05E4\u05D9\u05D3 \u05D5\u05DE\u05E6\u05D9\u05D2 \u05E9\u05D5\u05E8\u05D4 \u05E9\u05DC \u05D7\u05D3\u05E9 \u05DE\u05D0\u05D6 \u05D4\u05D1\u05D9\u05E7\u05D5\u05E8 \u05D4\u05D0\u05D7\u05E8\u05D5\u05DF. \u05D4\u05D5\u05D0 \u05DC\u05D0 \u05DE\u05D5\u05E1\u05D9\u05E3 \u05EA\u05D2 \u05E9\u05DC \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E9\u05DC\u05D0 \u05E0\u05E7\u05E8\u05D0\u05D5.","\u05DE\u05E9\u05D8\u05D7\u05D9 \u05E1\u05DE\u05DF \u05E7\u05E8\u05D9\u05D0\u05D4","\u05D1\u05D7\u05E8 \u05D4\u05D9\u05DB\u05DF \u05D9\u05D5\u05E4\u05D9\u05E2\u05D5 \u05E1\u05DE\u05DF \u05D4\u05DE\u05D9\u05E7\u05D5\u05DD \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9 \u05D5\u05D4\u05DE\u05E4\u05E8\u05D9\u05D3 \u05DC\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D7\u05D3\u05E9\u05D9\u05DD.","\u05D1\u05D9\u05EA","\u05E4\u05D5\u05E1\u05D8","\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC","\u05D7\u05D9\u05E4\u05D5\u05E9","\u05D4\u05EA\u05E8\u05D0\u05D5\u05EA","\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA","\u05DB\u05DC \u05E2\u05D5\u05D3 \u05D4\u05DE\u05D9\u05E7\u05D5\u05D3 \u05D1\u05D7\u05DC\u05D5\u05DF \u05D4\u05DB\u05EA\u05D9\u05D1\u05D4, \u05E1\u05E8\u05D2\u05DC \u05D4\u05E6\u05D3 \u05D5\u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF \u05E9\u05DE\u05D0\u05D7\u05D5\u05E8\u05D9\u05D5 \u05DE\u05EA\u05E2\u05DE\u05E2\u05DE\u05D9\u05DD. \u05D4\u05DB\u05D5\u05DC \u05D7\u05D5\u05D6\u05E8 \u05D1\u05E8\u05D2\u05E2 \u05E9\u05DC\u05D5\u05D7\u05E6\u05D9\u05DD \u05D1\u05DE\u05E7\u05D5\u05DD \u05D0\u05D7\u05E8.","\u05DC\u05E4\u05EA\u05D5\u05D7 \u05D0\u05EA \\"\u05E2\u05D5\u05E7\u05D1\\" \u05D1\u05DE\u05E7\u05D5\u05DD \\"\u05D1\u05E9\u05D1\u05D9\u05DC\u05DA\\"","\u05D1\u05D5\u05D7\u05E8 \u05D0\u05EA \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA \u05D4\u05E9\u05E0\u05D9\u05D9\u05D4 \u05D1\u05D3\u05E3 \u05D4\u05D1\u05D9\u05EA \u05D1\u05DB\u05DC \u05DB\u05E0\u05D9\u05E1\u05D4 \u05DC\u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF. \u05D0\u05DD \u05EA\u05D7\u05D6\u05D5\u05E8 \u05DC\\"\u05D1\u05E9\u05D1\u05D9\u05DC\u05DA\\", \u05D6\u05D4 \u05D9\u05D9\u05E9\u05D0\u05E8 \u05DB\u05DA \u05E2\u05D3 \u05E9\u05EA\u05E2\u05D6\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D3\u05E3.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05DC\u05E9\u05D5\u05E0\u05D9\u05EA For You","\u05D1\u05D5\u05D7\u05E8 \u05D1'\u05D1\u05DE\u05E2\u05E7\u05D1' \u05D5\u05D0\u05D6 \u05DE\u05DB\u05D5\u05D5\u05E5 \u05D0\u05EA \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA \u05D4\u05E8\u05D0\u05E9\u05D5\u05E0\u05D4 \u05D1\u05D3\u05E3 \u05D4\u05D1\u05D9\u05EA. \u05D7\u05DC \u05E8\u05E7 \u05D1\u05D3\u05E3 \u05D4\u05D1\u05D9\u05EA \u05D5\u05DE\u05E9\u05D5\u05D7\u05D6\u05E8 \u05DE\u05D9\u05D3 \u05DB\u05E9\u05DE\u05DB\u05D1\u05D9\u05DD.","\u05E4\u05EA\u05D9\u05D7\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E8\u05E7 \u05DE\u05E1\u05DE\u05DC \u05D4\u05EA\u05D2\u05D5\u05D1\u05D4","\u200FX \u05D4\u05D5\u05E4\u05DA \u05D0\u05EA \u05DB\u05DC \u05D4\u05E9\u05D5\u05E8\u05D4 \u05DC\u05E7\u05D9\u05E9\u05D5\u05E8, \u05D5\u05DC\u05DB\u05DF \u05DC\u05D7\u05D9\u05E6\u05D4 \u05E2\u05DC \u05D4\u05D8\u05E7\u05E1\u05D8 \u05D0\u05D5 \u05DC\u05E6\u05D3 \u05DB\u05E4\u05EA\u05D5\u05E8 \u05E4\u05D5\u05EA\u05D7\u05EA \u05E4\u05D5\u05E1\u05D8 \u05E9\u05DC\u05D0 \u05D1\u05D7\u05E8\u05EA. \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05EA \u05D4\u05D6\u05D0\u05EA \u05DE\u05E1\u05D9\u05E8\u05D4 \u05D0\u05EA \u05D0\u05D6\u05D5\u05E8 \u05D4\u05DC\u05D7\u05D9\u05E6\u05D4 \u05DE\u05D4\u05E9\u05D5\u05E8\u05D4 \u05D5\u05DE\u05E2\u05D1\u05D9\u05E8\u05D4 \u05D0\u05D5\u05EA\u05D5 \u05DC\u05E1\u05DE\u05DC \u05D4\u05EA\u05D2\u05D5\u05D1\u05D4, \u05E9\u05E4\u05D5\u05EA\u05D7 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D1\u05DE\u05E7\u05D5\u05DD \u05D0\u05EA \u05EA\u05D9\u05D1\u05EA \u05D4\u05EA\u05D2\u05D5\u05D1\u05D4. \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD, \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9\u05DD, \u05DE\u05D3\u05D9\u05D4 \u05D5\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05E6\u05D5\u05D8\u05D8\u05D9\u05DD \u05DE\u05DE\u05E9\u05D9\u05DB\u05D9\u05DD \u05DC\u05E2\u05D1\u05D5\u05D3.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05E4\u05E8\u05D9\u05D8\u05D9 \u05E0\u05D9\u05D5\u05D5\u05D8","\u05DE\u05D6\u05D4\u05D4 \u05E0\u05D9\u05D5\u05D5\u05D8 \u05D9\u05E6\u05D9\u05D1 \u05D0\u05D7\u05D3 \u05E9\u05DC X \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4: home, explore, notifications, follow, chat, messages, grok, history, studio, premium, profile \u05D0\u05D5 more.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05D5\u05D3\u05E2\u05D5\u05EA \u05D5\u05D7\u05DC\u05E7\u05D9\u05DD \u05D1-X \u05E9\u05D0\u05D9\u05E0\u05DD \u05D1\u05E9\u05D9\u05DE\u05D5\u05E9.","\u05D4\u05D2\u05E0\u05D4 \u05DE\u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA","\u05E8\u05DB\u05D9\u05D1\u05D9 \u05D4\u05D3\u05E3","\u05D6\u05E8\u05D9\u05DE\u05EA \u05E7\u05E8\u05D9\u05D0\u05D4","\u05E0\u05D9\u05D5\u05D5\u05D8","\u05D4\u05DB\u05DC\u05DC\u05D9\u05DD \u05E4\u05E2\u05D9\u05DC\u05D9\u05DD \u05D1\u05E0\u05EA\u05D9\u05D1\u05D9\u05DD \u05E9\u05E0\u05D1\u05D7\u05E8\u05D5.","\u05D4\u05E4\u05E2\u05DC\u05EA \u05DE\u05E1\u05E0\u05E0\u05D9\u05DD","\u05DE\u05EA\u05D2 \u05E8\u05D0\u05E9\u05D9 \u05DC\u05DE\u05E1\u05E0\u05E0\u05D9 \u05DE\u05D9\u05DC\u05D5\u05EA \u05DE\u05E4\u05EA\u05D7, \u05D1\u05D9\u05D8\u05D5\u05D9\u05D9\u05DD \u05E8\u05D2\u05D5\u05DC\u05E8\u05D9\u05D9\u05DD, \u05E4\u05E8\u05D9\u05DE\u05D9\u05D5\u05DD \u05D5\u05DE\u05D3\u05D9\u05D4.","\u05DE\u05E6\u05D1 \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD","\u05DC\u05D0 \u05E4\u05E2\u05D9\u05DC \u05E2\u05D3 \u05DC\u05D4\u05E4\u05E2\u05DC\u05EA \u05D4\u05DE\u05E1\u05E0\u05E0\u05D9\u05DD. \u05D0\u05E4\u05E9\u05E8 \u05DC\u05E2\u05E8\u05D5\u05DA \u05D0\u05EA \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DE\u05E4\u05E2\u05D9\u05DC\u05D9\u05DD \u05D0\u05D5\u05EA\u05DD.","\u05E2\u05DE\u05E2\u05D5\u05DD \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DB\u05D1\u05E8 \u05E8\u05D0\u05D9\u05EA","\u05D4\u05E4\u05D5\u05E1\u05D8 \u05D9\u05D5\u05E2\u05DE\u05E2\u05DD \u05D1\u05E4\u05E2\u05DD \u05D4\u05E9\u05E0\u05D9\u05D9\u05D4 \u05E9\u05D4\u05D5\u05D0 \u05D7\u05D5\u05DC\u05E3, \u05D5\u05D9\u05D9\u05E9\u05DE\u05E8 \u05E2\u05D5\u05EA\u05E7 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05E9\u05DC \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9-Aviary \u05D4\u05E6\u05D9\u05D2. \u05D4\u05E2\u05D1\u05E8\u05EA \u05D4\u05E2\u05DB\u05D1\u05E8 \u05DE\u05E2\u05DC \u05E4\u05D5\u05E1\u05D8 \u05DE\u05E2\u05D5\u05DE\u05E2\u05DD \u05EA\u05D7\u05D6\u05D9\u05E8 \u05D0\u05D5\u05EA\u05D5.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E0\u05E8\u05D0\u05D5 \u05D1","\u05D1\u05D7\u05E8 \u05D0\u05EA \u05D4\u05E4\u05D9\u05D3\u05D9\u05DD \u05E9\u05D1\u05D4\u05DD \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DB\u05D1\u05E8 \u05E8\u05D0\u05D9\u05EA \u05D9\u05D5\u05E2\u05DE\u05DE\u05D5.","\u05DB\u05DC\u05DC\u05D9 \u05E1\u05D9\u05E0\u05D5\u05DF","\u05DB\u05DC\u05DC \u05D0\u05D7\u05D3 \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4: \u05E9\u05D3\u05D4, not \u05D0\u05D5\u05E4\u05E6\u05D9\u05D5\u05E0\u05DC\u05D9, \u05D0\u05D5\u05E4\u05E8\u05D8\u05D5\u05E8, \u05E2\u05E8\u05DA. \u05D4\u05E9\u05D3\u05D5\u05EA \u05D4\u05DD text, handle, media, verified, link; \u05D4\u05D0\u05D5\u05E4\u05E8\u05D8\u05D5\u05E8\u05D9\u05DD \u05D4\u05DD contains, is, starts, ends, matches. \u05D7\u05D1\u05E8\u05D5 \u05D1\u05D9\u05E0\u05D9\u05D4\u05DD \u05E2\u05DD and / or, \u05D5\u05D4\u05D5\u05E1\u05D9\u05E4\u05D5 dim: \u05D1\u05EA\u05D7\u05D9\u05DC\u05EA \u05D4\u05E9\u05D5\u05E8\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E2\u05DE\u05E2\u05DD \u05D1\u05DE\u05E7\u05D5\u05DD \u05DC\u05D4\u05E1\u05EA\u05D9\u05E8. \u05EA\u05E0\u05D5 \u05E9\u05DD \u05DC\u05DB\u05DC\u05DC \u05D1\u05DB\u05DA \u05E9\u05EA\u05EA\u05D7\u05D9\u05DC\u05D5 \u05D0\u05EA \u05D4\u05E9\u05D5\u05E8\u05D4 \u05D1-[\u05DB\u05D5\u05EA\u05E8\u05EA], \u05D5\u05EA\u05E0\u05D5 \u05DC\u05D5 \u05EA\u05D5\u05E7\u05E3 \u05DE\u05D5\u05D2\u05D1\u05DC \u05E2\u05DD for 7d from <\u05EA\u05D0\u05E8\u05D9\u05DA>. \u05D3\u05D5\u05D2\u05DE\u05D4: [Weekend sales] dim for 7d from 2026-08-19T10:00:00.000Z: text contains sale and media is photo","\u05E2\u05E8\u05DB\u05EA \u05DB\u05DC\u05DC\u05D9\u05DD \u05E0\u05D9\u05D9\u05D3\u05EA","\u05D0\u05E4\u05E9\u05E8 \u05DC\u05D9\u05D9\u05E6\u05D0 \u05D8\u05E7\u05E1\u05D8 \u05E4\u05E9\u05D5\u05D8 \u05D0\u05D5 \u05DC\u05D4\u05D3\u05D1\u05D9\u05E7 \u05E2\u05E8\u05DB\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E8\u05D0\u05D5\u05EA \u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05DC\u05E4\u05E0\u05D9 \u05D4\u05D5\u05E1\u05E4\u05D4 \u05D0\u05D5 \u05D4\u05D7\u05DC\u05E4\u05D4 \u05E9\u05DC \u05DB\u05DC\u05DC\u05D9\u05DD.","\u05D4\u05D3\u05D1\u05E7\u05EA \u05DB\u05DC\u05DC\u05D9\u05DD \u05DB\u05D0\u05DF","\u05D9\u05D9\u05E6\u05D5\u05D0 .txt","\u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4","\u05D4\u05D5\u05E1\u05E4\u05EA \u05DB\u05DC\u05DC\u05D9\u05DD","\u05D4\u05D7\u05DC\u05E4\u05EA \u05DB\u05DC\u05DC\u05D9\u05DD","\u05D9\u05E9 \u05DC\u05D4\u05D3\u05D1\u05D9\u05E7 \u05DB\u05DC\u05DC\u05D9\u05DD \u05DB\u05D3\u05D9 \u05DC\u05E8\u05D0\u05D5\u05EA \u05D0\u05EA \u05E9\u05EA\u05D9 \u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05D4\u05D9\u05D9\u05D1\u05D5\u05D0.","\u05DB\u05DC\u05DC\u05D9 \u05DE\u05D9\u05DC\u05D5\u05EA \u05DE\u05E4\u05EA\u05D7","\u05DE\u05D9\u05DC\u05D4 \u05D0\u05D5 \u05D1\u05D9\u05D8\u05D5\u05D9 \u05D0\u05D7\u05D3 \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4. \u05D4\u05EA\u05D0\u05DE\u05D4 \u05D7\u05DC\u05E7\u05D9\u05EA \u05DC\u05DC\u05D0 \u05D4\u05D1\u05D7\u05E0\u05D4 \u05D1\u05D9\u05DF \u05D0\u05D5\u05EA\u05D9\u05D5\u05EA \u05D2\u05D3\u05D5\u05DC\u05D5\u05EA \u05DC\u05E7\u05D8\u05E0\u05D5\u05EA.","\u05DB\u05DC\u05DC\u05D9 \u05D1\u05D9\u05D8\u05D5\u05D9\u05D9\u05DD \u05E8\u05D2\u05D5\u05DC\u05E8\u05D9\u05D9\u05DD","\u05EA\u05D1\u05E0\u05D9\u05EA \u05D0\u05D7\u05EA \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4. \u05D0\u05E4\u05E9\u05E8 \u200E/pattern/flags\u200E \u05D0\u05D5 \u05EA\u05D1\u05E0\u05D9\u05EA \u05D1\u05DC\u05D1\u05D3 (\u05DC\u05DC\u05D0 \u05D4\u05D1\u05D7\u05E0\u05D4 \u05D1\u05D9\u05DF \u05D0\u05D5\u05EA\u05D9\u05D5\u05EA \u05D2\u05D3\u05D5\u05DC\u05D5\u05EA \u05DC\u05E7\u05D8\u05E0\u05D5\u05EA).","\u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA \u05DE\u05D5\u05D7\u05E8\u05D2\u05D9\u05DD","\u05E9\u05DE\u05D5\u05EA \u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA (\u05D0\u05D7\u05D3 \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4, \u05D1\u05DC\u05D9 @) \u05E9\u05DC\u05E2\u05D5\u05DC\u05DD \u05D0\u05D9\u05E0\u05DD \u05DE\u05E1\u05D5\u05E0\u05E0\u05D9\u05DD.","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DC \u05E4\u05E8\u05D9\u05DE\u05D9\u05D5\u05DD \u05D5\u05DE\u05D0\u05D5\u05DE\u05EA\u05D9\u05DD","\u05DB\u05D1\u05D5\u05D9","\u05D4\u05E1\u05EA\u05E8\u05D4","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05E6\u05D8\u05D8\u05D9\u05DD","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DE\u05E6\u05D8\u05D8\u05D9\u05DD \u05E4\u05D5\u05E1\u05D8 \u05D0\u05D7\u05E8.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05EA\u05D2\u05D5\u05D1\u05D5\u05EA \u05E2\u05DD \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA, GIF \u05D0\u05D5 \u05D5\u05D9\u05D3\u05D0\u05D5","\u05DE\u05EA\u05D7\u05EA \u05DC\u05E4\u05D5\u05E1\u05D8 \u05E9\u05E4\u05EA\u05D7\u05EA, \u05DE\u05E1\u05D9\u05E8 \u05DB\u05DC \u05EA\u05D2\u05D5\u05D1\u05D4 \u05E9\u05E0\u05D5\u05E9\u05D0\u05EA \u05EA\u05DE\u05D5\u05E0\u05D4, GIF \u05D0\u05D5 \u05D5\u05D9\u05D3\u05D0\u05D5. \u05D8\u05E7\u05E1\u05D8 \u05DC\u05E6\u05D9\u05D3\u05D4 \u05DC\u05D0 \u05DE\u05E9\u05E0\u05D4, \u05DB\u05D9 \u05E8\u05D5\u05D1 \u05D4\u05DE\u05DE\u05D9\u05DD \u05DE\u05D2\u05D9\u05E2\u05D9\u05DD \u05E2\u05DD \u05DB\u05D9\u05EA\u05D5\u05D1. \u05D4\u05E4\u05D5\u05E1\u05D8 \u05E2\u05E6\u05DE\u05D5 \u05D5\u05D4\u05E9\u05E8\u05E9\u05D5\u05E8 \u05E9\u05DE\u05E2\u05DC\u05D9\u05D5 \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05DB\u05DE\u05D5 \u05E9\u05D4\u05DD, \u05D5\u05D2\u05DD \u05EA\u05D2\u05D5\u05D1\u05D4 \u05E9\u05E8\u05E7 \u05DE\u05E6\u05D8\u05D8\u05EA \u05E4\u05D5\u05E1\u05D8 \u05E2\u05DD \u05EA\u05DE\u05D5\u05E0\u05D4 \u05E0\u05E9\u05D0\u05E8\u05EA. \u05D6\u05D4 \u05E2\u05D5\u05D1\u05D3 \u05D1\u05E4\u05E0\u05D9 \u05E2\u05E6\u05DE\u05D5, \u05D1\u05DC\u05D9 \u05D4\u05DE\u05E1\u05E0\u05E0\u05D9\u05DD \u05E9\u05DC\u05DE\u05E2\u05DC\u05D4, \u05DB\u05D9 \u05D4\u05E4\u05E0\u05D9\u05D4 \u05E9\u05DC\u05D4\u05DD \u05DC\u05E9\u05D9\u05D7\u05D4 \u05D4\u05D9\u05D9\u05EA\u05D4 \u05DE\u05E1\u05EA\u05D9\u05E8\u05D4 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8 \u05E9\u05D1\u05D0\u05EA \u05DC\u05E7\u05E8\u05D5\u05D0.","\u05DC\u05E6\u05D9\u05D9\u05DF \u05DC\u05DE\u05D4 \u05E4\u05D5\u05E1\u05D8 \u05E1\u05D5\u05E0\u05DF","\u05DE\u05E1\u05E0\u05DF \u05E9\u05DE\u05E1\u05EA\u05D9\u05E8 \u05D1\u05E9\u05E7\u05D8 \u05E7\u05E9\u05D4 \u05DC\u05D4\u05D1\u05D7\u05D9\u05DF \u05D1\u05D9\u05E0\u05D5 \u05DC\u05D1\u05D9\u05DF \u05EA\u05E7\u05DC\u05D4. \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05E2\u05D5\u05DE\u05E2\u05DE\u05D9\u05DD \u05D9\u05DB\u05D5\u05DC\u05D9\u05DD \u05DC\u05E6\u05D9\u05D9\u05DF \u05DE\u05D4 \u05E1\u05D9\u05E0\u05DF \u05D0\u05D5\u05EA\u05DD \u05D1\u05DC\u05D9 \u05DC\u05E9\u05E0\u05D5\u05EA \u05D0\u05EA \u05D4\u05E4\u05E8\u05D9\u05E1\u05D4; \u05D4\u05D4\u05D2\u05D3\u05E8\u05D4 \u05D4\u05E9\u05DC\u05D9\u05E9\u05D9\u05EA \u05D2\u05DD \u05D4\u05D5\u05E4\u05DB\u05EA \u05DB\u05DC \u05E4\u05D5\u05E1\u05D8 \u05DE\u05D5\u05E1\u05EA\u05E8 \u05DC\u05E8\u05E6\u05D5\u05E2\u05D4 \u05D1\u05EA \u05E9\u05D5\u05E8\u05D4 \u05D0\u05D7\u05EA \u05E9\u05DE\u05E6\u05D9\u05D9\u05E0\u05EA \u05D0\u05EA \u05D4\u05E1\u05D9\u05D1\u05D4 \u05D5\u05E0\u05E4\u05EA\u05D7\u05EA \u05D1\u05E8\u05D9\u05D7\u05D5\u05E3 \u05D0\u05D5 \u05D1\u05DE\u05E2\u05D1\u05E8 \u05D0\u05DC\u05D9\u05D4 \u05E2\u05DD Tab.","\u05DC\u05D0 \u05DC\u05E6\u05D9\u05D9\u05DF \u05D3\u05D1\u05E8","\u05D1\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05E2\u05D5\u05DE\u05E2\u05DE\u05D9\u05DD","\u05D1\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05E2\u05D5\u05DE\u05E2\u05DE\u05D9\u05DD \u05D5\u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E2\u05DD \u05DE\u05E2\u05D8 \u05EA\u05D2\u05D5\u05D1\u05D5\u05EA","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05EA\u05D7\u05EA \u05DC\u05DE\u05D9\u05E0\u05D9\u05DE\u05D5\u05DD \u05E9\u05DC\u05D4\u05DC\u05DF. \u05E4\u05D5\u05E1\u05D8 \u05E9-Aviary \u05DC\u05D0 \u05DE\u05E6\u05DC\u05D9\u05D7 \u05DC\u05E7\u05E8\u05D5\u05D0 \u05D0\u05EA \u05D4\u05DE\u05E1\u05E4\u05E8 \u05E9\u05DC\u05D5 \u05DC\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05D9\u05E1\u05D5\u05E0\u05DF \u05DC\u05E4\u05D9\u05D5.","\u05DE\u05D3\u05D9\u05D3\u05EA \u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA \u05DC\u05E4\u05D9","\u05DC\u05D0\u05D9\u05D6\u05D4 \u05DE\u05D4\u05DE\u05E1\u05E4\u05E8\u05D9\u05DD \u05E9\u05DE\u05EA\u05D7\u05EA \u05DC\u05E4\u05D5\u05E1\u05D8 \u05D7\u05DC \u05D4\u05DE\u05D9\u05E0\u05D9\u05DE\u05D5\u05DD.","\u05EA\u05D2\u05D5\u05D1\u05D5\u05EA","\u05E8\u05D9\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD","\u05DC\u05D9\u05D9\u05E7\u05D9\u05DD","\u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA \u05DE\u05D9\u05E0\u05D9\u05DE\u05DC\u05D9\u05EA","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05EA\u05D7\u05EA \u05DC\u05DE\u05E1\u05E4\u05E8 \u05D4\u05D6\u05D4 \u05DE\u05E1\u05D5\u05E0\u05E0\u05D9\u05DD. \u05D0\u05E4\u05E1 \u05DC\u05D0 \u05DE\u05E1\u05E0\u05DF \u05D0\u05E3 \u05E4\u05D5\u05E1\u05D8.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E2\u05DD \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA","\u05DE\u05E1\u05E0\u05DF \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DE\u05DB\u05D9\u05DC\u05D9\u05DD \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E2\u05DD \u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD","\u05DE\u05E1\u05E0\u05DF \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DE\u05DB\u05D9\u05DC\u05D9\u05DD \u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E2\u05DD GIF","\u05DE\u05E1\u05E0\u05DF \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DE\u05DB\u05D9\u05DC\u05D9\u05DD GIF.","\u05E4\u05E2\u05D9\u05DC \u05D1\u05E2\u05DE\u05D5\u05D3\u05D9\u05DD","\u05D4\u05E2\u05DE\u05D5\u05D3\u05D9\u05DD \u05E9\u05D1\u05D4\u05DD \u05D4\u05DE\u05E1\u05E0\u05E0\u05D9\u05DD \u05E4\u05D5\u05E2\u05DC\u05D9\u05DD.","\u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA \u05D7\u05E1\u05D5\u05DE\u05D9\u05DD \u05D5\u05E9\u05D9\u05EA\u05D5\u05E4\u05D9\u05DD \u05E2\u05E6\u05DE\u05D9\u05D9\u05DD","\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05D3\u05D5\u05D2\u05DE\u05D9\u05EA \u05DE\u05D0\u05D5\u05DE\u05EA\u05EA; \u05D4\u05E4\u05E7\u05D3\u05D9\u05DD \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05DE\u05D5\u05E9\u05D1\u05EA\u05D9\u05DD.","\u05D4\u05E1\u05EA\u05E8\u05D4 \u05D0\u05D5 \u05E2\u05DE\u05E2\u05D5\u05DD \u05E9\u05DC \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DC\u05E4\u05D9 \u05DE\u05D9\u05DC\u05D9\u05DD, \u05DE\u05D3\u05D9\u05D4, \u05EA\u05D2\u05D9 \u05D7\u05E9\u05D1\u05D5\u05DF \u05D0\u05D5 \u05D3\u05E3.","\u05DE\u05E6\u05D1 \u05D4\u05DE\u05E1\u05E0\u05E0\u05D9\u05DD","\u05DB\u05DC\u05DC\u05D9\u05DD","\u05E1\u05D5\u05D2\u05D9 \u05EA\u05D5\u05DB\u05DF","\u05E0\u05EA\u05D9\u05D1\u05D9\u05DD","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05D7\u05DC\u05D4 \u05E2\u05DC \u05DB\u05DC \u05E4\u05E7\u05D3\u05D9 \u05D4\u05DE\u05D3\u05D9\u05D4.","\u05DE\u05D5\u05E1\u05D9\u05E3 \u05E4\u05E2\u05D5\u05DC\u05EA \u05D4\u05D5\u05E8\u05D3\u05D4 \u05DC\u05DB\u05DC \u05E4\u05D5\u05E1\u05D8 \u05E2\u05DD \u05DE\u05D3\u05D9\u05D4, \u05DC\u05E6\u05D3 \u05E4\u05E7\u05D3\u05D9\u05DD \u05DC\u05DB\u05DC \u05E7\u05D5\u05D1\u05E5. \u05DB\u05D9\u05D1\u05D5\u05D9 \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05EA \u05DE\u05E1\u05EA\u05D9\u05E8 \u05D2\u05DD \u05D0\u05EA \u05D4\u05E2\u05EA\u05E7\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 \u05D4\u05DE\u05D3\u05D9\u05D4.","\u05D4\u05E6\u05D2\u05EA \u05D4\u05E2\u05EA\u05E7\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 \u05DE\u05D3\u05D9\u05D4","\u05DE\u05D5\u05E1\u05D9\u05E3 \u05E4\u05E2\u05D5\u05DC\u05EA \u05E4\u05D5\u05E1\u05D8 \u05E9\u05DE\u05E2\u05EA\u05D9\u05E7\u05D4 \u05D0\u05EA \u05DB\u05EA\u05D5\u05D1\u05D5\u05EA \u05D4-URL \u05D4\u05D9\u05E9\u05D9\u05E8\u05D5\u05EA \u05D4\u05D8\u05D5\u05D1\u05D5\u05EA \u05D1\u05D9\u05D5\u05EA\u05E8 \u05DC\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA, \u05E7\u05D5\u05D1\u05E6\u05D9 GIF, \u05D5\u05D9\u05D3\u05D0\u05D5, \u05E9\u05DE\u05E2 \u05D5\u05DB\u05EA\u05D5\u05D1\u05D9\u05D5\u05EA, \u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05D7\u05EA \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4. \u05D4\u05E4\u05E2\u05D5\u05DC\u05D4 \u05DE\u05E2\u05EA\u05D9\u05E7\u05D4 \u05E8\u05E7 \u05DE\u05D3\u05D9\u05D4 \u05E9\u05E9\u05D9\u05D9\u05DB\u05EA \u05DC\u05E4\u05D5\u05E1\u05D8 \u05D5\u05D3\u05D5\u05E8\u05E9\u05EA \u05D0\u05EA \u05E4\u05E7\u05D3\u05D9 \u05D4\u05DE\u05D3\u05D9\u05D4 \u05E9\u05DC\u05DE\u05E2\u05DC\u05D4.","\u05D9\u05E9 \u05DC\u05E0\u05E1\u05D5\u05EA \u05EA\u05D7\u05D9\u05DC\u05D4 name=orig \u05D1\u05E4\u05D5\u05E8\u05DE\u05D8 \u05D4\u05DE\u05E7\u05D5\u05E8, \u05D5\u05D0\u05DD \u05D4\u05E4\u05E2\u05D5\u05DC\u05D4 \u05E0\u05DB\u05E9\u05DC\u05EA \u05DC\u05E0\u05E1\u05D5\u05EA 4096x4096.","\u05DE\u05E6\u05D1 \u05D4\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9\u05EA","\u05D4\u05E6\u05D2\u05EA \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05D1\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9\u05EA","\u05D8\u05D5\u05E2\u05DF \u05D0\u05EA \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF \u05D1\u05D2\u05D5\u05D3\u05DC \u05DE\u05DC\u05D0 \u05D1\u05DE\u05E7\u05D5\u05DD \u05D1\u05D2\u05E8\u05E1\u05D4 \u05E9-X \u05D1\u05D5\u05D7\u05E8 \u05DC\u05DE\u05E7\u05D5\u05DD. \u05D7\u05D3 \u05D9\u05D5\u05EA\u05E8, \u05D5\u05E4\u05D9 \u05DB\u05DE\u05D4 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD.","\u05E8\u05E9\u05EA \u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC","\u05EA\u05D1\u05E0\u05D9\u05EA \u05E9\u05DD \u05E7\u05D5\u05D1\u05E5","\u05E9\u05D3\u05D5\u05EA: {handle}, {account}, {tweetId}, {mediaId}, {index}, {total}, {date}, {text}, {ext}. \u200F{account} \u05D4\u05D5\u05D0 \u05DB\u05D9\u05E0\u05D5\u05D9 \u05DC\u05D7\u05E9\u05D1\u05D5\u05DF \u05D4\u05DE\u05E4\u05E8\u05E1\u05DD \u05D5\u05D9\u05DB\u05D5\u05DC \u05DC\u05D9\u05E6\u05D5\u05E8 \u05EA\u05D9\u05E7\u05D9\u05D5\u05EA \u05DC\u05E4\u05D9 \u05D7\u05E9\u05D1\u05D5\u05DF.","\u05E7\u05D5\u05D1\u05E5 \u05DE\u05D8\u05D0-\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E0\u05DC\u05D5\u05D5\u05D4","\u05E9\u05D5\u05DE\u05E8 \u05E7\u05D5\u05D1\u05E5 \u05D8\u05E7\u05E1\u05D8 \u05D0\u05D5 JSON \u05DE\u05E7\u05D5\u05DE\u05D9 \u05E0\u05DC\u05D5\u05D5\u05D4 \u05DC\u05D0\u05D7\u05E8 \u05D4\u05E9\u05DC\u05DE\u05EA \u05DB\u05DC \u05D4\u05D5\u05E8\u05D3\u05EA \u05DE\u05D3\u05D9\u05D4.","\u05D8\u05E7\u05E1\u05D8","JSON","\u05D4\u05EA\u05D0\u05DE\u05EA \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05D3\u05D5\u05DE\u05D5\u05EA \u05D7\u05D6\u05D5\u05EA\u05D9\u05EA","\u05DE\u05E9\u05D5\u05D5\u05D4 \u05D2\u05DD \u05D7\u05EA\u05D9\u05DE\u05D4 \u05D7\u05D6\u05D5\u05EA\u05D9\u05EA \u05E9\u05DC 256 \u05E1\u05D9\u05D1\u05D9\u05D5\u05EA. \u05E7\u05D5\u05DE\u05E4\u05D5\u05D6\u05D9\u05E6\u05D9\u05D5\u05EA \u05E4\u05E9\u05D5\u05D8\u05D5\u05EA \u05D5\u05D3\u05D5\u05DE\u05D5\u05EA \u05E2\u05DC\u05D5\u05DC\u05D5\u05EA \u05DC\u05D4\u05D9\u05D7\u05E9\u05D1 \u05D1\u05D8\u05E2\u05D5\u05EA \u05DC\u05D4\u05EA\u05D0\u05DE\u05D4, \u05DC\u05DB\u05DF \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05EA \u05DB\u05D1\u05D5\u05D9\u05D4 \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC.","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA","\u05DE\u05D3\u05DC\u05D2 \u05E2\u05DC \u05D0\u05D5\u05EA\u05D5 \u05E4\u05E8\u05D9\u05D8 \u05DE\u05D3\u05D9\u05D4 \u05E9\u05DC X \u05D0\u05D5 \u05E2\u05DC \u05D1\u05EA\u05D9\u05DD \u05D6\u05D4\u05D9\u05DD \u05E9\u05DC \u05EA\u05DE\u05D5\u05E0\u05D4 \u05D1\u05DC\u05D9 \u05DC\u05E9\u05DE\u05D5\u05E8 \u05D0\u05EA \u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05DE\u05E7\u05D5\u05E8.","\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05D1\u05DE\u05E7\u05D1\u05D9\u05DC","\u05D4\u05DE\u05E1\u05E4\u05E8 \u05D4\u05DE\u05E8\u05D1\u05D9 \u05E9\u05DC \u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05DE\u05D3\u05D9\u05D4 \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D1\u05D0\u05E6\u05D5\u05D5\u05D4 (1-6).","\u05E7\u05E6\u05D1 \u05D4\u05D5\u05E8\u05D3\u05D4","\u05E9\u05D5\u05DC\u05D8 \u05D1\u05E4\u05E8\u05E5 \u05D4\u05E4\u05EA\u05D9\u05D7\u05D4 \u05D5\u05D1\u05E7\u05E6\u05D1 \u05D4\u05DE\u05EA\u05DE\u05E9\u05DA \u05E9\u05DC \u05D1\u05E7\u05E9\u05D5\u05EA \u05DE\u05D3\u05D9\u05D4 \u05D1\u05D0\u05E6\u05D5\u05D5\u05D4.","\u05E9\u05DE\u05E8\u05E0\u05D9","\u05DE\u05D0\u05D5\u05D6\u05DF","\u05D4\u05D5\u05E8\u05D3\u05EA \u05DB\u05DC \u05D4\u05DE\u05D3\u05D9\u05D4 \u05D4\u05DE\u05D5\u05E6\u05D2\u05EA","\u05D4\u05D5\u05E1\u05E3 \u05DC\u05EA\u05D5\u05E8 \u05D0\u05EA \u05DB\u05DC \u05D4\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA, \u05D4\u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD, \u05E7\u05D5\u05D1\u05E6\u05D9 \u05D4-GIF, \u05D4\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05D4\u05DE\u05DE\u05D5\u05D6\u05E2\u05E8\u05D5\u05EA, \u05E8\u05E6\u05D5\u05E2\u05D5\u05EA \u05D4\u05E9\u05DE\u05E2 \u05D5\u05E8\u05E6\u05D5\u05E2\u05D5\u05EA \u05D4\u05DB\u05EA\u05D5\u05D1\u05D9\u05D5\u05EA \u05E9\u05DE\u05D5\u05E6\u05D2\u05D9\u05DD \u05D1\u05D3\u05E3.","\u05DE\u05E6\u05D1 \u05D4\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA","\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D1\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4","\u05E9\u05D0\u05E8 \u05D4\u05E4\u05D0\u05E0\u05DC \u05DE\u05DE\u05E9\u05D9\u05DA \u05DC\u05E2\u05D1\u05D5\u05D3. \u05D3\u05D5\u05D5\u05D7 \u05DC\u05D0\u05D1\u05D7\u05D5\u05DF.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E6\u05D9\u05D9\u05E8 \u05D0\u05EA \u05D4\u05DE\u05E7\u05D8\u05E2 \u05D4\u05D6\u05D4","\u05D4\u05D2\u05D3\u05E8\u05EA \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05D4\u05D5\u05E8\u05D3\u05D4, \u05D0\u05D9\u05DB\u05D5\u05EA, \u05E9\u05DE\u05D5\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD \u05D5\u05EA\u05D5\u05E8\u05D9\u05DD.","{bytes} \u05E4\u05E8\u05D5\u05E1\u05D9\u05DD \u05E2\u05DC \u05E4\u05E0\u05D9 {count} \u05D0\u05D5\u05E1\u05E4\u05D9\u05DD","\u05E0\u05E4\u05D7 \u05D4\u05D0\u05D7\u05E1\u05D5\u05DF \u05E9\u05DC \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4","\u05D4\u05D0\u05D5\u05E1\u05E4\u05D9\u05DD \u05D4\u05D2\u05D3\u05D5\u05DC\u05D9\u05DD \u05D1\u05D9\u05D5\u05EA\u05E8","\u05D3\u05D5\u05D7 \u05D4\u05D0\u05D7\u05E1\u05D5\u05DF \u05E9\u05DC \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF","\u05D0\u05D6\u05D4\u05E8\u05EA \u05EA\u05E7\u05E8\u05EA \u05D0\u05D7\u05E1\u05D5\u05DF","\u05DE\u05D6\u05D4\u05D9\u05E8 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DC\u05DB\u05D9\u05D3\u05D4 \u05EA\u05E2\u05D1\u05D9\u05E8 \u05D0\u05EA \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05D0\u05EA \u05DE\u05E1\u05E4\u05E8 \u05D4\u05DE\u05D2\u05D4-\u05D1\u05D9\u05D9\u05D8\u05D9\u05DD \u05D4\u05D6\u05D4. 0 \u05DE\u05DB\u05D1\u05D4 \u05D0\u05EA \u05D4\u05D0\u05D6\u05D4\u05E8\u05D4. Aviary \u05DC\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05DE\u05D5\u05D7\u05E7 \u05D3\u05D1\u05E8 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D9\u05E9\u05D0\u05E8 \u05DE\u05EA\u05D7\u05EA \u05DC\u05EA\u05E7\u05E8\u05D4; \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05E0\u05D1\u05D7\u05E8\u05EA \u05D1\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05E9\u05DC \u05D4\u05E0\u05D9\u05E7\u05D5\u05D9.","\u05D4\u05E7\u05D8\u05E0\u05EA \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5","\u05D7\u05DC \u05E2\u05DC \u05DC\u05DB\u05D9\u05D3\u05D5\u05EA \u05DE\u05DB\u05D0\u05DF \u05D5\u05D0\u05D9\u05DC\u05DA. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DE\u05D4\u05DE\u05D0\u05D5\u05D7\u05E1\u05DF \u05DB\u05D1\u05E8 \u05DC\u05D0 \u05DE\u05E9\u05EA\u05E0\u05D4, \u05D5\u05DB\u05DC \u05E8\u05E9\u05D5\u05DE\u05D4 \u05DE\u05D5\u05E7\u05D8\u05E0\u05EA \u05DE\u05E6\u05D9\u05D9\u05E0\u05EA \u05E9\u05D4\u05D5\u05E7\u05D8\u05E0\u05D4.","\u05DC\u05E9\u05DE\u05D5\u05E8 \u05E2\u05DC \u05D4\u05DE\u05E7\u05D5\u05E8","\u05E9\u05DC\u05D5\u05E9\u05D4 \u05E8\u05D1\u05E2\u05D9\u05DD","\u05D7\u05E6\u05D9","\u05E8\u05D1\u05E2","\u05E8\u05E7 \u05EA\u05DE\u05D5\u05E0\u05EA \u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05E9\u05DC \u05D4\u05D5\u05D5\u05D9\u05D3\u05D0\u05D5","\u05E9\u05D5\u05DE\u05E8 \u05D0\u05EA \u05D4\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D4\u05E1\u05D8\u05D8\u05D9\u05EA \u05E9-X \u05DE\u05D2\u05D9\u05E9 \u05DC\u05D5\u05D5\u05D9\u05D3\u05D0\u05D5 \u05D1\u05DE\u05E7\u05D5\u05DD \u05D0\u05EA \u05D4\u05D5\u05D5\u05D9\u05D3\u05D0\u05D5 \u05E2\u05E6\u05DE\u05D5. \u05D4\u05E8\u05E9\u05D5\u05DE\u05D4 \u05DE\u05E6\u05D9\u05D9\u05E0\u05EA \u05E9\u05D4\u05D5\u05D5\u05D9\u05D3\u05D0\u05D5 \u05D4\u05D5\u05E9\u05DE\u05D8, \u05DB\u05D3\u05D9 \u05E9\u05D9\u05D9\u05E6\u05D5\u05D0 \u05DE\u05D0\u05D5\u05D7\u05E8 \u05D9\u05D5\u05EA\u05E8 \u05DC\u05D0 \u05D9\u05E6\u05D9\u05D2 \u05D0\u05EA \u05D4\u05EA\u05DE\u05D5\u05E0\u05D4 \u05DB\u05E4\u05D5\u05E1\u05D8 \u05D4\u05E9\u05DC\u05DD.","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D1\u05DB\u05DC \u05D4\u05D0\u05D5\u05E1\u05E4\u05D9\u05DD \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D1\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD, \u05DC\u05D9\u05D9\u05E7\u05D9\u05DD, \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA, \u05D4\u05E2\u05E8\u05D5\u05EA \u05D5\u05DC\u05DB\u05D9\u05D3\u05D5\u05EA.","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D1\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05EA","\u05D3\u05D9\u05E8\u05D5\u05D2 \u05E1\u05DE\u05E0\u05D8\u05D9","\u05D4\u05D5\u05E8\u05D3\u05EA \u05DE\u05D3\u05D9\u05D4","{count} \u05E4\u05E8\u05D9\u05D8\u05D9 \u05DE\u05D3\u05D9\u05D4","\u05E0\u05E1\u05D5 source:bookmarks, tag:reading \u05D0\u05D5 has:media.","\u05DC\u05D4\u05E6\u05D9\u05D2 \u05D0\u05EA \u05DB\u05E4\u05EA\u05D5\u05E8 \u05D4-AI \u05D1\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD","\u05DE\u05D5\u05E1\u05D9\u05E3 \u05DC\u05DB\u05DC \u05E4\u05D5\u05E1\u05D8 \u05DB\u05E4\u05EA\u05D5\u05E8 \u05E9\u05DE\u05E8\u05DB\u05D9\u05D1 \u05D1\u05E7\u05E9\u05D4 \u05DC\u05EA\u05E8\u05D2\u05D5\u05DD, \u05E1\u05D9\u05DB\u05D5\u05DD, \u05D4\u05E1\u05D1\u05E8 \u05D0\u05D5 \u05D1\u05D3\u05D9\u05E7\u05EA \u05E2\u05D5\u05D1\u05D3\u05D5\u05EA. \u05DC\u05DC\u05D0 \u05E1\u05E4\u05E7 AI \u05DE\u05D5\u05D2\u05D3\u05E8, \u05D4\u05D1\u05E7\u05E9\u05D4 \u05E4\u05E9\u05D5\u05D8 \u05DE\u05D5\u05E2\u05EA\u05E7\u05EA \u05DC\u05DC\u05D5\u05D7 \u05E9\u05DC\u05DA \u05D5\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7 \u05DC\u05E9\u05D5\u05DD \u05DE\u05E7\u05D5\u05DD.","\u05E4\u05EA\u05D9\u05D7\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 t.co","\u05DE\u05D7\u05DC\u05D9\u05E3 \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 \`t.co\` \u05DE\u05E7\u05D5\u05E6\u05E8\u05D9\u05DD \u05D1\u05D9\u05E2\u05D3 \u05E9\u05DE\u05D5\u05E4\u05D9\u05E2 \u05D1\u2011aria-label \u05D5\u05D1\u05DB\u05D5\u05EA\u05E8\u05D5\u05EA.","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05DE\u05E2\u05E7\u05D1 \u05DE\u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD","\u05DE\u05E1\u05D9\u05E8 \u05D0\u05E1\u05D9\u05DE\u05D5\u05E0\u05D9 \u05E9\u05D9\u05EA\u05D5\u05E3 \u05D5\u05E4\u05E8\u05DE\u05D8\u05E8\u05D9 \u05E7\u05DE\u05E4\u05D9\u05D9\u05DF (utm_*, fbclid, \u05D5\u05D4\u2011t/s \u05E9\u05DC X \u05E2\u05E6\u05DE\u05D4) \u05DE\u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05D1\u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF, \u05DB\u05DA \u05E9\u05DE\u05D4 \u05E9\u05EA\u05E2\u05EA\u05D9\u05E7 \u05D4\u05D5\u05D0 \u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05E0\u05E7\u05D9\u05D9\u05D4.","\u05D4\u05E2\u05EA\u05E7\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D1\u05EA\u05D5\u05E8","\u05DE\u05D5\u05E1\u05D9\u05E3 \u05DC\u05DB\u05DC \u05E4\u05D5\u05E1\u05D8 \u05DC\u05D7\u05E6\u05DF \xAB\u05D4\u05E2\u05EA\u05E7 \u05E7\u05D9\u05E9\u05D5\u05E8\xBB \u05E9\u05DB\u05D5\u05EA\u05D1 \u05D0\u05EA \u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05E9\u05DC \u05D0\u05D5\u05EA\u05D5 \u05E4\u05D5\u05E1\u05D8 \u05D1\u05DE\u05D0\u05E8\u05D7 \u05E9\u05E0\u05D1\u05D7\u05E8. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05E9-X \u05D4\u05E6\u05D9\u05D2 \u05D0\u05D9\u05E0\u05D5 \u05E0\u05DB\u05EA\u05D1 \u05DE\u05D7\u05D3\u05E9 \u05D5\u05D0\u05E3 \u05E0\u05D9\u05D5\u05D5\u05D8 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05E0\u05D5\u05EA\u05D1 \u05DE\u05D7\u05D3\u05E9. \u05DE\u05E9\u05EA\u05E0\u05D4 \u05E8\u05E7 \u05DE\u05D4 \u05E9\u05D0\u05EA\u05D4 \u05DE\u05E2\u05EA\u05D9\u05E7. \u05D4\u05E9\u05D0\u05E8 \u05E2\u05DC X \u05DB\u05D3\u05D9 \u05DC\u05D4\u05E1\u05D9\u05E8 \u05D0\u05EA \u05D4\u05DC\u05D7\u05E6\u05DF.","\u05E6\u05D1\u05E2\u05D9 \u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA","\u05EA\u05D1\u05E0\u05D9\u05EA: \u05E9\u05DD \u05DE\u05E9\u05EA\u05DE\u05E9: \u05E6\u05D1\u05E2. \u05D0\u05D7\u05D3 \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4. \u05D4\u05E6\u05D1\u05E2\u05D9\u05DD \u05D4\u05DD amber, rose, violet, sky, green \u05D0\u05D5 slate. \u05E9\u05D5\u05E8\u05D4 \u05E8\u05D9\u05E7\u05D4 \u05DE\u05E1\u05D9\u05E8\u05D4 \u05D0\u05EA \u05D4\u05EA\u05D2\u05D9\u05EA.","\u05D4\u05E2\u05E8\u05D5\u05EA \u05E2\u05DC \u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA","\u05DE\u05D1\u05E0\u05D4: \u05D7\u05E9\u05D1\u05D5\u05DF: \u05D4\u05E2\u05E8\u05D4. \u05D0\u05D7\u05EA \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4. \u05D4\u05E2\u05E8\u05D4 \u05E8\u05D9\u05E7\u05D4 \u05DE\u05D5\u05D7\u05E7\u05EA \u05D0\u05EA \u05D4\u05E8\u05E9\u05D5\u05DE\u05D4.","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05DB\u05DC \u05D4\u05D4\u05E2\u05E8\u05D5\u05EA","\u05DE\u05D5\u05D7\u05E7 \u05D0\u05EA \u05DB\u05DC \u05D4\u05D4\u05E2\u05E8\u05D5\u05EA \u05D4\u05E9\u05DE\u05D5\u05E8\u05D5\u05EA.","\u05E7\u05D8\u05E2\u05D9 \u05D8\u05E7\u05E1\u05D8","\u05E7\u05D8\u05E2 \u05D0\u05D7\u05D3 \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4. \u05EA\u05D2\u05D5\u05D1\u05D5\u05EA \u05D5\u05EA\u05D1\u05E0\u05D9\u05D5\u05EA \u05DC\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D7\u05D5\u05D6\u05E8 \u05E9\u05E0\u05D9\u05EA\u05DF \u05DC\u05D4\u05D5\u05E1\u05D9\u05E3 \u05DE\u05E1\u05E8\u05D2\u05DC \u05D4\u05DB\u05DC\u05D9\u05DD \u05E9\u05DC \u05D4\u05E2\u05D5\u05E8\u05DA.","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D5\u05E0\u05D9\u05D4\u05D5\u05DC \u05E9\u05DC \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D0\u05D5\u05D7\u05E1\u05E0\u05D9\u05DD \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05D4.","\u05DB\u05DC\u05D9 \u05E4\u05D5\u05E1\u05D8","\u05DB\u05DC\u05D9 \u05DB\u05EA\u05D9\u05D1\u05D4","\u05D0\u05D7\u05E1\u05D5\u05DF \u05D5\u05D3\u05D5\u05D7\u05D5\u05EA","\u05D0\u05D5\u05E1\u05E3 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E6\u05D2\u05D9\u05DD \u05D1\u05E2\u05DE\u05D5\u05D3 \u05DC\u05E7\u05E8\u05D0\u05EA \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4\u05D1\u05D0.","\u05E8\u05E9\u05D9\u05DE\u05D4 \u05DE\u05D5\u05E4\u05E8\u05D3\u05EA \u05D1\u05E4\u05E1\u05D9\u05E7\u05D9\u05DD. \u05E0\u05EA\u05DE\u05DB\u05D9\u05DD: json, csv, html, markdown, xlsx.","\u05E9\u05D5\u05DE\u05E8 \u05D2\u05DD \u05D0\u05EA \u05EA\u05E9\u05D5\u05D1\u05D5\u05EA \u05D4\u2011GraphQL \u05D4\u05D2\u05D5\u05DC\u05DE\u05D9\u05D5\u05EA \u05E9\u2011X \u05E9\u05D5\u05DC\u05D7 \u05DC\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA, \u05DB\u05D3\u05D9 \u05DC\u05D0\u05E4\u05E9\u05E8 \u05E0\u05D9\u05EA\u05D5\u05D7 \u05DE\u05D7\u05D3\u05E9 \u05D1\u05D4\u05DE\u05E9\u05DA. \u05D0\u05E1\u05D9\u05DE\u05D5\u05E0\u05D9 \u05D4\u05E4\u05E2\u05DC\u05D4 \u05DE\u05D5\u05E1\u05E8\u05D9\u05DD \u05DC\u05E4\u05E0\u05D9 \u05D4\u05DB\u05EA\u05D9\u05D1\u05D4.","\u05DC\u05DB\u05D9\u05D3\u05EA \u05D1\u05EA\u05D9\u05DD \u05E9\u05DC \u05DE\u05D3\u05D9\u05D4 \u05D1\u05D9\u05D9\u05E6\u05D5\u05D0","\u05DE\u05D5\u05E8\u05D9\u05D3 \u05DE\u05D3\u05D9\u05D4 \u05D1\u05DE\u05D4\u05DC\u05DA \u05E4\u05E2\u05D5\u05DC\u05EA \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D5\u05DB\u05D5\u05DC\u05DC \u05D1\u05EA\u05D9\u05DD \u05E9\u05D4\u05EA\u05E7\u05D1\u05DC\u05D5 \u05D1\u05D4\u05E6\u05DC\u05D7\u05D4 \u05E2\u05DD \u05D0\u05D5\u05E8\u05DA \u05D5\u05E1\u05DB\u05D5\u05DD \u05D1\u05D9\u05E7\u05D5\u05E8\u05EA; \u05E4\u05E8\u05D9\u05D8\u05D9\u05DD \u05E9\u05E0\u05DB\u05E9\u05DC\u05D5 \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05DB\u05D4\u05E4\u05E0\u05D9\u05D5\u05EA \u05E9\u05E0\u05D9\u05EA\u05DF \u05DC\u05E0\u05E1\u05D5\u05EA \u05DE\u05D7\u05D3\u05E9.","\u05D6\u05D9\u05D4\u05D5\u05D9 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9 \u05E9\u05DC \u05DE\u05D6\u05D4\u05D9 \u05E9\u05D0\u05D9\u05DC\u05EA\u05D4","\u05E1\u05D5\u05E8\u05E7 \u05D0\u05EA \u05D4\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8\u05D9\u05DD \u05E9\u05E0\u05D8\u05E2\u05E0\u05D5 \u05DC\u05D0\u05D9\u05EA\u05D5\u05E8 \u05DE\u05D6\u05D4\u05D9 \u05E4\u05E2\u05D5\u05DC\u05D5\u05EA GraphQL \u05E9\u05DC X \u05D5\u05E9\u05D5\u05DE\u05E8 \u05D0\u05D5\u05EA\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA.","\u05DB\u05DC\u05D5\u05DC \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05D5\u05D2\u05E0\u05D9\u05DD \u05D1\u05D9\u05D9\u05E6\u05D5\u05D0 \u05DC\u05E9\u05D9\u05EA\u05D5\u05E3","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05D5\u05D2\u05E0\u05D9\u05DD \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05DE\u05D7\u05D5\u05E5 \u05DC-HTML, Markdown, WARC, WACZ \u05D5\u05DC\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05E1\u05D8\u05D8\u05D9\u05EA \u05E2\u05D3 \u05DC\u05D4\u05E4\u05E2\u05DC\u05D4 \u05DE\u05E4\u05D5\u05E8\u05E9\u05EA. JSON \u05D5-CSV \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05D0\u05E8\u05DB\u05D9\u05D5\u05E0\u05D9\u05D9\u05DD \u05D5\u05E9\u05D5\u05DE\u05E8\u05D9\u05DD \u05D0\u05EA \u05E9\u05D3\u05D4 \u05D4\u05E7\u05D4\u05DC.","\u05DB\u05DC\u05D5\u05DC \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E2\u05DD \u05E7\u05D4\u05DC \u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2 \u05D1\u05D9\u05D9\u05E6\u05D5\u05D0 \u05DC\u05E9\u05D9\u05EA\u05D5\u05E3","\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05E9\u05E0\u05DE\u05E6\u05D0\u05D5\u05EA \u05E8\u05E7 \u05D1-DOM, \u05DE\u05D9\u05D5\u05D1\u05D0\u05D5\u05EA \u05D0\u05D5 \u05D9\u05E9\u05E0\u05D5\u05EA \u05E0\u05E9\u05D0\u05E8\u05D5\u05EA \u05DE\u05D7\u05D5\u05E5 \u05DC\u05D9\u05D9\u05E6\u05D5\u05D0 \u05DC\u05E9\u05D9\u05EA\u05D5\u05E3 \u05E2\u05D3 \u05DC\u05D4\u05E4\u05E2\u05DC\u05D4 \u05DE\u05E4\u05D5\u05E8\u05E9\u05EA. JSON \u05D5-CSV \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05D0\u05E8\u05DB\u05D9\u05D5\u05E0\u05D9\u05D9\u05DD.","\u05EA\u05D9\u05E7\u05D9\u05D9\u05EA \u05E9\u05DE\u05D9\u05E8\u05D4","\u05E9\u05DD \u05D4\u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 (\u05D0\u05D5 \u05D4\u05E0\u05EA\u05D9\u05D1) \u05E9\u05D9\u05E9\u05DE\u05E9 \u05DB\u05E9\u05D5\u05E8\u05E9 \u05E7\u05D5\u05D1\u05E5 \u05D4\u2011ZIP \u05D5\u05DB\u05EA\u05D7\u05D9\u05DC\u05D9\u05EA \u05DC\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA.","{jobs} \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D1\u05DE\u05E2\u05E7\u05D1 \xB7 {queries} \u05DE\u05D6\u05D4\u05D9 GraphQL \u05D1\u05DE\u05D8\u05DE\u05D5\u05DF","\u05DE\u05E6\u05D1 \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E6\u05D2\u05D9\u05DD","\u05D0\u05D5\u05E1\u05E3 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E6\u05D2\u05D9\u05DD \u05D5\u05DE\u05D5\u05E8\u05D9\u05D3 \u05E7\u05D5\u05D1\u05E5 ZIP.","\u05D4\u05E2\u05EA\u05E7\u05EA \u05E0\u05EA\u05D5\u05E0\u05D9 \u05D0\u05D1\u05D7\u05D5\u05DF","\u05DE\u05E2\u05EA\u05D9\u05E7 \u05E0\u05EA\u05D5\u05E0\u05D9 \u05D0\u05D1\u05D7\u05D5\u05DF \u05DC\u05EA\u05DE\u05D9\u05DB\u05D4 (\u05D2\u05E8\u05E1\u05D4, \u05E2\u05DE\u05D5\u05D3, \u05D9\u05D5\u05DE\u05DF \u05D0\u05D7\u05E8\u05D5\u05DF).","\u05D4\u05D5\u05E8\u05D3\u05EA WARC \u05D2\u05D5\u05DC\u05DE\u05D9 \u05D0\u05D5 WACZ \u05DE\u05D5\u05DB\u05DF \u05DC\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D7\u05D5\u05D6\u05E8\u05EA. WACZ \u05E9\u05D5\u05DE\u05E8 \u05D0\u05EA \u05E7\u05D5\u05D1\u05E6\u05D9 \u05D4\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05D5\u05D4\u05D0\u05D9\u05E0\u05D3\u05E7\u05E1 \u05DC\u05DC\u05D0 \u05D3\u05D7\u05D9\u05E1\u05D4.","\u05D2\u05D5\u05D3\u05DC WACZ \u05DE\u05E9\u05D5\u05E2\u05E8: {size} \u05E2\u05D1\u05D5\u05E8 {records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA.","\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05DC\u05E9\u05D9\u05DE\u05D5\u05E8","\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05D1\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05DC\u05E9\u05D9\u05DE\u05D5\u05E8","WARC","WACZ","\u05D1\u05D9\u05D8\u05D5\u05DC","\u05E4\u05EA\u05D9\u05D7\u05EA replayweb.page","\u05D4\u05D5\u05DB\u05D7\u05EA WACZ \u05E9\u05DC Aviary \u05D1\u05DC\u05D1\u05D3","\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05D4\u05D5\u05DB\u05D7\u05EA WACZ \u05E9\u05DC Aviary \u05D1\u05DC\u05D1\u05D3","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D6\u05D5\u05D2 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA","\u05D4\u05E2\u05EA\u05E7\u05D4 \u05DB\u2011Markdown","\u05DE\u05E2\u05EA\u05D9\u05E7 \u05D9\u05D9\u05E6\u05D5\u05D0 Markdown \u05E4\u05E9\u05D5\u05D8 \u05DC\u05DC\u05D5\u05D7.","\u05E9\u05DE\u05D9\u05E8\u05EA Markdown \u05DC\u2011Obsidian","\u200FMarkdown \u05E2\u05DD \u05DB\u05D5\u05EA\u05E8\u05EA YAML \u05D5\u05EA\u05D2\u05D9\u05D5\u05EA Aviary.","\u05E9\u05DE\u05D9\u05E8\u05EA Markdown \u05DC\u2011Notion","\u200FMarkdown \u05DE\u05D1\u05D5\u05E1\u05E1 \u05DB\u05D5\u05EA\u05E8\u05D5\u05EA \u05E9\u2011Notion \u05DE\u05D9\u05D9\u05D1\u05D0 \u05D1\u05E6\u05D5\u05E8\u05D4 \u05E0\u05E7\u05D9\u05D9\u05D4.","\u05E9\u05DE\u05D9\u05E8\u05EA \u05D4\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05DB\u2011JSON","\u200FJSON \u05D2\u05D5\u05DC\u05DE\u05D9 \u05DE\u05E1\u05D5\u05D2 ExportRecord[] \u05DC\u05DC\u05D0 \u05E2\u05D8\u05D9\u05E4\u05EA ZIP.","\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05DC\u05DB\u05DC ZIP","\u05DE\u05E4\u05E6\u05DC \u05D9\u05D9\u05E6\u05D5\u05D0 \u05D0\u05E8\u05D5\u05DA \u05DC\u05DB\u05DE\u05D4 \u05D0\u05E8\u05DB\u05D9\u05D5\u05E0\u05D9\u05DD \u05D1\u05DE\u05E7\u05D5\u05DD \u05E7\u05D5\u05D1\u05E5 \u05E2\u05E0\u05E7 \u05D0\u05D7\u05D3 (25-1000).","\u05DE\u05E1\u05E4\u05E8 \u05DE\u05E8\u05D1\u05D9 \u05E9\u05DC \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D9\u05D9\u05E6\u05D5\u05D0","\u05E9\u05D5\u05DE\u05E8 \u05D0\u05EA \u05D4\u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D4\u05D7\u05D3\u05E9\u05D5\u05EA. 0 \u05DE\u05D1\u05D8\u05DC \u05D0\u05EA \u05D4\u05DE\u05D2\u05D1\u05DC\u05D4.","\u05DE\u05E1\u05E4\u05E8 \u05DE\u05E8\u05D1\u05D9 \u05E9\u05DC \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05DC\u05DE\u05E9\u05D9\u05DE\u05D4","\u05E9\u05D5\u05DE\u05E8 \u05D0\u05EA \u05D4\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D4\u05D7\u05D3\u05E9\u05D5\u05EA \u05D1\u05DB\u05DC \u05DE\u05E9\u05D9\u05DE\u05D4. 0 \u05DE\u05D1\u05D8\u05DC \u05D0\u05EA \u05D4\u05DE\u05D2\u05D1\u05DC\u05D4.","\u05D2\u05D9\u05DC \u05D9\u05D9\u05E6\u05D5\u05D0 \u05DE\u05E8\u05D1\u05D9 (\u05D9\u05DE\u05D9\u05DD)","\u05DE\u05D5\u05D7\u05E7 \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D9\u05E9\u05E0\u05D5\u05EA \u05D1\u05D4\u05E4\u05E2\u05DC\u05D4. 0 \u05DE\u05D1\u05D8\u05DC \u05E0\u05D9\u05E7\u05D5\u05D9 \u05DC\u05E4\u05D9 \u05D2\u05D9\u05DC.","\u05DC\u05DB\u05D9\u05D3\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D1\u05D3\u05E3 \u05D5\u05D4\u05D5\u05E8\u05D3\u05EA \u05E2\u05D5\u05EA\u05E7\u05D9\u05DD \u05E0\u05D9\u05D9\u05D3\u05D9\u05DD.","\u05DC\u05DB\u05D9\u05D3\u05D4","\u05D7\u05D1\u05D9\u05DC\u05D4","\u05D9\u05E2\u05D3","\u05DE\u05E9\u05D9\u05DE\u05D5\u05EA","\u05E9\u05D9\u05DE\u05D5\u05E8","\u05DE\u05D4 \u05DC\u05DE\u05D7\u05D5\u05E7","\u05D4\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05E9\u05E0\u05D1\u05D7\u05E8\u05D4 \u05DE\u05D5\u05E1\u05E8\u05EA \u05D1\u05E1\u05D3\u05E8 \u05D4\u05D1\u05D0: \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA, \u05DC\u05D9\u05D9\u05E7\u05D9\u05DD, \u05E4\u05E8\u05E1\u05D5\u05DE\u05D9\u05DD \u05DE\u05D7\u05D3\u05E9, \u05EA\u05D2\u05D5\u05D1\u05D5\u05EA, \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD.","\u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA","\u05DE\u05E1\u05D9\u05E8 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DE\u05D5\u05E8\u05D9\u05DD \u05DE\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA X.","\u05DE\u05E1\u05D9\u05E8 \u05DC\u05D9\u05D9\u05E7\u05D9\u05DD \u05DE\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA X.","\u05DE\u05D1\u05D8\u05DC \u05E9\u05D9\u05EA\u05D5\u05E4\u05D9\u05DD \u05DE\u05D7\u05D3\u05E9 \u05DE\u05D4\u05DB\u05E8\u05D8\u05D9\u05E1\u05D9\u05D9\u05D4 \u05E9\u05D9\u05EA\u05D5\u05E4\u05D9\u05DD \u05DE\u05D7\u05D3\u05E9.","\u05DE\u05D5\u05D7\u05E7 \u05EA\u05D2\u05D5\u05D1\u05D5\u05EA \u05E9\u05DB\u05EA\u05D1\u05EA \u05D1\u05DC\u05D9 \u05DC\u05D2\u05E2\u05EA \u05D1\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9\u05D9\u05DD.","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD","\u05DE\u05D5\u05D7\u05E7 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D5\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05E6\u05D5\u05D8\u05D8\u05D9\u05DD \u05E9\u05DB\u05EA\u05D1\u05EA.","\u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05D4\u05D5\u05E9\u05DC\u05DE\u05D4. \u05DC\u05D0 \u05E9\u05D5\u05E0\u05D5 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D1\u05D7\u05E9\u05D1\u05D5\u05DF X.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E9\u05D7\u05D6\u05E8 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D5\u05EA\u05D2\u05D5\u05D1\u05D5\u05EA \u05E9\u05E0\u05DE\u05D7\u05E7\u05D5. Aviary \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05D4\u05D7\u05D6\u05D9\u05E8 \u05DC\u05D9\u05D9\u05E7\u05D9\u05DD, \u05E4\u05E8\u05E1\u05D5\u05DE\u05D9\u05DD \u05DE\u05D7\u05D3\u05E9 \u05D0\u05D5 \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05E9\u05D4\u05D5\u05E1\u05E8\u05D5.","\u05D4\u05E4\u05E2\u05DC\u05D4","\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05DE\u05EA\u05E7\u05D3\u05DE\u05D5\u05EA","\u05E9\u05E0\u05D4 \u05D0\u05EA \u05DE\u05D4\u05D9\u05E8\u05D5\u05EA \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05D0\u05D5 \u05D4\u05E9\u05D4\u05D4 \u05DC\u05D0\u05D7\u05E8 \u05DE\u05E1\u05E4\u05E8 \u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05DE\u05D5\u05D2\u05D3\u05E8.","\u05DE\u05D4\u05D9\u05E8\u05D5\u05EA","\u05DE\u05D5\u05E1\u05D9\u05E3 \u05D4\u05E9\u05D4\u05D9\u05D4 \u05D0\u05E7\u05E8\u05D0\u05D9\u05EA \u05D1\u05D9\u05DF \u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05D5\u05D4\u05E4\u05E1\u05E7\u05D5\u05EA \u05D0\u05E8\u05D5\u05DB\u05D5\u05EA \u05D9\u05D5\u05EA\u05E8 \u05D0\u05D7\u05E8\u05D9 \u05DB\u05DC \u05D0\u05E6\u05D5\u05D5\u05D4.","\u05D6\u05D4\u05D9\u05E8","\u05DE\u05D4\u05D9\u05E8","\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05D1\u05DB\u05DC \u05D0\u05E6\u05D5\u05D5\u05D4","\u05DE\u05E9\u05D4\u05D4 \u05D0\u05D7\u05E8\u05D9 \u05DE\u05E1\u05E4\u05E8 \u05D6\u05D4 \u05E9\u05DC \u05D4\u05EA\u05D0\u05DE\u05D5\u05EA. \u05D4\u05E9\u05EA\u05DE\u05E9\u05D5 \u05D1\u05BE0 \u05DC\u05DC\u05D0 \u05D4\u05D2\u05D1\u05DC\u05D4. \u05D4\u05DE\u05E9\u05DA \u05DE\u05E4\u05E2\u05D9\u05DC \u05D0\u05E6\u05D5\u05D5\u05D4 \u05D7\u05D3\u05E9\u05D4.","\u05D1\u05D7\u05E8 \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D5\u05DC\u05D7\u05E5 \u05E2\u05DC \u05D4\u05E4\u05E2\u05DC\u05D4. \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05DE\u05EA\u05D7\u05D9\u05DC\u05D4 \u05DE\u05D9\u05D3.","\u05D4\u05E1\u05D9\u05DB\u05D5\u05DD \u05DE\u05D5\u05DB\u05DF","\u05D4\u05E4\u05E2\u05DC \u05D0\u05EA \u05E2\u05DE\u05E2\u05DD \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DB\u05D1\u05E8 \u05E8\u05D0\u05D9\u05EA \u05EA\u05D7\u05EA \u05E1\u05D9\u05E0\u05D5\u05DF. \u05D4\u05E1\u05D9\u05DB\u05D5\u05DD \u05DE\u05E9\u05EA\u05DE\u05E9 \u05E8\u05E7 \u05D1\u05E9\u05D5\u05E8\u05D5\u05EA \u05E9-Aviary \u05DB\u05D1\u05E8 \u05D4\u05E6\u05D9\u05D2.","\u05DE\u05D4 \u05DB\u05DC\u05D5\u05DC","\u05DB\u05DC \u05DE\u05D4 \u05E9-Aviary \u05E8\u05D0\u05D4 \u05D1\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05E4\u05E2\u05D9\u05DC. \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E1\u05D5\u05E0\u05E0\u05D5 \u05E9\u05D5\u05DE\u05E8\u05D9\u05DD \u05D0\u05EA \u05D4\u05E1\u05D9\u05D1\u05D4 \u05E9\u05DB\u05EA\u05D5\u05D1\u05D4 \u05D1\u05DB\u05DC\u05DC \u05D4\u05E4\u05E2\u05D9\u05DC.","\u05E1\u05E7\u05D9\u05E8\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9-Aviary \u05DB\u05D1\u05E8 \u05E8\u05D0\u05D4 \u05D1\u05DC\u05D9 \u05DC\u05D1\u05E7\u05E9 \u05E2\u05D5\u05D3 \u05DE-X.","\u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05D4\u05D4\u05E1\u05EA\u05E8\u05D4 \u05E4\u05D5\u05E2\u05DC\u05D9\u05DD \u05DC\u05E4\u05D9 \u05D4\u05D4\u05D2\u05D3\u05E8\u05D4 \u05E9\u05DC\u05DE\u05E2\u05DC\u05D4.","\u05D4\u05E1\u05EA\u05E8\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E0\u05E1\u05D2\u05E8\u05D5","\u05DE\u05E9\u05D0\u05D9\u05E8 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05D4\u05E1\u05EA\u05E8\u05EA \u05DE\u05DB\u05D5\u05D5\u05E6\u05D9\u05DD, \u05DB\u05DA \u05E9\u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D1\u05D0 \u05E2\u05D5\u05DC\u05D4 \u05DC\u05DE\u05E2\u05DC\u05D4.","\u05D4\u05E6\u05D2\u05EA \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05D4\u05E1\u05EA\u05E8\u05D4","\u05DE\u05D5\u05E1\u05D9\u05E3 \u05DB\u05E4\u05EA\u05D5\u05E8 \u05D4\u05E1\u05EA\u05E8\u05D4 \u05DC\u05DB\u05DC \u05E4\u05D5\u05E1\u05D8, \u05DC\u05E6\u05D3 \u05EA\u05E4\u05E8\u05D9\u05D8 \u05D4\u05E2\u05D5\u05D3.","\u05DE\u05E6\u05D1 \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05D4\u05D4\u05E1\u05EA\u05E8\u05D4","\u05DE\u05D5\u05E4\u05E2\u05DC \u05DB\u05D0\u05E9\u05E8 \u05D4\u05E1\u05EA\u05E8\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E0\u05D3\u05D7\u05D5 \u05E4\u05E2\u05D9\u05DC\u05D4.","\u05D4\u05E2\u05DE\u05D5\u05D3\u05D9\u05DD \u05E9\u05D1\u05D4\u05DD \u05D4\u05D4\u05E1\u05EA\u05E8\u05D4 \u05D5\u05D4\u05DB\u05E4\u05EA\u05D5\u05E8 \u05E4\u05D5\u05E2\u05DC\u05D9\u05DD.","\u05DE\u05E1\u05E4\u05E8 \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05E8\u05D1\u05D9 \u05DC\u05E9\u05DE\u05D9\u05E8\u05D4","\u05D4\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD \u05D4\u05D9\u05E9\u05E0\u05D9\u05DD \u05E0\u05DE\u05D7\u05E7\u05D9\u05DD \u05DB\u05E9\u05D4\u05DE\u05D0\u05D2\u05E8 \u05D7\u05D5\u05E8\u05D2 \u05DE\u05D2\u05D5\u05D3\u05DC \u05D6\u05D4 (100\u200F-50000).","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD \u05E9\u05E0\u05E9\u05DE\u05E8\u05D5","\u05D1\u05D9\u05D8\u05D5\u05DC \u05D4\u05D4\u05E1\u05EA\u05E8\u05D4 \u05D4\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4","\u05DE\u05E9\u05D7\u05D6\u05E8 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D0\u05D7\u05E8\u05D5\u05DF \u05E9\u05D4\u05D5\u05E1\u05EA\u05E8.","\u05E9\u05D7\u05D6\u05D5\u05E8","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD","\u05E9\u05D5\u05DB\u05D7 \u05D0\u05EA \u05DB\u05DC \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD \u05D5\u05DE\u05D7\u05D6\u05D9\u05E8 \u05D0\u05EA \u05DB\u05D5\u05DC\u05DD.","\u05D1\u05D7\u05D9\u05E8\u05D4 \u05D4\u05D9\u05DB\u05DF \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD, \u05D0\u05D5 \u05D4\u05E6\u05D2\u05EA\u05DD \u05DE\u05D7\u05D3\u05E9.","\u05DB\u05D9\u05E1\u05D5\u05D9","\u05E9\u05DE\u05D9\u05E8\u05D4","\u05E9\u05D7\u05D6\u05D5\u05E8","\u05D4\u05E9\u05D4\u05D9\u05D9\u05EA \u05D5\u05D9\u05D3\u05D0\u05D5 \u05E9\u05D9\u05D5\u05E6\u05D0 \u05DE\u05D4\u05DE\u05E1\u05DA","\u05DE\u05E4\u05E1\u05D9\u05E7 \u05DC\u05E4\u05E2\u05E0\u05D7 \u05D5\u05D9\u05D3\u05D0\u05D5 \u05D1\u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF \u05DB\u05E9\u05D4\u05D5\u05D0 \u05D9\u05D5\u05E6\u05D0 \u05DE\u05D4\u05DE\u05E1\u05DA, \u05D5\u05DE\u05DE\u05E9\u05D9\u05DA \u05D0\u05D5\u05EA\u05D5 \u05DB\u05E9\u05D4\u05D5\u05D0 \u05D7\u05D5\u05D6\u05E8. \u05D5\u05D9\u05D3\u05D0\u05D5 \u05E9\u05D4\u05E9\u05D4\u05D9\u05EA \u05D1\u05E2\u05E6\u05DE\u05DA \u05E0\u05E9\u05D0\u05E8 \u05DE\u05D5\u05E9\u05D4\u05D4.","\u05D4\u05DE\u05E9\u05DA \u05E0\u05D9\u05D2\u05D5\u05DF \u05D5\u05D9\u05D3\u05D0\u05D5 \u05DB\u05E9\u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA \u05DE\u05D0\u05D1\u05D3\u05EA \u05DE\u05D9\u05E7\u05D5\u05D3","X \u05E2\u05D5\u05E6\u05E8 \u05D5\u05D9\u05D3\u05D0\u05D5 \u05DE\u05EA\u05E0\u05D2\u05DF \u05DB\u05E9\u05E2\u05D5\u05D1\u05E8\u05D9\u05DD \u05DC\u05E9\u05D5\u05E0\u05D9\u05EA. \u05D0\u05E4\u05E9\u05E8\u05D5\u05EA \u05D6\u05D5 \u05DE\u05D7\u05D3\u05E9\u05EA \u05D0\u05D5\u05EA\u05D5 \u05D1\u05D7\u05D6\u05E8\u05D4. \u05D5\u05D9\u05D3\u05D0\u05D5 \u05E9\u05D4\u05E9\u05D4\u05D9\u05EA \u05D1\u05E2\u05E6\u05DE\u05DA \u05D9\u05D9\u05E9\u05D0\u05E8 \u05DE\u05D5\u05E9\u05D4\u05D4.","\u05E0\u05D9\u05D2\u05D5\u05DF \u05D7\u05D5\u05D6\u05E8 \u05E9\u05DC \u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD","\u05DE\u05E4\u05E2\u05D9\u05DC \u05D0\u05EA \u05D4\u05E1\u05E8\u05D8\u05D5\u05DF \u05DE\u05D7\u05D3\u05E9 \u05D1\u05E1\u05D9\u05D5\u05DE\u05D5 \u05D1\u05DE\u05E7\u05D5\u05DD \u05DC\u05E2\u05E6\u05D5\u05E8.","\u05E7\u05D9\u05D1\u05D5\u05E2 \u05E8\u05E9\u05D9\u05DE\u05D5\u05EA \u05D4\u05E0\u05D9\u05D2\u05D5\u05DF \u05DC\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05D8\u05D5\u05D1\u05D4 \u05D1\u05D9\u05D5\u05EA\u05E8","\u05DB\u05D0\u05E9\u05E8 X \u05DE\u05D5\u05E1\u05E8 \u05DC-Aviary \u05E8\u05E9\u05D9\u05DE\u05EA \u05E0\u05D9\u05D2\u05D5\u05DF \u05E2\u05DD \u05DB\u05DE\u05D4 \u05D0\u05D9\u05DB\u05D5\u05D9\u05D5\u05EA, \u05E0\u05E9\u05DE\u05E8\u05EA \u05E8\u05E7 \u05D4\u05D2\u05D1\u05D5\u05D4\u05D4 \u05D1\u05D9\u05D5\u05EA\u05E8. \u05D2\u05DD \u05D1\u05D7\u05D9\u05D1\u05D5\u05E8 \u05DE\u05D4\u05D9\u05E8 X \u05DE\u05E1\u05EA\u05E4\u05E7 \u05DC\u05D0 \u05E4\u05E2\u05DD \u05D1\u05D0\u05D9\u05DB\u05D5\u05EA \u05E0\u05DE\u05D5\u05DB\u05D4 \u05DE\u05D4\u05D6\u05DE\u05D9\u05E0\u05D4. \u05D4\u05D3\u05D1\u05E8 \u05E6\u05D5\u05E8\u05DA \u05D9\u05D5\u05EA\u05E8 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD, \u05D5\u05E4\u05D5\u05E2\u05DC \u05E8\u05E7 \u05E2\u05DC \u05E8\u05E9\u05D9\u05DE\u05D5\u05EA \u05E9-Aviary \u05D0\u05DB\u05DF \u05E8\u05D5\u05D0\u05D4.","\u05D4\u05E9\u05D4\u05D9\u05D9\u05EA \u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD \u05D0\u05D7\u05E8\u05D9 \u05E9\u05D4\u05DD \u05D9\u05D5\u05E6\u05D0\u05D9\u05DD \u05DE\u05D4\u05DE\u05E1\u05DA.","\u05D4\u05E4\u05E2\u05DC\u05D4","{count} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \xB7 \u05D4\u05D0\u05D7\u05E8\u05D5\u05DF {kind}, {latestCount} \u05D1\u05BE{at}","\u05EA\u05E6\u05DC\u05D5\u05DE\u05D9 \u05DE\u05E6\u05D1 \u05E9\u05E0\u05E9\u05DE\u05E8\u05D5","\u05D0\u05D9\u05E1\u05D5\u05E3 \u05E2\u05D5\u05E7\u05D1\u05D9\u05DD \u05DE\u05D4\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D6\u05D4","\u05E2\u05D5\u05D1\u05E8 \u05E2\u05DC \u05E9\u05D5\u05E8\u05D5\u05EA UserCell \u05D1\u05E2\u05DE\u05D5\u05D3 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9. \u05E4\u05EA\u05D7 \u05EA\u05D7\u05D9\u05DC\u05D4 \u05E2\u05DE\u05D5\u05D3 \u200E/\u05D7\u05E9\u05D1\u05D5\u05DF/followers\u200E.","\u05D0\u05D9\u05E1\u05D5\u05E3 \u05E0\u05E2\u05E7\u05D1\u05D9\u05DD \u05DE\u05D4\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D6\u05D4","\u05E2\u05D5\u05D1\u05E8 \u05E2\u05DC \u05E9\u05D5\u05E8\u05D5\u05EA UserCell \u05D1\u05E2\u05DE\u05D5\u05D3 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9. \u05E4\u05EA\u05D7 \u05EA\u05D7\u05D9\u05DC\u05D4 \u05E2\u05DE\u05D5\u05D3 \u200E/\u05D7\u05E9\u05D1\u05D5\u05DF/following\u200E.","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05DB\u05DC \u05EA\u05E6\u05DC\u05D5\u05DE\u05D9 \u05D4\u05DE\u05E6\u05D1","\u05DE\u05D5\u05D7\u05E7 \u05D0\u05EA \u05DB\u05DC \u05EA\u05E6\u05DC\u05D5\u05DE\u05D9 \u05D4\u05E2\u05D5\u05E7\u05D1\u05D9\u05DD \u05D5\u05D4\u05E0\u05E2\u05E7\u05D1\u05D9\u05DD \u05E9\u05E0\u05E9\u05DE\u05E8\u05D5.","\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF X \u05D4\u05E8\u05E9\u05DE\u05D9","\u05D1\u05D7\u05E8 \u05E7\u05D5\u05D1\u05E5 ZIP \u05E9\u05D9\u05D5\u05E6\u05D0 \u05DE\u05BEx.com. \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA STORE \u05D5\u05BEDEFLATE \u05E0\u05EA\u05DE\u05DB\u05D5\u05EA; \u05D4\u05DE\u05E7\u05D5\u05E8 \u05E0\u05E9\u05D0\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05DB\u05DC \u05E2\u05D5\u05D3 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA \u05D0\u05EA \u05D4\u05D9\u05D9\u05D1\u05D5\u05D0.","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D8\u05E7\u05E1\u05D8 \u05DE\u05DC\u05D0 \u05D1\u05D4\u05E8\u05E6\u05EA \u05D0\u05D9\u05E1\u05D5\u05E3 \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4.","@\u05DB\u05D9\u05E0\u05D5\u05D9, \u05DE\u05D9\u05DC\u05EA \u05DE\u05E4\u05EA\u05D7, \u05D1\u05D9\u05D8\u05D5\u05D9\u2026","\u05D4\u05E7\u05DC\u05D3 \u05DB\u05D3\u05D9 \u05DC\u05D7\u05E4\u05E9 \u05D1\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \u05D1\u05D4\u05E8\u05E6\u05D5\u05EA \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0.","\u05D4\u05D5\u05E8\u05D3\u05EA \u05D3\u05D5\u05D7 Markdown","\u05D9\u05D5\u05DE\u05DF \u05D1\u05D9\u05E7\u05D5\u05E8\u05EA, \u05D4\u05E9\u05D5\u05D5\u05D0\u05EA \u05EA\u05E6\u05DC\u05D5\u05DE\u05D9 \u05DE\u05E6\u05D1 \u05D5\u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05E9\u05DC \u05E0\u05D9\u05E7\u05D5\u05D9.","{total} \u05E4\u05E8\u05D9\u05D8\u05D9\u05DD \xB7 \u05D1\u05EA\u05D5\u05E8 {queued} \xB7 \u05D0\u05D5\u05E9\u05E8\u05D5 {approved} \xB7 \u05D3\u05D5\u05DC\u05D2\u05D5 {skipped}","\u05EA\u05D5\u05E8 \u05DC\u05D1\u05D3\u05D9\u05E7\u05EA \u05E0\u05D9\u05E7\u05D5\u05D9","\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05D4\u05E8\u05E1\u05E0\u05D9\u05D5\u05EA","\u200FAviary \u05DC\u05E2\u05D5\u05DC\u05DD \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D5\u05D7\u05E7 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD, \u05DC\u05D9\u05D9\u05E7\u05D9\u05DD \u05D0\u05D5 \u05E2\u05D5\u05E7\u05D1\u05D9\u05DD. \u05D4\u05EA\u05D5\u05E8 \u05D4\u05D5\u05D0 \u05E8\u05E9\u05D9\u05DE\u05EA \u05D1\u05D3\u05D9\u05E7\u05D4 \u05D1\u05DC\u05D1\u05D3; \u05D0\u05D9\u05E9\u05D5\u05E8 \u05D0\u05D5 \u05D3\u05D9\u05DC\u05D5\u05D2 \u05E0\u05E8\u05E9\u05DE\u05D9\u05DD \u05E8\u05E7 \u05D1\u05D9\u05D5\u05DE\u05DF \u05D4\u05D1\u05D9\u05E7\u05D5\u05E8\u05EA.","\u05D4\u05D5\u05E1\u05E4\u05EA \u05EA\u05E6\u05D5\u05D2\u05EA \u05D4\u05E0\u05D9\u05E7\u05D5\u05D9 \u05DC\u05EA\u05D5\u05E8","\u05DE\u05D5\u05E1\u05D9\u05E3 \u05DC\u05EA\u05D5\u05E8 \u05D0\u05EA \u05DB\u05DC \u05D4\u05DE\u05D5\u05E2\u05DE\u05D3\u05D9\u05DD \u05D4\u05DC\u05D0 \u05DE\u05D5\u05D2\u05E0\u05D9\u05DD \u05DE\u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4 (\u05DC\u05DC\u05D0 \u05E4\u05E2\u05D5\u05DC\u05D4 \u05D4\u05E8\u05E1\u05E0\u05D9\u05EA).","\u05E8\u05D9\u05E7\u05D5\u05DF \u05EA\u05D5\u05E8 \u05D4\u05E0\u05D9\u05E7\u05D5\u05D9","\u05DE\u05D5\u05D7\u05E7 \u05D0\u05EA \u05DB\u05DC \u05D4\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD \u05D1\u05EA\u05D5\u05E8 \u05D1\u05DC\u05D9 \u05DC\u05D2\u05E2\u05EA \u05D1\u05E0\u05EA\u05D5\u05E0\u05D9 \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF.","\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF X \u05E8\u05E9\u05DE\u05D9 \u05D0\u05D5 \u05D4\u05E9\u05D5\u05D5\u05D0\u05EA \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05DE\u05E6\u05D1 \u05E9\u05DC \u05E2\u05D5\u05E7\u05D1\u05D9\u05DD.","\u05EA\u05E6\u05DC\u05D5\u05DE\u05D9 \u05DE\u05E6\u05D1 \u05D7\u05D9\u05D9\u05DD","\u05D4\u05E2\u05D1\u05E8\u05D4 \u05DC\u2011Aria2","\u05E9\u05D5\u05DC\u05D7 \u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05DE\u05D3\u05D9\u05D4 \u05D2\u05D3\u05D5\u05DC\u05D5\u05EA \u05DC\u05E0\u05E7\u05D5\u05D3\u05EA \u05E7\u05E6\u05D4 Aria2 \u05DE\u05E1\u05D5\u05D2 JSON-RPC \u05E9\u05D0\u05EA\u05D4 \u05DE\u05D0\u05E8\u05D7.","\u05E0\u05E7\u05D5\u05D3\u05EA \u05D4\u05E7\u05E6\u05D4 \u05E9\u05DC Aria2","\u200Fhttp://localhost:6800 (\u05DC\u05DC\u05D0 \u05DC\u05D5\u05DB\u05E1\u05DF \u05D1\u05E1\u05D5\u05E3)","\u05E1\u05D5\u05D3 \u05D4\u2011RPC \u05E9\u05DC Aria2","\u05E1\u05D5\u05D3 \u05DE\u05E9\u05D5\u05EA\u05E3 \u05D0\u05D5\u05E4\u05E6\u05D9\u05D5\u05E0\u05DC\u05D9 \u05DC\u05D0\u05D9\u05DE\u05D5\u05EA token:.","\u05D4\u05E6\u05D2\u05D4","\u05D4\u05E2\u05D1\u05E8\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD \u05D2\u05D3\u05D5\u05DC\u05D9\u05DD \u05DE-(MB)","\u05E7\u05D1\u05E6\u05D9\u05DD \u05E7\u05D8\u05E0\u05D9\u05DD \u05D9\u05D5\u05EA\u05E8 \u05E0\u05E9\u05DE\u05E8\u05D9\u05DD \u05D3\u05E8\u05DA \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF. Aviary \u05D1\u05D5\u05D3\u05E7 \u05E7\u05D5\u05D3\u05DD \u05D0\u05EA \u05D4\u05D2\u05D5\u05D3\u05DC, \u05D5\u05D0\u05DD \u05D4\u05E9\u05E8\u05EA \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D3\u05D5\u05D5\u05D7 \u05E2\u05DC\u05D9\u05D5 \u05D4\u05E7\u05D5\u05D1\u05E5 \u05DE\u05D5\u05E2\u05D1\u05E8 \u05D1\u05DB\u05DC \u05D6\u05D0\u05EA.","\u05D1\u05D3\u05D9\u05E7\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC\u2011Aria2","\u05E9\u05D5\u05DC\u05D7 \u05E7\u05E8\u05D9\u05D0\u05EA JSON-RPC \u05E4\u05E9\u05D5\u05D8\u05D4.","\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA Aria2 \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA","\u05E8\u05E2\u05E0\u05DF \u05DB\u05D3\u05D9 \u05DC\u05D4\u05E6\u05D9\u05D2 \u05D4\u05E2\u05D1\u05E8\u05D5\u05EA \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA; \u05DC\u05D7\u05E5 \u05E2\u05DC \u05D1\u05D9\u05D8\u05D5\u05DC \u05DB\u05D3\u05D9 \u05DC\u05E2\u05E6\u05D5\u05E8 \u05D0\u05D7\u05EA.","\u05E8\u05E2\u05E0\u05D5\u05DF","\u05D4\u05E2\u05D1\u05E8\u05D4 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05DC-yt-dlp","\u05DE\u05E6\u05D9\u05E2 \u05E9\u05DE\u05D9\u05E8\u05D4 \u05D0\u05D3\u05E4\u05D8\u05D9\u05D1\u05D9\u05EA \u05D1\u05D0\u05D9\u05DB\u05D5\u05EA \u05D2\u05D1\u05D5\u05D4\u05D4 \u05D9\u05D5\u05EA\u05E8 \u05DB\u05E9\u05E8\u05E5 \u05E2\u05D5\u05D6\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05DE\u05D0\u05D5\u05DE\u05EA.","\u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05E2\u05D5\u05D6\u05E8 \u05E9\u05DC yt-dlp","\u200Fhttp://127.0.0.1:8787 (\u05DC\u05D5\u05DC\u05D0\u05D4 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05D1\u05DC\u05D1\u05D3)","\u05D4\u05E1\u05D5\u05D3 \u05E9\u05DC \u05D4\u05E2\u05D5\u05D6\u05E8 yt-dlp","\u05D4-AVIARY_YTDLP_TOKEN \u05D4\u05DE\u05E9\u05D5\u05EA\u05E3 \u05E2\u05DD \u05D4\u05EA\u05D4\u05DC\u05D9\u05DA \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9.","\u05E4\u05E8\u05E1\u05D5\u05DD \u05DE\u05E7\u05D1\u05D9\u05DC \u05D1\u2011Bluesky","\u05DE\u05E4\u05E8\u05E1\u05DD \u05D0\u05EA \u05D4\u05D8\u05E7\u05E1\u05D8 \u05DE\u05D7\u05DC\u05D5\u05DF \u05D4\u05DB\u05EA\u05D9\u05D1\u05D4 \u05DC\u05D7\u05E9\u05D1\u05D5\u05DF Bluesky \u05E9\u05DC\u05DA \u05DC\u05E4\u05D9 \u05D3\u05E8\u05D9\u05E9\u05D4.","\u05DB\u05EA\u05D5\u05D1\u05EA \u05E9\u05D9\u05E8\u05D5\u05EA Bluesky","\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC: https://bsky.social","\u05D7\u05E9\u05D1\u05D5\u05DF Bluesky","\u05E9\u05DD \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05E9\u05DC\u05DA (\u05D1\u05DC\u05D9 @, \u05DC\u05DE\u05E9\u05DC you.bsky.social)","\u05E1\u05D9\u05E1\u05DE\u05EA \u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05DC\u2011Bluesky","\u05E1\u05D9\u05E1\u05DE\u05EA \u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05DE\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF. \u05DC\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05D4\u05E1\u05D9\u05E1\u05DE\u05D4 \u05D4\u05E8\u05D0\u05E9\u05D9\u05EA.","\u05E4\u05E8\u05E1\u05D5\u05DD \u05DE\u05E7\u05D1\u05D9\u05DC \u05D1\u2011Mastodon","\u05DE\u05E4\u05E8\u05E1\u05DD \u05D0\u05EA \u05D4\u05D8\u05E7\u05E1\u05D8 \u05DE\u05D7\u05DC\u05D5\u05DF \u05D4\u05DB\u05EA\u05D9\u05D1\u05D4 \u05DC\u05D7\u05E9\u05D1\u05D5\u05DF Mastodon \u05E9\u05DC\u05DA \u05DC\u05E4\u05D9 \u05D3\u05E8\u05D9\u05E9\u05D4.","\u05E9\u05E8\u05EA Mastodon","https://mastodon.social","\u05D0\u05E1\u05D9\u05DE\u05D5\u05DF \u05D2\u05D9\u05E9\u05D4 \u05DC\u2011Mastodon","\u05D0\u05E1\u05D9\u05DE\u05D5\u05DF Bearer \u05E2\u05DD \u05D4\u05E8\u05E9\u05D0\u05EA write:statuses.","\u05E6\u05D9\u05E8\u05D5\u05E3 \u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05D4\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4","\u05DE\u05E2\u05DC\u05D4 \u05D0\u05EA \u05D4\u05DE\u05D3\u05D9\u05D4 \u05D4\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4 \u05E9\u2011Aviary \u05D4\u05D5\u05E8\u05D9\u05D3 \u05D1\u05D4\u05E6\u05DC\u05D7\u05D4 \u05D9\u05D7\u05D3 \u05E2\u05DD \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05D1\u05E4\u05E8\u05E1\u05D5\u05DD \u05DE\u05E7\u05D1\u05D9\u05DC.","\u05E4\u05E8\u05E1\u05D5\u05DD \u05DB\u05E9\u05E8\u05E9\u05D5\u05E8","\u05E4\u05E6\u05DC \u05D1\u05E9\u05D5\u05E8\u05D5\u05EA \u05E8\u05D9\u05E7\u05D5\u05EA \u05D5\u05D4\u05E9\u05D1 \u05DC\u05DB\u05DC \u05DE\u05E7\u05D8\u05E2 \u05DC\u05E7\u05D8\u05E2 \u05D4\u05E7\u05D5\u05D3\u05DD.","\u05E4\u05E8\u05E1\u05D5\u05DD \u05D7\u05DC\u05D5\u05DF \u05D4\u05DB\u05EA\u05D9\u05D1\u05D4 \u05D1\u2011Bluesky","\u05DE\u05E9\u05EA\u05DE\u05E9 \u05D1\u05D8\u05E7\u05E1\u05D8 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9 \u05D1\u05D7\u05DC\u05D5\u05DF \u05D4\u05DB\u05EA\u05D9\u05D1\u05D4.","\u05E4\u05E8\u05E1\u05D5\u05DD \u05D7\u05DC\u05D5\u05DF \u05D4\u05DB\u05EA\u05D9\u05D1\u05D4 \u05D1\u2011Mastodon","\u05D4\u05E8\u05E6\u05D5\u05EA \u05E1\u05E4\u05E7 \u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA","\u05DE\u05D0\u05E4\u05E9\u05E8 \u05DC\u05EA\u05E4\u05E8\u05D9\u05D8 \u05D4\u05E4\u05E7\u05D5\u05D3\u05D5\u05EA \u05DC\u05E9\u05DC\u05D5\u05D7 \u05D1\u05E7\u05E9\u05D5\u05EA \u05DC\u05E1\u05E4\u05E7 \u05E9\u05D4\u05D2\u05D3\u05E8\u05EA.","\u05E1\u05E4\u05E7 \u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA","Anthropic Messages API","OpenAI Chat Completions","\u05EA\u05D5\u05D0\u05DD OpenAI \u200F(LocalAI, \u05E4\u05E8\u05D5\u05E7\u05E1\u05D9 Ollama, \u2026)","\u05E0\u05E7\u05D5\u05D3\u05EA \u05E7\u05E6\u05D4 (\u05D0\u05D5\u05E4\u05E6\u05D9\u05D5\u05E0\u05DC\u05D9)","\u05E2\u05D5\u05E7\u05E3 \u05D0\u05EA \u05E0\u05E7\u05D5\u05D3\u05EA \u05D4\u05E7\u05E6\u05D4 \u05E9\u05D1\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC \u05E2\u05D1\u05D5\u05E8 \u05D4\u05E1\u05E4\u05E7 \u05E9\u05E0\u05D1\u05D7\u05E8.","\u05DE\u05D5\u05D3\u05DC","\u05DC\u05D3\u05D5\u05D2\u05DE\u05D4: claude-sonnet-4-6, gpt-4o, llama3.1:8b","\u05DE\u05E4\u05EA\u05D7 API","\u05E0\u05E9\u05DE\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05D1\u05DC\u05D1\u05D3. \u200FAviary \u05E9\u05D5\u05DC\u05D7 \u05D0\u05D5\u05EA\u05D5 \u05E8\u05E7 \u05DB\u05DB\u05D5\u05EA\u05E8\u05EA \u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05DC \u05D4\u05E1\u05E4\u05E7 \u05E9\u05DC\u05DA.","\u05DE\u05D5\u05EA\u05E8","\u05DE\u05E6\u05D1 \u05D4\u05E8\u05E9\u05EA","\u05D9\u05E2\u05D3 \u05D4\u05D1\u05D9\u05E0\u05D4 \u05D4\u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA","\u05D7\u05E9\u05D9\u05E4\u05EA \u05E0\u05EA\u05D5\u05E0\u05D9 \u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA","\u05DC\u05E4\u05E0\u05D9 \u05D4\u05E9\u05DC\u05D9\u05D7\u05D4 Aviary \u05DE\u05E6\u05D9\u05D2\u05D4 \u05D0\u05EA \u05D4\u05E1\u05E4\u05E7, \u05E0\u05E7\u05D5\u05D3\u05EA \u05D4\u05E7\u05E6\u05D4, \u05D4\u05E9\u05D3\u05D5\u05EA, \u05D4\u05E2\u05E8\u05DB\u05EA \u05D4\u05EA\u05D5\u05D5\u05D9\u05DD/\u05D4\u05D8\u05D5\u05E7\u05E0\u05D9\u05DD, \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05D5\u05DE\u05E6\u05D1 \u05D4\u05EA\u05E7\u05E6\u05D9\u05D1.","\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1-AI \u05D4\u05D9\u05D5\u05DD","\u05DE\u05E7\u05E1\u05D9\u05DE\u05D5\u05DD \u05D1\u05EA\u05D9\u05DD \u05DC\u05D1\u05E7\u05E9\u05EA AI","\u05DC\u05E2\u05E6\u05D5\u05E8 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DC\u05D9\u05D7\u05EA \u05D1\u05E7\u05E9\u05EA \u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA \u05E9\u05D2\u05D5\u05E3 \u05D4-UTF-8 \u05E9\u05DC\u05D4 \u05D2\u05D3\u05D5\u05DC \u05DE\u05D2\u05D5\u05D3\u05DC \u05D6\u05D4. \u05E2\u05E8\u05DA 0 \u05D7\u05D5\u05E1\u05DD \u05DB\u05DC \u05D1\u05E7\u05E9\u05EA \u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA.","\u05D1\u05EA\u05D9\u05DD \u05D9\u05D5\u05DE\u05D9\u05D9\u05DD \u05DC\u05D1\u05E7\u05E9\u05D5\u05EA AI","\u05DC\u05E2\u05E6\u05D5\u05E8 \u05E7\u05E8\u05D9\u05D0\u05D5\u05EA \u05DC\u05E1\u05E4\u05E7 \u05D4\u05D1\u05D9\u05E0\u05D4 \u05D4\u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA \u05D0\u05D7\u05E8\u05D9 \u05DB\u05DE\u05D5\u05EA \u05D6\u05D5 \u05E9\u05DC \u05D1\u05D9\u05D9\u05D8\u05D9\u05DD \u05D1\u05D1\u05E7\u05E9\u05D5\u05EA UTF-8 \u05D1\u05D9\u05D5\u05DD \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9. \u05E2\u05E8\u05DA 0 \u05D7\u05D5\u05E1\u05DD \u05DB\u05DC \u05D1\u05E7\u05E9\u05EA \u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA.","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05E1\u05DE\u05E0\u05D8\u05D9","\u05E9\u05DC\u05D9\u05D7\u05EA \u05D8\u05E7\u05E1\u05D8 \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \u05DC\u05E0\u05E7\u05D5\u05D3\u05EA \u05D4\u05E7\u05E6\u05D4 \u05D4\u05DE\u05D5\u05D2\u05D3\u05E8\u05EA \u05E9\u05DC embeddings \u05DC\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D3\u05DE\u05D9\u05D5\u05DF. \u05D4\u05D9\u05E2\u05D3, \u05D4\u05E9\u05D3\u05D5\u05EA, \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05D5\u05EA\u05E7\u05E6\u05D9\u05D1 \u05D4\u05D1\u05EA\u05D9\u05DD \u05DE\u05D5\u05E6\u05D2\u05D9\u05DD \u05DB\u05D0\u05DF.","\u05E0\u05E7\u05D5\u05D3\u05EA \u05E7\u05E6\u05D4 \u05DC\u05D4\u05D8\u05DE\u05E2\u05D4","\u05E0\u05E7\u05D5\u05D3\u05EA POST \u05E9\u05DE\u05D7\u05D6\u05D9\u05E8\u05D4 {data: [{embedding: number[]}]}","\u05DE\u05D5\u05D3\u05DC \u05D4\u05D8\u05DE\u05E2\u05D4","\u05DC\u05D3\u05D5\u05D2\u05DE\u05D4: text-embedding-3-small","\u05DE\u05E4\u05EA\u05D7 API \u05DC\u05D4\u05D8\u05DE\u05E2\u05D4","\u05E0\u05E9\u05DE\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05D5\u05DE\u05E9\u05DE\u05E9 \u05E8\u05E7 \u05DB\u05DB\u05D5\u05EA\u05E8\u05EA Authorization.","\u05DC\u05D0 \u05DE\u05D5\u05D2\u05D3\u05E8","\u05D9\u05E2\u05D3 embeddings","\u05D7\u05E9\u05D9\u05E4\u05EA \u05E0\u05EA\u05D5\u05E0\u05D9 embeddings","\u05D1\u05E7\u05E9\u05D4 \u05DE\u05DB\u05D9\u05DC\u05D4 \u05D0\u05EA \u05D4\u05DE\u05D5\u05D3\u05DC \u05D5\u05D0\u05EA \u05D8\u05E7\u05E1\u05D8 \u05D4\u05E8\u05E9\u05D5\u05DE\u05D4 \u05E9\u05E0\u05DC\u05DB\u05D3\u05D4. \u05D5\u05E7\u05D8\u05D5\u05E8\u05D9\u05DD \u05D5\u05D8\u05E7\u05E1\u05D8 \u05DE\u05D5\u05D2\u05D1\u05DC \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05D1\u05D0\u05D9\u05E0\u05D3\u05E7\u05E1 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9 \u05E9\u05DC Aviary; \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05D0\u05E6\u05DC \u05D4\u05E1\u05E4\u05E7 \u05E4\u05D5\u05E2\u05DC\u05EA \u05DC\u05E4\u05D9 \u05D4\u05DE\u05D3\u05D9\u05E0\u05D9\u05D5\u05EA \u05E9\u05DC\u05D5.","\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1-embeddings \u05D4\u05D9\u05D5\u05DD","\u05DE\u05E7\u05E1\u05D9\u05DE\u05D5\u05DD \u05D1\u05EA\u05D9\u05DD \u05DC\u05E8\u05E9\u05D5\u05DE\u05EA embedding","\u05DC\u05E2\u05E6\u05D5\u05E8 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DC\u05D9\u05D7\u05EA \u05E8\u05E9\u05D5\u05DE\u05D4 \u05E9\u05D2\u05D5\u05E3 \u05D4-UTF-8 \u05E9\u05DC\u05D4 \u05D2\u05D3\u05D5\u05DC \u05DE\u05D2\u05D5\u05D3\u05DC \u05D6\u05D4. \u05E2\u05E8\u05DA 0 \u05D7\u05D5\u05E1\u05DD \u05DB\u05DC \u05E7\u05E8\u05D9\u05D0\u05EA \u05D4\u05D8\u05DE\u05E2\u05D4.","\u05D1\u05EA\u05D9\u05DD \u05D9\u05D5\u05DE\u05D9\u05D9\u05DD \u05DC\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA embeddings","\u05DC\u05E2\u05E6\u05D5\u05E8 \u05E7\u05E8\u05D9\u05D0\u05D5\u05EA \u05D4\u05D8\u05DE\u05E2\u05D4 \u05D0\u05D7\u05E8\u05D9 \u05DB\u05DE\u05D5\u05EA \u05D6\u05D5 \u05E9\u05DC \u05D1\u05D9\u05D9\u05D8\u05D9\u05DD \u05D1\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA UTF-8 \u05D1\u05D9\u05D5\u05DD \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9. \u05E2\u05E8\u05DA 0 \u05D7\u05D5\u05E1\u05DD \u05DB\u05DC \u05E7\u05E8\u05D9\u05D0\u05EA \u05D4\u05D8\u05DE\u05E2\u05D4.","\u05D4\u05D8\u05DE\u05E2\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA \u05D1\u05DB\u05DC \u05D9\u05D9\u05E6\u05D5\u05D0","\u05DC\u05E4\u05E0\u05D9 \u05D4\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D9\u05E9 \u05DC\u05D1\u05D3\u05D5\u05E7 \u05DC\u05DE\u05E2\u05DC\u05D4 \u05D0\u05EA \u05E0\u05E7\u05D5\u05D3\u05EA \u05D4\u05E7\u05E6\u05D4, \u05E9\u05D3\u05D5\u05EA \u05D4\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5, \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05D5\u05EA\u05E7\u05E6\u05D9\u05D1 \u05D4\u05D1\u05EA\u05D9\u05DD \u05D4\u05D9\u05D5\u05DE\u05D9. \u05D0\u05D7\u05E8\u05D9 \u05DB\u05DC \u05D9\u05D9\u05E6\u05D5\u05D0 \u05D9\u05EA\u05D1\u05E6\u05E2 embedding \u05D1\u05E8\u05E7\u05E2. \u05DB\u05D1\u05D5\u05D9 \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC.","\u05D1\u05E0\u05D9\u05D9\u05D4 \u05DE\u05D7\u05D3\u05E9 \u05E9\u05DC \u05D4\u05D0\u05D9\u05E0\u05D3\u05E7\u05E1 \u05D4\u05E1\u05DE\u05E0\u05D8\u05D9","\u05DE\u05D8\u05DE\u05D9\u05E2 \u05DB\u05DC \u05E8\u05E9\u05D5\u05DE\u05D4 \u05E9\u05E0\u05D0\u05E1\u05E4\u05D4. \u05D4\u05E8\u05E6\u05D4 \u05D7\u05D5\u05D6\u05E8\u05EA \u05D6\u05D5\u05DC\u05D4 \u05DB\u05D9 \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05E9\u05DB\u05D1\u05E8 \u05D1\u05DE\u05D8\u05DE\u05D5\u05DF \u05DE\u05D3\u05D5\u05DC\u05D2\u05D5\u05EA.","\u05D3\u05DE\u05D9\u05D5\u05DF \u05D5\u05E7\u05D8\u05D5\u05E8\u05D9 \u05D1\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5. \u05D4\u05D8\u05DE\u05E2\u05D5\u05EA \u05DE\u05D5\u05E4\u05E2\u05DC\u05D5\u05EA \u05DC\u05E4\u05D9 \u05D3\u05E8\u05D9\u05E9\u05D4.","\u05EA\u05D0\u05E8 \u05DE\u05D4 \u05D0\u05EA\u05D4 \u05DE\u05D7\u05E4\u05E9\u2026","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D0\u05D9\u05E0\u05D3\u05E7\u05E1 \u05D4\u05E1\u05DE\u05E0\u05D8\u05D9","\u05E9\u05D5\u05DB\u05D7 \u05D0\u05EA \u05DB\u05DC \u05D4\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05E9\u05D4\u05D5\u05D8\u05DE\u05E2\u05D5.","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1-AI \u05D5\u05D1-embeddings","\u05E9\u05DB\u05D7\u05EA \u05DE\u05D5\u05E0\u05D9 \u05D4\u05D1\u05E7\u05E9\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD \u05D1\u05DC\u05D1\u05D3. \u05D4\u05D0\u05D9\u05E0\u05D3\u05E7\u05E1 \u05D4\u05E1\u05DE\u05E0\u05D8\u05D9 \u05D5\u05E4\u05E8\u05D8\u05D9 \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05E9\u05DC \u05D4\u05E1\u05E4\u05E7 \u05DC\u05D0 \u05D9\u05D5\u05E1\u05E8\u05D5.","\u05E4\u05E2\u05D9\u05DC","\u05DB\u05D1\u05D5\u05D9","\u05DE\u05D5\u05D2\u05D3\u05E8","\u05E0\u05E7\u05D5\u05D3\u05EA \u05E7\u05E6\u05D4 \u05D7\u05E1\u05E8\u05D4","\u05E4\u05E8\u05D8\u05D9 \u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05D7\u05E1\u05E8\u05D9\u05DD","\u05DE\u05E4\u05EA\u05D7 \u05D0\u05D5 \u05DE\u05D5\u05D3\u05DC \u05D7\u05E1\u05E8\u05D9\u05DD","\u05DE\u05D0\u05D5\u05E0\u05D3\u05E7\u05E1","{name}: {state} \xB7 {config}","{name}: {state} \xB7 {count} {indexed}","\u05DE\u05E6\u05D1 \u05D4\u05D0\u05D9\u05E0\u05D8\u05D2\u05E8\u05E6\u05D9\u05D5\u05EA","\u05E9\u05D2\u05D9\u05D0\u05D5\u05EA \u05D0\u05D9\u05E0\u05D8\u05D2\u05E8\u05E6\u05D9\u05D4 \u05D0\u05D7\u05E8\u05D5\u05E0\u05D5\u05EA","\u05E0\u05DC\u05E7\u05D7 \u05DE\u05D9\u05D5\u05DE\u05DF \u05D4\u05D1\u05D9\u05E7\u05D5\u05E8\u05EA; \u05E8\u05E7 \u05E7\u05E8\u05D9\u05D0\u05D5\u05EA \u05D0\u05D9\u05E0\u05D8\u05D2\u05E8\u05E6\u05D9\u05D4 \u05E9\u05E0\u05DB\u05E9\u05DC\u05D5 \u05DE\u05D5\u05E6\u05D2\u05D5\u05EA.","\u05D4\u05D2\u05D3\u05E8\u05EA \u05E9\u05D9\u05E8\u05D5\u05EA\u05D9\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD \u05D0\u05D5\u05E4\u05E6\u05D9\u05D5\u05E0\u05DC\u05D9\u05D9\u05DD \u05D5\u05E1\u05E4\u05E7\u05D9 \u05D1\u05D9\u05E0\u05D4 \u05DE\u05DC\u05D0\u05DB\u05D5\u05EA\u05D9\u05EA.","\u05D1\u05D9\u05E0\u05D4","\u05D4\u05D5\u05E1\u05EA\u05E8\u05D5. \u05E4\u05E8\u05D8\u05D9 \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05E9\u05DE\u05D5\u05E8\u05D9\u05DD \u05D9\u05D9\u05E9\u05DE\u05E8\u05D5.","\u05E2\u05E6\u05D9\u05E8\u05D4 \u05D0\u05D7\u05E8\u05D9 \u05D4\u05D0\u05D5\u05E1\u05E3 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9 \u05D5\u05D4\u05D7\u05D6\u05E8\u05EA \u05DB\u05DC \u05DE\u05D4 \u05E9\u05DB\u05D1\u05E8 \u05E0\u05DB\u05EA\u05D1.","\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05D2\u05D9\u05D1\u05D5\u05D9 \u05D5\u05D4\u05E6\u05D2\u05EA \u05D0\u05D5\u05EA\u05DF \u05D4\u05EA\u05E0\u05D2\u05E9\u05D5\u05D9\u05D5\u05EA \u05D1\u05DC\u05D9 \u05DC\u05DB\u05EA\u05D5\u05D1 \u05D0\u05D5 \u05DC\u05D4\u05E1\u05D9\u05E8 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD.","\u05D4\u05D7\u05DC\u05EA \u05D0\u05D5\u05E1\u05E4\u05D9 \u05D4\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05E9\u05E0\u05D1\u05D7\u05E8\u05D5. \u05DB\u05EA\u05D9\u05D1\u05D4 \u05E9\u05E0\u05DB\u05E9\u05DC\u05D4 \u05DE\u05D7\u05D6\u05D9\u05E8\u05D4 \u05D0\u05EA \u05D4\u05D0\u05D5\u05E1\u05E4\u05D9\u05DD \u05E9\u05DB\u05D1\u05E8 \u05D4\u05E9\u05EA\u05E0\u05D5.","\u05E4\u05E8\u05D8\u05D9 \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05D5\u05E1\u05EA\u05E8\u05D5; \u05D4\u05E2\u05E8\u05DB\u05D9\u05DD \u05E9\u05DB\u05D1\u05E8 \u05E0\u05E9\u05DE\u05E8\u05D5 \u05D1\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05D6\u05D4 \u05D9\u05D9\u05E9\u05DE\u05E8\u05D5.","\u05D0\u05D9\u05E4\u05D5\u05E1 \u05DB\u05DC \u05D4\u05D4\u05E2\u05D3\u05E4\u05D5\u05EA","\u05DE\u05E9\u05D7\u05D6\u05E8 \u05D0\u05EA \u05D1\u05E8\u05D9\u05E8\u05D5\u05EA \u05D4\u05DE\u05D7\u05D3\u05DC \u05E9\u05DC Aviary: \u05DE\u05E6\u05D1 \u05DC\u05DC\u05D0 \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA \u05E0\u05E9\u05D0\u05E8 \u05E4\u05E2\u05D9\u05DC \u05D5\u05DB\u05DC \u05E9\u05D0\u05E8 \u05E4\u05E7\u05D3\u05D9 \u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D0\u05D5 \u05D4\u05D4\u05EA\u05E0\u05D4\u05D2\u05D5\u05EA \u05D7\u05D5\u05D6\u05E8\u05D9\u05DD \u05DC\u05DE\u05E6\u05D1 \u05DB\u05D1\u05D5\u05D9. \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD, \u05D4\u05E2\u05E8\u05D5\u05EA, \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05D5\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05E9\u05E0\u05E9\u05DE\u05E8\u05D5 \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD.","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA","\u05DE\u05D5\u05E8\u05D9\u05D3 \u05D0\u05EA \u05D4\u05D4\u05E2\u05D3\u05E4\u05D5\u05EA \u05E9\u05DC\u05DA \u05DB\u2011JSON. \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA API \u05D5\u05E1\u05D9\u05E1\u05DE\u05D0\u05D5\u05EA \u05DE\u05D5\u05D7\u05DC\u05E4\u05D9\u05DD \u05D1\u05DE\u05E6\u05D9\u05D9\u05DF \u05DE\u05E7\u05D5\u05DD, \u05DB\u05DA \u05E9\u05D4\u05E7\u05D5\u05D1\u05E5 \u05D1\u05D8\u05D5\u05D7 \u05DC\u05E9\u05D9\u05EA\u05D5\u05E3; \u05D9\u05D9\u05D1\u05D5\u05D0 \u05DB\u05D0\u05DF \u05DE\u05E9\u05DE\u05E8 \u05D0\u05EA \u05E4\u05E8\u05D8\u05D9 \u05D4\u05D2\u05D9\u05E9\u05D4 \u05D4\u05E9\u05DE\u05D5\u05E8\u05D9\u05DD \u05D1\u05DE\u05D7\u05E9\u05D1 \u05D6\u05D4.","\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA (JSON)","\u05D4\u05D3\u05D1\u05E7 \u05E7\u05D5\u05D1\u05E5 \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05E9\u05D9\u05D5\u05E6\u05D0 \u05DE\u2011Aviary \u05D5\u05D1\u05D7\u05E8 \u05D9\u05D9\u05D1\u05D5\u05D0. \u05E4\u05E8\u05D8\u05D9 \u05D2\u05D9\u05E9\u05D4 \u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD \u05D9\u05E9\u05DE\u05E8\u05D5 \u05E2\u05DC \u05D4\u05E2\u05E8\u05DB\u05D9\u05DD \u05D4\u05E7\u05D9\u05D9\u05DE\u05D9\u05DD \u05DB\u05D0\u05DF.","\u05D9\u05D9\u05D1\u05D5\u05D0","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D2\u05D9\u05D1\u05D5\u05D9 \u05DE\u05DC\u05D0 \u05E9\u05DC \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4","\u05DE\u05D5\u05E8\u05D9\u05D3 \u05D2\u05D9\u05D1\u05D5\u05D9 JSON \u05E2\u05DD \u05DE\u05E1\u05E4\u05E8 \u05D2\u05E8\u05E1\u05D4 \u05E9\u05DE\u05DB\u05E1\u05D4 \u05D0\u05EA \u05DB\u05DC \u05D4\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC\u05D9\u05DD \u05D1\u05DE\u05D7\u05E9\u05D1 \u05D4\u05D6\u05D4, \u05DC\u05D0 \u05E8\u05E7 \u05D0\u05EA \u05D6\u05D4 \u05E9\u05E4\u05EA\u05D5\u05D7. \u05E4\u05E8\u05D8\u05D9 \u05D4\u05D4\u05D6\u05D3\u05D4\u05D5\u05EA \u05D0\u05D9\u05E0\u05DD \u05E0\u05DB\u05DC\u05DC\u05D9\u05DD \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC, \u05D5\u05E9\u05D7\u05D6\u05D5\u05E8 \u05DE\u05E9\u05D0\u05D9\u05E8 \u05D0\u05EA \u05D0\u05DC\u05D4 \u05E9\u05DB\u05D1\u05E8 \u05E9\u05DE\u05D5\u05E8\u05D9\u05DD \u05DB\u05D0\u05DF.","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D2\u05D9\u05D1\u05D5\u05D9 \u05E2\u05DD \u05E4\u05E8\u05D8\u05D9 \u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA","\u05D0\u05D5\u05EA\u05D5 \u05D2\u05D9\u05D1\u05D5\u05D9, \u05D1\u05EA\u05D5\u05E1\u05E4\u05EA \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4-API \u05D5\u05D6\u05D4\u05D5\u05EA \u05D7\u05EA\u05D9\u05DE\u05EA WACZ \u05E9\u05E0\u05E9\u05DE\u05E8\u05D5 \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05D4. \u05DB\u05DC \u05DE\u05D9 \u05E9\u05D9\u05E4\u05EA\u05D7 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D1\u05E5 \u05D9\u05D5\u05DB\u05DC \u05DC\u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05D4\u05DD, \u05DC\u05DB\u05DF \u05E9\u05DE\u05D5\u05E8 \u05D0\u05D5\u05EA\u05D5 \u05DB\u05DE\u05D5 \u05E1\u05D9\u05E1\u05DE\u05D4.","\u05D1\u05D7\u05D9\u05E8\u05EA \u05D2\u05D9\u05D1\u05D5\u05D9 \u05E1\u05E4\u05E8\u05D9\u05D9\u05D4","\u05D1\u05D7\u05E8\u05D5 \u05D2\u05D9\u05D1\u05D5\u05D9 JSON \u05DB\u05D3\u05D9 \u05DC\u05D1\u05D3\u05D5\u05E7 \u05D2\u05E8\u05E1\u05D0\u05D5\u05EA, \u05DB\u05DE\u05D5\u05D9\u05D5\u05EA, \u05D4\u05EA\u05E0\u05D2\u05E9\u05D5\u05D9\u05D5\u05EA \u05D5\u05E1\u05DB\u05D5\u05DD \u05D1\u05D9\u05E7\u05D5\u05E8\u05EA \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D9\u05E0\u05D5\u05D9 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD.","\u05E9\u05DE\u05D9\u05E8\u05EA \u05D9\u05D5\u05DE\u05DF \u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9","\u05DE\u05EA\u05E2\u05D3 \u05D4\u05D5\u05E8\u05D3\u05D5\u05EA, \u05D9\u05D9\u05E6\u05D5\u05D0 \u05D5\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9 \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05D4\u05D6\u05D4 \u05DB\u05D3\u05D9 \u05E9\u05EA\u05D5\u05DB\u05DC \u05DC\u05D1\u05D3\u05D5\u05E7 \u05DE\u05D4 Aviary \u05E2\u05E9\u05D4. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7 \u05DC\u05E9\u05D5\u05DD \u05DE\u05E7\u05D5\u05DD. \u05DB\u05D9\u05D1\u05D5\u05D9 \u05E2\u05D5\u05E6\u05E8 \u05DE\u05D9\u05D3 \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D7\u05D3\u05E9\u05D5\u05EA; \u05D4\u05E7\u05D9\u05D9\u05DE\u05D5\u05EA \u05E0\u05E9\u05D0\u05E8\u05D5\u05EA \u05E2\u05D3 \u05E9\u05EA\u05DE\u05D7\u05E7 \u05D0\u05D5\u05EA\u05DF.","\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D1\u05D9\u05E7\u05D5\u05E8\u05EA","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05D9\u05D5\u05DE\u05DF \u05D4\u05D1\u05D9\u05E7\u05D5\u05E8\u05EA","\u05DE\u05D5\u05D7\u05E7 \u05D0\u05EA \u05D9\u05D5\u05DE\u05DF \u05D4\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9.","\u05D2\u05D9\u05D1\u05D5\u05D9 \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD, \u05E9\u05D7\u05D6\u05D5\u05E8 \u05E9\u05DC\u05D4\u05DD \u05D0\u05D5 \u05D0\u05D9\u05E4\u05D5\u05E1 Aviary.","\u05D4\u05E2\u05D3\u05E4\u05D5\u05EA","\u05D2\u05D9\u05D1\u05D5\u05D9 \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D1\u05D9\u05E7\u05D5\u05E8\u05EA","\u05D0\u05D7\u05E1\u05D5\u05DF","\u05D4\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05E0\u05E9\u05D0\u05E8\u05D5\u05EA \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05D4.","\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA CSS \u05DE\u05D5\u05EA\u05D0\u05DD \u05D0\u05D9\u05E9\u05D9\u05EA","CSS \u05DE\u05D5\u05EA\u05D0\u05DD \u05D0\u05D9\u05E9\u05D9\u05EA \u05E0\u05E9\u05DE\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA, \u05DE\u05D5\u05D2\u05D1\u05DC \u05DC\u05DE\u05E9\u05D8\u05D7 \u05E9\u05E6\u05D5\u05D9\u05DF \u05D5\u05DC\u05E2\u05D5\u05DC\u05DD \u05D0\u05D9\u05E0\u05D5 \u05E0\u05E9\u05DC\u05D7 \u05E2\u05DD \u05E0\u05EA\u05D5\u05E0\u05D9 \u05D0\u05D1\u05D7\u05D5\u05DF. \u05D6\u05D5 \u05E2\u05E7\u05D9\u05E4\u05D4 \u05DC\u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD \u05DE\u05EA\u05E7\u05D3\u05DE\u05D9\u05DD, \u05D5\u05DC\u05DB\u05DF \u05D4\u05EA\u05DE\u05D9\u05DB\u05D4 \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC\u05D4 \u05DC\u05E9\u05D7\u05D6\u05E8 \u05D0\u05EA \u05D4\u05D0\u05E4\u05E7\u05D8\u05D9\u05DD \u05D4\u05D7\u05D6\u05D5\u05EA\u05D9\u05D9\u05DD \u05E9\u05DC\u05D4.","\u05DE\u05E6\u05D1 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05D1\u05DC\u05D1\u05D3","\u05D7\u05D5\u05E1\u05DD \u05DB\u05DC \u05D1\u05E7\u05E9\u05D4 \u05DC\u05D0\u05D9\u05E0\u05D8\u05D2\u05E8\u05E6\u05D9\u05D4 \u05E9\u05D4\u05D2\u05D3\u05E8\u05EA: Aria2, \u05E4\u05E8\u05E1\u05D5\u05DD \u05DE\u05E7\u05D1\u05D9\u05DC, \u05D1\u05E7\u05E9\u05D5\u05EA AI \u05D5\u05D4\u05D8\u05DE\u05E2\u05D5\u05EA. \u05E9\u05DE\u05D9\u05E8\u05EA \u05DE\u05D3\u05D9\u05D4 \u05E2\u05D3\u05D9\u05D9\u05DF \u05DE\u05D5\u05E9\u05DB\u05EA \u05D0\u05D5\u05EA\u05D4 \u05DE\u05E9\u05E8\u05EA\u05D9 X, \u05DE\u05D0\u05D5\u05EA\u05D5 \u05DE\u05E7\u05D5\u05DD \u05E9\u05D4\u05E2\u05DE\u05D5\u05D3 \u05D8\u05E2\u05DF \u05D0\u05D5\u05EA\u05D4 \u05DE\u05DE\u05E0\u05D5. \u05DE\u05D5\u05E4\u05E2\u05DC \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC; \u05D4\u05E4\u05E2\u05DC\u05EA \u05D0\u05D9\u05E0\u05D8\u05D2\u05E8\u05E6\u05D9\u05D4 \u05D4\u05D9\u05D0 \u05DE\u05D4 \u05E9\u05DE\u05DB\u05D1\u05D4 \u05D0\u05D5\u05EA\u05D5.","\u05DC\u05E1\u05E8\u05D1 \u05DC\u05DE\u05E9\u05D5\u05D0\u05D5\u05EA \u05D4\u05E0\u05D9\u05EA\u05D5\u05D7 \u05E9\u05DC X","\u05E2\u05D5\u05E6\u05E8 \u05D0\u05EA \u05E4\u05E0\u05D9\u05D5\u05EA \u05D4\u05DE\u05E2\u05E7\u05D1 \u05E9-X \u05E9\u05D5\u05DC\u05D7 \u05D1\u05DB\u05DC \u05D2\u05DC\u05D9\u05DC\u05D4, \u05DC\u05D7\u05D9\u05E6\u05D4 \u05D5\u05D4\u05E9\u05D4\u05D9\u05D4. \u05E8\u05E7 \u05E0\u05E7\u05D5\u05D3\u05D5\u05EA \u05D4\u05E0\u05D9\u05EA\u05D5\u05D7 \u05E0\u05D3\u05D7\u05D5\u05EA. \u05EA\u05E2\u05D1\u05D5\u05E8\u05EA \u05D4\u05E6\u05D9\u05E8, \u05D4\u05DE\u05D3\u05D9\u05D4 \u05D5\u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05E0\u05E9\u05D0\u05E8\u05EA \u05E9\u05DC\u05DE\u05D4.","\u05E0\u05D9\u05D8\u05D5\u05E8 \u05EA\u05E7\u05D9\u05E0\u05D5\u05EA \u05D1\u05D5\u05E8\u05E8\u05D9\u05DD","\u05D1\u05D5\u05D3\u05E7 \u05D0\u05EA \u05DE\u05E9\u05D8\u05D7 X \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9 \u05DC\u05D0\u05D9\u05EA\u05D5\u05E8 \u05E2\u05D5\u05D2\u05E0\u05D9\u05DD \u05E0\u05D3\u05E8\u05E9\u05D9\u05DD \u05D5\u05D7\u05DC\u05D5\u05E4\u05D9\u05D9\u05DD. \u05DB\u05D1\u05D4 \u05D6\u05D0\u05EA \u05D0\u05DD \u05D0\u05D9\u05E0\u05DA \u05E8\u05D5\u05E6\u05D4 \u05D0\u05D1\u05D7\u05D5\u05DF \u05D1\u05D5\u05E8\u05E8\u05D9\u05DD.","\u05DE\u05D7\u05D5\u05D1\u05E8 \u05DC\u05D3\u05E3","\u05D2\u05D9\u05E9\u05D4 \u05DC\u05D3\u05E3","\u05DE\u05E9\u05D5\u05D0\u05D5\u05EA \u05E9\u05E0\u05D3\u05D7\u05D5","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E9\u05DE\u05D5\u05E8 \u05D7\u05DC\u05E7 \u05DE\u05D4\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD. \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D0\u05D7\u05E1\u05D5\u05DF \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05DE\u05DC\u05D0.","\u05E9\u05DE\u05D9\u05E8\u05D4","\u05E0\u05EA\u05D5\u05E0\u05D9 \u05E9\u05D9\u05DE\u05D5\u05E9","\u05E9\u05E4\u05EA \u05D4\u05E4\u05D0\u05E0\u05DC","\u05D4\u05E0\u05D9\u05D8\u05D5\u05E8 \u05E4\u05E2\u05D9\u05DC","\u05EA\u05E7\u05D9\u05E0\u05D5\u05EA \u05D4\u05E1\u05DC\u05E7\u05D8\u05D5\u05E8\u05D9\u05DD","\u05D1\u05D3\u05D9\u05E7\u05D4 \u05DE\u05D4 \u05E0\u05E9\u05D0\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05D5\u05D4\u05D0\u05DD Aviary \u05E2\u05D3\u05D9\u05D9\u05DF \u05E4\u05D5\u05E2\u05DC \u05E2\u05DD X.","\u05D2\u05D1\u05D5\u05DC \u05E4\u05E8\u05D8\u05D9\u05D5\u05EA","\u05D7\u05D9\u05D1\u05D5\u05E8\u05D9 \u05D3\u05E3","\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD","\u05EA\u05D0\u05D9\u05DE\u05D5\u05EA","\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD \u05E9\u05DC\u05D0 \u05E0\u05E9\u05DE\u05E8\u05D5","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E9\u05DE\u05D5\u05E8 \u05D0\u05EA \u05D4\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA. \u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1.","\u05D9\u05E9 \u05DC\u05E9\u05DE\u05D5\u05E8 \u05D0\u05D5 \u05DC\u05D1\u05D8\u05DC \u05D0\u05EA \u05D4\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D9\u05D5\u05E6\u05D0\u05D9\u05DD \u05DE\u05D4\u05D7\u05DC\u05E7 \u05D4\u05D6\u05D4.","\u05E9\u05D5\u05DE\u05E8...","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E9\u05DE\u05D5\u05E8 \u05D0\u05EA \u05D4\u05E9\u05D9\u05E0\u05D5\u05D9 \u05D4\u05D6\u05D4. \u05D1\u05E6\u05E2 \u05D0\u05D5\u05EA\u05D5 \u05E9\u05D5\u05D1 \u05D5\u05E9\u05DE\u05D5\u05E8.","\u05D9\u05E9 \u05DC\u05EA\u05E7\u05DF \u05E2\u05E8\u05DB\u05D9\u05DD \u05DC\u05D0 \u05EA\u05E7\u05D9\u05E0\u05D9\u05DD \u05DC\u05E4\u05E0\u05D9 \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4.","\u05E0\u05EA\u05D5\u05E0\u05D9 \u05D4\u05D0\u05D1\u05D7\u05D5\u05DF \u05D4\u05D5\u05E2\u05EA\u05E7\u05D5 \u05DC\u05DC\u05D5\u05D7.","\u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05E2\u05D5\u05D3\u05DB\u05E0\u05D4.","\u05E4\u05E7\u05D5\u05D3\u05EA \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05E0\u05DB\u05E9\u05DC\u05D4.","\u05DE\u05E6\u05D1 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05D1\u05DC\u05D1\u05D3 \u05E4\u05E2\u05D9\u05DC.","\u05DE\u05E6\u05D1 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05D1\u05DC\u05D1\u05D3 \u05DB\u05D1\u05D5\u05D9.","\u05DE\u05E9\u05D5\u05D0\u05D5\u05EA \u05D4\u05E0\u05D9\u05EA\u05D5\u05D7 \u05E0\u05D3\u05D7\u05D5.","\u05DE\u05E9\u05D5\u05D0\u05D5\u05EA \u05D4\u05E0\u05D9\u05EA\u05D5\u05D7 \u05DE\u05D5\u05EA\u05E8\u05D5\u05EA.","\u05E0\u05D9\u05D8\u05D5\u05E8 \u05EA\u05E7\u05D9\u05E0\u05D5\u05EA \u05D4\u05D1\u05D5\u05E8\u05E8\u05D9\u05DD \u05D4\u05D5\u05E4\u05E2\u05DC.","\u05E0\u05D9\u05D8\u05D5\u05E8 \u05EA\u05E7\u05D9\u05E0\u05D5\u05EA \u05D4\u05D1\u05D5\u05E8\u05E8\u05D9\u05DD \u05D4\u05D5\u05E9\u05D1\u05EA.","\u05D4\u05EA\u05E6\u05E4\u05D9\u05EA \u05D4\u05DE\u05D1\u05E0\u05D9\u05EA \u05D4\u05D5\u05E2\u05EA\u05E7\u05D4 \u05DC\u05DC\u05D5\u05D7.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D4\u05E2\u05EA\u05D9\u05E7 \u05D0\u05EA \u05D4\u05EA\u05E6\u05E4\u05D9\u05EA \u05D4\u05DE\u05D1\u05E0\u05D9\u05EA.","\u05DE\u05D3\u05D3\u05D9 \u05D4\u05D1\u05D9\u05E6\u05D5\u05E2\u05D9\u05DD \u05D0\u05D5\u05E4\u05E1\u05D5.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D0\u05E4\u05E1 \u05D0\u05EA \u05DE\u05D3\u05D3\u05D9 \u05D4\u05D1\u05D9\u05E6\u05D5\u05E2\u05D9\u05DD.","\u05D4\u05D0\u05D6\u05D4\u05E8\u05D5\u05EA \u05D4\u05E9\u05DE\u05D5\u05E8\u05D5\u05EA \u05E0\u05DE\u05D7\u05E7\u05D5.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05DE\u05D7\u05D5\u05E7 \u05D0\u05EA \u05D4\u05D0\u05D6\u05D4\u05E8\u05D5\u05EA \u05D4\u05E9\u05DE\u05D5\u05E8\u05D5\u05EA.","\u05EA\u05E6\u05E4\u05D9\u05D5\u05EA \u05D4\u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA \u05D0\u05D5\u05E4\u05E1\u05D5.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D0\u05E4\u05E1 \u05D0\u05EA \u05EA\u05E6\u05E4\u05D9\u05D5\u05EA \u05D4\u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA.","\u05D4\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05D5\u05D7\u05DC\u05E3. \u05D8\u05D5\u05E2\u05DF \u05DE\u05D7\u05D3\u05E9\u2026","\u05D4\u05D7\u05DC\u05E4\u05EA \u05D4\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05E0\u05DB\u05E9\u05DC\u05D4.","\u05D4\u05D5\u05E7\u05E6\u05D5 {moved} \u05DE\u05D0\u05D2\u05E8\u05D9\u05DD; {completedAfterRetry} \u05D4\u05D5\u05E9\u05DC\u05DE\u05D5 \u05DC\u05D0\u05D7\u05E8 \u05E0\u05D9\u05E1\u05D9\u05D5\u05DF \u05D7\u05D5\u05D6\u05E8; {skipped} \u05DB\u05D1\u05E8 \u05D4\u05D9\u05D5 \u05E7\u05D9\u05D9\u05DE\u05D9\u05DD; {conflicted} \u05D4\u05EA\u05E0\u05D2\u05E9\u05D5; {failed} \u05E0\u05DB\u05E9\u05DC\u05D5.","\u05D4\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05E0\u05D5\u05E6\u05E8. \u05D8\u05D5\u05E2\u05DF \u05DE\u05D7\u05D3\u05E9\u2026","\u05D9\u05E6\u05D9\u05E8\u05EA \u05D4\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05E0\u05DB\u05E9\u05DC\u05D4.","\u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05E0\u05E8\u05E9\u05DE\u05D4.","\u05DB\u05DC \u05D4\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05DB\u05D1\u05D5\u05D9\u05D5\u05EA. \u05D4\u05D3\u05E3 \u05E2\u05D3\u05D9\u05D9\u05DF \u05E9\u05D2\u05D5\u05D9?","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05EA\u05DB\u05D5\u05E0\u05D4 \u05E0\u05D5\u05E7\u05D4.","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05EA\u05DB\u05D5\u05E0\u05D4 \u05D4\u05D5\u05E4\u05E1\u05E7; \u05DB\u05DC \u05D4\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05E4\u05D5\u05E2\u05DC\u05D5\u05EA \u05E9\u05D5\u05D1.","\u05D4\u05E2\u05D1\u05E8\u05D4 \u05DC-Aria2 \u05E4\u05E2\u05D9\u05DC\u05D4.","\u05D4\u05E2\u05D1\u05E8\u05D4 \u05DC-Aria2 \u05DB\u05D1\u05D5\u05D9\u05D4.","\u05E0\u05E7\u05D5\u05D3\u05EA \u05D4\u05E7\u05E6\u05D4 \u05E9\u05DC Aria2 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D4\u05E1\u05D5\u05D3 \u05E9\u05DC Aria2 \u05E0\u05E9\u05DE\u05E8.","\u05E1\u05E3 Aria2 \u05E0\u05E9\u05DE\u05E8.","\u05D9\u05E9 \u05D2\u05D9\u05E9\u05D4 \u05DC-Aria2.","Aria2 \u05D0\u05D9\u05E0\u05D5 \u05E0\u05D2\u05D9\u05E9: {error}","\u05D1\u05D3\u05D9\u05E7\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC\u2011Aria2 \u05E0\u05DB\u05E9\u05DC\u05D4.","{gid} \u05D1\u05D5\u05D8\u05DC.","\u05D1\u05D9\u05D8\u05D5\u05DC Aria2 \u05E0\u05DB\u05E9\u05DC: {error}","\u05D1\u05D9\u05D8\u05D5\u05DC Aria2 \u05E0\u05DB\u05E9\u05DC.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E7\u05D1\u05DC \u05D0\u05EA \u05E8\u05E9\u05D9\u05DE\u05EA Aria2.","\u05D4\u05D4\u05E2\u05D1\u05E8\u05D4 \u05DC-yt-dlp \u05E4\u05D5\u05E2\u05DC\u05EA.","\u05D4\u05D4\u05E2\u05D1\u05E8\u05D4 \u05DC-yt-dlp \u05DB\u05D1\u05D5\u05D9\u05D4.","\u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05E2\u05D5\u05D6\u05E8 \u05E9\u05DC yt-dlp \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D4\u05E1\u05D5\u05D3 \u05E9\u05DC \u05D4\u05E2\u05D5\u05D6\u05E8 yt-dlp \u05E0\u05E9\u05DE\u05E8.","Bluesky \u05E4\u05E2\u05D9\u05DC.","Bluesky \u05DB\u05D1\u05D5\u05D9.","\u05E9\u05D9\u05E8\u05D5\u05EA Bluesky \u05E0\u05E9\u05DE\u05E8.","\u05D7\u05E9\u05D1\u05D5\u05DF Bluesky \u05E0\u05E9\u05DE\u05E8.","\u05E1\u05D9\u05E1\u05DE\u05EA \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05E9\u05DC Bluesky \u05E0\u05E9\u05DE\u05E8\u05D4.","Mastodon \u05E4\u05E2\u05D9\u05DC.","Mastodon \u05DB\u05D1\u05D5\u05D9.","\u05E9\u05E8\u05EA Mastodon \u05E0\u05E9\u05DE\u05E8.","\u05D0\u05E1\u05D9\u05DE\u05D5\u05DF Mastodon \u05E0\u05E9\u05DE\u05E8.","\u05E6\u05D9\u05E8\u05D5\u05E3 \u05DC\u05E4\u05E8\u05E1\u05D5\u05DD \u05DE\u05D5\u05E6\u05DC\u05D1 \u05E4\u05E2\u05D9\u05DC.","\u05E6\u05D9\u05E8\u05D5\u05E3 \u05DC\u05E4\u05E8\u05E1\u05D5\u05DD \u05DE\u05D5\u05E6\u05DC\u05D1 \u05DB\u05D1\u05D5\u05D9.","\u05E4\u05D5\u05E8\u05E1\u05DE\u05D5 {posts} \u05D1\u05BEBluesky.{url}","\u05D4\u05E4\u05E8\u05E1\u05D5\u05DD \u05D1\u05BEBluesky \u05E0\u05DB\u05E9\u05DC: {error}","\u05D4\u05E4\u05E8\u05E1\u05D5\u05DD \u05D4\u05DE\u05E7\u05D1\u05D9\u05DC \u05D1\u2011Bluesky \u05E0\u05DB\u05E9\u05DC.","\u05E4\u05D5\u05E8\u05E1\u05DE\u05D5 {posts} \u05D1\u05BEMastodon.{url}","\u05D4\u05E4\u05E8\u05E1\u05D5\u05DD \u05D1\u05BEMastodon \u05E0\u05DB\u05E9\u05DC: {error}","\u05D4\u05E4\u05E8\u05E1\u05D5\u05DD \u05D4\u05DE\u05E7\u05D1\u05D9\u05DC \u05D1\u2011Mastodon \u05E0\u05DB\u05E9\u05DC.","\u05D4\u05E8\u05E6\u05D5\u05EA AI \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA.","\u05D4\u05E8\u05E6\u05D5\u05EA AI \u05DB\u05D1\u05D5\u05D9\u05D5\u05EA.","\u05E0\u05E7\u05D5\u05D3\u05EA \u05D4\u05E7\u05E6\u05D4 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D4\u05DE\u05D5\u05D3\u05DC \u05E0\u05E9\u05DE\u05E8.","\u05DE\u05E4\u05EA\u05D7 \u05D4\u2011API \u05E0\u05E9\u05DE\u05E8.","\u05EA\u05E7\u05E6\u05D9\u05D1 \u05D1\u05E7\u05E9\u05D5\u05EA AI \u05E0\u05E9\u05DE\u05E8.","\u05EA\u05E7\u05E6\u05D9\u05D1 AI \u05D9\u05D5\u05DE\u05D9 \u05E0\u05E9\u05DE\u05E8.","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05E1\u05DE\u05E0\u05D8\u05D9 \u05E4\u05E2\u05D9\u05DC.","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05E1\u05DE\u05E0\u05D8\u05D9 \u05DB\u05D1\u05D5\u05D9.","\u05E0\u05E7\u05D5\u05D3\u05EA \u05D4\u05E7\u05E6\u05D4 \u05DC\u05D4\u05D8\u05DE\u05E2\u05D4 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05DE\u05D5\u05D3\u05DC \u05D4\u05D4\u05D8\u05DE\u05E2\u05D4 \u05E0\u05E9\u05DE\u05E8.","\u05DE\u05E4\u05EA\u05D7 \u05D4\u2011API \u05DC\u05D4\u05D8\u05DE\u05E2\u05D4 \u05E0\u05E9\u05DE\u05E8.","\u05EA\u05E7\u05E6\u05D9\u05D1 \u05D1\u05E7\u05E9\u05D5\u05EA embeddings \u05E0\u05E9\u05DE\u05E8.","\u05EA\u05E7\u05E6\u05D9\u05D1 embeddings \u05D9\u05D5\u05DE\u05D9 \u05E0\u05E9\u05DE\u05E8.","\u05D4\u05D8\u05DE\u05E2\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA \u05E4\u05E2\u05D9\u05DC\u05D4.","\u05D4\u05D8\u05DE\u05E2\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA \u05DB\u05D1\u05D5\u05D9\u05D4.","\u05D1\u05D5\u05E0\u05D4 \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05D0\u05D9\u05E0\u05D3\u05E7\u05E1 \u05D4\u05E1\u05DE\u05E0\u05D8\u05D9\u2026","\u05D4-embeddings \u05E0\u05E2\u05E6\u05E8\u05D5 \u05D1\u05EA\u05E7\u05E6\u05D9\u05D1 ({blocked} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05D5).","\u05D0\u05D9\u05E0\u05D3\u05D5\u05E7\u05E1: \u05D7\u05D3\u05E9 +{added} \xB7 \u05D3\u05D5\u05DC\u05D2\u05D5 {skipped} \xB7 \u05E9\u05D2\u05D9\u05D0\u05D5\u05EA {errors} \xB7 \u05E1\u05D4\u05F4\u05DB {total}{trimmed}.","\u05D4\u05D4\u05D8\u05DE\u05E2\u05D4 \u05E0\u05DB\u05E9\u05DC\u05D4.","\u05D4\u05D0\u05D9\u05E0\u05D3\u05E7\u05E1 \u05D4\u05E1\u05DE\u05E0\u05D8\u05D9 \u05E0\u05D5\u05E7\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E0\u05E7\u05D5\u05EA \u05D0\u05EA \u05D4\u05D0\u05D9\u05E0\u05D3\u05E7\u05E1 \u05D4\u05E1\u05DE\u05E0\u05D8\u05D9.","\u05D4\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1-AI \u05D5\u05D1-embeddings \u05E0\u05D5\u05E7\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E0\u05E7\u05D5\u05EA \u05D0\u05EA \u05D4\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1-AI \u05D5\u05D1-embeddings.","\u05D4\u05D4\u05E2\u05D3\u05E4\u05D5\u05EA \u05D0\u05D5\u05E4\u05E1\u05D5. \u05DE\u05E6\u05D1 \u05DC\u05DC\u05D0 \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA \u05E4\u05E2\u05D9\u05DC.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D0\u05E4\u05E1 \u05D0\u05EA \u05D4\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA.","\u05D4\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D9\u05D5\u05E6\u05D0\u05D5.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D9\u05D9\u05E6\u05D0 \u05D0\u05EA \u05D4\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA.","\u05D4\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D9\u05D5\u05D1\u05D0\u05D5. {warning}","\u05D4\u05D9\u05D9\u05D1\u05D5\u05D0 \u05E0\u05DB\u05E9\u05DC: {errors}","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D9\u05D9\u05D1\u05D0 \u05D0\u05EA \u05D4\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA.","\u05D2\u05D9\u05D1\u05D5\u05D9 \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05D4\u05D5\u05E8\u05D3: {filename} ({collections} \u05D0\u05D5\u05E1\u05E4\u05D9\u05DD, {bytes}).","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D9\u05D9\u05E6\u05D0 \u05D0\u05EA \u05D2\u05D9\u05D1\u05D5\u05D9 \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05D4\u05DE\u05DC\u05D0.","\u05D4\u05D2\u05D9\u05D1\u05D5\u05D9 \u05E2\u05DD \u05E4\u05E8\u05D8\u05D9 \u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05D4\u05D5\u05E8\u05D3: {filename} ({collections} \u05D0\u05D5\u05E1\u05E4\u05D9\u05DD, {bytes}).","\u05D2\u05D9\u05D1\u05D5\u05D9 \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05E0\u05E7\u05E8\u05D0\u2026","\u05D4\u05D2\u05D9\u05D1\u05D5\u05D9 \u05E0\u05D8\u05E2\u05DF: {collections} \u05D0\u05D5\u05E1\u05E4\u05D9\u05DD, {conflicts} \u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E7\u05E8\u05D5\u05D0 \u05D0\u05EA \u05D2\u05D9\u05D1\u05D5\u05D9 \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4.","\u05D4\u05E9\u05D7\u05D6\u05D5\u05E8 \u05DE\u05D1\u05D5\u05D8\u05DC\u2026","\u05D4\u05D4\u05E8\u05E6\u05D4 \u05D4\u05D9\u05D1\u05E9\u05D4 \u05D4\u05D5\u05E9\u05DC\u05DE\u05D4. \u05E9\u05D5\u05DD \u05E0\u05EA\u05D5\u05DF \u05DE\u05E7\u05D5\u05DE\u05D9 \u05DC\u05D0 \u05D4\u05E9\u05EA\u05E0\u05D4.","\u05D4\u05D4\u05E8\u05E6\u05D4 \u05D4\u05D9\u05D1\u05E9\u05D4 \u05E0\u05DB\u05E9\u05DC\u05D4: {errors}","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D1\u05E6\u05E2 \u05D4\u05E8\u05E6\u05D4 \u05D9\u05D1\u05E9\u05D4 \u05E9\u05DC \u05E9\u05D7\u05D6\u05D5\u05E8 \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4.","\u05D2\u05D9\u05D1\u05D5\u05D9 \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05E9\u05D5\u05D7\u05D6\u05E8 ({collections} \u05D0\u05D5\u05E1\u05E4\u05D9\u05DD). \u05D8\u05D5\u05E2\u05DF \u05DE\u05D7\u05D3\u05E9\u2026","\u05D4\u05E9\u05D7\u05D6\u05D5\u05E8 \u05D1\u05D5\u05D8\u05DC; \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD \u05D4\u05D5\u05D7\u05D6\u05E8\u05D5 \u05DC\u05D0\u05D7\u05D5\u05E8.","\u05D4\u05E9\u05D7\u05D6\u05D5\u05E8 \u05D1\u05D5\u05D8\u05DC.","\u05D4\u05E9\u05D7\u05D6\u05D5\u05E8 \u05E0\u05DB\u05E9\u05DC: {errors}","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E9\u05D7\u05D6\u05E8 \u05D0\u05EA \u05D2\u05D9\u05D1\u05D5\u05D9 \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4.","\u05D9\u05D5\u05DE\u05DF \u05D4\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05E4\u05E2\u05D9\u05DC.","\u05D9\u05D5\u05DE\u05DF \u05D4\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05DB\u05D1\u05D5\u05D9.","\u05D9\u05D5\u05DE\u05DF \u05D4\u05D1\u05D9\u05E7\u05D5\u05E8\u05EA \u05E0\u05D5\u05E7\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E0\u05E7\u05D5\u05EA \u05D0\u05EA \u05D9\u05D5\u05DE\u05DF \u05D4\u05D1\u05D9\u05E7\u05D5\u05E8\u05EA.","\u05E0\u05D0\u05E1\u05E4\u05D5 {count} \u05E2\u05D5\u05E7\u05D1\u05D9\u05DD \u05E9\u05DC @{handle}. \u05D4\u05E8\u05E9\u05D9\u05DE\u05D4 \u05E1\u05D9\u05D9\u05DE\u05D4 \u05DC\u05D4\u05D9\u05D8\u05E2\u05DF, \u05D0\u05D6 \u05D0\u05DC\u05D4 \u05DB\u05D5\u05DC\u05DD.","\u05E0\u05D0\u05E1\u05E4\u05D5 {count} \u05E2\u05D5\u05E7\u05D1\u05D9\u05DD \u05E9\u05DC @{handle}. \u05D4\u05E8\u05E9\u05D9\u05DE\u05D4 \u05E2\u05D3\u05D9\u05D9\u05DF \u05E0\u05D8\u05E2\u05E0\u05D4, \u05D0\u05D6 \u05D6\u05D4 \u05E8\u05E7 \u05DE\u05D4 \u05E9\u05D4\u05D9\u05D4 \u05E2\u05DC \u05D4\u05DE\u05E1\u05DA. \u05D2\u05DC\u05D5\u05DC \u05E2\u05D3 \u05D4\u05E1\u05D5\u05E3 \u05D5\u05D0\u05E1\u05D5\u05E3 \u05E9\u05D5\u05D1 \u05DB\u05D3\u05D9 \u05DC\u05E7\u05D1\u05DC \u05D0\u05EA \u05D4\u05E8\u05E9\u05D9\u05DE\u05D4 \u05D4\u05DE\u05DC\u05D0\u05D4.","\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D5 \u05E9\u05D5\u05E8\u05D5\u05EA UserCell.","\u05EA\u05E6\u05DC\u05D5\u05DD \u05D4\u05DE\u05E6\u05D1 \u05E0\u05DB\u05E9\u05DC.","\u05E0\u05D0\u05E1\u05E4\u05D5 {count} \u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA \u05E9-@{handle} \u05E2\u05D5\u05E7\u05D1 \u05D0\u05D7\u05E8\u05D9\u05D4\u05DD. \u05D4\u05E8\u05E9\u05D9\u05DE\u05D4 \u05E1\u05D9\u05D9\u05DE\u05D4 \u05DC\u05D4\u05D9\u05D8\u05E2\u05DF, \u05D0\u05D6 \u05D0\u05DC\u05D4 \u05DB\u05D5\u05DC\u05DD.","\u05E0\u05D0\u05E1\u05E4\u05D5 {count} \u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA \u05E9-@{handle} \u05E2\u05D5\u05E7\u05D1 \u05D0\u05D7\u05E8\u05D9\u05D4\u05DD. \u05D4\u05E8\u05E9\u05D9\u05DE\u05D4 \u05E2\u05D3\u05D9\u05D9\u05DF \u05E0\u05D8\u05E2\u05E0\u05D4, \u05D0\u05D6 \u05D6\u05D4 \u05E8\u05E7 \u05DE\u05D4 \u05E9\u05D4\u05D9\u05D4 \u05E2\u05DC \u05D4\u05DE\u05E1\u05DA. \u05D2\u05DC\u05D5\u05DC \u05E2\u05D3 \u05D4\u05E1\u05D5\u05E3 \u05D5\u05D0\u05E1\u05D5\u05E3 \u05E9\u05D5\u05D1 \u05DB\u05D3\u05D9 \u05DC\u05E7\u05D1\u05DC \u05D0\u05EA \u05D4\u05E8\u05E9\u05D9\u05DE\u05D4 \u05D4\u05DE\u05DC\u05D0\u05D4.","\u05EA\u05E6\u05DC\u05D5\u05DE\u05D9 \u05D4\u05DE\u05E6\u05D1 \u05E0\u05D5\u05E7\u05D5.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E0\u05E7\u05D5\u05EA \u05D0\u05EA \u05EA\u05E6\u05DC\u05D5\u05DE\u05D9 \u05D4\u05DE\u05E6\u05D1.","\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D4\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05D4\u05D5\u05E9\u05D4\u05D4.","\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D4\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05D7\u05D5\u05D3\u05E9.","\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D4\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05D1\u05D5\u05D8\u05DC.","\u05D4\u05D5\u05E4\u05E2\u05DC \u05E0\u05D9\u05E1\u05D9\u05D5\u05DF \u05D7\u05D5\u05D6\u05E8 \u05DC\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D4\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF.","\u05E7\u05D5\u05E8\u05D0 \u05D0\u05EA \u05D4\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF, \u05E7\u05D1\u05E6\u05D9\u05DD \u05D2\u05D3\u05D5\u05DC\u05D9\u05DD \u05DC\u05D5\u05E7\u05D7\u05D9\u05DD \u05E8\u05D2\u05E2\u2026","\u05E0\u05E7\u05E8\u05D0 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05DE\u05E1\u05D5\u05D2 {layout}. \u05D9\u05D5\u05D1\u05D0\u05D5 {records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA. \u05EA\u05D9\u05E7\u05D5\u05E0\u05D9\u05DD: {archiveLinks} \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF, {corpusLinks} \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5, {participants} \u05DE\u05D6\u05D4\u05D9 \u05DE\u05E9\u05EA\u05EA\u05E4\u05D9\u05DD \u05E0\u05E4\u05EA\u05E8\u05D5, {unresolved} \u05E0\u05D5\u05EA\u05E8\u05D5 \u05DC\u05DC\u05D0 \u05E4\u05EA\u05E8\u05D5\u05DF. \u05D0\u05D6\u05D4\u05E8\u05D5\u05EA: {warnings}; \u05E9\u05D2\u05D9\u05D0\u05D5\u05EA: {errors}. \u05E7\u05D1\u05E6\u05D9\u05DD: {recognized} \u05D6\u05D5\u05D4\u05D5, {skipped} \u05D3\u05D5\u05DC\u05D2\u05D5, {malformed} \u05E4\u05D2\u05D5\u05DE\u05D9\u05DD.{absent}","\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D4\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05E0\u05DB\u05E9\u05DC.","\u05D1\u05D5\u05E0\u05D4 \u05D0\u05EA \u05D4\u05D3\u05D5\u05D7\u2026","\u05D4\u05D3\u05D5\u05D7 \u05D4\u05D5\u05E8\u05D3.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D1\u05E0\u05D5\u05EA \u05D0\u05EA \u05D4\u05D3\u05D5\u05D7.","\u05D1\u05D5\u05E0\u05D4 \u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05E9\u05DC \u05D4\u05E0\u05D9\u05E7\u05D5\u05D9\u2026","\u05E0\u05D5\u05E1\u05E4\u05D5 {added} \u05E4\u05E8\u05D9\u05D8\u05D9\u05DD \u05DC\u05EA\u05D5\u05E8 ({protected} \u05DE\u05D5\u05D2\u05E0\u05D9\u05DD \u05D3\u05D5\u05DC\u05D2\u05D5).","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D4\u05D5\u05E1\u05D9\u05E3 \u05D0\u05EA \u05D4\u05E0\u05D9\u05E7\u05D5\u05D9 \u05DC\u05EA\u05D5\u05E8.","\u05EA\u05D5\u05E8 \u05D4\u05E0\u05D9\u05E7\u05D5\u05D9 \u05E8\u05D5\u05E7\u05DF.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E8\u05D5\u05E7\u05DF \u05D0\u05EA \u05D4\u05EA\u05D5\u05E8.","\u05D0\u05D6\u05D4\u05E8\u05EA \u05EA\u05E7\u05E8\u05EA \u05D4\u05D0\u05D7\u05E1\u05D5\u05DF \u05DB\u05D1\u05D5\u05D9\u05D4.","\u05D0\u05D6\u05D4\u05E8\u05EA \u05EA\u05E7\u05E8\u05EA \u05D4\u05D0\u05D7\u05E1\u05D5\u05DF \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \u05E9\u05D5\u05DE\u05E8\u05D5\u05EA \u05E2\u05DC \u05D2\u05D5\u05D3\u05DC\u05DF \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9.","\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \u05D9\u05D5\u05E7\u05D8\u05E0\u05D5.","\u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD \u05D9\u05D9\u05EA\u05E4\u05E1\u05D5 \u05DB\u05EA\u05DE\u05D5\u05E0\u05EA \u05EA\u05E6\u05D5\u05D2\u05D4.","\u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD \u05D9\u05D9\u05EA\u05E4\u05E1\u05D5 \u05D1\u05DE\u05DC\u05D5\u05D0\u05DD.","\u05E7\u05D5\u05E8\u05D0 \u05D0\u05EA \u05D3\u05D5\u05D7 \u05DE\u05D0\u05D7\u05D5\u05E8\u05D9 \u05D4\u05E7\u05DC\u05E2\u05D9\u05DD\u2026","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E7\u05E8\u05D5\u05D0 \u05D0\u05EA \u05D3\u05D5\u05D7 \u05DE\u05D0\u05D7\u05D5\u05E8\u05D9 \u05D4\u05E7\u05DC\u05E2\u05D9\u05DD.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D9\u05D9\u05E6\u05D0 \u05D0\u05EA \u05D3\u05D5\u05D7\u05D5\u05EA \u05DE\u05D0\u05D7\u05D5\u05E8\u05D9 \u05D4\u05E7\u05DC\u05E2\u05D9\u05DD.","\u05DE\u05D5\u05E8\u05D9\u05D3 {count} \u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05E0\u05D1\u05D7\u05E8\u05D5.","\u05D4\u05D5\u05E8\u05D3\u05EA \u05D4\u05DE\u05D3\u05D9\u05D4 \u05E9\u05E0\u05DC\u05DB\u05D3\u05D4 \u05E0\u05DB\u05E9\u05DC\u05D4.","\u05D4\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D1\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05E0\u05DB\u05E9\u05DC. \u05D1\u05D3\u05D5\u05E7 \u05D0\u05EA \u05E0\u05E7\u05D5\u05D3\u05EA \u05D4\u05E7\u05E6\u05D4 \u05D5\u05D4\u05DE\u05E4\u05EA\u05D7 \u05E9\u05DC \u05D4\u05D4\u05D8\u05DE\u05E2\u05D5\u05EA \u05D1\u05E9\u05D9\u05DC\u05D5\u05D1\u05D9\u05DD.","\u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D9\u05D4 \u05E2\u05D5\u05D3\u05DB\u05E0\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E2\u05D3\u05DB\u05DF \u05D0\u05EA \u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D9\u05D4.","\u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D9\u05D4 \u05D4\u05D5\u05E1\u05E8\u05D4.","\u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D9\u05D4 \u05DB\u05D1\u05E8 \u05D4\u05D5\u05E1\u05E8\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D4\u05E1\u05D9\u05E8 \u05D0\u05EA \u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D9\u05D4.","\u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05D9\u05D5\u05E6\u05D0\u05D5: {records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D1\u05BE{files} \u05E7\u05D1\u05E6\u05D9\u05DD.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D9\u05D9\u05E6\u05D0 \u05D0\u05EA \u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA.","\u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05E0\u05DE\u05D7\u05E7\u05D5.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05DE\u05D7\u05D5\u05E7 \u05D0\u05EA \u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA.","\u05DB\u05E4\u05EA\u05D5\u05E8 \u05D4-AI \u05E4\u05E2\u05D9\u05DC.","\u05DB\u05E4\u05EA\u05D5\u05E8 \u05D4-AI \u05DB\u05D1\u05D5\u05D9.","\u05E4\u05EA\u05D9\u05D7\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05DE\u05E7\u05D5\u05E6\u05E8\u05D9\u05DD \u05E4\u05E2\u05D9\u05DC\u05D4.","\u05E4\u05EA\u05D9\u05D7\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05DE\u05E7\u05D5\u05E6\u05E8\u05D9\u05DD \u05DB\u05D1\u05D5\u05D9\u05D4.","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05E4\u05E2\u05D9\u05DC.","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05DB\u05D1\u05D5\u05D9.","\u05DC\u05D7\u05E6\u05DF \u05D4\u05E2\u05EA\u05E7\u05EA \u05D4\u05E7\u05D9\u05E9\u05D5\u05E8 \u05DB\u05D1\u05D5\u05D9.","\u05DC\u05D7\u05E6\u05DF \u05D4\u05E2\u05EA\u05E7\u05EA \u05D4\u05E7\u05D9\u05E9\u05D5\u05E8 \u05E4\u05D5\u05E2\u05DC.","\u05E6\u05D1\u05E2\u05D9 \u05D4\u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA \u05E0\u05E9\u05DE\u05E8\u05D5.","\u05D4\u05D4\u05E2\u05E8\u05D5\u05EA \u05E2\u05DC \u05D4\u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA \u05E0\u05D5\u05E7\u05D5.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E0\u05E7\u05D5\u05EA \u05D0\u05EA \u05D4\u05D4\u05E2\u05E8\u05D5\u05EA.","\u05DC\u05DB\u05D9\u05D3\u05D4 \u05DC\u05D9\u05D9\u05E6\u05D5\u05D0 \u05E4\u05E2\u05D9\u05DC\u05D4.","\u05DC\u05DB\u05D9\u05D3\u05D4 \u05DC\u05D9\u05D9\u05E6\u05D5\u05D0 \u05DB\u05D1\u05D5\u05D9\u05D4.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D5\u05EA \u05D4\u05D2\u05D5\u05DC\u05DE\u05D9\u05D5\u05EA \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05DC\u05DB\u05D9\u05D3\u05EA \u05D1\u05EA\u05D9 \u05DE\u05D3\u05D9\u05D4 \u05DE\u05D5\u05E4\u05E2\u05DC\u05EA.","\u05DC\u05DB\u05D9\u05D3\u05EA \u05D1\u05EA\u05D9 \u05DE\u05D3\u05D9\u05D4 \u05DE\u05D5\u05E9\u05D1\u05EA\u05EA.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D6\u05D9\u05D4\u05D5\u05D9 \u05D4\u05E9\u05D0\u05D9\u05DC\u05EA\u05D5\u05EA \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05E9\u05D9\u05EA\u05D5\u05E3 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05D5\u05D2\u05E0\u05D9\u05DD \u05D4\u05D5\u05E4\u05E2\u05DC.","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05D5\u05D2\u05E0\u05D9\u05DD \u05D4\u05D5\u05D7\u05E8\u05D2\u05D5 \u05DE\u05D9\u05D9\u05E6\u05D5\u05D0 \u05DC\u05E9\u05D9\u05EA\u05D5\u05E3.","\u05E9\u05D9\u05EA\u05D5\u05E3 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E2\u05DD \u05E7\u05D4\u05DC \u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2 \u05D4\u05D5\u05E4\u05E2\u05DC.","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E2\u05DD \u05E7\u05D4\u05DC \u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2 \u05D4\u05D5\u05D7\u05E8\u05D2\u05D5 \u05DE\u05D9\u05D9\u05E6\u05D5\u05D0 \u05DC\u05E9\u05D9\u05EA\u05D5\u05E3.","\u05EA\u05D9\u05E7\u05D9\u05D9\u05EA \u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05DE\u05E9\u05D9\u05DE\u05EA \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4\u05D5\u05E9\u05D4\u05EA\u05D4.","\u05DE\u05E9\u05D9\u05DE\u05EA \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D7\u05D5\u05D3\u05E9\u05D4.","\u05DE\u05E9\u05D9\u05DE\u05EA \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D1\u05D5\u05D8\u05DC\u05D4.","\u05D0\u05D5\u05E1\u05E3 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E6\u05D2\u05D9\u05DD\u2026","\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D5 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D1\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05D6\u05D5. \u05D2\u05DC\u05D5\u05DC \u05D1\u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF \u05DB\u05D3\u05D9 \u05DC\u05D8\u05E2\u05D5\u05DF \u05DB\u05DE\u05D4, \u05D5\u05D0\u05D6 \u05D9\u05D9\u05E6\u05D0 \u05E9\u05D5\u05D1.","\u05D9\u05D5\u05E6\u05D0\u05D5 {records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05DC\u05BE{files} \u05E7\u05D5\u05D1\u05E6\u05D9 ZIP \u2192 {filename}","\u05D9\u05D5\u05E6\u05D0\u05D4 \u05E8\u05E9\u05D5\u05DE\u05D4 {records} \u2192 {filename}","\u05D9\u05D5\u05E6\u05D0\u05D5 {records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u2192 {filename}","\u05D4\u05D9\u05D9\u05E6\u05D5\u05D0 \u05E0\u05DB\u05E9\u05DC. \u05E2\u05D9\u05D9\u05DF \u05D1\u05E0\u05EA\u05D5\u05E0\u05D9 \u05D4\u05D0\u05D1\u05D7\u05D5\u05DF.","\u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05DF \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \u05E2\u05DD \u05E0\u05EA\u05D5\u05E0\u05D9 \u05E9\u05E8\u05E9\u05D5\u05E8.","\u05E7\u05D5\u05E8\u05D0 \u05D4\u05E9\u05E8\u05E9\u05D5\u05E8\u05D9\u05DD \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \u05D9\u05D5\u05E6\u05D0.","\u05D1\u05E0\u05D9\u05D9\u05EA \u05D4\u05E9\u05E8\u05E9\u05D5\u05E8\u05D9\u05DD \u05DE\u05D7\u05D3\u05E9 \u05E0\u05DB\u05E9\u05DC\u05D4. \u05E8\u05D0\u05D5 \u05D0\u05D1\u05D7\u05D5\u05DF.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D4\u05E2\u05EA\u05D9\u05E7 \u05D0\u05EA \u05E0\u05EA\u05D5\u05E0\u05D9 \u05D4\u05D0\u05D1\u05D7\u05D5\u05DF.","{records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D4\u05D5\u05E2\u05EA\u05E7\u05D5 \u05DC\u05DC\u05D5\u05D7.","\u05D9\u05D5\u05E6\u05D0\u05D5 {records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D0\u05DC {target}.","\u05D4\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4\u05D7\u05D9\u05E6\u05D5\u05E0\u05D9 \u05E0\u05DB\u05E9\u05DC.","\u05DE\u05E1\u05E4\u05E8 \u05D4\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05DC\u05DB\u05DC ZIP \u05E0\u05E9\u05DE\u05E8.","\u05E9\u05DE\u05D9\u05E8\u05EA \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4\u05D5\u05D2\u05D3\u05E8\u05D4.","\u05E9\u05DE\u05D9\u05E8\u05EA \u05D4\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D4\u05D5\u05D2\u05D3\u05E8\u05D4.","\u05D4\u05E9\u05DE\u05D9\u05E8\u05D4 \u05DC\u05E4\u05D9 \u05D2\u05D9\u05DC \u05D4\u05D5\u05D2\u05D3\u05E8\u05D4.","WARC \u05D4\u05D5\u05E8\u05D3 ({records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA).","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4\u2011WARC \u05E0\u05DB\u05E9\u05DC.","WACZ \u05D4\u05D5\u05E8\u05D3 ({records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA, {size}).","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4-WACZ \u05E0\u05DB\u05E9\u05DC. \u05E4\u05E0\u05D4 \u05DE\u05E7\u05D5\u05DD \u05D1\u05D3\u05D9\u05E1\u05E7 \u05D0\u05D5 \u05D9\u05D9\u05E6\u05D0 \u05E4\u05D7\u05D5\u05EA \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D5\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1.","\u05D6\u05D4\u05D5\u05EA \u05D4\u05D7\u05EA\u05D9\u05DE\u05D4 \u05D4\u05D5\u05D7\u05DC\u05E4\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05D7\u05DC\u05D9\u05E3 \u05D0\u05EA \u05D6\u05D4\u05D5\u05EA \u05D4\u05D7\u05EA\u05D9\u05DE\u05D4.","\u05D4\u05D5\u05DB\u05D7\u05EA WACZ \u05E9\u05DC Aviary \u05D1\u05DC\u05D1\u05D3 \u05D4\u05D5\u05E8\u05D3\u05D4 ({records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA, {size}).","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4\u05D5\u05DB\u05D7\u05EA WACZ \u05E9\u05DC Aviary \u05D1\u05DC\u05D1\u05D3 \u05E0\u05DB\u05E9\u05DC.","\u05D6\u05D5\u05D2 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05D7\u05EA\u05D9\u05DE\u05D4 \u05D4\u05D5\u05E8\u05D3: {filename}.","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D6\u05D5\u05D2 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05D7\u05EA\u05D9\u05DE\u05D4 \u05E0\u05DB\u05E9\u05DC.","\u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05DE\u05D3\u05D9\u05D4 \u05E4\u05E2\u05D9\u05DC\u05D9\u05DD.","\u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05DE\u05D3\u05D9\u05D4 \u05DB\u05D1\u05D5\u05D9\u05D9\u05DD.","\u05D4\u05E2\u05EA\u05E7\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 \u05DE\u05D3\u05D9\u05D4 \u05D4\u05D5\u05E4\u05E2\u05DC\u05D4.","\u05D4\u05E2\u05EA\u05E7\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 \u05DE\u05D3\u05D9\u05D4 \u05D4\u05D5\u05E9\u05D1\u05EA\u05D4.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D4\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9\u05EA \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05D1\u05D2\u05D5\u05D3\u05DC \u05DE\u05DC\u05D0 \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA.","\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05D1\u05D2\u05D5\u05D3\u05DC \u05DE\u05DC\u05D0 \u05DB\u05D1\u05D5\u05D9\u05D5\u05EA.","\u05E4\u05E8\u05D9\u05E1\u05EA \u05D4\u05DE\u05D3\u05D9\u05D4 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05EA\u05D1\u05E0\u05D9\u05EA \u05E9\u05DD \u05D4\u05E7\u05D5\u05D1\u05E5 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D4\u05E7\u05D5\u05D1\u05E5 \u05D4\u05E0\u05DC\u05D5\u05D5\u05D4 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D4\u05EA\u05D0\u05DE\u05D4 \u05D7\u05D6\u05D5\u05EA\u05D9\u05EA \u05E9\u05DC \u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05D4\u05D5\u05E4\u05E2\u05DC\u05D4.","\u05D4\u05EA\u05D0\u05DE\u05D4 \u05D7\u05D6\u05D5\u05EA\u05D9\u05EA \u05E9\u05DC \u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05D4\u05D5\u05E9\u05D1\u05EA\u05D4.","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05E4\u05E2\u05D9\u05DC\u05D4.","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05DB\u05D1\u05D5\u05D9\u05D4.","\u05DE\u05D2\u05D1\u05DC\u05EA \u05D4\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05D1\u05DE\u05E7\u05D1\u05D9\u05DC \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05E7\u05E6\u05D1 \u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05E0\u05E9\u05DE\u05E8.","\u05DE\u05D5\u05E8\u05D9\u05D3 \u05D0\u05EA \u05D4\u05DE\u05D3\u05D9\u05D4 \u05DE\u05D4\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D6\u05D4\u2026","\u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05D4\u05DE\u05E8\u05D5\u05DB\u05D6\u05EA \u05E0\u05DB\u05E9\u05DC\u05D4.","\u05D4\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4 \u05E0\u05D5\u05E7\u05EA\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E0\u05E7\u05D5\u05EA \u05D0\u05EA \u05D4\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4.","\u05D4\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4 \u05D9\u05D5\u05E6\u05D0\u05D4: {records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D1-{files} \u05E7\u05D1\u05E6\u05D9\u05DD.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D9\u05D9\u05E6\u05D0 \u05D0\u05EA \u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D4\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA.","\u05D4\u05DE\u05D3\u05D9\u05D4 \u05E9\u05E0\u05DC\u05DB\u05D3\u05D4 \u05D4\u05D5\u05E9\u05DC\u05DE\u05D4: {downloaded} \u05E0\u05E9\u05DE\u05E8\u05D5 / {duplicate} \u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA / {failed} \u05E0\u05DB\u05E9\u05DC\u05D5.","\u05D0\u05D9\u05DF \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05DE\u05D3\u05D9\u05D4 \u05E9\u05E0\u05DB\u05E9\u05DC\u05D5 \u05DC\u05E0\u05D9\u05E1\u05D9\u05D5\u05DF \u05D7\u05D5\u05D6\u05E8.","\u05D4\u05D4\u05D2\u05D3\u05E8\u05D4 \u05D4\u05DE\u05D5\u05E7\u05D3\u05DE\u05EA \u05D4\u05D5\u05D7\u05DC\u05D4: {preset} ({changes})","\u05D4\u05D4\u05D2\u05D3\u05E8\u05D4 \u05D4\u05DE\u05D5\u05E7\u05D3\u05DE\u05EA \u05DB\u05D1\u05E8 \u05D4\u05D5\u05D7\u05DC\u05D4: {preset}","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D4\u05D7\u05D9\u05DC \u05D0\u05EA \u05D4\u05E2\u05E8\u05DB\u05D4.","\u05E2\u05E8\u05DB\u05EA \u05D4\u05E0\u05D5\u05E9\u05D0 \u05D4\u05D6\u05D5 \u05D0\u05D9\u05E0\u05D4 \u05E0\u05EA\u05DE\u05DB\u05EA.","\u05E2\u05E8\u05DB\u05EA \u05D4\u05E0\u05D5\u05E9\u05D0 \u05E2\u05D5\u05D3\u05DB\u05E0\u05D4.","\u05D4\u05E6\u05E4\u05D9\u05E4\u05D5\u05EA \u05E2\u05D5\u05D3\u05DB\u05E0\u05D4.","\u05E8\u05D5\u05D7\u05D1 \u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF \u05E2\u05D5\u05D3\u05DB\u05DF.","\u05D4\u05D2\u05D5\u05E4\u05DF Chirp \u05E4\u05E2\u05D9\u05DC.","\u05D4\u05D2\u05D5\u05E4\u05DF Chirp \u05DB\u05D1\u05D5\u05D9.","\u05DE\u05D5\u05E0\u05D9 \u05D4\u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA \u05D4\u05D5\u05E1\u05EA\u05E8\u05D5.","\u05DE\u05D5\u05E0\u05D9 \u05D4\u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA \u05DE\u05D5\u05E6\u05D2\u05D9\u05DD.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D4\u05DE\u05D5\u05E0\u05D9\u05DD \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05DE\u05D5\u05E0\u05D4 \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA \u05DE\u05D5\u05E1\u05EA\u05E8.","\u05DE\u05D5\u05E0\u05D4 \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA \u05DE\u05D5\u05E6\u05D2.","\u05D7\u05D5\u05EA\u05DE\u05D5\u05EA \u05D6\u05DE\u05DF \u05DE\u05D5\u05D7\u05DC\u05D8\u05D5\u05EA \u05D4\u05D5\u05E4\u05E2\u05DC\u05D5.","\u05D7\u05D5\u05EA\u05DE\u05D5\u05EA \u05D6\u05DE\u05DF \u05DE\u05D5\u05D7\u05DC\u05D8\u05D5\u05EA \u05DB\u05D5\u05D1\u05D5.","\u05E1\u05DE\u05DC \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA \u05E9\u05DC Aviary \u05D4\u05D5\u05E4\u05E2\u05DC.","\u05E1\u05DE\u05DC \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA \u05E9\u05DC X \u05E9\u05D5\u05D7\u05D6\u05E8.","\u05D2\u05D1\u05D5\u05DC\u05D5\u05EA \u05D4\u05E9\u05D5\u05E8\u05D5\u05EA \u05D4\u05D5\u05E1\u05EA\u05E8\u05D5.","\u05D2\u05D1\u05D5\u05DC\u05D5\u05EA \u05D4\u05E9\u05D5\u05E8\u05D5\u05EA \u05E9\u05D5\u05D7\u05D6\u05E8\u05D5.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D4\u05E0\u05D9\u05D2\u05D5\u05D3\u05D9\u05D5\u05EA \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D4\u05EA\u05E0\u05D5\u05E2\u05D4 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05DE\u05E6\u05D1 \u05DC\u05DC\u05D0 \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA \u05E4\u05E2\u05D9\u05DC.","\u05DE\u05E6\u05D1 \u05DC\u05DC\u05D0 \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA \u05DB\u05D1\u05D5\u05D9.","\u05E8\u05D9\u05E9\u05D5\u05DD \u05D4\u05DE\u05D5\u05D3\u05E2\u05D5\u05EA \u05E0\u05D3\u05D7\u05D4.","\u05E8\u05D9\u05E9\u05D5\u05DD \u05D4\u05DE\u05D5\u05D3\u05E2\u05D5\u05EA \u05DE\u05D5\u05EA\u05E8.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05E1\u05E8\u05D2\u05DC \u05D4\u05E6\u05D3 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D4\u05DE\u05D2\u05DE\u05D5\u05EA \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D4\u05E4\u05E8\u05D9\u05E1\u05D4 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D4\u05E2\u05D3\u05E4\u05EA Grok \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D4\u05E2\u05D3\u05E4\u05EA \u05D4\u05E8\u05D9\u05D7\u05D5\u05E3 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05DE\u05E6\u05D1 \u05E8\u05D9\u05DB\u05D5\u05D6 \u05D4\u05D5\u05E4\u05E2\u05DC.","\u05DE\u05E6\u05D1 \u05E8\u05D9\u05DB\u05D5\u05D6 \u05DB\u05D5\u05D1\u05D4.","\u05E9\u05E2\u05D5\u05EA \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4 \u05E0\u05E9\u05DE\u05E8\u05D5.","\u05D4\u05E4\u05D9\u05D3 \u05E0\u05D2\u05DC\u05DC \u05D1\u05DC\u05D9 \u05DC\u05E2\u05E6\u05D5\u05E8.","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D0\u05E8\u05D5\u05DB\u05D9\u05DD \u05DE\u05EA\u05E8\u05D7\u05D1\u05D9\u05DD \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA.","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D0\u05E8\u05D5\u05DB\u05D9\u05DD \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05DE\u05DB\u05D5\u05D5\u05E6\u05D9\u05DD.","\u05D7\u05D6\u05E8\u05D4 \u05DE\u05E9\u05D7\u05D6\u05E8\u05EA \u05D0\u05EA \u05D4\u05DE\u05D9\u05E7\u05D5\u05DD \u05E9\u05DC\u05DA.","\u05D7\u05D6\u05E8\u05D4 \u05DE\u05E9\u05EA\u05DE\u05E9\u05EA \u05D1\u05DE\u05D9\u05E7\u05D5\u05DD \u05E9\u05DC X.","\u05E1\u05DE\u05DF \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4 \u05DE\u05D5\u05E4\u05E2\u05DC.","\u05E1\u05DE\u05DF \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4 \u05DB\u05D1\u05D5\u05D9.","\u05DE\u05E9\u05D8\u05D7\u05D9 \u05E1\u05DE\u05DF \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4 \u05E0\u05E9\u05DE\u05E8\u05D5.","\u05DE\u05E6\u05D1 \u05DB\u05EA\u05D9\u05D1\u05D4 \u05E4\u05E2\u05D9\u05DC.","\u05DE\u05E6\u05D1 \u05DB\u05EA\u05D9\u05D1\u05D4 \u05DB\u05D1\u05D5\u05D9.","\u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF \\"\u05E2\u05D5\u05E7\u05D1\\" \u05E4\u05E2\u05D9\u05DC.","\u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF \\"\u05E2\u05D5\u05E7\u05D1\\" \u05DB\u05D1\u05D5\u05D9.","\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA For You \u05D4\u05D5\u05E1\u05EA\u05E8\u05D4.","\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA For You \u05E9\u05D5\u05D7\u05D6\u05E8\u05D4.","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E0\u05E4\u05EA\u05D7\u05D9\u05DD \u05DE\u05E1\u05DE\u05DC \u05D4\u05EA\u05D2\u05D5\u05D1\u05D4.","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E0\u05E4\u05EA\u05D7\u05D9\u05DD \u05E9\u05D5\u05D1 \u05DE\u05D4\u05E9\u05D5\u05E8\u05D4.","\u05E0\u05E8\u05D0\u05D5\u05EA \u05D4\u05E0\u05D9\u05D5\u05D5\u05D8 \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05D5\u05D9\u05D3\u05D0\u05D5 \u05DE\u05D7\u05D5\u05E5 \u05DC\u05DE\u05E1\u05DA \u05D4\u05D5\u05E9\u05D4\u05D4.","\u05D5\u05D9\u05D3\u05D0\u05D5 \u05DE\u05D7\u05D5\u05E5 \u05DC\u05DE\u05E1\u05DA \u05DE\u05DE\u05E9\u05D9\u05DA \u05DC\u05E4\u05E2\u05D5\u05DC.","\u05D4\u05D5\u05D5\u05D9\u05D3\u05D0\u05D5 \u05DE\u05DE\u05E9\u05D9\u05DA \u05DC\u05E0\u05D2\u05DF.","\u05D4\u05D5\u05D5\u05D9\u05D3\u05D0\u05D5 \u05DE\u05D5\u05E9\u05D4\u05D4 \u05D9\u05D7\u05D3 \u05E2\u05DD \u05D4\u05DC\u05E9\u05D5\u05E0\u05D9\u05EA.","\u05E0\u05D9\u05D2\u05D5\u05DF \u05D7\u05D5\u05D6\u05E8 \u05D4\u05D5\u05E4\u05E2\u05DC.","\u05E0\u05D9\u05D2\u05D5\u05DF \u05D7\u05D5\u05D6\u05E8 \u05DB\u05D5\u05D1\u05D4.","\u05E7\u05D9\u05D1\u05D5\u05E2 \u05E8\u05E9\u05D9\u05DE\u05D5\u05EA \u05D4\u05E0\u05D9\u05D2\u05D5\u05DF \u05D4\u05D5\u05E4\u05E2\u05DC.","\u05E7\u05D9\u05D1\u05D5\u05E2 \u05E8\u05E9\u05D9\u05DE\u05D5\u05EA \u05D4\u05E0\u05D9\u05D2\u05D5\u05DF \u05DB\u05D5\u05D1\u05D4.","\u05D4\u05DE\u05E1\u05E0\u05E0\u05D9\u05DD \u05D4\u05D5\u05E4\u05E2\u05DC\u05D5.","\u05D4\u05DE\u05E1\u05E0\u05E0\u05D9\u05DD \u05DB\u05D5\u05D1\u05D5.","\u05E2\u05DE\u05E2\u05D5\u05DD \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E0\u05E8\u05D0\u05D5 \u05D4\u05D5\u05E4\u05E2\u05DC.","\u05E2\u05DE\u05E2\u05D5\u05DD \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E0\u05E8\u05D0\u05D5 \u05DB\u05D5\u05D1\u05D4.","\u05DE\u05E9\u05D8\u05D7\u05D9 \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E0\u05E8\u05D0\u05D5 \u05E0\u05E9\u05DE\u05E8\u05D5.","\u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E0\u05E8\u05D0\u05D5 \u05E0\u05E9\u05DB\u05D7\u05D5.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E0\u05E7\u05D5\u05EA \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E0\u05E8\u05D0\u05D5.","\u05DB\u05DC\u05DC\u05D9 \u05D4\u05E1\u05D9\u05E0\u05D5\u05DF \u05E0\u05E9\u05DE\u05E8\u05D5.","\u05D7\u05D5\u05D3\u05E9 \u05DB\u05DC\u05DC {count}.","{count} \u05DB\u05DC\u05DC\u05D9\u05DD \u05D7\u05D5\u05D3\u05E9\u05D5.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD \u05E9\u05E4\u05D2 \u05EA\u05D5\u05E7\u05E4\u05DD.","\u05DE\u05E1\u05E0\u05DF \u05D4\u05E4\u05E8\u05D9\u05DE\u05D9\u05D5\u05DD \u05E0\u05E9\u05DE\u05E8.","\u05DE\u05E1\u05E0\u05DF \u05D4\u05E6\u05D9\u05D8\u05D5\u05D8\u05D9\u05DD \u05E0\u05E9\u05DE\u05E8.","\u05EA\u05D2\u05D5\u05D1\u05D5\u05EA \u05E2\u05DD \u05DE\u05D3\u05D9\u05D4 \u05D4\u05D5\u05E1\u05EA\u05E8\u05D5.","\u05EA\u05D2\u05D5\u05D1\u05D5\u05EA \u05E2\u05DD \u05DE\u05D3\u05D9\u05D4 \u05DE\u05D5\u05E6\u05D2\u05D5\u05EA \u05E9\u05D5\u05D1.","\u05D4\u05D2\u05D3\u05E8\u05EA \u05E1\u05D9\u05D1\u05EA \u05D4\u05E1\u05D9\u05E0\u05D5\u05DF \u05E0\u05E9\u05DE\u05E8\u05D4.","\u05DE\u05E1\u05E0\u05DF \u05D4\u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA \u05E0\u05E9\u05DE\u05E8.","\u05DE\u05D3\u05D3 \u05D4\u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA \u05E0\u05E9\u05DE\u05E8.","\u05D4\u05DE\u05E1\u05E0\u05E0\u05D9\u05DD \u05DB\u05D1\u05D5\u05D9\u05D9\u05DD \u05D1\u05DB\u05DC \u05D4\u05DE\u05E1\u05DC\u05D5\u05DC\u05D9\u05DD.","\u05E2\u05E8\u05DB\u05EA \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD \u05D9\u05D5\u05E6\u05D0\u05D4: {filename} ({count} \u05E9\u05D5\u05E8\u05D5\u05EA).","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D9\u05D9\u05E6\u05D0 \u05D0\u05EA \u05E2\u05E8\u05DB\u05EA \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD.","\u05E2\u05E8\u05DB\u05EA \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD \u05D3\u05D5\u05E8\u05E9\u05EA \u05D1\u05D3\u05D9\u05E7\u05D4.","\u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05E9\u05DC \u05E2\u05E8\u05DB\u05EA \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD \u05DE\u05D5\u05DB\u05E0\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D4\u05E6\u05D9\u05D2 \u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05E9\u05DC \u05E2\u05E8\u05DB\u05EA \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD.","\u05E0\u05D5\u05E1\u05E4\u05D5 {count} \u05DB\u05DC\u05DC\u05D9\u05DD.","\u05E2\u05E8\u05DB\u05EA \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD \u05D4\u05D5\u05D7\u05DC\u05E4\u05D4 \u05D1-{count} \u05DB\u05DC\u05DC\u05D9\u05DD.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D9\u05D9\u05D1\u05D0 \u05D0\u05EA \u05E2\u05E8\u05DB\u05EA \u05D4\u05DB\u05DC\u05DC\u05D9\u05DD.","\u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD \u05D4\u05D5\u05D7\u05DC\u05D5.","\u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD \u05E0\u05D7\u05E9\u05E4\u05D5.","\u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05D4\u05D4\u05E1\u05EA\u05E8\u05D4 \u05E4\u05E2\u05D9\u05DC\u05D9\u05DD.","\u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05D4\u05D4\u05E1\u05EA\u05E8\u05D4 \u05DB\u05D1\u05D5\u05D9\u05D9\u05DD.","\u05D4\u05D4\u05E1\u05EA\u05E8\u05D4 \u05DB\u05D1\u05D5\u05D9\u05D4 \u05D1\u05DB\u05DC \u05D4\u05DE\u05E1\u05DC\u05D5\u05DC\u05D9\u05DD.","\u05DC\u05D0 \u05E0\u05D5\u05EA\u05E8 \u05DE\u05D4 \u05DC\u05E9\u05D7\u05D6\u05E8.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05D1\u05D8\u05DC \u05D0\u05EA \u05D4\u05D4\u05E1\u05EA\u05E8\u05D4 \u05D4\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4.","\u05D4\u05E4\u05D5\u05E1\u05D8 \u05E9\u05D5\u05D7\u05D6\u05E8.","\u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4 \u05DB\u05D1\u05E8 \u05E9\u05D5\u05D7\u05D6\u05E8.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E9\u05D7\u05D6\u05E8 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8.","\u05E0\u05DE\u05D7\u05E7 \u05E4\u05D5\u05E1\u05D8 \u05DE\u05D5\u05E1\u05EA\u05E8 \u05D0\u05D7\u05D3 ({removed}).","\u05E0\u05DE\u05D7\u05E7\u05D5 {removed} \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05DC\u05E0\u05E7\u05D5\u05EA \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E9\u05D9\u05D9\u05DA \u05D0\u05EA \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D4\u05D9\u05E9\u05E0\u05D9\u05DD. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D4\u05D5\u05E2\u05D1\u05E8, \u05D5\u05DC\u05DB\u05DF \u05D4\u05DD \u05E0\u05E9\u05D0\u05E8\u05D5 \u05D1\u05DE\u05E7\u05D5\u05DE\u05DD. \u05E4\u05EA\u05D7 \u05D0\u05EA \u05D4\u05D3\u05E3 \u05D4\u05D6\u05D4 \u05DE\u05D7\u05D3\u05E9 \u05DB\u05D3\u05D9 \u05DC\u05E0\u05E1\u05D5\u05EA \u05E9\u05D5\u05D1.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05D0\u05EA \u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05EA\u05DB\u05D5\u05E0\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E0\u05E7\u05D5\u05EA \u05D0\u05EA \u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05EA\u05DB\u05D5\u05E0\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E8\u05E9\u05D5\u05DD \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05D4\u05D6\u05D5. \u05D4\u05D7\u05D9\u05E4\u05D5\u05E9 \u05E0\u05E9\u05D0\u05E8 \u05DB\u05E4\u05D9 \u05E9\u05D4\u05D9\u05D4, \u05D0\u05D6 \u05DC\u05D7\u05E5 \u05E9\u05D5\u05D1 \u05E2\u05DC \u05D0\u05D5\u05EA\u05D5 \u05DB\u05E4\u05EA\u05D5\u05E8.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E2\u05E6\u05D5\u05E8 \u05D0\u05EA \u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05EA\u05DB\u05D5\u05E0\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D1\u05D8\u05DC \u05D0\u05EA \u05D4\u05E9\u05D7\u05D6\u05D5\u05E8. \u05D4\u05D5\u05D0 \u05D9\u05D9\u05E2\u05E6\u05E8 \u05DE\u05E2\u05E6\u05DE\u05D5 \u05D1\u05E1\u05D9\u05D5\u05DD \u05D4\u05D0\u05D5\u05E1\u05E3 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E9\u05D4\u05D5\u05EA \u05D0\u05EA \u05D4\u05D9\u05D9\u05D1\u05D5\u05D0. \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D4\u05D5\u05D0 \u05DB\u05D1\u05E8 \u05D4\u05E1\u05EA\u05D9\u05D9\u05DD. \u05E4\u05EA\u05D7 \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05DE\u05E7\u05D8\u05E2 \u05D4\u05D6\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E8\u05D0\u05D5\u05EA \u05E2\u05D3 \u05D4\u05D9\u05DB\u05DF \u05D4\u05D2\u05D9\u05E2.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05D9\u05D9\u05D1\u05D5\u05D0. \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D4\u05DE\u05E7\u05D5\u05E8 \u05D4\u05E9\u05DE\u05D5\u05E8 \u05E0\u05DE\u05D7\u05E7. \u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05DE\u05D4\u05E7\u05D5\u05D1\u05E5 \u05DE\u05D7\u05D3\u05E9.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D1\u05D8\u05DC \u05D0\u05EA \u05D4\u05D9\u05D9\u05D1\u05D5\u05D0. \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D4\u05D5\u05D0 \u05DB\u05D1\u05E8 \u05D4\u05E1\u05EA\u05D9\u05D9\u05DD. \u05E4\u05EA\u05D7 \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05DE\u05E7\u05D8\u05E2 \u05D4\u05D6\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E8\u05D0\u05D5\u05EA \u05E2\u05D3 \u05D4\u05D9\u05DB\u05DF \u05D4\u05D2\u05D9\u05E2.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E0\u05E1\u05D5\u05EA \u05D0\u05EA \u05D4\u05D9\u05D9\u05D1\u05D5\u05D0 \u05E9\u05D5\u05D1. \u05D1\u05D7\u05E8 \u05D0\u05EA \u05E7\u05D5\u05D1\u05E5 \u05D4\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05DE\u05D7\u05D3\u05E9 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05D9\u05D9\u05D1\u05D5\u05D0 \u05D7\u05D3\u05E9.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E9\u05D4\u05D5\u05EA \u05D0\u05EA \u05DE\u05E9\u05D9\u05DE\u05EA \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0. \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D4\u05D9\u05D0 \u05DB\u05D1\u05E8 \u05D4\u05E1\u05EA\u05D9\u05D9\u05DE\u05D4. \u05E4\u05EA\u05D7 \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05DE\u05E7\u05D8\u05E2 \u05D4\u05D6\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E8\u05D0\u05D5\u05EA \u05D0\u05EA \u05DE\u05E6\u05D1\u05D4 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D7\u05D3\u05E9 \u05D0\u05EA \u05DE\u05E9\u05D9\u05DE\u05EA \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0. \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05E0\u05E7\u05D5\u05D3\u05EA \u05D4\u05D1\u05D9\u05E7\u05D5\u05E8\u05EA \u05E9\u05DC\u05D4 \u05E0\u05DE\u05D7\u05E7\u05D4. \u05D4\u05EA\u05D7\u05DC \u05D9\u05D9\u05E6\u05D5\u05D0 \u05D7\u05D3\u05E9 \u05D1\u05DE\u05E7\u05D5\u05DD.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D1\u05D8\u05DC \u05D0\u05EA \u05DE\u05E9\u05D9\u05DE\u05EA \u05D4\u05D9\u05D9\u05E6\u05D5\u05D0. \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D4\u05D9\u05D0 \u05DB\u05D1\u05E8 \u05D4\u05E1\u05EA\u05D9\u05D9\u05DE\u05D4. \u05E4\u05EA\u05D7 \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05DE\u05E7\u05D8\u05E2 \u05D4\u05D6\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E8\u05D0\u05D5\u05EA \u05D0\u05EA \u05DE\u05E6\u05D1\u05D4 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E8\u05D9\u05E5 \u05D0\u05EA \u05D4\u05D0\u05E6\u05D5\u05D5\u05D4 \u05D4\u05D6\u05D5. \u05D0\u05E9\u05E8 \u05D2\u05D9\u05E9\u05EA \u05D4\u05D5\u05E8\u05D3\u05D4 \u05D1\u05D3\u05E3 \u05D4\u05D4\u05E8\u05E9\u05D0\u05D5\u05EA \u05E9\u05DC Aviary \u05D5\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1.","\u05D4\u05D0\u05E6\u05D5\u05D5\u05D4 \u05DC\u05D0 \u05E7\u05D9\u05D1\u05DC\u05D4 \u05D0\u05EA \u05D4\u05D4\u05D5\u05E8\u05D0\u05D4 \u05D4\u05D6\u05D5. \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D4\u05D9\u05D0 \u05DB\u05D1\u05E8 \u05D4\u05E1\u05EA\u05D9\u05D9\u05DE\u05D4. \u05E4\u05EA\u05D7 \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05DE\u05E7\u05D8\u05E2 \u05D4\u05D6\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E8\u05D0\u05D5\u05EA \u05D0\u05EA \u05DE\u05E6\u05D1\u05D4 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05D4\u05DE\u05DE\u05EA\u05D9\u05E0\u05D5\u05EA. \u05D0\u05E9\u05E8 \u05D2\u05D9\u05E9\u05EA \u05D4\u05D5\u05E8\u05D3\u05D4 \u05D1\u05D3\u05E3 \u05D4\u05D4\u05E8\u05E9\u05D0\u05D5\u05EA \u05E9\u05DC Aviary \u05D5\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E0\u05E1\u05D5\u05EA \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05E9\u05E0\u05DB\u05E9\u05DC\u05D5. \u05D0\u05E9\u05E8 \u05D2\u05D9\u05E9\u05EA \u05D4\u05D5\u05E8\u05D3\u05D4 \u05D1\u05D3\u05E3 \u05D4\u05D4\u05E8\u05E9\u05D0\u05D5\u05EA \u05E9\u05DC Aviary \u05D5\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E4\u05EA\u05D5\u05D7 \u05D0\u05EA \u05D4\u05E1\u05D9\u05DB\u05D5\u05DD. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D0\u05D1\u05D3, \u05D0\u05D6 \u05D8\u05E2\u05DF \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05E2\u05DE\u05D5\u05D3 \u05D5\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1.","\u05D0\u05D9\u05DF \u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05DC\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05D6\u05D4.","\u05E0\u05E1\u05D4 \u05DE\u05D9\u05DC\u05D4 \u05E7\u05E6\u05E8\u05D4 \u05D9\u05D5\u05EA\u05E8, \u05D0\u05D5 \u05D1\u05D7\u05E8 \u05DE\u05E7\u05D8\u05E2 \u05DE\u05D9\u05DE\u05D9\u05DF.","\u05E0\u05E9\u05DE\u05E8: \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05DC\u05D0 \u05D9\u05DE\u05D7\u05E7 \u05D0\u05EA \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E4\u05E0\u05D5\u05EA \u05DE\u05E7\u05D5\u05DD.","\u05DE\u05D0\u05DE\u05E5 \u05DE\u05D9\u05D8\u05D1\u05D9: \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05E2\u05E9\u05D5\u05D9 \u05DC\u05DE\u05D7\u05D5\u05E7 \u05D0\u05EA \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05DB\u05E9\u05E9\u05D8\u05D7 \u05D4\u05D3\u05D9\u05E1\u05E7 \u05E0\u05DE\u05D5\u05DA. \u05E9\u05DE\u05D5\u05E8 \u05D2\u05D9\u05D1\u05D5\u05D9.","\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05DC\u05D0 \u05E6\u05D9\u05D9\u05DF \u05D0\u05DD \u05D9\u05E9\u05DE\u05D5\u05E8 \u05D0\u05EA \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4. \u05E9\u05DE\u05D5\u05E8 \u05D2\u05D9\u05D1\u05D5\u05D9.","\u05DE\u05E0\u05D4\u05DC \u05D4\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8\u05D9\u05DD \u05D4\u05D6\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05E2\u05E0\u05D9\u05E7 \u05DC-Aviary \u05D2\u05D9\u05E9\u05D4 \u05DC\u05D3\u05E3 \u05E2\u05E6\u05DE\u05D5.","\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05D4 \u05DC\u05D0 \u05D8\u05E2\u05DF \u05D0\u05EA \u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 \u05D4\u05D3\u05E3 \u05E9\u05DC Aviary.","\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 \u05D4\u05D3\u05E3 \u05E9\u05DC Aviary \u05E0\u05D8\u05E2\u05DF, \u05D0\u05D1\u05DC \u05DE\u05E9\u05D4\u05D5 \u05D0\u05D7\u05E8 \u05E2\u05E0\u05D4 \u05DC\u05E4\u05E0\u05D9\u05D5, \u05DB\u05DB\u05DC \u05D4\u05E0\u05E8\u05D0\u05D4 \u05D4\u05E8\u05D7\u05D1\u05D4 \u05D0\u05D7\u05E8\u05EA. \u05D1\u05D3\u05E3 \u05D4\u05D6\u05D4 \u05D4\u05D4\u05D2\u05E0\u05D4 \u05DE\u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA \u05D1\u05E8\u05DE\u05EA \u05D4\u05E8\u05E9\u05EA \u05D0\u05D9\u05E0\u05D4 \u05D1\u05E9\u05DC\u05D9\u05D8\u05EA Aviary.","\u05DC\u05D0 \u05D6\u05DE\u05D9\u05DF \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05D4.","\u05D4\u05EA\u05D0\u05DE\u05D5\u05EA \u05D1\u05D5\u05E8\u05E8\u05D9\u05DD","\u05DE\u05E9\u05D8\u05D7\u05D9\u05DD \u05E0\u05D3\u05E8\u05E9\u05D9\u05DD \u05D7\u05E1\u05E8\u05D9\u05DD","\u05DE\u05E9\u05D8\u05D7\u05D9\u05DD \u05D0\u05D5\u05E4\u05E6\u05D9\u05D5\u05E0\u05DC\u05D9\u05D9\u05DD \u05D7\u05E1\u05E8\u05D9\u05DD","\u05D1\u05D5\u05E8\u05E8\u05D9 \u05D2\u05D9\u05D1\u05D5\u05D9 \u05D1\u05E9\u05D9\u05DE\u05D5\u05E9","\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05DE\u05D5\u05E9\u05E4\u05E2\u05D5\u05EA","\u05DE\u05E2\u05D1\u05E8 \u05D4\u05D1\u05D5\u05E8\u05E8 \u05D4\u05D0\u05D7\u05E8\u05D5\u05DF","\u05EA\u05E6\u05E4\u05D9\u05D5\u05EA \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA","\u05E1\u05E4\u05D9\u05E8\u05EA \u05E1\u05DE\u05E0\u05D9 \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA","\u05E1\u05D8\u05D9\u05D9\u05D4 \u05D1\u05D7\u05D5\u05D6\u05D4 \u05D4\u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA","\u05EA\u05E6\u05E4\u05D9\u05D5\u05EA \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA \u05E9\u05E0\u05E9\u05DE\u05E8\u05D5","\u05DE\u05E7\u05D5\u05E8\u05D9","\u05DE\u05D2\u05DE\u05D4","\u05E7\u05D9\u05D3\u05D5\u05DD \u05E4\u05E0\u05D9\u05DE\u05D9","\u05D5\u05D9\u05D3\u05D0\u05D5","\u05D4\u05EA\u05D7\u05D1\u05E8 \u05DC-X \u05DC\u05E4\u05E0\u05D9 \u05D4\u05D4\u05E4\u05E2\u05DC\u05D4.","\u05D1\u05D7\u05E8 \u05DC\u05E4\u05D7\u05D5\u05EA \u05E1\u05D5\u05D2 \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D0\u05D7\u05D3 \u05DB\u05D3\u05D9 \u05E9\u05DB\u05E4\u05EA\u05D5\u05E8 \u05D4\u05E4\u05E2\u05DC\u05D4 \u05D9\u05D4\u05D9\u05D4 \u05D6\u05DE\u05D9\u05DF.","\u05DE\u05EA\u05D7\u05D9\u05DC \u05DE\u05D7\u05D9\u05E7\u05D4\u2026","Long Animation Frame \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF","\u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05DF \u05D3\u05D2\u05D9\u05DE\u05D5\u05EA \u05D4\u05D7\u05DC\u05D4","\u05E9\u05D2\u05D9\u05D0\u05D4","\u05E9\u05D2\u05D9\u05D0\u05D5\u05EA","\u05D4\u05D3\u05E3 \u05D4\u05D9\u05D4 \u05E9\u05D2\u05D5\u05D9 \u05D2\u05DD \u05DB\u05E9\u05DB\u05DC \u05EA\u05DB\u05D5\u05E0\u05D5\u05EA Aviary \u05D4\u05D9\u05D5 \u05DB\u05D1\u05D5\u05D9\u05D5\u05EA, \u05D5\u05DC\u05DB\u05DF \u05D3\u05D1\u05E8 \u05DE\u05DE\u05D4 \u05E9-Aviary \u05E2\u05D5\u05E9\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05D4\u05D2\u05D5\u05E8\u05DD. \u05D4\u05DE\u05E7\u05D5\u05DD \u05D4\u05D1\u05D0 \u05DC\u05D1\u05D3\u05D5\u05E7 \u05D4\u05D5\u05D0 \u05D4\u05E8\u05D7\u05D1\u05D4 \u05D0\u05D7\u05E8\u05EA, \u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 \u05DE\u05E9\u05EA\u05DE\u05E9 \u05D0\u05D5 X \u05E2\u05E6\u05DE\u05D5.","\u05DC\u05D0 \u05E4\u05E2\u05DC\u05D4 \u05D0\u05E3 \u05EA\u05DB\u05D5\u05E0\u05D4 \u05E9\u05DC Aviary, \u05D5\u05DC\u05DB\u05DF \u05DC\u05D0 \u05D4\u05D9\u05D4 \u05DE\u05D4 \u05DC\u05D7\u05E4\u05E9.","\u05D0\u05D9\u05DF \u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA.","\u05E0\u05D7\u05E1\u05DD \u05D1\u05DE\u05E6\u05D1 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05D1\u05DC\u05D1\u05D3","\u05D7\u05E1\u05D5\u05DD (\u05D4\u05EA\u05E7\u05E6\u05D9\u05D1 \u05D4\u05D5\u05D0 0)","\u05D0\u05D9\u05DF \u05D4\u05EA\u05D0\u05DE\u05D5\u05EA (\u05D0\u05D5 \u05E9\u05D4\u05D0\u05D9\u05E0\u05D8\u05D2\u05E8\u05E6\u05D9\u05D4 \u05DE\u05D5\u05E9\u05D1\u05EA\u05EA).","\u05E4\u05EA\u05D7 \u05D0\u05EA \u05E8\u05E9\u05D9\u05DE\u05EA \u05D4\u05E2\u05D5\u05E7\u05D1\u05D9\u05DD \u05D0\u05D5 \u05D4\u05E0\u05E2\u05E7\u05D1\u05D9\u05DD \u05E9\u05DC \u05E4\u05E8\u05D5\u05E4\u05D9\u05DC, \u05D5\u05D0\u05D6 \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\\"\u05DC\u05DB\u05D9\u05D3\u05EA \u05EA\u05DE\u05D5\u05E0\u05EA \u05DE\u05E6\u05D1\\" \u05DB\u05D3\u05D9 \u05DC\u05EA\u05E2\u05D3 \u05D0\u05D5\u05EA\u05D4.","\u05DC\u05D0 \u05E7\u05D9\u05D9\u05DD \u05D1\u05E4\u05D5\u05E8\u05DE\u05D8 \u05D4\u05D6\u05D4:","\u05D0\u05D9\u05DF \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \u05D4\u05EA\u05D5\u05D0\u05DE\u05D5\u05EA \u05DC\u05BE\u201E{query}\u201D.","\u05DE\u05D0\u05D7\u05D5\u05E8\u05D9 \u05D4\u05E7\u05DC\u05E2\u05D9\u05DD \u05E9\u05DC X","\u05E7\u05D5\u05E8\u05D0 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05D0\u05EA \u05E1\u05D9\u05DB\u05D5\u05DD \u05D4\u05D7\u05E9\u05D9\u05E4\u05D4 \u05D4\u05D7\u05D5\u05D3\u05E9\u05D9 \u05E9\u05DC X. \u05D4\u05D5\u05D0 \u05DE\u05E6\u05D9\u05D2 \u05EA\u05D5\u05D5\u05D9\u05D5\u05EA \u05DE\u05E6\u05D8\u05D1\u05E8\u05D5\u05EA, \u05DC\u05D0 \u05DE\u05E9\u05E7\u05DC\u05D9 \u05D3\u05D9\u05E8\u05D5\u05D2 \u05D1\u05D9\u05D9\u05E6\u05D5\u05E8 \u05D5\u05DC\u05D0 \u05D1\u05D9\u05E7\u05D5\u05E8\u05EA \u05DE\u05DC\u05D0\u05D4 \u05E9\u05DC \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD.","\u05D9\u05D9\u05D1\u05D5\u05D0 JSON \u05E9\u05DC \u05DE\u05D0\u05D7\u05D5\u05E8\u05D9 \u05D4\u05E7\u05DC\u05E2\u05D9\u05DD \u05E9\u05DC X","\u05D3\u05D5\u05D7 \u05DE\u05D0\u05D7\u05D5\u05E8\u05D9 \u05D4\u05E7\u05DC\u05E2\u05D9\u05DD \u05E0\u05E9\u05DE\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA.","\u05DC\u05D0 \u05D3\u05D5\u05D5\u05D7\u05D5 \u05EA\u05D5\u05D5\u05D9\u05D5\u05EA \u05D7\u05E9\u05D9\u05E4\u05D4 \u05D4\u05D7\u05D5\u05D3\u05E9.","\u05E2\u05D3\u05D9\u05D9\u05DF \u05DC\u05D0 \u05D9\u05D5\u05D1\u05D0 \u05D3\u05D5\u05D7 \u05E9\u05DC X.","\u05D9\u05D9\u05D1\u05D0 \u05D7\u05D5\u05D3\u05E9 \u05E0\u05D5\u05E1\u05E3 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05E9\u05D5\u05D5\u05EA \u05D3\u05D5\u05D7\u05D5\u05EA.","\u05D4\u05D5\u05E8\u05D3\u05EA \u05D4\u05E0\u05D1\u05D7\u05E8\u05D9\u05DD","\u05E0\u05D1\u05D7\u05E8\u05D5 {selected} \u05DE\u05EA\u05D5\u05DA {total} \u05E7\u05D1\u05E6\u05D9\u05DD. {unavailable} \u05DC\u05D0 \u05E0\u05D9\u05EA\u05E0\u05D9\u05DD \u05DC\u05D4\u05D5\u05E8\u05D3\u05D4.","\u05E1\u05D5\u05D2 \u05DE\u05D3\u05D9\u05D4","\u05DB\u05DC \u05D4\u05E1\u05D5\u05D2\u05D9\u05DD","\u05D1\u05D7\u05D9\u05E8\u05EA \u05D4\u05DB\u05D5\u05DC","\u05DC\u05D0 \u05D6\u05DE\u05D9\u05DF.","\u05D4\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05D6\u05D4 \u05DE\u05DB\u05D9\u05DC \u05D9\u05D5\u05EA\u05E8 \u05DE-{limit} \u05E7\u05D1\u05E6\u05D9\u05DD \u05DC\u05D4\u05D5\u05E8\u05D3\u05D4. \u05E6\u05DE\u05E6\u05DD \u05D0\u05D5\u05EA\u05D5 \u05E7\u05D5\u05D3\u05DD.","\u05D0\u05D9\u05DF \u05D0\u05D5\u05E1\u05E4\u05D9\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD \u05D4\u05EA\u05D5\u05D0\u05DE\u05D9\u05DD \u05DC\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05D6\u05D4.","\u05D4\u05EA\u05D0\u05DE\u05EA \u05D8\u05E7\u05E1\u05D8 \u05D5\u05D4\u05EA\u05D0\u05DE\u05D4 \u05E1\u05DE\u05E0\u05D8\u05D9\u05EA","\u05D4\u05EA\u05D0\u05DE\u05D4 \u05E1\u05DE\u05E0\u05D8\u05D9\u05EA","\u05D4\u05EA\u05D0\u05DE\u05EA \u05D8\u05E7\u05E1\u05D8","(\u05DC\u05DC\u05D0 \u05D8\u05E7\u05E1\u05D8)","\u05DE\u05E6\u05D9\u05D0\u05EA \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DE\u05D5\u05E8\u05D9\u05DD \u05DC\u05E4\u05D9 \u05D8\u05E7\u05E1\u05D8, \u05DB\u05D9\u05E0\u05D5\u05D9, \u05EA\u05D2\u05D9\u05D5\u05EA, \u05EA\u05D9\u05E7\u05D9\u05D9\u05D4 \u05D0\u05D5 \u05DE\u05D6\u05D4\u05D4. \u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \u05DB\u05D5\u05DC\u05DC\u05D5\u05EA \u05E8\u05E7 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05BEX \u05E9\u05DC\u05D7 \u05DC\u05D3\u05E3 \u05D1\u05D6\u05DE\u05DF \u05D4\u05D2\u05DC\u05D9\u05DC\u05D4.","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D1\u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA","\u05E2\u05D3\u05D9\u05D9\u05DF \u05DC\u05D0 \u05E0\u05E9\u05DE\u05E8 \u05D3\u05D1\u05E8. \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\\"\u05E9\u05DE\u05D9\u05E8\u05D4 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA\\" \u05D1\u05DB\u05DC \u05E4\u05D5\u05E1\u05D8 \u05DB\u05D3\u05D9 \u05DC\u05E9\u05DE\u05D5\u05E8 \u05DB\u05D0\u05DF \u05E2\u05D5\u05EA\u05E7.","\u05D0\u05D9\u05DF \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA \u05E9\u05EA\u05D5\u05D0\u05DE\u05D5\u05EA \u05DC\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05D6\u05D4.","\u05D4\u05E2\u05E8\u05D5\u05EA","\u05D4\u05E2\u05E8\u05D5\u05EA \u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D9\u05D4","\u05D4\u05E1\u05E8\u05D4","\u05D4\u05D5\u05E1\u05E3 \u05D0\u05D7\u05EA \u05DC\u05DE\u05D8\u05D4 \u05D1\u05E4\u05D5\u05E8\u05DE\u05D8 \u05E9\u05DD \u05DE\u05E9\u05EA\u05DE\u05E9: \u05D4\u05E2\u05E8\u05D4. \u05D4\u05D4\u05E2\u05E8\u05D5\u05EA \u05DE\u05D5\u05E4\u05D9\u05E2\u05D5\u05EA \u05DC\u05E6\u05D3 \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05DC \u05D0\u05D5\u05EA\u05D5 \u05D7\u05E9\u05D1\u05D5\u05DF.","\u05D4\u05E4\u05E2\u05DC \u05DC\u05DB\u05D9\u05D3\u05D4, \u05D2\u05DC\u05D5\u05DC \u05D1\u05E6\u05D9\u05E8 \u05D6\u05DE\u05DF \u05D5\u05D0\u05D6 \u05D9\u05D9\u05E6\u05D0. \u05D4\u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D5\u05D4\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05E9\u05DC\u05D4\u05DF \u05D9\u05D5\u05E4\u05D9\u05E2\u05D5 \u05DB\u05D0\u05DF.","\u05D1\u05D5\u05E0\u05D4 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF WARC\u2026","\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF WACZ \u05E0\u05D1\u05E0\u05D4 \u05DB\u05E2\u05EA\u2026","\u05D6\u05D5\u05D2 \u05D4\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05E9\u05DE\u05D5\u05E8 \u05D0\u05D9\u05E0\u05D5 \u05EA\u05E7\u05D9\u05DF. \u05D9\u05E9 \u05DC\u05D4\u05D7\u05DC\u05D9\u05E3 \u05D0\u05D5\u05EA\u05D5 \u05DC\u05E4\u05E0\u05D9 \u05D7\u05EA\u05D9\u05DE\u05D4 \u05E2\u05DC \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05E0\u05D5\u05E1\u05E3.","\u05D1\u05E9\u05D9\u05DE\u05D5\u05E9 \u05D4\u05E8\u05D0\u05E9\u05D5\u05DF \u05E0\u05D5\u05E6\u05E8\u05EA \u05D6\u05D4\u05D5\u05EA P-384 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA. \u05D4\u05D7\u05EA\u05D9\u05DE\u05D4 \u05E0\u05E9\u05D0\u05E8\u05EA \u05DB\u05D1\u05D5\u05D9\u05D4 \u05D1\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA WACZ \u05E8\u05D2\u05D9\u05DC\u05D5\u05EA.","\u05E0\u05D5\u05E6\u05E8\u05EA \u05D6\u05D4\u05D5\u05EA \u05D7\u05EA\u05D9\u05DE\u05D4 \u05D7\u05D3\u05E9\u05D4\u2026","\u05D9\u05D5\u05E6\u05E8 \u05D4\u05D5\u05DB\u05D7\u05EA WACZ \u05D9\u05D9\u05E2\u05D5\u05D3\u05D9\u05EA \u05DC-Aviary\u2026","\u05D6\u05D5\u05D2 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05D7\u05EA\u05D9\u05DE\u05D4 \u05D1\u05D4\u05DB\u05E0\u05D4\u2026","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D4\u05D5\u05E8\u05D3\u05D5\u05EA","\u05D9\u05D9\u05E6\u05D0 \u05D0\u05EA \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05D4\u05E1\u05E8\u05EA \u05D4\u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA \u05DB-JSON \u05D5\u05DB-CSV \u05DC\u05D8\u05D5\u05D5\u05D7 \u05EA\u05D0\u05E8\u05D9\u05DB\u05D9\u05DD \u05E0\u05D1\u05D7\u05E8. \u05DB\u05EA\u05D5\u05D1\u05D5\u05EA \u05D4\u05DE\u05D3\u05D9\u05D4 \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9\u05D5\u05EA \u05DC\u05D0 \u05E0\u05DB\u05DC\u05DC\u05D5\u05EA.","\u05EA\u05D0\u05E8\u05D9\u05DA \u05D4\u05EA\u05D7\u05DC\u05D4 \u05DC\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4","\u05EA\u05D0\u05E8\u05D9\u05DA \u05E1\u05D9\u05D5\u05DD \u05DC\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D8\u05D5\u05D5\u05D7","\u05D4\u05D5\u05E8\u05D3\u05EA \u05E9\u05DE\u05E2 \u05E9\u05E0\u05DC\u05DB\u05D3","\u05D4\u05D5\u05E8\u05D3 \u05E8\u05E6\u05D5\u05E2\u05D5\u05EA \u05E9\u05DE\u05E2 \u05E9\u05DB\u05D1\u05E8 \u05E7\u05D9\u05D9\u05DE\u05D5\u05EA \u05D1\u05DC\u05DB\u05D9\u05D3\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA. \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05EA \u05D1\u05E7\u05E9\u05EA \u05D2\u05D9\u05DC\u05D5\u05D9 \u05DE\u05D8\u05D0-\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD.","\u05D4\u05D5\u05E8\u05D3\u05EA \u05DB\u05EA\u05D5\u05D1\u05D9\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5","\u05D4\u05D5\u05E8\u05D3 \u05E8\u05E6\u05D5\u05E2\u05D5\u05EA \u05DB\u05EA\u05D5\u05D1\u05D9\u05D5\u05EA \u05E9\u05DB\u05D1\u05E8 \u05E7\u05D9\u05D9\u05DE\u05D5\u05EA \u05D1\u05DC\u05DB\u05D9\u05D3\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA. \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05EA \u05D1\u05E7\u05E9\u05EA \u05D2\u05D9\u05DC\u05D5\u05D9 \u05DE\u05D8\u05D0-\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD.","\u05E9\u05D5\u05E8\u05D4","\u05E1\u05DE\u05E0\u05D9\u05DD \u05E9\u05E0\u05E6\u05E4\u05D5 \u05D1\u05E2\u05D1\u05E8 \u05D0\u05D9\u05E0\u05DD \u05DE\u05D6\u05D5\u05D4\u05D9\u05DD \u05E2\u05D5\u05D3: {markers}.","\u05DE\u05D5\u05DB\u05DF \u05DC\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D1\u05D7\u05E9\u05D1\u05D5\u05DF @{handle}.","{feature}: \u200F{count} \u05D4\u05E8\u05E6\u05D5\u05EA \xB7 \u05E1\u05D4\u05F4\u05DB {total} \u05DE\u05F4\u05E9 \xB7 \u05DE\u05E7\u05E1\u05D9\u05DE\u05D5\u05DD {max} \u05DE\u05F4\u05E9 \xB7 \u05DE\u05DC\u05D0\u05D5\u05EA {full} / \u05DE\u05E6\u05D8\u05D1\u05E8\u05D5\u05EA {incremental}","{observed} \u05E4\u05E8\u05D9\u05D9\u05DE\u05D9\u05DD \u05D0\u05E8\u05D5\u05DB\u05D9\u05DD \xB7 \u05D1\u05DE\u05EA\u05D0\u05DD {correlated}","{count} \u05EA\u05DB\u05D5\u05E0\u05D5\u05EA","X \u05DE\u05D5\u05E6\u05D2 \u05D1\u05E9\u05E4\u05D4 {language}, \u05E9\u05E2\u05D1\u05D5\u05E8\u05D4 \u05D0\u05D9\u05DF \u05DC-Aviary \u05EA\u05D5\u05D5\u05D9\u05D5\u05EA \u05DE\u05D5\u05D3\u05E2\u05D5\u05EA. \u05DB\u05D0\u05DF \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05DE\u05D5\u05DE\u05E0\u05D9\u05DD \u05D0\u05D9\u05E0\u05DD \u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD \u05DC\u05E4\u05D9 \u05EA\u05D5\u05D5\u05D9\u05EA.","{feature} \u05D4\u05D5\u05D0 \u05DE\u05D4 \u05E9\u05E9\u05D9\u05E0\u05D4 \u05D0\u05EA \u05D4\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D6\u05D4. \u05E0\u05D3\u05E8\u05E9\u05D5 {rounds} \u05E1\u05D1\u05D1\u05D9\u05DD \u05DB\u05D3\u05D9 \u05DC\u05DE\u05E6\u05D5\u05D0 \u05D0\u05D5\u05EA\u05D5. \u05DB\u05DC \u05D4\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05E4\u05D5\u05E2\u05DC\u05D5\u05EA \u05E9\u05D5\u05D1, \u05D0\u05D6 \u05DB\u05D1\u05D4 \u05D0\u05D5\u05EA\u05D4 \u05D1\u05D4\u05D2\u05D3\u05E8\u05D4 \u05E9\u05DC\u05D4 \u05E2\u05E6\u05DE\u05D4 \u05D0\u05DD \u05D1\u05E8\u05E6\u05D5\u05E0\u05DA \u05E9\u05EA\u05D9\u05E9\u05D0\u05E8 \u05DB\u05D1\u05D5\u05D9\u05D4.","\u05E1\u05D1\u05D1 {round} \u05DE\u05EA\u05D5\u05DA {total}. \u05DB\u05DC {off} \u05D4\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05DB\u05D1\u05D5\u05D9\u05D5\u05EA.","\u05E1\u05D1\u05D1 {round} \u05DE\u05EA\u05D5\u05DA {total}. \u200F{off} \u05DE\u05EA\u05D5\u05DA {suspect} \u05D4\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05E9\u05E2\u05D3\u05D9\u05D9\u05DF \u05D7\u05E9\u05D5\u05D3\u05D5\u05EA \u05DB\u05D1\u05D5\u05D9\u05D5\u05EA.","\u05DE\u05D6\u05D4\u05D4 {gid} \xB7 {status}","{count} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA","{posts} \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \xB7 {likes} \u05DC\u05D9\u05D9\u05E7\u05D9\u05DD \xB7 {messages} \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D9\u05E9\u05D9\u05E8\u05D5\u05EA (\u05DE\u05D7\u05D5\u05E5 \u05DC\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D4\u05E6\u05D9\u05D1\u05D5\u05E8\u05D9) \xB7 {media} \u05D4\u05E4\u05E0\u05D9\u05D5\u05EA \u05DE\u05D3\u05D9\u05D4 \xB7 {followers} \u05E2\u05D5\u05E7\u05D1\u05D9\u05DD \xB7 {following} \u05D1\u05DE\u05E2\u05E7\u05D1 \xB7 {lists} \u05E8\u05E9\u05D9\u05DE\u05D5\u05EA","\u05D4\u05D5\u05E8\u05D7\u05D1\u05D5 {archiveLinks} \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05DE\u05D4\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF + {corpusLinks} \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \xB7 \u05D6\u05D5\u05D4\u05D5 {participants} \u05DE\u05D6\u05D4\u05D9 \u05DE\u05E9\u05EA\u05EA\u05E4\u05D9\u05DD \xB7 {unresolved} \u05E0\u05E9\u05DE\u05E8\u05D5 \u05DB\u05DE\u05D6\u05D4\u05D9\u05DD \u05E9\u05DC\u05D0 \u05D6\u05D5\u05D4\u05D5 \xB7 \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05D5 \u05D1\u05E7\u05E9\u05D5\u05EA","{status} \xB7 {filename} \xB7 {records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \xB7 {files} \u05E7\u05D1\u05E6\u05D9\u05DD \xB7 {warnings} \u05D0\u05D6\u05D4\u05E8\u05D5\u05EA","{saved} \u05E0\u05E9\u05DE\u05E8\u05D5 \xB7 {mirrored} \u05E9\u05D5\u05DB\u05E4\u05DC\u05D5 \xB7 {due} \u05DC\u05EA\u05D6\u05DB\u05D5\u05E8\u05EA \xB7 {tags} \u05EA\u05D2\u05D9\u05D5\u05EA \xB7 {folders} \u05EA\u05D9\u05E7\u05D9\u05D5\u05EA","{public} \u05E6\u05D9\u05D1\u05D5\u05E8\u05D9\u05D9\u05DD \xB7 {protected} \u05DE\u05D5\u05D2\u05E0\u05D9\u05DD \xB7 {unknown} \u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2\u05D9\u05DD \xB7 {excluded} \u05DE\u05D5\u05D7\u05E8\u05D2\u05D9\u05DD \u05DE\u05D9\u05D9\u05E6\u05D5\u05D0 \u05DC\u05E9\u05D9\u05EA\u05D5\u05E3","{status} \xB7 {records} \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \xB7 {surface}","\u05D6\u05D4\u05D5\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA {fingerprint}. \u05D4\u05D9\u05D0 \u05DE\u05D5\u05DB\u05D9\u05D7\u05D4 \u05D0\u05EA \u05D4\u05DE\u05E9\u05DB\u05D9\u05D5\u05EA \u05D4\u05DE\u05E4\u05EA\u05D7 \u05D4\u05D6\u05D4, \u05DC\u05D0 \u05D0\u05EA \u05DE\u05D4 \u05E9-X \u05E1\u05D9\u05E4\u05E7\u05D4.","{count} \u05D1\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D6\u05D5","\u05E0\u05DE\u05E6\u05D0\u05D5 {imported} \u05DB\u05DC\u05DC\u05D9\u05DD. \u05D0\u05E4\u05E9\u05E8 \u05DC\u05D4\u05D7\u05DC\u05D9\u05E3. \u05D4\u05D4\u05D5\u05E1\u05E4\u05D4 \u05D7\u05E1\u05D5\u05DE\u05D4 \u05D1\u05E9\u05D5\u05E8\u05D4 {line}: {error}","\u05E0\u05DE\u05E6\u05D0\u05D5 {imported} \u05DB\u05DC\u05DC\u05D9\u05DD. \u05D9\u05EA\u05D5\u05D5\u05E1\u05E4\u05D5 {added}; {duplicates} \u05DB\u05D1\u05E8 \u05E7\u05D9\u05D9\u05DE\u05D9\u05DD. {replaced} \u05D9\u05D5\u05D7\u05DC\u05E4\u05D5 \u05D1-{total}.","\u05DE\u05D5\u05D7\u05E7 \u05D0\u05EA \u05D4\u05D0\u05D6\u05D4\u05E8\u05D5\u05EA \u05D5\u05D4\u05E9\u05D2\u05D9\u05D0\u05D5\u05EA \u05D4\u05E9\u05DE\u05D5\u05E8\u05D5\u05EA. \u05E0\u05DB\u05EA\u05D1\u05D9\u05DD \u05DB\u05D0\u05DF \u05E8\u05E7 \u05D8\u05E7\u05E1\u05D8 \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E9\u05DC Aviary \u05E2\u05E6\u05DE\u05D5, \u05D4\u05E9\u05E2\u05D4 \u05D5\u05E9\u05DE\u05D5\u05EA \u05E9\u05D3\u05D5\u05EA \u05D4\u05E4\u05D9\u05E8\u05D5\u05D8.","\u05DE\u05D7\u05D9\u05E7\u05EA \u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D4\u05E1\u05DE\u05E0\u05D9\u05DD \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05D5\u05D4\u05DE\u05D5\u05D2\u05D1\u05DC\u05EA \u05D5\u05D0\u05EA \u05D0\u05D6\u05D4\u05E8\u05EA \u05D4\u05E1\u05D8\u05D9\u05D9\u05D4 \u05E9\u05DC\u05D4. \u05D8\u05E7\u05E1\u05D8 \u05E9\u05DC \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD, \u05E9\u05DE\u05D5\u05EA \u05DE\u05E9\u05EA\u05DE\u05E9, \u05DB\u05EA\u05D5\u05D1\u05D5\u05EA URL \u05D5\u05D2\u05D5\u05E4\u05D9 \u05EA\u05D2\u05D5\u05D1\u05D4 \u05D0\u05D9\u05E0\u05DD \u05E0\u05E9\u05DE\u05E8\u05D9\u05DD \u05DB\u05D0\u05DF.","\u05DE\u05DB\u05D1\u05D4 \u05DB\u05DC \u05EA\u05DB\u05D5\u05E0\u05D4 \u05E9\u05DC Aviary \u05D5\u05D0\u05D6 \u05DE\u05D3\u05DC\u05D9\u05E7 \u05D0\u05D5\u05EA\u05DF \u05D7\u05D6\u05E8\u05D4 \u05D1\u05D7\u05E6\u05D0\u05D9\u05DD, \u05D5\u05E9\u05D5\u05D0\u05DC \u05D0\u05D7\u05E8\u05D9 \u05DB\u05DC \u05E1\u05D1\u05D1 \u05D0\u05DD \u05D4\u05D3\u05E3 \u05E2\u05D3\u05D9\u05D9\u05DF \u05E9\u05D2\u05D5\u05D9. \u05D4\u05D5\u05D0 \u05DE\u05D6\u05D4\u05D4 \u05D0\u05EA \u05D4\u05EA\u05DB\u05D5\u05E0\u05D4 \u05D4\u05D0\u05D7\u05E8\u05D0\u05D9\u05EA \u05D1\u05DB\u05D7\u05DE\u05D9\u05E9\u05D4 \u05E1\u05D1\u05D1\u05D9\u05DD. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05DB\u05EA\u05D1 \u05DC\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05E9\u05DC\u05DA, \u05D5\u05DC\u05DB\u05DF \u05E8\u05E2\u05E0\u05D5\u05DF \u05DE\u05E9\u05D7\u05D6\u05E8 \u05D4\u05DB\u05D5\u05DC \u05DC\u05D0 \u05DE\u05E9\u05E0\u05D4 \u05DE\u05D4 \u05EA\u05E2\u05E9\u05D4, \u05DB\u05D5\u05DC\u05DC \u05E2\u05E6\u05D9\u05E8\u05D4 \u05D1\u05D0\u05DE\u05E6\u05E2. \u05DE\u05E8\u05DB\u05D6 \u05D4\u05D1\u05E7\u05E8\u05D4 \u05D5\u05D4\u05E9\u05E4\u05D4 \u05E9\u05DC\u05D5 \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05D3\u05DC\u05D5\u05E7\u05D9\u05DD \u05DC\u05D0\u05D5\u05E8\u05DA \u05DB\u05DC \u05D4\u05D3\u05E8\u05DA, \u05D5\u05DC\u05DB\u05DF \u05D0\u05E3 \u05D0\u05D7\u05D3 \u05DE\u05D4\u05DD \u05DC\u05D0 \u05D9\u05DB\u05D5\u05DC \u05DC\u05D4\u05D9\u05D5\u05EA \u05DE\u05D6\u05D5\u05D4\u05D4 \u05DB\u05D0\u05E9\u05DD.","\u05D4\u05EA\u05D7\u05DC \u05DE\u05D7\u05D3\u05E9 \u05DB\u05E9\u05DB\u05DC \u05D4\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05DB\u05D1\u05D5\u05D9\u05D5\u05EA.","\u05E1\u05D2\u05D5\u05E8 \u05D0\u05EA \u05D4\u05D7\u05D9\u05E4\u05D5\u05E9. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05DE\u05E9\u05EA\u05E0\u05D4; \u05DB\u05DC \u05D4\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05DB\u05D1\u05E8 \u05E4\u05D5\u05E2\u05DC\u05D5\u05EA.","\u05D4\u05D1\u05E2\u05D9\u05D4 \u05E0\u05DE\u05E9\u05DB\u05EA \u05DB\u05E9\u05D4\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05D4\u05D0\u05DC\u05D4 \u05DB\u05D1\u05D5\u05D9\u05D5\u05EA, \u05D5\u05DC\u05DB\u05DF \u05DE\u05D3\u05D5\u05D1\u05E8 \u05D1\u05D0\u05D7\u05EA \u05DE\u05D4\u05D0\u05D7\u05E8\u05D5\u05EA.","\u05D4\u05D1\u05E2\u05D9\u05D4 \u05E0\u05E2\u05DC\u05DE\u05D4 \u05DB\u05E9\u05D4\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05D4\u05D0\u05DC\u05D4 \u05DB\u05D1\u05D5\u05D9\u05D5\u05EA, \u05D5\u05DC\u05DB\u05DF \u05DE\u05D3\u05D5\u05D1\u05E8 \u05D1\u05D0\u05D7\u05EA \u05DE\u05D4\u05DF.","\u05D4\u05D3\u05DC\u05E7 \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05DB\u05DC \u05D4\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05D5\u05E9\u05DB\u05D7 \u05DE\u05D4\u05D7\u05D9\u05E4\u05D5\u05E9. \u05DC\u05D0 \u05E0\u05E8\u05E9\u05DE\u05EA \u05E9\u05D5\u05DD \u05EA\u05E9\u05D5\u05D1\u05D4.","\u05D4\u05E9\u05D4\u05D4 \u05D0\u05EA {filename}.","\u05D7\u05D3\u05E9 \u05D0\u05EA {filename}.","\u05D1\u05D8\u05DC \u05D0\u05EA {filename}.","\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1 \u05D0\u05EA {filename}.","\u05D4\u05E9\u05D4\u05D4 \u05D0\u05EA {jobId}.","\u05D7\u05D3\u05E9 \u05D0\u05EA {jobId}.","\u05D1\u05D8\u05DC \u05D0\u05EA {jobId}.","\u05D4\u05E2\u05EA\u05E7\u05EA \u05EA\u05E6\u05E4\u05D9\u05EA \u05DE\u05D1\u05E0\u05D9\u05EA","\u05D1\u05D9\u05E6\u05D5\u05E2\u05D9 \u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD","\u05D0\u05D9\u05E4\u05D5\u05E1 \u05DE\u05D3\u05D3\u05D9 \u05D1\u05D9\u05E6\u05D5\u05E2\u05D9\u05DD","\u05EA\u05D5\u05D5\u05D9\u05D5\u05EA \u05DE\u05D5\u05D3\u05E2\u05D5\u05EA \u05E2\u05D1\u05D5\u05E8 \u05E9\u05E4\u05D4 \u05D6\u05D5","\u05D0\u05D6\u05D4\u05E8\u05D5\u05EA \u05E9\u05DE\u05D5\u05E8\u05D5\u05EA","\u05DE\u05D7\u05D9\u05E7\u05EA \u05D0\u05D6\u05D4\u05E8\u05D5\u05EA \u05E9\u05DE\u05D5\u05E8\u05D5\u05EA","\u05D0\u05D9\u05E4\u05D5\u05E1 \u05EA\u05E6\u05E4\u05D9\u05D5\u05EA \u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA","\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05E4\u05E2\u05D9\u05DC","\u05D4\u05D7\u05DC\u05E4\u05EA \u05E4\u05E8\u05D5\u05E4\u05D9\u05DC","\u05D4\u05E7\u05E6\u05D0\u05EA \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D9\u05E9\u05E0\u05D9\u05DD \u05DB\u05D0\u05DF","\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D7\u05D3\u05E9","\u05DE\u05E6\u05D0 \u05D0\u05EA \u05D4\u05EA\u05DB\u05D5\u05E0\u05D4 \u05E9\u05E9\u05D5\u05D1\u05E8\u05EA \u05D0\u05EA \u05D4\u05D3\u05E3 \u05D4\u05D6\u05D4","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05EA\u05DB\u05D5\u05E0\u05D4","\u05D7\u05E4\u05E9 \u05E9\u05D5\u05D1","\u05E0\u05E7\u05D4 \u05D0\u05EA \u05D4\u05EA\u05D5\u05E6\u05D0\u05D4","\u05E2\u05D3\u05D9\u05D9\u05DF \u05D7\u05E9\u05D5\u05D3\u05D5\u05EA","\u05D4\u05D3\u05E3 \u05E2\u05D3\u05D9\u05D9\u05DF \u05E9\u05D2\u05D5\u05D9","\u05D4\u05D3\u05E3 \u05E0\u05E8\u05D0\u05D4 \u05EA\u05E7\u05D9\u05DF \u05E2\u05DB\u05E9\u05D9\u05D5","\u05E2\u05E6\u05D5\u05E8 \u05D0\u05EA \u05D4\u05D7\u05D9\u05E4\u05D5\u05E9","\u05D2\u05E8\u05E1\u05EA \u05D4\u05D2\u05D9\u05D1\u05D5\u05D9","\u05D0\u05D5\u05E1\u05E4\u05D9 \u05D4\u05D2\u05D9\u05D1\u05D5\u05D9","\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD \u05D1\u05D0\u05D5\u05E1\u05E4\u05D9\u05DD","\u05E4\u05E8\u05D8\u05D9 \u05D0\u05D9\u05DE\u05D5\u05EA","\u05D0\u05D6\u05D4\u05E8\u05D5\u05EA \u05D4\u05D2\u05D9\u05D1\u05D5\u05D9","\u05D1\u05D9\u05D8\u05D5\u05DC \u05D4\u05E9\u05D7\u05D6\u05D5\u05E8","\u05D4\u05E8\u05E6\u05D4 \u05D9\u05D1\u05E9\u05D4 \u05E9\u05DC \u05E9\u05D7\u05D6\u05D5\u05E8","\u05E9\u05D7\u05D6\u05D5\u05E8 \u05D2\u05D9\u05D1\u05D5\u05D9 \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D4","\u05D0\u05D9\u05DF \u05E2\u05D3\u05D9\u05D9\u05DF \u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05DE\u05E6\u05D1","\u05D0\u05D5\u05E1\u05E4\u05D9\u05DD \u05E9\u05D9\u05D5\u05D1\u05D0\u05D5","\u05EA\u05D9\u05E7\u05D5\u05E0\u05D9 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD","\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF","\u05D4\u05E9\u05D4\u05D9\u05D9\u05EA \u05D9\u05D9\u05D1\u05D5\u05D0 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF","\u05D7\u05D9\u05D3\u05D5\u05E9 \u05D9\u05D9\u05D1\u05D5\u05D0 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF","\u05D1\u05D9\u05D8\u05D5\u05DC \u05D9\u05D9\u05D1\u05D5\u05D0 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF","\u05E0\u05D9\u05E1\u05D9\u05D5\u05DF \u05D7\u05D5\u05D6\u05E8 \u05DC\u05D9\u05D9\u05D1\u05D5\u05D0 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF","\u05D3\u05D5\u05D7 \u05DE\u05D0\u05D7\u05D5\u05E8\u05D9 \u05D4\u05E7\u05DC\u05E2\u05D9\u05DD \u05D4\u05D0\u05D7\u05E8\u05D5\u05DF","\u05D4\u05EA\u05D5\u05D5\u05D9\u05D5\u05EA \u05D1\u05D3\u05D5\u05D7 \u05D4\u05D0\u05D7\u05E8\u05D5\u05DF","\u05D3\u05D5\u05D7\u05D5\u05EA \u05DE\u05D0\u05D7\u05D5\u05E8\u05D9 \u05D4\u05E7\u05DC\u05E2\u05D9\u05DD","\u05D4\u05E9\u05D5\u05D5\u05D0\u05D4 \u05D7\u05D5\u05D3\u05E9\u05D9\u05EA","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05D3\u05D5\u05D7\u05D5\u05EA \u05DE\u05D0\u05D7\u05D5\u05E8\u05D9 \u05D4\u05E7\u05DC\u05E2\u05D9\u05DD \u05E9\u05E0\u05E9\u05DE\u05E8\u05D5","\u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA","\u05D9\u05D9\u05E6\u05D5\u05D0 \u05DC\u05DE\u05E0\u05D4\u05DC\u05D9 \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA","\u05D0\u05D9\u05DF \u05E2\u05D3\u05D9\u05D9\u05DF \u05D4\u05E2\u05E8\u05D5\u05EA \u05E2\u05DC \u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA","\u05DB\u05D9\u05E1\u05D5\u05D9 \u05E7\u05D4\u05DC","\u05D0\u05D9\u05DF \u05E2\u05D3\u05D9\u05D9\u05DF \u05DE\u05E9\u05D9\u05DE\u05D5\u05EA \u05D9\u05D9\u05E6\u05D5\u05D0","\u05DE\u05E9\u05D9\u05DE\u05EA \u05D9\u05D9\u05E6\u05D5\u05D0","\u05D4\u05E9\u05D4\u05D9\u05D9\u05EA \u05DE\u05E9\u05D9\u05DE\u05EA \u05D9\u05D9\u05E6\u05D5\u05D0","\u05D7\u05D9\u05D3\u05D5\u05E9 \u05DE\u05E9\u05D9\u05DE\u05EA \u05D9\u05D9\u05E6\u05D5\u05D0","\u05D1\u05D9\u05D8\u05D5\u05DC \u05DE\u05E9\u05D9\u05DE\u05EA \u05D9\u05D9\u05E6\u05D5\u05D0","\u05D1\u05E0\u05D9\u05D9\u05EA \u05E9\u05E8\u05E9\u05D5\u05E8\u05D9\u05DD \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \u05DE\u05D7\u05D3\u05E9","\u05D0\u05E6\u05D5\u05D5\u05D4 \u05E4\u05E2\u05D9\u05DC\u05D4 \u05E9\u05DC \u05DE\u05D3\u05D9\u05D4","\u05D4\u05EA\u05D0\u05DE\u05D5\u05EA \u05DB\u05E4\u05D5\u05DC\u05D5\u05EA","\u05D0\u05D9\u05E9\u05D5\u05E8\u05D9 \u05D0\u05D9\u05DB\u05D5\u05EA","\u05D4\u05D4\u05EA\u05D0\u05DE\u05D4 \u05D4\u05DB\u05E4\u05D5\u05DC\u05D4 \u05D4\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D4\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA","\u05D7\u05D9\u05D3\u05D5\u05E9 \u05DE\u05D3\u05D9\u05D4 \u05D1\u05EA\u05D5\u05E8","\u05E0\u05D9\u05E1\u05D9\u05D5\u05DF \u05D7\u05D5\u05D6\u05E8 \u05DC\u05DE\u05D3\u05D9\u05D4 \u05E9\u05E0\u05DB\u05E9\u05DC\u05D4","\u05E8\u05E9\u05D9\u05DE\u05D5\u05EA \u05E0\u05D9\u05D2\u05D5\u05DF \u05E9\u05E0\u05DB\u05EA\u05D1\u05D5 \u05DE\u05D7\u05D3\u05E9","\u05E9\u05DB\u05D7 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9\u05E0\u05E8\u05D0\u05D5","\u05DB\u05DC\u05DC\u05D9\u05DD \u05E9\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E7\u05E8\u05D5\u05D0","\u05DB\u05DC\u05DC\u05D9\u05DD \u05E9\u05E4\u05D2 \u05EA\u05D5\u05E7\u05E4\u05DD","\u05D7\u05D9\u05D3\u05D5\u05E9 \u05DB\u05DC\u05DC\u05D9\u05DD \u05E9\u05E4\u05D2 \u05EA\u05D5\u05E7\u05E4\u05DD","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D6\u05DE\u05D9\u05E0\u05D9\u05DD","\u05E4\u05EA\u05D9\u05D7\u05EA \u05D4\u05E1\u05D9\u05DB\u05D5\u05DD","\u05D4\u05E9\u05D4\u05D9\u05D4","\u05D4\u05DE\u05E9\u05DA","\u05E2\u05E6\u05D9\u05E8\u05D4","\u05D4\u05D7\u05DC\u05E4\u05EA \u05E6\u05DE\u05D3 \u05D4\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA","\u05EA\u05E7\u05D9\u05DF. \u05DB\u05DC \u05D4\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD \u05E0\u05E9\u05DE\u05E8\u05D5.","\u05DE\u05E2\u05EA\u05D9\u05E7 \u05D0\u05EA \u05D4\u05D0\u05D5\u05E4\u05DF \u05E9\u05D1\u05D5 X \u05D1\u05D5\u05E0\u05D4 \u05D0\u05EA \u05D4\u05D3\u05E3 \u05D4\u05D6\u05D4 (\u05E1\u05E4\u05D9\u05E8\u05EA \u05E8\u05DB\u05D9\u05D1\u05D9\u05DD, \u05E7\u05D9\u05E0\u05D5\u05DF \u05D5\u05E4\u05E8\u05D9\u05E1\u05D4) \u05DB\u05D3\u05D9 \u05DC\u05E8\u05E2\u05E0\u05DF \u05D0\u05EA \u05E0\u05EA\u05D5\u05E0\u05D9 \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4 \u05E9\u05DC Aviary. \u05DC\u05DC\u05D0 \u05D8\u05E7\u05E1\u05D8 \u05E9\u05DC \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD, \u05E9\u05DE\u05D5\u05EA, \u05E9\u05DE\u05D5\u05EA \u05DE\u05E9\u05EA\u05DE\u05E9, \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05D0\u05D5 \u05DE\u05D6\u05D4\u05D9\u05DD.","\u05DE\u05D3\u05D9\u05D3\u05EA \u05D4\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD \u05E0\u05E9\u05D0\u05E8\u05EA \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05D5\u05E9\u05D5\u05DE\u05E8\u05EA \u05E8\u05E7 \u05DE\u05D6\u05D4\u05D9 \u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05D5\u05DE\u05E9\u05DA \u05DE\u05D5\u05D2\u05D1\u05DC.","\u05DE\u05E2\u05D1\u05D9\u05E8 \u05DC\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05E4\u05E2\u05D9\u05DC \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D5\u05DE\u05D0\u05D2\u05E8\u05D9 \u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05DE\u05DC\u05E4\u05E0\u05D9 \u05D4\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC\u05D9\u05DD \u05E9\u05DC\u05D0 \u05E9\u05D5\u05D9\u05DB\u05D5 \u05DC\u05D0\u05E3 \u05D0\u05D7\u05D3. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05D2\u05D6\u05E8 \u05DE\u05D4\u05E0\u05EA\u05D9\u05D1 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9 \u05D1-X.","\u05E6\u05E8\u05D5 \u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05DC\u05D0\u05BE\u05DE\u05E7\u05D5\u05D5\u05DF \u05E8\u05D9\u05E7 \u05DC\u05E4\u05E0\u05D9 \u05DE\u05E2\u05D1\u05E8 \u05D1\u05D9\u05DF \u05D7\u05E9\u05D1\u05D5\u05E0\u05D5\u05EA \u05D0\u05D5 \u05D9\u05D9\u05D1\u05D5\u05D0 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05E0\u05D5\u05E1\u05E3.","\u05DC\u05D0 \u05E0\u05E8\u05E9\u05DD \u05D3\u05D1\u05E8.","\u05DE\u05D5\u05D3\u05D3\u2026","\u05D0\u05D9 \u05D0\u05E4\u05E9\u05E8 \u05DC\u05DE\u05D3\u05D5\u05D3 \u05D0\u05EA \u05DE\u05D0\u05D2\u05E8 \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05D4 \u05DE\u05DB\u05D0\u05DF, \u05D5\u05DC\u05DB\u05DF Aviary \u05DC\u05D0 \u05DE\u05D3\u05D5\u05D5\u05D7 \u05E2\u05DC \u05D2\u05D5\u05D3\u05DC\u05D5.","\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05D4 \u05DC\u05D0 \u05DE\u05E4\u05E8\u05E7 \u05D0\u05EA \u05D3\u05D5\u05D7 \u05D4\u05D0\u05D7\u05E1\u05D5\u05DF \u05DC\u05E4\u05D9 \u05E1\u05D5\u05D2, \u05D5\u05DC\u05DB\u05DF \u05DE\u05D5\u05E6\u05D2\u05EA \u05E8\u05E7 \u05D4\u05DE\u05D3\u05D9\u05D3\u05D4 \u05E9\u05DC Aviary \u05E2\u05E6\u05DE\u05D5.","\u05DE\u05D5\u05E8\u05D9\u05D3 \u05D0\u05EA \u05D4\u05D3\u05D5\u05D7\u05D5\u05EA \u05D4\u05DE\u05E0\u05D5\u05E8\u05DE\u05DC\u05D9\u05DD \u05DB-JSON \u05DE\u05E7\u05D5\u05DE\u05D9. \u05D0\u05DC\u05D4 \u05E0\u05EA\u05D5\u05E0\u05D9 \u05DE\u05E9\u05EA\u05DE\u05E9 \u05DE-X; Aviary \u05DC\u05D0 \u05DE\u05D5\u05E1\u05D9\u05E3 \u05DE\u05E9\u05E7\u05DC\u05D9 \u05D3\u05D9\u05E8\u05D5\u05D2 \u05D5\u05DC\u05D0 \u05DE\u05E1\u05D9\u05E7 \u05E6\u05D9\u05D5\u05DF.","\u05D4\u05D5\u05E8\u05D3\u05EA JSON \u05D5\u05BECSV \u05DC\u05DB\u05DC \u05E1\u05D9\u05DE\u05E0\u05D9\u05D9\u05D4 \u05D1\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC. \u05D4\u05E2\u05D5\u05EA\u05E7 \u05E9\u05D5\u05DE\u05E8 \u05E8\u05E7 \u05D0\u05EA \u05DE\u05D4 \u05E9\u05BEX \u05E9\u05DC\u05D7 \u05DC\u05D3\u05E3 \u05D1\u05D6\u05DE\u05DF \u05D4\u05D2\u05DC\u05D9\u05DC\u05D4.","\u05D4\u05D5\u05E8\u05D3\u05EA \u05E7\u05D5\u05D1\u05E5 \u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05E9\u05DC \u05D3\u05E4\u05D3\u05E4\u05DF \u05E9-Karakeep, \u200FLinkwarden, \u200Flinkding \u05D5\u05DB\u05DC \u05D3\u05E4\u05D3\u05E4\u05DF \u05DE\u05D9\u05D9\u05D1\u05D0\u05D9\u05DD, \u05D5\u05D2\u05DD \u05E7\u05D5\u05D1\u05E5 \u05D4-CSV \u05E9-Raindrop.io \u05DE\u05D9\u05D9\u05D1\u05D0.","\u05DE\u05E1\u05D9\u05E8 \u05D0\u05EA \u05DB\u05DC \u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05D5\u05EA \u05D4\u05E9\u05DE\u05D5\u05E8\u05D5\u05EA.","\u05E7\u05E8\u05D0\u05D5 \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D5\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5 \u05DC\u05E4\u05D9 \u05E1\u05D3\u05E8 \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D0\u05D1. \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D0\u05D1\u05D5\u05EA \u05D7\u05E1\u05E8\u05D9\u05DD \u05E0\u05E9\u05D0\u05E8\u05D9\u05DD \u05D2\u05DC\u05D5\u05D9\u05D9\u05DD \u05DB\u05E8\u05D5\u05D5\u05D7\u05D9\u05DD \u05DE\u05E7\u05D5\u05DE\u05D9\u05D9\u05DD.","\u05DE\u05D0\u05E4\u05E1 \u05D0\u05EA \u05D0\u05D9\u05E0\u05D3\u05E7\u05E1 \u05D4\u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9.","\u05DE\u05E9\u05D7\u05D6\u05E8 \u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05E9\u05D4\u05D5\u05E9\u05D4\u05D5 \u05D0\u05D5 \u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 \u05D1\u05EA\u05D5\u05E8 \u05DE\u05D4\u05E4\u05E2\u05DC\u05D4 \u05E7\u05D5\u05D3\u05DE\u05EA.","\u05DE\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1 \u05DB\u05DC \u05DE\u05E9\u05D9\u05DE\u05EA \u05DE\u05D3\u05D9\u05D4 \u05E9\u05E0\u05DB\u05E9\u05DC\u05D4 \u05D0\u05D5 \u05D1\u05D5\u05D8\u05DC\u05D4 \u05D1\u05EA\u05D5\u05E8 \u05D4\u05E7\u05D1\u05D5\u05E2.","\u05D4\u05E2\u05E8\u05DB\u05D5\u05EA \u05D4\u05DE\u05D5\u05DB\u05E0\u05D5\u05EA \u05D0\u05D9\u05E0\u05DF \u05D6\u05DE\u05D9\u05E0\u05D5\u05EA \u05D1\u05D2\u05E8\u05E1\u05D4 \u05D6\u05D5.","\u05DE\u05D5\u05D7\u05E7 \u05D0\u05EA \u05DE\u05D6\u05D4\u05D9 \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05E9\u05DE\u05D5\u05E8\u05D9\u05DD \u05DB\u05DA \u05E9\u05D4\u05DB\u05D5\u05DC \u05D9\u05D9\u05D7\u05E9\u05D1 \u05E9\u05D5\u05D1 \u05DB\u05DC\u05D0 \u05E0\u05E6\u05E4\u05D4.","\u05DE\u05EA\u05D7\u05D9\u05DC \u05DE\u05D7\u05D3\u05E9 \u05DE\u05E2\u05DB\u05E9\u05D9\u05D5 \u05D0\u05EA \u05D4\u05EA\u05E7\u05D5\u05E4\u05D4 \u05E9\u05DC \u05DB\u05DC \u05DB\u05DC\u05DC \u05E9\u05E4\u05D2 \u05EA\u05D5\u05E7\u05E4\u05D5. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05DE\u05D7\u05E7 \u05D1\u05E4\u05E7\u05D9\u05E2\u05D4, \u05D5\u05DC\u05DB\u05DF \u05EA\u05DE\u05D9\u05D3 \u05D0\u05E4\u05E9\u05E8 \u05DC\u05D4\u05D7\u05D6\u05D9\u05E8 \u05DB\u05DC\u05DC.","\u05E1\u05E7\u05D5\u05E8 \u05D7\u05DC\u05D5\u05DF \u05D6\u05DE\u05DF, \u05E1\u05E0\u05DF \u05DC\u05E4\u05D9 \u05E1\u05D5\u05D2 \u05E4\u05D5\u05E1\u05D8, \u05E7\u05D1\u05E5 \u05DC\u05E4\u05D9 \u05DE\u05D7\u05D1\u05E8 \u05D5\u05E4\u05EA\u05D7 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9. \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05D5\u05EA \u05D1\u05E7\u05E9\u05D5\u05EA.","\u05DE\u05D0\u05D2\u05E8 \u05D4\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05D4\u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF \u05D1\u05D2\u05E8\u05E1\u05D4 \u05D6\u05D5.","\u05DE\u05D5\u05DB\u05DF.","\u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05D4\u05D5\u05E9\u05DC\u05DE\u05D4.","\u05D4\u05D2\u05E2\u05EA \u05DC\u05DE\u05D2\u05D1\u05DC\u05EA \u05D4\u05E4\u05E2\u05D5\u05DC\u05D5\u05EA. \u05D9\u05E9 \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA \u05DB\u05D3\u05D9 \u05DC\u05D4\u05E8\u05D9\u05E5 \u05D0\u05E6\u05D5\u05D5\u05D4 \u05E0\u05D5\u05E1\u05E4\u05EA.","\u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05D4\u05D5\u05E9\u05D4\u05EA\u05D4.","\u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05E0\u05E2\u05E6\u05E8\u05D4.","\u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05E4\u05D5\u05E2\u05DC\u05EA.","\u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05E4\u05D5\u05E2\u05DC\u05EA.","\u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05D4\u05DE\u05D7\u05D5\u05D1\u05E8 \u05D4\u05E9\u05EA\u05E0\u05D4. \u05DC\u05D0 \u05D1\u05D5\u05E6\u05E2\u05D5 \u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05E0\u05D5\u05E1\u05E4\u05D5\u05EA.","\u05DB\u05E8\u05D8\u05D9\u05E1\u05D9\u05D9\u05D4 \u05D0\u05D7\u05E8\u05EA \u05E9\u05DC X \u05DB\u05D1\u05E8 \u05DE\u05E8\u05D9\u05E6\u05D4 \u05D0\u05EA \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05D4\u05D6\u05D5.","\u05D4\u05DB\u05E8\u05D8\u05D9\u05E1\u05D9\u05D9\u05D4 \u05D4\u05D6\u05D5 \u05DB\u05D1\u05E8 \u05DE\u05E8\u05D9\u05E6\u05D4 \u05DE\u05D7\u05D9\u05E7\u05D4.","X \u05D4\u05E6\u05D9\u05D2 \u05D1\u05D3\u05D9\u05E7\u05EA \u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05D0\u05D5 \u05DE\u05E0\u05D9\u05E2\u05EA \u05E0\u05D9\u05E6\u05D5\u05DC \u05DC\u05E8\u05E2\u05D4. \u05D9\u05E9 \u05DC\u05D4\u05E9\u05DC\u05D9\u05DD \u05D0\u05D5\u05EA\u05D4 \u05D5\u05D0\u05D6 \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA.","\u05D9\u05E9 \u05DC\u05D1\u05D7\u05D5\u05E8 \u05DC\u05E4\u05D7\u05D5\u05EA \u05E7\u05D8\u05D2\u05D5\u05E8\u05D9\u05D4 \u05D0\u05D7\u05EA \u05E9\u05DC \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF.","\u05D0\u05D9\u05DF \u05DE\u05D7\u05D9\u05E7\u05D4 \u05E4\u05E2\u05D9\u05DC\u05D4 \u05DC\u05D4\u05E9\u05D4\u05D5\u05EA.","\u05D0\u05D9\u05DF \u05DE\u05D7\u05D9\u05E7\u05D4 \u05DE\u05D5\u05E9\u05D4\u05D9\u05EA \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA.","\u05D0\u05D9\u05DF \u05DE\u05D7\u05D9\u05E7\u05D4 \u05DC\u05E2\u05E6\u05D5\u05E8.","\u05DE\u05D7\u05D9\u05E7\u05EA \u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D1-X \u05E2\u05D3\u05D9\u05D9\u05DF \u05E0\u05D8\u05E2\u05E0\u05EA.","\u05D9\u05E9 \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA \u05D0\u05EA \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05D4\u05D6\u05D5 \u05DE\u05DB\u05E8\u05D8\u05D9\u05E1\u05D9\u05D9\u05EA X \u05E9\u05D1\u05D4 \u05D4\u05D9\u05D0 \u05D4\u05EA\u05D7\u05D9\u05DC\u05D4.","X \u05DC\u05D0 \u05D4\u05D7\u05D9\u05DC \u05D0\u05EA \u05D4\u05E4\u05E2\u05D5\u05DC\u05D4 \u05D0\u05D7\u05E8\u05D9 \u05D7\u05DE\u05E9 \u05D8\u05E2\u05D9\u05E0\u05D5\u05EA \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05D5\u05EA \u05DE\u05D7\u05D3\u05E9 \u05E9\u05DC \u05D4\u05D3\u05E3. \u05D9\u05E9 \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA \u05DB\u05D3\u05D9 \u05DC\u05E0\u05E1\u05D5\u05EA \u05E9\u05D5\u05D1.","\u05E9\u05D2\u05D9\u05D0\u05D4 \u05DC\u05D0 \u05E6\u05E4\u05D5\u05D9\u05D4 \u05E2\u05E6\u05E8\u05D4 \u05D0\u05EA \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E9\u05DC\u05D9\u05DD \u05D0\u05EA \u05E4\u05E7\u05D5\u05D3\u05EA \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4.","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05D4\u05D5\u05E9\u05D4\u05D4.","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05E0\u05E2\u05E6\u05E8.","\u05E8\u05E9\u05D5\u05DE\u05EA \u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05E0\u05DE\u05D7\u05E7\u05D4.","\u05D4\u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D6\u05D4 \u05E2\u05D1\u05E8 \u05DC\u05DB\u05E8\u05D8\u05D9\u05E1\u05D9\u05D9\u05D4 \u05D0\u05D7\u05E8\u05EA \u05E9\u05DC X.","\u05E4\u05D5\u05EA\u05D7 \u05D0\u05EA {category}.","\u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4 \u05E9\u05DC {category}.","\u05DE\u05E0\u05E7\u05D4 \u05D0\u05EA {category}.","\u05DE\u05E2\u05D1\u05E8\u05D9 \u05D4\u05E0\u05D9\u05E7\u05D5\u05D9 \u05E9\u05E0\u05D1\u05D7\u05E8\u05D5 \u05D4\u05D5\u05E9\u05DC\u05DE\u05D5.","\u05D8\u05D5\u05E2\u05DF \u05E2\u05D5\u05D3 {category}.","\u05E0\u05D8\u05E2\u05E0\u05D5 \u05E2\u05D5\u05D3 {count} \u05E4\u05E8\u05D9\u05D8\u05D9\u05DD \u05DE\u05EA\u05D5\u05DA {category}.","X \u05E2\u05D3\u05D9\u05D9\u05DF \u05D8\u05D5\u05E2\u05DF \u05E4\u05E8\u05D9\u05D8\u05D9\u05DD \u05D9\u05E9\u05E0\u05D9\u05DD \u05D9\u05D5\u05EA\u05E8 \u05DE\u05EA\u05D5\u05DA {category}.","\u05D1\u05D5\u05D3\u05E7 \u05D0\u05DD \u05D9\u05E9 \u05E2\u05D5\u05D3 {category} ({checks}/{limit}).","{category}: \u05E0\u05DE\u05E6\u05D0\u05D5 {count}.","{category}: \u05D4\u05D5\u05E1\u05E8\u05D5 {count}.","\u05D4\u05E4\u05E1\u05E7\u05D4 \u05E9\u05DC {seconds} \u05E9\u05E0\u05D9\u05D5\u05EA \u05D0\u05D7\u05E8\u05D9 {count} \u05E4\u05E2\u05D5\u05DC\u05D5\u05EA. \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05DE\u05DE\u05E9\u05D9\u05DB\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA.","\u05DE\u05DE\u05E9\u05D9\u05DA \u05E2\u05DD {category}.","\u05E4\u05E8\u05D9\u05D8 \u05D0\u05D7\u05D3 \u05D3\u05D5\u05DC\u05D2 \u05DB\u05D9 \u05D4\u05E4\u05E7\u05D3 \u05D4\u05E6\u05E4\u05D5\u05D9 \u05D4\u05D9\u05D4 \u05D7\u05E1\u05E8.","\u05E4\u05E2\u05D5\u05DC\u05D4 \u05D1\u05D7\u05E9\u05D1\u05D5\u05DF \u05DC\u05D0 \u05D4\u05D5\u05D7\u05DC\u05D4. Aviary \u05D9\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1.","\u05D8\u05D5\u05E2\u05DF \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA {category} \u05DE\u05D4\u05D4\u05EA\u05D7\u05DC\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05D5\u05D5\u05D3\u05D0 \u05E9\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E4\u05D5\u05E1\u05E4\u05E1.","\u05D4\u05D1\u05D3\u05D9\u05E7\u05D4 \u05DE\u05D4\u05D4\u05EA\u05D7\u05DC\u05D4 \u05DC\u05D0 \u05DE\u05E6\u05D0\u05D4 \u05E2\u05D5\u05D3 {category}.","\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D5 \u05E2\u05D5\u05D3 {category}.","\u05D8\u05D5\u05E2\u05DF \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05DC\u05D9\u05D9\u05E7\u05D9\u05DD \u05DC\u05D7\u05DC\u05D5\u05DF \u05D4\u05DE\u05D2\u05D1\u05DC\u05D4 \u05D4\u05D1\u05D0 \u05E9\u05DC X.","X \u05DC\u05D0 \u05D4\u05D7\u05D9\u05DC \u05D0\u05EA \u05D4\u05E4\u05E2\u05D5\u05DC\u05D4 \u05E4\u05E2\u05DE\u05D9\u05D9\u05DD. \u05DE\u05DE\u05EA\u05D9\u05DF {seconds} \u05E9\u05E0\u05D9\u05D5\u05EA \u05DC\u05E4\u05E0\u05D9 \u05D8\u05E2\u05D9\u05E0\u05D4 \u05DE\u05D7\u05D3\u05E9 \u05E9\u05DC {category} ({attempt}/{max}).","\u05D8\u05D5\u05E2\u05DF \u05DE\u05D7\u05D3\u05E9 \u05D0\u05EA {category} \u05E2\u05DB\u05E9\u05D9\u05D5. \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05DE\u05DE\u05E9\u05D9\u05DB\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D7\u05D3\u05E9 \u05D0\u05EA \u05D4\u05E0\u05E2\u05D9\u05DC\u05D4 \u05E9\u05DC \u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF.","\u05D9\u05E9 \u05DC\u05D4\u05EA\u05D7\u05D1\u05E8 \u05DC-X \u05D5\u05D0\u05D6 \u05DC\u05D4\u05DE\u05E9\u05D9\u05DA.","\u05E9\u05D2\u05D9\u05D0\u05D4 \u05DC\u05D0 \u05E6\u05E4\u05D5\u05D9\u05D4 \u05E2\u05E6\u05E8\u05D4 \u05D0\u05EA \u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF.","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF \u05D7\u05E1\u05D5\u05DD \u05D5\u05D3\u05D5\u05E8\u05E9 \u05EA\u05E9\u05D5\u05DE\u05EA \u05DC\u05D1.","\u05D4\u05D2\u05E2\u05EA \u05DC\u05DE\u05D2\u05D1\u05DC\u05D4 \u05E9\u05DC X \u05E9\u05DC 500 \u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05DC\u05D9\u05D9\u05E7. \u05DE\u05DE\u05EA\u05D9\u05DF {seconds} \u05E9\u05E0\u05D9\u05D5\u05EA \u05DC\u05D7\u05DC\u05D5\u05DF \u05D4\u05D1\u05D0. \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05DE\u05DE\u05E9\u05D9\u05DB\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA.","\u05D4\u05D2\u05E2\u05EA \u05DC\u05DE\u05D2\u05D1\u05DC\u05D4 \u05E9\u05DC X \u05E9\u05DC 500 \u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05DC\u05D9\u05D9\u05E7. \u05DE\u05DE\u05EA\u05D9\u05DF \u05D3\u05E7\u05D4 \u05D0\u05D7\u05EA \u05DC\u05D7\u05DC\u05D5\u05DF \u05D4\u05D1\u05D0. \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05DE\u05DE\u05E9\u05D9\u05DB\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA.","\u05D4\u05D2\u05E2\u05EA \u05DC\u05DE\u05D2\u05D1\u05DC\u05D4 \u05E9\u05DC X \u05E9\u05DC 500 \u05E4\u05E2\u05D5\u05DC\u05D5\u05EA \u05DC\u05D9\u05D9\u05E7. \u05DE\u05DE\u05EA\u05D9\u05DF {minutes} \u05D3\u05E7\u05D5\u05EA \u05DC\u05D7\u05DC\u05D5\u05DF \u05D4\u05D1\u05D0. \u05D4\u05DE\u05D7\u05D9\u05E7\u05D4 \u05DE\u05DE\u05E9\u05D9\u05DB\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA.","\u05E4\u05EA\u05D9\u05D7\u05EA \u05EA\u05E4\u05E8\u05D9\u05D8 \u05E4\u05E7\u05D5\u05D3\u05D5\u05EA \u05D4-AI \u05E9\u05DC Aviary","\u05D4\u05E8\u05E6\u05D4 \u05DE\u05D5\u05DC \u05D4\u05E1\u05E4\u05E7","\u05E8\u05E5\u2026","\u05D4\u05EA\u05D5\u05E6\u05D0\u05D4 \u05D4\u05D5\u05E2\u05EA\u05E7\u05D4 \u05DC\u05DC\u05D5\u05D7.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E2\u05EA\u05D9\u05E7 \u05D0\u05EA \u05D4\u05EA\u05D5\u05E6\u05D0\u05D4. \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05D7\u05E1\u05DD \u05D0\u05EA \u05D4\u05D2\u05D9\u05E9\u05D4 \u05DC\u05DC\u05D5\u05D7.","\u05D4\u05E1\u05E4\u05E7 \u05DC\u05D0 \u05D4\u05D2\u05D9\u05D1","\u05D1\u05D3\u05D5\u05E7 \u05D0\u05EA \u05D4\u05DE\u05E4\u05EA\u05D7 \u05D5\u05D4\u05DE\u05D5\u05D3\u05DC \u05EA\u05D7\u05EA \u05D0\u05D9\u05E0\u05D8\u05D2\u05E8\u05E6\u05D9\u05D5\u05EA.","\u05D4\u05E4\u05E8\u05D5\u05DE\u05E4\u05D8 \u05D4\u05D5\u05E2\u05EA\u05E7 \u05DC\u05DC\u05D5\u05D7. \u05D4\u05D3\u05D1\u05E7 \u05D0\u05D5\u05EA\u05D5 \u05D1\u05E2\u05D5\u05D6\u05E8 \u05E9\u05DC\u05DA.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E2\u05EA\u05D9\u05E7 \u05D0\u05EA \u05D4\u05E4\u05E8\u05D5\u05DE\u05E4\u05D8. \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05D7\u05E1\u05DD \u05D0\u05EA \u05D4\u05D2\u05D9\u05E9\u05D4 \u05DC\u05DC\u05D5\u05D7.","\u05D1\u05D3\u05D9\u05E7\u05EA \u05D1\u05E7\u05E9\u05EA AI \u05D7\u05D9\u05E6\u05D5\u05E0\u05D9\u05EA","\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7 \u05E2\u05D3 \u05DC\u05D1\u05D7\u05D9\u05E8\u05D4 \u05D1\u05E9\u05DC\u05D9\u05D7\u05EA \u05D1\u05E7\u05E9\u05D4.","\u05DC\u05DC\u05D0 \u05D4\u05D2\u05D1\u05DC\u05D4","Aviary \u05E9\u05D5\u05DE\u05E8 \u05E8\u05E7 \u05DE\u05D5\u05E0\u05D9 \u05E9\u05D9\u05DE\u05D5\u05E9; \u05E9\u05DE\u05D9\u05E8\u05EA \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D0\u05E6\u05DC \u05D4\u05E1\u05E4\u05E7 \u05DB\u05E4\u05D5\u05E4\u05D4 \u05DC\u05DE\u05D3\u05D9\u05E0\u05D9\u05D5\u05EA \u05E9\u05DC\u05D5.","\u05D4\u05EA\u05E7\u05E6\u05D9\u05D1 \u05D7\u05E1\u05DD \u05D0\u05EA \u05D4\u05D1\u05E7\u05E9\u05D4 \u05D4\u05D6\u05D5.","\u05E9\u05DC\u05D9\u05D7\u05EA \u05D1\u05E7\u05E9\u05D4","\u05EA\u05E8\u05D2\u05D5\u05DD","\u05DE\u05EA\u05E8\u05D2\u05DD \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8 \u05E9\u05E0\u05D1\u05D7\u05E8 \u05DC\u05E9\u05E4\u05D4 \u05D4\u05E4\u05E2\u05D9\u05DC\u05D4 \u05E9\u05DC\u05DA.","\u05E1\u05D9\u05DB\u05D5\u05DD","\u05DE\u05E1\u05DB\u05DD \u05E9\u05E8\u05E9\u05D5\u05E8 \u05D0\u05D5 \u05E4\u05D5\u05E1\u05D8 \u05D0\u05E8\u05D5\u05DA \u05D1\u05E9\u05DC\u05D5\u05E9 \u05E0\u05E7\u05D5\u05D3\u05D5\u05EA.","\u05D4\u05E1\u05D1\u05E8","\u05DE\u05E1\u05D1\u05D9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05E7\u05E9\u05E8, \u05D4\u05DE\u05D5\u05E0\u05D7\u05D9\u05DD \u05D5\u05D4\u05D4\u05E4\u05E0\u05D9\u05D5\u05EA \u05D1\u05E4\u05D5\u05E1\u05D8.","\u05E4\u05E8\u05D5\u05DE\u05E4\u05D8 \u05DC\u05D1\u05D3\u05D9\u05E7\u05EA \u05E2\u05D5\u05D1\u05D3\u05D5\u05EA","\u05D9\u05D5\u05E6\u05E8 \u05E4\u05E8\u05D5\u05DE\u05E4\u05D8 \u05DC\u05D1\u05D3\u05D9\u05E7\u05EA \u05E2\u05D5\u05D1\u05D3\u05D5\u05EA \u05E2\u05D1\u05D5\u05E8 \u05D4\u05E4\u05D5\u05E1\u05D8 (\u05DC\u05DC\u05D0 \u05E4\u05E0\u05D9\u05D9\u05D4 \u05DC\u05E8\u05E9\u05EA \u05D1\u05DC\u05D9 \u05D4\u05DE\u05E4\u05EA\u05D7 \u05E9\u05DC\u05DA).","\u05E7\u05D8\u05E2\u05D9 \u05D8\u05E7\u05E1\u05D8","\u05E4\u05EA\u05D9\u05D7\u05EA \u05E7\u05D8\u05E2\u05D9 \u05D4\u05D8\u05E7\u05E1\u05D8 \u05E9\u05DC \u05D4\u05E2\u05D5\u05E8\u05DA \u05D1-Aviary","\u05D0\u05D9\u05DF \u05E2\u05D3\u05D9\u05D9\u05DF \u05E7\u05D8\u05E2\u05D9 \u05D8\u05E7\u05E1\u05D8. \u05D4\u05D5\u05E1\u05E3 \u05D0\u05D5\u05EA\u05DD \u05D1\u05DE\u05E8\u05DB\u05D6 \u05D4\u05D1\u05E7\u05E8\u05D4 \u2190 \u05E1\u05E4\u05E8\u05D9\u05D9\u05D4.","\u05DC\u05D7\u05E5 \u05E7\u05D5\u05D3\u05DD \u05D1\u05EA\u05D5\u05DA \u05D4\u05E2\u05D5\u05E8\u05DA, \u05D5\u05D0\u05D6 \u05D1\u05D7\u05E8 \u05E7\u05D8\u05E2 \u05D8\u05E7\u05E1\u05D8.","Aviary \u05E4\u05E2\u05D9\u05DC","\u05E9\u05E0\u05D9 \u05D3\u05D1\u05E8\u05D9\u05DD \u05DE\u05D5\u05E4\u05E2\u05DC\u05D9\u05DD \u05DE\u05DC\u05DB\u05EA\u05D7\u05D9\u05DC\u05D4. \u05DB\u05DC \u05D4\u05E9\u05D0\u05E8 \u05E0\u05E9\u05D0\u05E8 \u05DB\u05D1\u05D5\u05D9 \u05E2\u05D3 \u05E9\u05EA\u05E4\u05E2\u05D9\u05DC \u05D0\u05D5\u05EA\u05D5.","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05DE\u05D5\u05DE\u05E0\u05D9\u05DD, \u05DE\u05D2\u05DE\u05D5\u05EA \u05DE\u05E7\u05D5\u05D3\u05DE\u05D5\u05EA \u05D5\u05E4\u05E8\u05E1\u05D5\u05DE\u05D5\u05EA \u05E4\u05EA\u05D9\u05D7 \u05DE\u05D5\u05E1\u05EA\u05E8\u05D9\u05DD.","\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05D5\u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD \u05DE\u05E7\u05D1\u05DC\u05D9\u05DD \u05DB\u05E4\u05EA\u05D5\u05E8 \u05D4\u05D5\u05E8\u05D3\u05D4 \u05E9\u05E4\u05D5\u05E2\u05DC \u05E8\u05E7 \u05DB\u05E9\u05DC\u05D5\u05D7\u05E6\u05D9\u05DD \u05E2\u05DC\u05D9\u05D5.","\u05E4\u05EA\u05D7 \u05D0\u05EA Aviary \u05DE\u05D4\u05E9\u05D5\u05E8\u05D4 \u05D4\u05D0\u05D7\u05E8\u05D5\u05E0\u05D4 \u05D1\u05E0\u05D9\u05D5\u05D5\u05D8 \u05D4\u05E9\u05DE\u05D0\u05DC\u05D9 \u05E9\u05DC X \u05DB\u05D3\u05D9 \u05DC\u05E9\u05E0\u05D5\u05EA \u05DB\u05DC \u05D0\u05D7\u05D3 \u05DE\u05D4\u05DD.","\u05D4\u05D1\u05E0\u05EA\u05D9","\u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05E9\u05DC\u05DA \u05DB\u05D1\u05E8 \u05E2\u05D1\u05E8\u05D4 \u05D0\u05EA \u05EA\u05E7\u05E8\u05EA \u05D4\u05D0\u05D7\u05E1\u05D5\u05DF \u05E9\u05D4\u05D2\u05D3\u05E8\u05EA. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05DE\u05D7\u05E7.","\u05D4\u05DC\u05DB\u05D9\u05D3\u05D4 \u05D4\u05D6\u05D5 \u05DE\u05E2\u05D1\u05D9\u05E8\u05D4 \u05D0\u05EA \u05D4\u05E1\u05E4\u05E8\u05D9\u05D9\u05D4 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05E9\u05DC\u05DA \u05D0\u05EA \u05EA\u05E7\u05E8\u05EA \u05D4\u05D0\u05D7\u05E1\u05D5\u05DF \u05E9\u05D4\u05D2\u05D3\u05E8\u05EA. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05DE\u05D7\u05E7.","\u05DE\u05E7\u05D5\u05E8\u05D9\u05D9\u05DD","\u05E6\u05D9\u05D8\u05D5\u05D8\u05D9\u05DD","\u05DE\u05E1\u05D5\u05E0\u05E0\u05D9\u05DD","\u05D4\u05DB\u05D5\u05DC","\u05E7\u05D8\u05D2\u05D5\u05E8\u05D9\u05D5\u05EA \u05D4\u05E1\u05D9\u05DB\u05D5\u05DD","\u05E1\u05D9\u05DB\u05D5\u05DD","\u05E1\u05D2\u05D9\u05E8\u05EA \u05D4\u05E1\u05D9\u05DB\u05D5\u05DD","\u05D8\u05D5\u05D5\u05D7 \u05D6\u05DE\u05DF","\u05DE\u05D9\u05D5\u05DF","\u05D4\u05D7\u05D3\u05E9\u05D5\u05EA \u05EA\u05D7\u05D9\u05DC\u05D4","\u05D4\u05D9\u05E9\u05E0\u05D5\u05EA \u05EA\u05D7\u05D9\u05DC\u05D4","\u05D4\u05E4\u05D7\u05D5\u05EA \u05E6\u05E4\u05D5\u05E4\u05D9\u05DD \u05EA\u05D7\u05D9\u05DC\u05D4","\u05E7\u05D9\u05D1\u05D5\u05E5 \u05DC\u05E4\u05D9 \u05DE\u05E4\u05E8\u05E1\u05DD","\u05D8\u05D5\u05D5\u05D7 \u05E9\u05E7\u05D8. \u05D0\u05D9\u05DF \u05D7\u05D3\u05E9 \u05DC\u05E2\u05D1\u05D5\u05E8 \u05E2\u05DC\u05D9\u05D5.","\u05D0\u05D9\u05DF \u05D3\u05D1\u05E8 \u05D1\u05D8\u05D5\u05D5\u05D7 \u05D4\u05D6\u05D4.","\u05D4\u05E1\u05D9\u05DB\u05D5\u05DD \u05DB\u05D5\u05DC\u05DC \u05E8\u05E7 \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9-Aviary \u05DB\u05D1\u05E8 \u05D4\u05E6\u05D9\u05D2. \u05D4\u05D5\u05D0 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D1\u05E7\u05E9 \u05E2\u05D5\u05D3 \u05DE-X.","\u05D6\u05D4 \u05D4\u05DB\u05D5\u05DC.","\u05D7\u05E9\u05D1\u05D5\u05DF \u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2","\u05EA\u05DE\u05D5\u05E0\u05D4","\u05D0\u05D5\u05D3\u05D9\u05D5","\u05DB\u05EA\u05D5\u05D1\u05D9\u05D5\u05EA","\u05EA\u05DE\u05D5\u05E0\u05D4 \u05DE\u05DE\u05D5\u05D6\u05E2\u05E8\u05EA","\u05D8\u05E2\u05D9\u05E0\u05EA \u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4","\u05E4\u05EA\u05D9\u05D7\u05EA \u05D4\u05DB\u05EA\u05D5\u05D1\u05D9\u05D5\u05EA","\u05E4\u05EA\u05D9\u05D7\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8","\u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05DE\u05D5\u05D1\u05D9\u05DC\u05D9\u05DD","\u05E4\u05D5\u05E1\u05D8 \u05E9-Aviary \u05E8\u05D0\u05D4 \u05D1\u05D8\u05D5\u05D5\u05D7 \u05D4\u05D6\u05D4","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E9-Aviary \u05E8\u05D0\u05D4 \u05D1\u05D8\u05D5\u05D5\u05D7 \u05D4\u05D6\u05D4","\u05E9\u05D9\u05EA\u05D5\u05E3","\u05E9\u05D9\u05EA\u05D5\u05E4\u05D9\u05DD","\u05DE\u05EA\u05D7\u05EA \u05DC\u05E1\u05E3 \u05D4\u05DE\u05E2\u05D5\u05E8\u05D1\u05D5\u05EA \u05E9\u05DC\u05DA","\u05D4\u05D5\u05E1\u05EA\u05E8: \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4 \u05DB\u05D5\u05DC\u05DC \u05EA\u05DE\u05D5\u05E0\u05D4","\u05D4\u05D5\u05E1\u05EA\u05E8: \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4 \u05DB\u05D5\u05DC\u05DC \u05E1\u05E8\u05D8\u05D5\u05DF","\u05D4\u05D5\u05E1\u05EA\u05E8: \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4 \u05DB\u05D5\u05DC\u05DC GIF","\u05D4\u05D5\u05E1\u05EA\u05E8: \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4 \u05DE\u05D7\u05E9\u05D1\u05D5\u05DF \u05DE\u05D0\u05D5\u05DE\u05EA","\u05D4\u05D5\u05E1\u05EA\u05E8: \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4 \u05DE\u05E6\u05D8\u05D8 \u05E4\u05D5\u05E1\u05D8 \u05D0\u05D7\u05E8","\u05E2\u05D5\u05DE\u05E2\u05DD \u05E2\u05DC \u05D9\u05D3\u05D9 \u05D4\u05DB\u05DC\u05DC \u05E9\u05DC\u05DA","\u05D4\u05D5\u05E1\u05EA\u05E8 \u05E2\u05DC \u05D9\u05D3\u05D9 \u05D4\u05DB\u05DC\u05DC \u05E9\u05DC\u05DA","\u05E2\u05D5\u05DE\u05E2\u05DD \u05E2\u05DC \u05D9\u05D3\u05D9 \u05DE\u05D9\u05DC\u05EA \u05D4\u05DE\u05E4\u05EA\u05D7 \u05E9\u05DC\u05DA","\u05D4\u05D5\u05E1\u05EA\u05E8 \u05E2\u05DC \u05D9\u05D3\u05D9 \u05DE\u05D9\u05DC\u05EA \u05D4\u05DE\u05E4\u05EA\u05D7 \u05E9\u05DC\u05DA","\u05E2\u05D5\u05DE\u05E2\u05DD \u05E2\u05DC \u05D9\u05D3\u05D9 \u05D4\u05EA\u05D1\u05E0\u05D9\u05EA \u05E9\u05DC\u05DA","\u05D4\u05D5\u05E1\u05EA\u05E8 \u05E2\u05DC \u05D9\u05D3\u05D9 \u05D4\u05EA\u05D1\u05E0\u05D9\u05EA \u05E9\u05DC\u05DA","\u05D4\u05E1\u05EA\u05E8\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4","\u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D5\u05E1\u05EA\u05E8","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E9\u05DE\u05D5\u05E8 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05DE\u05D5\u05E1\u05EA\u05E8. \u05D4\u05D0\u05D7\u05E1\u05D5\u05DF \u05D3\u05D7\u05D4 \u05D0\u05EA \u05D4\u05DB\u05EA\u05D9\u05D1\u05D4.","\u05D1\u05D9\u05D8\u05D5\u05DC","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E9\u05D7\u05D6\u05E8 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4.","\u05DE\u05D7\u05D5\u05E5 \u05DC\u05E9\u05E2\u05D5\u05EA \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4 \u05E9\u05DC\u05DA","Aviary \u05DE\u05DB\u05E1\u05D4 \u05D0\u05EA \u05E6\u05D9\u05E8 \u05D4\u05D6\u05DE\u05DF \u05E2\u05D3 \u05D4\u05D7\u05DC\u05D5\u05DF \u05D4\u05D1\u05D0 \u05E9\u05DC\u05DA. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05E0\u05D7\u05E1\u05DD \u05D5\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D9\u05E6\u05D0 \u05DE\u05D4\u05DE\u05DB\u05E9\u05D9\u05E8 \u05D4\u05D6\u05D4.","\u05EA\u05DF \u05DC\u05D9 \u05DC\u05E2\u05D1\u05D5\u05E8 \u05DC\u05D7\u05DE\u05E9 \u05D3\u05E7\u05D5\u05EA","\u05DC\u05D7\u05D9\u05E6\u05D5\u05EA \u05E2\u05DC \u05D4\u05E9\u05D5\u05E8\u05D4 \u05DE\u05D5\u05E9\u05D1\u05EA\u05D5\u05EA. \u05E1\u05DE\u05DC \u05D4\u05EA\u05D2\u05D5\u05D1\u05D4 \u05E4\u05D5\u05EA\u05D7 \u05D0\u05EA \u05D4\u05E4\u05D5\u05E1\u05D8.","\u05D4\u05E6\u05D2\u05EA \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E0\u05D5\u05E1\u05E4\u05D9\u05DD","\u05E9\u05DE\u05D9\u05E8\u05EA \u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D9\u05D4 \u05E0\u05DB\u05E9\u05DC\u05D4.","\u05E9\u05DE\u05D9\u05E8\u05D4 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA","\u05D4\u05E1\u05E8\u05EA \u05E1\u05D9\u05DE\u05E0\u05D9\u05D9\u05D4 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA","\u05D4\u05E2\u05EA\u05E7 \u05E7\u05D9\u05E9\u05D5\u05E8","\u05D4\u05E2\u05EA\u05E7 \u05D0\u05EA \u05D4\u05E7\u05D9\u05E9\u05D5\u05E8 \u05E9\u05DC \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4","\u05DC\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4 \u05D0\u05D9\u05DF \u05E7\u05D9\u05E9\u05D5\u05E8 \u05E9-Aviary \u05D9\u05DB\u05D5\u05DC \u05DC\u05D4\u05E2\u05EA\u05D9\u05E7.","\u05D4\u05D5\u05E2\u05EA\u05E7","\u05E0\u05DB\u05E9\u05DC","\u05D4\u05DC\u05D5\u05D7 \u05E1\u05D9\u05E8\u05D1 \u05DC\u05D4\u05E2\u05EA\u05E7\u05D4 \u05D4\u05D6\u05D5.","\u05D4\u05E2\u05E8\u05D4","\u05EA\u05D2\u05D9\u05EA","\u05D4\u05D9\u05E9\u05D9\u05E8 \u05D4\u05D8\u05D5\u05D1 \u05D1\u05D9\u05D5\u05EA\u05E8","\u05D4\u05E8\u05E9\u05D0\u05EA \u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05DC\u05D0 \u05E0\u05D9\u05EA\u05E0\u05D4. \u05E4\u05EA\u05D7 \u05D0\u05EA \u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA Aviary \u05DB\u05D3\u05D9 \u05DC\u05D0\u05E4\u05E9\u05E8 \u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF.","\u05D4\u05D5\u05E8\u05D3\u05EA \u05D4\u05DE\u05D3\u05D9\u05D4 \u05E0\u05DB\u05E9\u05DC\u05D4. \u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1 \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA \u05D4\u05DB\u05E4\u05EA\u05D5\u05E8 \u05E9\u05D1\u05E4\u05D5\u05E1\u05D8.","\u05DC\u05D7\u05E5 \u05EA\u05D7\u05D9\u05DC\u05D4 \u05DC\u05D7\u05D9\u05E6\u05D4 \u05D9\u05DE\u05E0\u05D9\u05EA \u05E2\u05DC \u05EA\u05DE\u05D5\u05E0\u05D4 \u05D0\u05D5 \u05D5\u05D9\u05D3\u05D0\u05D5, \u05D5\u05D0\u05D6 \u05D1\u05D7\u05E8 \u05D1\u05D4\u05D5\u05E8\u05D3\u05EA Aviary.","\u05D4\u05D5\u05E8\u05D3\u05D4 \xB7 \u05D4-MP4 \u05D4\u05D9\u05E9\u05D9\u05E8 \u05D4\u05D8\u05D5\u05D1 \u05D1\u05D9\u05D5\u05EA\u05E8","\u05D4\u05D5\u05E8\u05D3\u05D4","\u05DE\u05D5\u05E8\u05D9\u05D3 \u05D0\u05EA \u05D4\u05DE\u05D3\u05D9\u05D4 \u05E9\u05DC \u05D4\u05E4\u05D5\u05E1\u05D8 \u05E2\u05E6\u05DE\u05D5. \u05DC\u05DE\u05D3\u05D9\u05D4 \u05DE\u05E6\u05D5\u05D8\u05D8\u05EA \u05D5\u05DC\u05DE\u05D3\u05D9\u05D4 \u05E9\u05DC \u05DB\u05E8\u05D8\u05D9\u05E1\u05D9\u05DD \u05D9\u05E9 \u05DB\u05E4\u05EA\u05D5\u05E8 \u05D4\u05D5\u05E8\u05D3\u05D4 \u05DE\u05E9\u05DC\u05D4.","\u05D4\u05D5\u05E8\u05D3\u05EA \u05DB\u05DC \u05D4\u05DE\u05D3\u05D9\u05D4 \u05D1\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4","\u05D4\u05D5\u05D5\u05D9\u05D3\u05D0\u05D5 \u05D4\u05D9\u05E9\u05D9\u05E8 \u05E2\u05D3\u05D9\u05D9\u05DF \u05E0\u05D8\u05E2\u05DF. \u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1 \u05D1\u05E2\u05D5\u05D3 \u05E8\u05D2\u05E2.","\u05D4\u05E2\u05EA\u05E7\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD","\u05D4\u05E2\u05EA\u05E7\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9 \u05D4\u05DE\u05D3\u05D9\u05D4 \u05D4\u05D9\u05E9\u05D9\u05E8\u05D9\u05DD \u05D4\u05D8\u05D5\u05D1\u05D9\u05DD \u05D1\u05D9\u05D5\u05EA\u05E8 \u05E9\u05DC \u05D4\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D6\u05D4","\u05D0\u05D3\u05E4\u05D8\u05D9\u05D1\u05D9","\u05E9\u05DC\u05D9\u05D7\u05D4 \u05DC-yt-dlp","\u05E9\u05DC\u05D9\u05D7\u05EA \u05D4\u05D5\u05D5\u05D9\u05D3\u05D0\u05D5 \u05D4\u05D0\u05D3\u05E4\u05D8\u05D9\u05D1\u05D9 \u05E9\u05E0\u05E6\u05E4\u05D4 \u05DC-yt-dlp \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9","\u05D4\u05E2\u05EA\u05E7\u05EA \u05D4\u05E4\u05E7\u05D5\u05D3\u05D4 \u05E9\u05DC yt-dlp","\u05D4\u05E2\u05EA\u05E7\u05EA \u05E4\u05E7\u05D5\u05D3\u05EA yt-dlp \u05E2\u05D1\u05D5\u05E8 \u05D4\u05D5\u05D5\u05D9\u05D3\u05D0\u05D5 \u05D4\u05D0\u05D3\u05E4\u05D8\u05D9\u05D1\u05D9 \u05E9\u05E0\u05E6\u05E4\u05D4","\u05D5\u05D9\u05D3\u05D0\u05D5 \u05D0\u05D3\u05E4\u05D8\u05D9\u05D1\u05D9 \u05D1\u05D0\u05D9\u05DB\u05D5\u05EA \u05D2\u05D1\u05D5\u05D4\u05D4 \u05D9\u05D5\u05EA\u05E8","\u05E9\u05D5\u05DC\u05D7\u2026","\u05E0\u05D3\u05D7\u05D4","\u05D4\u05E2\u05D5\u05D6\u05E8 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9 \u05E9\u05DC yt-dlp \u05D3\u05D7\u05D4 \u05D0\u05EA \u05D4\u05DE\u05E9\u05D9\u05DE\u05D4 \u05D4\u05D6\u05D5.","\u05D4\u05E2\u05D5\u05D6\u05E8 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9 \u05E9\u05DC yt-dlp \u05E0\u05DB\u05E9\u05DC.","\u05E0\u05E9\u05DE\u05E8","\u200Fyt-dlp \u05E9\u05DE\u05E8 \u05D0\u05EA \u05D4\u05D5\u05D5\u05D9\u05D3\u05D0\u05D5 \u05D4\u05D0\u05D3\u05E4\u05D8\u05D9\u05D1\u05D9.","\u05D7\u05E1\u05E8","\u05DE\u05E9\u05D9\u05DE\u05EA yt-dlp \u05DB\u05D1\u05E8 \u05DC\u05D0 \u05D6\u05DE\u05D9\u05E0\u05D4. \u05D4\u05E2\u05EA\u05E7 \u05D0\u05EA \u05D4\u05E4\u05E7\u05D5\u05D3\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E0\u05E1\u05D5\u05EA \u05E9\u05D5\u05D1.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05D2\u05D9\u05E2 \u05DC\u05E2\u05D5\u05D6\u05E8 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9 \u05E9\u05DC yt-dlp.","\u05D4\u05E4\u05E7\u05D5\u05D3\u05D4 \u05E9\u05DC yt-dlp \u05D4\u05D5\u05E2\u05EA\u05E7\u05D4.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E2\u05EA\u05D9\u05E7 \u05D0\u05EA \u05D4\u05E4\u05E7\u05D5\u05D3\u05D4 \u05E9\u05DC yt-dlp.","\u05DE\u05D5\u05E8\u05D9\u05D3\u2026","\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1","\u05DC\u05D0 \u05D6\u05DE\u05D9\u05DF","\u05D4\u05EA\u05D7\u05D9\u05DC","\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05E2\u05D3\u05D9\u05D9\u05DF \u05DE\u05E2\u05D1\u05D9\u05E8 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D1\u05E5 \u05D4\u05D6\u05D4. \u05D1\u05D3\u05D5\u05E7 \u05D0\u05EA \u05D4\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA \u05E9\u05DC\u05DA \u05DB\u05D3\u05D9 \u05DC\u05E8\u05D0\u05D5\u05EA \u05D0\u05EA \u05D4\u05EA\u05D5\u05E6\u05D0\u05D4.","\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05E4\u05EA\u05D7 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D1\u05E5 \u05D1\u05DE\u05E7\u05D5\u05DD \u05DC\u05E9\u05DE\u05D5\u05E8 \u05D0\u05D5\u05EA\u05D5. \u05D4\u05E2\u05E0\u05E7 \u05DC-Aviary \u05D4\u05E8\u05E9\u05D0\u05EA \u05D4\u05D5\u05E8\u05D3\u05D4 \u05DB\u05D3\u05D9 \u05DC\u05E9\u05DE\u05D5\u05E8 \u05D1\u05D0\u05DE\u05EA.","\u05D3\u05D5\u05DC\u05D2 \u05DB\u05D9 \u05D4\u05D1\u05EA\u05D9\u05DD \u05E9\u05D4\u05D5\u05E8\u05D3\u05D5 \u05EA\u05D5\u05D0\u05DE\u05D9\u05DD \u05DC\u05E4\u05E8\u05D9\u05D8 \u05D1\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4.","\u05D3\u05D5\u05DC\u05D2 \u05DB\u05D9 \u05D4\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D3\u05D5\u05DE\u05D4 \u05DC\u05E4\u05E8\u05D9\u05D8 \u05D1\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D4.","\u05D3\u05D5\u05DC\u05D2 \u05DB\u05D9 \u05D6\u05D4 \u05D0\u05D5\u05EA\u05D5 \u05E4\u05E8\u05D9\u05D8 \u05DE\u05D3\u05D9\u05D4 \u05E9\u05DC X \u05D1\u05D2\u05D5\u05D3\u05DC \u05D0\u05D7\u05E8.","\u05DC-Aviary \u05E0\u05D3\u05E8\u05E9\u05EA \u05D4\u05E8\u05E9\u05D0\u05EA \u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05E9\u05DC \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF. \u05E0\u05E4\u05EA\u05D7 \u05D3\u05E3 \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA.","\u05E0\u05E1\u05D4 \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9\u05EA","\u05D4\u05D5\u05E8\u05D3 \u05D1\u05E2\u05D1\u05E8","\u05D0\u05D9\u05DB\u05D5\u05EA \u05DE\u05E7\u05D5\u05E8\u05D9\u05EA","\u05D0\u05D9\u05DB\u05D5\u05EA \u05D7\u05DC\u05D5\u05E4\u05D9\u05EA. \u05DC\u05D7\u05E5 \u05DB\u05D3\u05D9 \u05DC\u05E0\u05E1\u05D5\u05EA \u05E9\u05D5\u05D1 \u05D0\u05EA \u05D4\u05DE\u05E7\u05D5\u05E8","\u05D4\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05D9\u05E9\u05D9\u05E8\u05D4 \u05D4\u05D8\u05D5\u05D1\u05D4 \u05D1\u05D9\u05D5\u05EA\u05E8","\u05D0\u05D9\u05DB\u05D5\u05EA \u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2\u05D4","\u05D4\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D4\u05D6\u05D5 \u05D0\u05D9\u05E0\u05D4 \u05D6\u05DE\u05D9\u05E0\u05D4 \u05DC\u05D4\u05D5\u05E8\u05D3\u05D4.","\u05D0\u05D9\u05E9\u05D5\u05E8","\u05D4\u05E8\u05E9\u05D0\u05D5\u05EA","\u05D2\u05D9\u05E9\u05D4 \u05DC\u05D4\u05D5\u05E8\u05D3\u05D5\u05EA","\u05D9\u05E9 \u05DC\u05D4\u05E4\u05E2\u05D9\u05DC \u05D0\u05EA \u05D4\u05D4\u05E8\u05E9\u05D0\u05D5\u05EA \u05E9-Aviary \u05E6\u05E8\u05D9\u05DA \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D5\u05E8\u05D9\u05D3 \u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD \u05D5\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA \u05D1\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05D8\u05D5\u05D1\u05D4 \u05D1\u05D9\u05D5\u05EA\u05E8. \u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D9\u05D5\u05E6\u05D0 \u05DE\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05E9\u05DC\u05DA.","\u05DE\u05D5\u05DB\u05E0\u05D5\u05EA \u05DC\u05D4\u05D5\u05E8\u05D3\u05D4","\u05E0\u05D9\u05EA\u05E0\u05D4","\u05D0\u05D5\u05E4\u05E6\u05D9\u05D5\u05E0\u05DC\u05D9","\u05D4\u05DB\u05D5\u05DC \u05D0\u05D5\u05E4\u05E6\u05D9\u05D5\u05E0\u05DC\u05D9. \u05D4\u05E9\u05DC\u05D9\u05D8\u05D4 \u05D1\u05D9\u05D3\u05D9\u05DA.","\u05E9\u05DE\u05D9\u05E8\u05EA \u05E1\u05E8\u05D8\u05D5\u05E0\u05D9\u05DD \u05D5\u05EA\u05DE\u05D5\u05E0\u05D5\u05EA","\u05D1\u05D5\u05D3\u05E7\u2026","\u05E9\u05D5\u05DE\u05E8 \u05D3\u05E8\u05DA \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05D0\u05EA \u05D4\u05E1\u05E8\u05D8\u05D5\u05DF \u05D0\u05D5 \u05D4\u05EA\u05DE\u05D5\u05E0\u05D4 \u05D1\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05D8\u05D5\u05D1\u05D4 \u05D1\u05D9\u05D5\u05EA\u05E8 \u05DC\u05E4\u05D9 \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05E9\u05DE\u05D5\u05EA \u05D4\u05E7\u05D1\u05E6\u05D9\u05DD \u05D5\u05D4\u05DB\u05E4\u05D9\u05DC\u05D5\u05D9\u05D5\u05EA \u05E9\u05DC\u05DA.","\u05DE\u05EA\u05DF \u05D4\u05E8\u05E9\u05D0\u05EA \u05D4\u05D5\u05E8\u05D3\u05D4","\u05D1\u05D9\u05D8\u05D5\u05DC \u05D4\u05E8\u05E9\u05D0\u05D4","\u05E7\u05E8\u05D9\u05D0\u05EA \u05D4\u05DE\u05D3\u05D9\u05D4 \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9\u05EA \u05D9\u05E9\u05D9\u05E8\u05D5\u05EA","\u05DE\u05D0\u05E4\u05E9\u05E8 \u05DC-Aviary \u05DC\u05D4\u05D1\u05D9\u05D0 \u05DE\u05D3\u05D9\u05D4 \u05D1\u05D2\u05D5\u05D3\u05DC \u05DE\u05DC\u05D0 \u05D9\u05E9\u05D9\u05E8\u05D5\u05EA. \u05DB\u05E4\u05EA\u05D5\u05E8\u05D9 \u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05E4\u05D5\u05E2\u05DC\u05D9\u05DD \u05D2\u05DD \u05D1\u05DC\u05D9 \u05D4\u05D4\u05E8\u05E9\u05D0\u05D4 \u05D4\u05D6\u05D5.","\u05DE\u05EA\u05DF \u05D4\u05E8\u05E9\u05D0\u05D4 \u05DC\u05E9\u05E8\u05EA\u05D9 \u05D4\u05DE\u05D3\u05D9\u05D4","\u05D7\u05D9\u05D1\u05D5\u05E8 \u05DC\u05E2\u05D5\u05D6\u05E8 yt-dlp \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9","\u05E8\u05E7 \u05DC\u05E2\u05D5\u05D6\u05E8 yt-dlp \u05D4\u05D0\u05D5\u05E4\u05E6\u05D9\u05D5\u05E0\u05DC\u05D9. Aviary \u05DE\u05EA\u05E7\u05E9\u05E8 \u05D0\u05D9\u05EA\u05D5 \u05DE\u05EA\u05D5\u05DA \u05D4\u05EA\u05D5\u05E1\u05E3, \u05DB\u05DA \u05E9-Chrome \u05DC\u05D0 \u05DE\u05D1\u05E7\u05E9 \u05DE-x.com \u05D2\u05D9\u05E9\u05D4 \u05DC\u05E8\u05E9\u05EA \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9\u05EA.","\u05DE\u05EA\u05DF \u05D2\u05D9\u05E9\u05D4 \u05DC\u05E2\u05D5\u05D6\u05E8","\u05DE\u05EA\u05D7\u05D9\u05DC\u05D9\u05DD \u05DC\u05D4\u05D5\u05E8\u05D9\u05D3","\u05D4\u05E4\u05E2\u05D9\u05DC\u05D5 \u05E9\u05DE\u05D9\u05E8\u05D4 \u05D1\u05DC\u05D7\u05D9\u05E6\u05D4 \u05D0\u05D7\u05EA \u05D3\u05E8\u05DA \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF.","\u05E4\u05EA\u05D9\u05D7\u05EA X","Aviary \u05DE\u05D5\u05E1\u05D9\u05E3 \u05D0\u05EA \u05DB\u05E4\u05EA\u05D5\u05E8 \u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA \u05DC\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05E2\u05DD \u05DE\u05D3\u05D9\u05D4.","\u05D1\u05D7\u05D9\u05E8\u05D4 \u05D1\u05D4\u05D5\u05E8\u05D3\u05D4","Aviary \u05D1\u05D5\u05D7\u05E8 \u05D0\u05EA \u05D4\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05D8\u05D5\u05D1\u05D4 \u05D1\u05D9\u05D5\u05EA\u05E8 \u05D4\u05D6\u05DE\u05D9\u05E0\u05D4.","\u05E4\u05EA\u05D9\u05D7\u05EA X \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D5\u05E8\u05D9\u05D3","\u05E4\u05E8\u05D8\u05D9 \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC","\u05E9\u05D5\u05DD \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D9\u05D5\u05E6\u05D0 \u05DE\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05E9\u05DC\u05DA.","\u05D4\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA, \u05D4\u05DE\u05E1\u05E0\u05E0\u05D9\u05DD, \u05D4\u05D4\u05E2\u05E8\u05D5\u05EA \u05D5\u05D4\u05D0\u05E8\u05DB\u05D9\u05D5\u05E0\u05D9\u05DD \u05E0\u05DE\u05E6\u05D0\u05D9\u05DD \u05D1\u05DE\u05E8\u05DB\u05D6 \u05D4\u05D1\u05E7\u05E8\u05D4 \u05D1-x.com. \u05D4\u05D3\u05E3 \u05D4\u05D6\u05D4 \u05DE\u05E0\u05D4\u05DC \u05E8\u05E7 \u05D0\u05EA \u05D4\u05E8\u05E9\u05D0\u05D5\u05EA \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF.","\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05D4\u05D6\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05D7\u05D5\u05E9\u05E3 \u05D0\u05EA \u05DE\u05DE\u05E9\u05E7 \u05D4\u05D4\u05E8\u05E9\u05D0\u05D5\u05EA.","\u05D4\u05D1\u05E7\u05E9\u05D4 \u05E0\u05D3\u05D7\u05EA\u05D4. \u05D3\u05D1\u05E8 \u05DC\u05D0 \u05D4\u05E9\u05EA\u05E0\u05D4.","\u05D4\u05D4\u05E8\u05E9\u05D0\u05D4 \u05D1\u05D5\u05D8\u05DC\u05D4.","\u05D0\u05D9\u05DF \u05D4\u05E8\u05E9\u05D0\u05D4 \u05DC\u05D1\u05D8\u05DC.","\u05DC\u05D0 \u05E0\u05D9\u05EA\u05E0\u05D4","\u05E0\u05D9\u05EA\u05E0\u05D4 \u05D4\u05E8\u05E9\u05D0\u05D4. \u05DE\u05E2\u05DB\u05E9\u05D9\u05D5 \u05D4\u05DE\u05D3\u05D9\u05D4 \u05E0\u05E9\u05DE\u05E8\u05EA \u05D3\u05E8\u05DA \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF.","\u05E0\u05D9\u05EA\u05E0\u05D4 \u05D4\u05E8\u05E9\u05D0\u05D4. \u05DE\u05E2\u05DB\u05E9\u05D9\u05D5 Aviary \u05D9\u05DB\u05D5\u05DC \u05DC\u05E7\u05E8\u05D5\u05D0 \u05DE\u05D3\u05D9\u05D4 \u05D1\u05D2\u05D5\u05D3\u05DC \u05DE\u05DC\u05D0 \u05D9\u05E9\u05D9\u05E8\u05D5\u05EA \u05E2\u05D1\u05D5\u05E8 \u05D9\u05D9\u05E6\u05D5\u05D0.","\u05E0\u05D9\u05EA\u05E0\u05D4 \u05D4\u05E8\u05E9\u05D0\u05D4. Aviary \u05DE\u05EA\u05D7\u05D1\u05E8 \u05DC\u05E2\u05D5\u05D6\u05E8 \u05D4\u05DE\u05E7\u05D5\u05DE\u05D9 \u05D1\u05DC\u05D9 \u05D1\u05E7\u05E9\u05D4 \u05DE\u05D4\u05D3\u05E4\u05D3\u05E4\u05DF.","Aviary \u05DC-X","\u05DE\u05E9\u05E4\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05DC-X/Twitter \u05E2\u05DD \u05D1\u05E7\u05E8\u05D5\u05EA \u05D4\u05E4\u05D9\u05DB\u05D5\u05EA \u05D5\u05E4\u05E8\u05D8\u05D9\u05D5\u05EA \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC.","\u05D4\u05D5\u05E8\u05D3\u05EA \u05DE\u05D3\u05D9\u05D4 \u05E2\u05DD Aviary","\u05D0\u05E8\u05DB\u05D9\u05D5\u05DF Aviary","\u05DE\u05E6\u05D9\u05D2 \u05D0\u05E8\u05DB\u05D9\u05D5\u05DF \u05DE\u05E7\u05D5\u05DE\u05D9. \u05D4\u05E4\u05E0\u05D9\u05D5\u05EA \u05DE\u05E8\u05D5\u05D7\u05E7\u05D5\u05EA \u05DC\u05E2\u05D5\u05DC\u05DD \u05DC\u05D0 \u05E0\u05D8\u05E2\u05E0\u05D5\u05EA \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA.","\u05D7\u05D9\u05E4\u05D5\u05E9 \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA","\u05DE\u05E6\u05D1 \u05DE\u05D3\u05D9\u05D4","\u05DB\u05DC \u05D4\u05DE\u05D3\u05D9\u05D4","\u05D1\u05EA\u05D9\u05DD \u05E9\u05E0\u05DC\u05DB\u05D3\u05D5","\u05D4\u05E4\u05E0\u05D9\u05D4 \u05DE\u05E8\u05D5\u05D7\u05E7\u05EA","\u05DE\u05D6\u05D4\u05D4","\u05EA\u05E6\u05D5\u05D2\u05EA \u05E9\u05E8\u05E9\u05D5\u05E8\u05D9\u05DD","\u05DE\u05D3\u05D9\u05D4","\u05E8\u05E9\u05D5\u05DE\u05D5\u05EA","\u05DE\u05D5\u05E6\u05D2\u05D5\u05EA","\u05D0\u05D9\u05DF \u05E8\u05E9\u05D5\u05DE\u05D5\u05EA \u05EA\u05D5\u05D0\u05DE\u05D5\u05EA.","\u05DE\u05E7\u05D5\u05E8","\u05D1\u05EA\u05D9\u05DD","SHA-256","\u05E4\u05EA\u05D9\u05D7\u05EA \u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05DE\u05E7\u05D5\u05E8","\u05E4\u05D5\u05E1\u05D8\u05D9\u05DD","\u05DE\u05D5\u05DB\u05DF \u05DC\u05DC\u05D0 \u05D7\u05D9\u05D1\u05D5\u05E8","\u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05E0\u05D3\u05E8\u05E9 \u05D7\u05D9\u05D1\u05D5\u05E8 \u05E8\u05E9\u05EA","\u05E4\u05D5\u05E1\u05D8 \u05E9\u05DC\u05D0 \u05E0\u05DC\u05DB\u05D3","\u05E4\u05D5\u05E1\u05D8 \u05D4\u05D0\u05D1 \u05D4\u05D6\u05D4 \u05DC\u05D0 \u05E0\u05DC\u05DB\u05D3 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA.","\u05E9\u05D9\u05D7\u05D4","{count} \u05E4\u05D5\u05E1\u05D8\u05D9\u05DD \u05DE\u05D0\u05EA {author}","\u05D4\u05EA\u05D7\u05DC\u05D4","\u05E0\u05D9\u05E7\u05D5\u05D9 \u05D4\u05D7\u05E9\u05D1\u05D5\u05DF","\u05E8\u05E9\u05D5\u05DE\u05D4","\u05D4\u05E8\u05E9\u05D0\u05D5\u05EA \u05D0\u05D5\u05E4\u05E6\u05D9\u05D5\u05E0\u05DC\u05D9\u05D5\u05EA","\u05D4\u05E4\u05E2\u05D5\u05DC\u05D4 \u05E0\u05DB\u05E9\u05DC\u05D4.","\u05E4\u05E7\u05D3\u05D9\u05DD \u05D1\u05E4\u05D5\u05E1\u05D8","\u05E9\u05DE\u05D5\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD","\u05D4\u05EA\u05E0\u05D4\u05D2\u05D5\u05EA \u05D0\u05E6\u05D5\u05D5\u05D4","\u05DE\u05E6\u05D1 \u05D4\u05EA\u05D5\u05E8","\u05D1\u05EA\u05D5\u05E8","\u05D4\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05DE\u05E7\u05D5\u05E8\u05D9\u05EA \u05D7\u05DC\u05D4 \u05DB\u05D0\u05E9\u05E8 \u05E4\u05E7\u05D3\u05D9 \u05D4\u05D4\u05D5\u05E8\u05D3\u05D4 \u05DE\u05D5\u05E4\u05E2\u05DC\u05D9\u05DD.","\u05E9\u05DE\u05D9\u05E8\u05EA \u05D4\u05E8\u05E9\u05D9\u05DE\u05D4"]}`; var parsedCatalog; function panelCatalog() { if (parsedCatalog) { return parsedCatalog; } const rows = JSON.parse(PANEL_CATALOG_JSON); const built = {}; for (const [locale, values] of Object.entries(rows)) { const bundle = {}; const count = Math.min(values.length, PANEL_STRINGS.length); for (let index = 0; index < count; index += 1) { const value = values[index]; const key = PANEL_STRINGS[index]; if (value != null && key !== void 0) { bundle[key] = value; } } built[locale] = bundle; } parsedCatalog = built; return parsedCatalog; } // src/platform/i18n.ts var LOCALES = [ { code: "en", label: "English", direction: "ltr" }, { code: "es", label: "Espa\xF1ol", direction: "ltr" }, { code: "pt", label: "Portugu\xEAs", direction: "ltr" }, { code: "fr", label: "Fran\xE7ais", direction: "ltr" }, { code: "de", label: "Deutsch", direction: "ltr" }, { code: "ja", label: "\u65E5\u672C\u8A9E", direction: "ltr" }, { code: "ko", label: "\uD55C\uAD6D\uC5B4", direction: "ltr" }, { code: "ar", label: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629", direction: "rtl" }, { code: "he", label: "\u05E2\u05D1\u05E8\u05D9\u05EA", direction: "rtl" } ]; function translateText(locale, english) { if (locale === "en") { return english; } return panelCatalog()[locale]?.[english] ?? english; } function hasTranslation(locale, english) { if (locale === "en") { return true; } return panelCatalog()[locale]?.[english] !== void 0; } function localeDirection(locale) { return LOCALES.find((entry) => entry.code === locale)?.direction ?? "ltr"; } function supportedLocales() { return LOCALES.map((entry) => ({ ...entry })); } // src/platform/build-version.ts var AVIARY_VERSION = false ? "dev" : "1.54.0"; // src/platform/diagnostics.ts var UNKNOWN_DIAGNOSTIC_MESSAGE_ID = "diagnostic.unknown"; var Diagnostics = class { #events = []; #sink; /** * Mirror events to a persistent store. The sink runs inside `push`, so it must not throw and * must not await: every caller of `info`/`warn`/`error` is on a feature's hot path. */ setSink(sink) { this.#sink = sink; } info(message, details) { this.push("info", message, details); } warn(message, details) { this.push("warn", message, details); } error(message, details) { this.push("error", message, details); } snapshot() { return [...this.#events]; } push(level, message, details) { const event = { level, message, at: (/* @__PURE__ */ new Date()).toISOString(), messageId: diagnosticMessageId(message), ...details ? { details } : {} }; this.#events.push(event); if (this.#events.length > 200) { this.#events.shift(); } try { this.#sink?.(event); } catch { } } }; function diagnosticMessageId(message) { const source = message.trim(); if (!source) { return UNKNOWN_DIAGNOSTIC_MESSAGE_ID; } let hash = 2166136261; for (let index = 0; index < source.length; index += 1) { hash ^= source.charCodeAt(index); hash = Math.imul(hash, 16777619); } return `diagnostic.${(hash >>> 0).toString(16).padStart(8, "0")}`; } function safeDetailKeys(details) { return Object.keys(details ?? {}).slice(0, 12).map((key) => /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/.test(key) ? key : "unknown"); } function redactDiagnosticEvent(event) { return { level: event.level, at: safeDiagnosticTimestamp(event.at), messageId: isSafeDiagnosticMessageId(event.messageId) ? event.messageId : diagnosticMessageId(event.message), detailKeys: safeDetailKeys(event.details) }; } function isSafeDiagnosticTimestamp(value) { return typeof value === "string" && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(value) && Number.isFinite(Date.parse(value)); } function safeDiagnosticTimestamp(value) { return isSafeDiagnosticTimestamp(value) ? value : (/* @__PURE__ */ new Date()).toISOString(); } function isSafeDiagnosticMessageId(value) { return typeof value === "string" && /^(?:diagnostic|background)\.[a-z0-9][a-z0-9._-]{0,95}$/.test(value); } // src/ui/control-center/constants.ts var MEDIA_LAYOUT_OPTIONS = [ ["default", "Default grid"], ["stacked", "Stacked"], ["grid", "Strict grid"] ]; var FILTER_ACTION_OPTIONS = [ ["off", "Off"], ["hide", "Hide"], ["dim", "Dim"] ]; var ENGAGEMENT_METRIC_OPTIONS = [ ["replies", "Replies"], ["reposts", "Reposts"], ["likes", "Likes"] ]; var FILTER_REASON_OPTIONS = [ ["off", "Say nothing"], ["dimmed", "On dimmed posts"], ["all", "On dimmed and hidden posts"] ]; var FILTER_SURFACE_LABELS = { home: "Home", status: "Status", profile: "Profile", search: "Search", notifications: "Notifications", messages: "Messages" }; var FILTER_MEDIA_LABELS = { photo: "Photos", video: "Videos", gif: "GIFs" }; var HIDE_NAV_ITEM_IDS = /* @__PURE__ */ new Set([ "premium", "home", "explore", "notifications", "follow", "chat", "messages", "grok", "history", "studio", "profile", "more" ]); // src/ui/control-center/sections/advanced.ts function buildTrustRows(ctx) { const rows = [ ctx.storageStatusRow(), ctx.readonlyRow( "Custom CSS safety", "Custom CSS is local, scoped to the named surface, and never sent with diagnostics. It is a power-user override, so support cannot reproduce its visual effects." ), ctx.toggleRow( "Local-only mode", "Blocks every request to an integration you configured: Aria2, crossposting, AI prompts and embeddings. Saving media still fetches from X's own servers, which is where the page loaded it from. On by default; turning an integration on is what turns this off.", ctx.options.settings.privacy.localOnly, async (checked) => { ctx.options.settings.privacy.localOnly = checked; await ctx.save(checked ? "Local-only mode on." : "Local-only mode off."); } ), ctx.toggleRow( "Refuse X's analytics beacons", "Stops the tracking pings X sends as you scroll, click and pause. Only the analytics endpoints are refused. Timeline, media and login traffic is untouched.", ctx.options.settings.privacy.blockAnalyticsBeacons, async (checked) => { ctx.options.settings.privacy.blockAnalyticsBeacons = checked; await ctx.save(checked ? "Analytics beacons refused." : "Analytics beacons allowed."); } ), ctx.toggleRow( "Monitor selector health", "Check the current X surface for required and fallback anchors. Turn this off when you do not want selector diagnostics.", ctx.options.settings.diagnostics.selectorHealth, async (checked) => { ctx.options.settings.diagnostics.selectorHealth = checked; await ctx.save(checked ? "Selector health monitoring on." : "Selector health monitoring off."); } ), ...ctx.beaconRows(), ctx.storageHealthRow(), ctx.readonlyRow("Telemetry", ctx.options.settings.privacy.telemetry ? "Enabled" : "Disabled"), ctx.coverageRow(), ...ctx.selectorHealthRows() ]; if (ctx.options.copyStructuralObservation) { rows.push( ctx.actionRow( "Copy structural observation", "Copies how X builds this page (element counts, nesting and layout) for refreshing Aviary's test fixtures. No post text, names, handles, links or ids.", async () => { try { await ctx.options.copyStructuralObservation(); ctx.setStatus("Structural observation copied to clipboard."); } catch (error) { ctx.options.onError("Could not copy structural observation", error); ctx.setStatus("Could not copy the structural observation."); } } ) ); } const performance = ctx.options.getPerformanceMetrics?.(); if (performance) { const ranked = [...performance.features].sort( (left, right) => right.totalDurationMs - left.totalDurationMs ); const featureSummary = ranked.slice(0, 3).map( (feature) => ctx.localizedCopy( "{feature}: {count} runs \xB7 {total} ms total \xB7 {max} ms max \xB7 {full} full / {incremental} incremental", { feature: feature.featureId, count: feature.invocationCount, total: feature.totalDurationMs.toFixed(1), max: feature.maxDurationMs.toFixed(1), full: feature.fullPasses, incremental: feature.incrementalPasses } ) ).join(" | "); const longFrameSummary = performance.longFrames.supported ? ctx.localizedCopy("{observed} long frames \xB7 {correlated} correlated", { observed: performance.longFrames.observed, correlated: performance.longFrames.correlatedPasses }) : ctx.t("Long Animation Frame unavailable"); rows.push( ctx.dataRow( "Mutation performance", `${ctx.localizedCopy("{count} features", { count: performance.features.length })} \xB7 ${longFrameSummary} \xB7 ${featureSummary || ctx.t("No apply samples yet")}` ) ); if (ctx.options.resetPerformanceMetrics) { rows.push( ctx.actionRow( "Reset performance metrics", "Mutation timing stays local and stores only feature ids and bounded durations.", async () => { try { ctx.options.resetPerformanceMetrics(); ctx.render(); ctx.setStatus("Performance metrics reset."); } catch (error) { ctx.options.onError("Could not reset performance metrics", error); ctx.setStatus("Could not reset performance metrics."); } } ) ); } } const adLanguage = ctx.options.getAdLabelLanguage?.(); if (adLanguage && !adLanguage.supported) { rows.push( ctx.dataRow( "Ad labels for this language", ctx.localizedCopy( "X is in {language}, which Aviary has no ad labels for. Sponsored posts are not suppressed by label here.", { language: adLanguage.language } ) ) ); } if (ctx.options.getSavedDiagnostics) { const saved = ctx.options.getSavedDiagnostics(); rows.push( ctx.dataRow( "Saved warnings", saved.total === 0 ? "None" : `${saved.total} kept \xB7 ${saved.errors} ${saved.errors === 1 ? ctx.t("error") : ctx.t("errors")} \xB7 newest ${saved.newestAt ?? "unknown"}` ) ); if (ctx.options.clearSavedDiagnostics && saved.total > 0) { rows.push( ctx.actionRow( "Clear saved warnings", { source: "Forget the stored warnings and errors. Only Aviary's own message text, the time, and the names of its detail fields are ever written here.", values: {} }, async () => { try { await ctx.options.clearSavedDiagnostics(); ctx.render(); ctx.setStatus("Saved warnings cleared."); } catch (error) { ctx.options.onError("Could not clear saved warnings", error); ctx.setStatus("Could not clear saved warnings."); } } ) ); } } if (ctx.options.clearAdObservations) { rows.push( ctx.actionRow( "Reset ad observations", { source: "Clear the bounded local marker history and its drift warning. No post text, handles, URLs, or response bodies are stored here.", values: {} }, async () => { try { await ctx.options.clearAdObservations(); ctx.render(); ctx.setStatus("Ad observations reset."); } catch (error) { ctx.options.onError("Could not reset ad observations", error); ctx.setStatus("Could not reset ad observations."); } } ) ); } const profile = ctx.options.getProfileStatus?.(); if (profile) { rows.splice( 1, 0, ctx.dataRow("Active profile", `${profile.activeLabel} \xB7 ${profile.activeId}`), ctx.selectRow( "Switch profile", profile.activeId, profile.profiles.map((entry) => [entry.id, `${entry.label} (${entry.kind})`]), async (profileId) => { if (!ctx.options.switchProfile) return; try { const result = await ctx.options.switchProfile(profileId); if (!result.ok) throw new Error(result.error ?? "Profile could not be switched"); ctx.setStatus("Profile switched. Reloading\u2026"); } catch (error) { ctx.options.onError("Profile switch failed", error); ctx.setStatus("Profile switch failed."); } }, "A profile is an explicit local boundary for settings, credentials, library data, jobs, and search.", false, "action" ) ); if (profile.legacyDataAvailable && ctx.options.adoptLegacyProfileData) { rows.push( ctx.actionRow( "Assign legacy data here", "Move unassigned pre-profile settings and library stores into the active profile. Nothing is guessed from the current X route.", async () => { const result = await ctx.options.adoptLegacyProfileData(); ctx.render(); ctx.setStatusCopy( "Assigned {moved} stores; {completedAfterRetry} completed after retry; {skipped} already existed; {conflicted} conflicted; {failed} failed.", { moved: result.moved, completedAfterRetry: result.completedAfterRetry, skipped: result.skipped, conflicted: result.conflicted, failed: result.failed } ); }, "The legacy data could not be assigned. Nothing was moved, so it is still where it was. Reopen this page to try again." ) ); } if (ctx.options.createProfile) { rows.push( ctx.textInputRow( "New profile", "Create an empty offline profile before switching accounts or importing another archive.", "", async (label) => { try { const result = await ctx.options.createProfile(label); if (!result.ok) throw new Error(result.error ?? "Profile could not be created"); ctx.setStatus("Profile created. Reloading\u2026"); } catch (error) { ctx.options.onError("Profile creation failed", error); ctx.setStatus("Profile creation failed."); } }, "action", "Apply" ) ); } } rows.push(...buildBisectRows(ctx)); return rows; } function buildBisectRows(ctx) { const read = ctx.options.getBisectStatus; const start = ctx.options.startBisect; const answer = ctx.options.answerBisect; const stop3 = ctx.options.cancelBisect; if (!read || !start || !answer || !stop3) { return []; } const status = read(); const rows = []; const name = (id) => ctx.options.featureTitle?.(id) ?? id; const respond = (verdict) => async () => { await answer(verdict); ctx.render(); ctx.setStatus("Answer recorded."); }; if (status.phase === "idle") { rows.push( ctx.actionRow( "Find the feature breaking this page", { source: "Turns every Aviary feature off, then back on in halves, asking after each round whether the page is still wrong. It names the one responsible in about five rounds. Nothing is written to your settings, so reloading restores everything whatever you do, including stopping halfway. The Control Center and its language stay on throughout, so neither can be named.", values: {} }, async () => { await start(); ctx.render(); ctx.setStatus("Every feature is off. Is the page still wrong?"); }, "The feature search could not start." ) ); return rows; } if (status.phase === "done") { const result = status.result; if (result?.kind === "culprit") { rows.push( ctx.dataRow( "Feature search", ctx.localizedCopy( "{feature} is what changed this page. It took {rounds} rounds to find. Every feature is running again, so turn that one off with its own setting if you want it to stay off.", { feature: name(result.featureId), rounds: status.round } ) ) ); } else if (result?.kind === "not-aviary") { rows.push( ctx.dataRow( "Feature search", ctx.t( "The page was still wrong with every Aviary feature off, so nothing Aviary does is causing it. Another extension, a userscript, or X itself is the place to look next." ) ) ); } else { rows.push( ctx.dataRow( "Feature search", ctx.t("No Aviary features were running, so there was nothing to search.") ) ); } rows.push( ctx.actionRow( "Search again", { source: "Start over from every feature off.", values: {} }, async () => { await start(); ctx.render(); ctx.setStatus("Every feature is off. Is the page still wrong?"); }, "The feature search could not start." ), ctx.actionRow( "Clear the result", { source: "Put the search away. Nothing changes; every feature is already back on.", values: {} }, async () => { await stop3(); ctx.render(); ctx.setStatus("Feature search cleared."); }, "The feature search could not be cleared." ) ); return rows; } rows.push( ctx.dataRow( "Feature search", status.phase === "confirming" ? ctx.localizedCopy("Round {round} of {total}. All {off} features are off.", { round: status.round, total: status.totalRounds, off: status.disabled.length }) : ctx.localizedCopy( "Round {round} of {total}. {off} of the {suspect} features still suspected are off.", { round: status.round, total: status.totalRounds, off: status.disabled.length, suspect: status.remaining.length } ) ) ); if (status.remaining.length <= 4) { rows.push( ctx.dataRow( "Still suspected", status.remaining.map((id) => name(id)).join(", ") ) ); } rows.push( ctx.actionRow( "The page is still wrong", { source: "The problem survives with these features off, so it is one of the others.", values: {} }, respond("still-wrong"), "The search could not record that answer. It is still where it was, so press the same button again." ), ctx.actionRow( "The page looks right now", { source: "The problem went away with these features off, so it is one of them.", values: {} }, respond("fixed"), "The search could not record that answer. It is still where it was, so press the same button again." ), ctx.actionRow( "Stop the search", { source: "Turn every feature back on and forget the search. No answer is recorded.", values: {} }, async () => { await stop3(); ctx.render(); ctx.setStatus("Feature search stopped; every feature is back on."); }, "The feature search could not be stopped." ) ); return rows; } function buildIntegrationRows(ctx) { const rows = []; const status = ctx.options.getIntegrationStatus?.(); const usage = ctx.options.getIntegrationUsage?.(); const integrations = ctx.options.settings.integrations; rows.push( ctx.toggleRow( "Aria2 handoff", "Send large media downloads to a self-hosted Aria2 JSON-RPC endpoint.", integrations.aria2.enabled, async (checked) => { integrations.aria2.enabled = checked; await ctx.save(checked ? "Aria2 handoff on." : "Aria2 handoff off."); } ) ); rows.push( ctx.textInputRow( "Aria2 endpoint", "http://localhost:6800 (no trailing slash needed)", integrations.aria2.endpoint, async (value) => { integrations.aria2.endpoint = value; await ctx.save("Aria2 endpoint saved."); } ) ); rows.push( ctx.secretInputRow( "Aria2 RPC secret", "Optional shared secret for token: auth.", integrations.aria2.secret, async (value) => { integrations.aria2.secret = value; await ctx.save("Aria2 secret saved."); } ) ); rows.push( ctx.integerInputRow( "Hand off files larger than (MB)", "Smaller files save through the browser. Aviary checks the size first; when the server will not report one, the file is handed off anyway.", Math.round(integrations.aria2.minBytes / 1e6), async (value) => { integrations.aria2.minBytes = Math.max(0, value) * 1e6; await ctx.save("Aria2 threshold saved."); }, // In MB, matching the label. The normalizer's floor is one megabyte, and a typed 0 meant // every download was handed off for the rest of the session before a reload replaced it. { min: 1, max: 5e3 } ) ); if (ctx.options.pingAria2) { rows.push( ctx.actionRow("Test Aria2 connection", "Sends a trivial JSON-RPC call.", async () => { try { const result = await ctx.options.pingAria2(); if (result.ok) { ctx.setStatus("Aria2 reachable."); } else { ctx.setStatusCopy("Aria2 unreachable: {error}", { error: result.error ?? "unknown error" }); } } catch (error) { ctx.options.onError("Aria2 connection test failed", error); ctx.setStatus("Aria2 connection test failed."); } }) ); } if (ctx.options.listAria2Active && ctx.options.cancelAria2) { const row = ctx.el("div", "av-row av-row-stack"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("Aria2 active downloads")), ctx.el("span", "av-row-description", ctx.t("Refresh to list in-flight transfers; tap Cancel to abort one.")) ); const list = ctx.el("div", "av-search-results"); const refresh = async () => { try { const active2 = await ctx.options.listAria2Active(); list.replaceChildren(); if (active2.length === 0) { list.append(ctx.el("div", "av-row-description", ctx.t("No active downloads."))); return; } for (const job of active2) { const item = ctx.el("div", "av-search-hit"); const total = job.totalLength > 0 ? `${Math.round(job.completedLength / job.totalLength * 100)}%` : "?"; item.append( ctx.el("span", "av-row-label", `${job.path || job.gid} \xB7 ${total}`), ctx.el("span", "av-row-description", ctx.localizedCopy("gid {gid} \xB7 {status}", { gid: job.gid, status: job.status })) ); const cancel = ctx.el("button", "av-button av-button-secondary", ctx.t("Cancel")); cancel.type = "button"; cancel.addEventListener("click", () => { void (async () => { cancel.disabled = true; try { const result = await ctx.options.cancelAria2(job.gid); if (result.ok) { ctx.setStatusCopy("Cancelled {gid}.", { gid: job.gid }); await refresh(); } else { ctx.setStatusCopy("Aria2 cancel failed: {error}", { error: result.error ?? "unknown error" }); } } catch (error) { try { ctx.options.onError("Aria2 cancel failed", error); } catch { } ctx.setStatus("Aria2 cancel failed."); } finally { cancel.disabled = false; } })(); }); item.append(cancel); list.append(item); } } catch (error) { ctx.options.onError("Aria2 sweep failed", error); ctx.setStatus("Aria2 sweep failed."); } }; const refreshBtn = ctx.el("button", "av-button av-button-secondary", ctx.t("Refresh")); refreshBtn.type = "button"; refreshBtn.addEventListener("click", () => void refresh()); row.append(copy2, refreshBtn, list); rows.push(row); } rows.push( ctx.toggleRow( "Local yt-dlp handoff", "Offer a higher-quality adaptive save when a local authenticated helper is running.", integrations.ytDlp.enabled, async (checked) => { integrations.ytDlp.enabled = checked; await ctx.save(checked ? "yt-dlp handoff on." : "yt-dlp handoff off."); } ) ); rows.push( ctx.textInputRow( "yt-dlp helper endpoint", "http://127.0.0.1:8787 (loopback only)", integrations.ytDlp.endpoint, async (value) => { integrations.ytDlp.endpoint = value; await ctx.save("yt-dlp helper endpoint saved."); } ) ); rows.push( ctx.secretInputRow( "yt-dlp helper secret", "The AVIARY_YTDLP_TOKEN shared with the local process.", integrations.ytDlp.secret, async (value) => { integrations.ytDlp.secret = value; await ctx.save("yt-dlp helper secret saved."); } ) ); rows.push( ctx.toggleRow( "Bluesky crosspost", "Post composer text to your Bluesky account on demand.", integrations.bluesky.enabled, async (checked) => { integrations.bluesky.enabled = checked; await ctx.save(checked ? "Bluesky on." : "Bluesky off."); } ) ); rows.push( ctx.textInputRow( "Bluesky service URL", "Default: https://bsky.social", integrations.bluesky.service, async (value) => { integrations.bluesky.service = value; await ctx.save("Bluesky service saved."); } ) ); rows.push( ctx.textInputRow( "Bluesky handle", "Your handle (no @, e.g. you.bsky.social)", integrations.bluesky.handle, async (value) => { integrations.bluesky.handle = value; await ctx.save("Bluesky handle saved."); } ) ); rows.push( ctx.secretInputRow( "Bluesky app password", "App password from your account settings. Never your main password.", integrations.bluesky.appPassword, async (value) => { integrations.bluesky.appPassword = value; await ctx.save("Bluesky app password saved."); } ) ); rows.push( ctx.toggleRow( "Mastodon crosspost", "Post composer text to your Mastodon account on demand.", integrations.mastodon.enabled, async (checked) => { integrations.mastodon.enabled = checked; await ctx.save(checked ? "Mastodon on." : "Mastodon off."); } ) ); rows.push( ctx.textInputRow( "Mastodon instance", "https://mastodon.social", integrations.mastodon.instance, async (value) => { integrations.mastodon.instance = value; await ctx.save("Mastodon instance saved."); } ) ); rows.push( ctx.secretInputRow( "Mastodon access token", "Bearer token with write:statuses scope.", integrations.mastodon.token, async (value) => { integrations.mastodon.token = value; await ctx.save("Mastodon token saved."); } ) ); rows.push( ctx.toggleRow( "Attach last download", "Upload the last successful Aviary media download with the first post in an explicit crosspost.", integrations.crosspost.attachLastDownload, async (checked) => { integrations.crosspost.attachLastDownload = checked; await ctx.save(checked ? "Crosspost attachment on." : "Crosspost attachment off."); } ) ); if (ctx.options.crosspost) { const threadRow = ctx.el("div", "av-row"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("Crosspost as thread")), ctx.el("span", "av-row-description", ctx.t("Split on blank lines and reply each segment to the previous one.")) ); const threadLabel = copy2.querySelector(".av-row-label"); const checkbox = document.createElement("input"); checkbox.type = "checkbox"; threadLabel.id = "av-crosspost-thread-label"; checkbox.id = "av-crosspost-thread"; checkbox.setAttribute("aria-labelledby", threadLabel.id); threadRow.append(copy2, checkbox); rows.push(threadRow); rows.push( ctx.actionRow("Crosspost composer \u2192 Bluesky", "Uses the current composer text.", async () => { try { const result = await ctx.options.crosspost("bluesky", { asThread: checkbox.checked }); if (result.ok) { ctx.setStatusCopy("Posted {posts} to Bluesky.{url}", { posts: result.posts ?? 1, url: result.url ? ` ${result.url}` : "" }); } else { ctx.setStatusCopy("Bluesky failed: {error}", { error: result.error ?? "unknown error" }); } } catch (error) { ctx.options.onError("Bluesky crosspost failed", error); ctx.setStatus("Bluesky crosspost failed."); } }) ); rows.push( ctx.actionRow("Crosspost composer \u2192 Mastodon", "Uses the current composer text.", async () => { try { const result = await ctx.options.crosspost("mastodon", { asThread: checkbox.checked }); if (result.ok) { ctx.setStatusCopy("Posted {posts} to Mastodon.{url}", { posts: result.posts ?? 1, url: result.url ? ` ${result.url}` : "" }); } else { ctx.setStatusCopy("Mastodon failed: {error}", { error: result.error ?? "unknown error" }); } } catch (error) { ctx.options.onError("Mastodon crosspost failed", error); ctx.setStatus("Mastodon crosspost failed."); } }) ); } rows.push( ctx.toggleRow( "AI provider runs", "Let the AI command menu POST prompts to your configured provider.", integrations.ai.enabled, async (checked) => { integrations.ai.enabled = checked; await ctx.save(checked ? "AI runs on." : "AI runs off."); } ) ); rows.push( ctx.selectRow( "AI provider", integrations.ai.provider, [ ["anthropic", "Anthropic Messages API"], ["openai", "OpenAI Chat Completions"], ["openai-compatible", "OpenAI-compatible (LocalAI, Ollama proxy, \u2026)"] ], async (value) => { if (value === "anthropic" || value === "openai" || value === "openai-compatible") { integrations.ai.provider = value; await ctx.save(`AI provider set to ${value}`); } } ) ); rows.push( ctx.textInputRow( "AI endpoint (optional)", "Override the default endpoint for the chosen provider.", integrations.ai.endpoint, async (value) => { integrations.ai.endpoint = value; await ctx.save("AI endpoint saved."); } ) ); rows.push( ctx.textInputRow( "AI model", "e.g. claude-sonnet-4-6, gpt-4o, llama3.1:8b", integrations.ai.model, async (value) => { integrations.ai.model = value; await ctx.save("AI model saved."); } ) ); rows.push( ctx.secretInputRow( "AI API key", "Stored locally only. Aviary never sends this except as the auth header to your provider.", integrations.ai.apiKey, async (value) => { integrations.ai.apiKey = value; await ctx.save("AI API key saved."); } ) ); if (usage) { rows.push( ctx.dataRow( "Network status", usage.networkAllowed ? ctx.t("Allowed") : ctx.t("Blocked by local-only mode") ), ctx.dataRow( "AI destination", `${integrations.ai.provider} \xB7 ${integrations.ai.endpoint || ctx.defaultAiEndpoint(integrations.ai.provider)}` ), ctx.readonlyRow( "AI data disclosure", "Before sending, Aviary shows the provider, endpoint, fields, character/token estimate, retention, and budget status." ), ctx.dataRow( "AI usage today", `${usage.ai.requests} requests \xB7 ${ctx.formatBytes(usage.ai.bytes)} / ${usage.ai.dailyLimitBytes > 0 ? ctx.formatBytes(usage.ai.dailyLimitBytes) : ctx.t("blocked (budget is 0)")}` ), ctx.integerInputRow( "AI max request bytes", "Stop before sending one AI request larger than this UTF-8 body. Set 0 to block every AI request.", integrations.ai.maxRequestBytes, async (value) => { integrations.ai.maxRequestBytes = value; await ctx.save("AI request budget saved."); }, { max: INTEGRATION_BUDGET_CEILINGS.ai.maxRequestBytes } ), ctx.integerInputRow( "AI daily request bytes", "Stop AI provider calls after this many UTF-8 request bytes in the local day. Set 0 to block every AI request.", integrations.ai.dailyRequestBytes, async (value) => { integrations.ai.dailyRequestBytes = value; await ctx.save("AI daily budget saved."); }, { max: INTEGRATION_BUDGET_CEILINGS.ai.dailyRequestBytes } ) ); } rows.push( ctx.toggleRow( "Semantic search", "Send captured record text to the configured embedding endpoint for similarity search. The destination, fields, retention, and byte budget are shown here.", integrations.semanticSearch.enabled, async (checked) => { integrations.semanticSearch.enabled = checked; await ctx.save(checked ? "Semantic search on." : "Semantic search off."); } ) ); rows.push( ctx.textInputRow( "Embedding endpoint", "POST endpoint that returns {data: [{embedding: number[]}]}", integrations.semanticSearch.endpoint, async (value) => { integrations.semanticSearch.endpoint = value; await ctx.save("Embedding endpoint saved."); } ) ); rows.push( ctx.textInputRow( "Embedding model", "e.g. text-embedding-3-small", integrations.semanticSearch.model, async (value) => { integrations.semanticSearch.model = value; await ctx.save("Embedding model saved."); } ) ); rows.push( ctx.secretInputRow( "Embedding API key", "Stored locally; used only as the Authorization header.", integrations.semanticSearch.apiKey, async (value) => { integrations.semanticSearch.apiKey = value; await ctx.save("Embedding API key saved."); } ) ); if (usage) { rows.push( ctx.dataRow( "Embedding destination", `${integrations.semanticSearch.endpoint || ctx.t("Not configured")}` ), ctx.readonlyRow( "Embedding data disclosure", "A request contains the model and captured record text. Vectors and bounded text stay in Aviary's local index; provider retention follows its policy." ), ctx.dataRow( "Embedding usage today", `${usage.embedding.requests} requests \xB7 ${usage.embedding.records} records \xB7 ${ctx.formatBytes(usage.embedding.bytes)} / ${usage.embedding.dailyLimitBytes > 0 ? ctx.formatBytes(usage.embedding.dailyLimitBytes) : ctx.t("blocked (budget is 0)")}` ), ctx.integerInputRow( "Embedding max record bytes", "Stop before sending one record larger than this UTF-8 body. Set 0 to block every embedding call.", integrations.semanticSearch.maxRecordBytes, async (value) => { integrations.semanticSearch.maxRecordBytes = value; await ctx.save("Embedding request budget saved."); }, { max: INTEGRATION_BUDGET_CEILINGS.semanticSearch.maxRecordBytes } ), ctx.integerInputRow( "Embedding daily record bytes", "Stop embedding calls after this many UTF-8 record bytes in the local day. Set 0 to block every embedding call.", integrations.semanticSearch.dailyRecordBytes, async (value) => { integrations.semanticSearch.dailyRecordBytes = value; await ctx.save("Embedding daily budget saved."); }, { max: INTEGRATION_BUDGET_CEILINGS.semanticSearch.dailyRecordBytes } ) ); } rows.push( ctx.toggleRow( "Auto-embed every export", "Before enabling, review the endpoint, captured-record fields, local retention, and daily byte budget above. After each export, embed in the background. Off by default.", integrations.semanticSearch.autoIndex, async (checked) => { integrations.semanticSearch.autoIndex = checked; await ctx.save(checked ? "Auto-embed on." : "Auto-embed off."); } ) ); if (ctx.options.rebuildSemanticIndex) { rows.push( ctx.actionRow( "Rebuild semantic index", "Embed every captured record. Re-running is cheap because cached entries are skipped.", async () => { ctx.setStatus("Rebuilding semantic index\u2026"); try { const result = await ctx.options.rebuildSemanticIndex(); ctx.render(); if ((result.blocked ?? 0) > 0) { ctx.setStatusCopy( "Embedding stopped at the budget ({blocked} records were not sent).", { blocked: result.blocked ?? 0 } ); return; } const trimmed = result.dropped > 0 ? ` \xB7 oldest ${result.dropped} dropped` : ""; ctx.setStatusCopy( "Indexed: +{added} new \xB7 skipped {skipped} \xB7 errors {errors} \xB7 total {total}{trimmed}.", { added: result.added, skipped: result.skipped, errors: result.errors, total: result.total, trimmed } ); } catch (error) { ctx.options.onError("Embedding failed", error); ctx.setStatus("Embedding failed."); } } ) ); } if (ctx.options.semanticSearchQuery) { const row = ctx.el("div", "av-row av-row-stack"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("Semantic search")), ctx.el("span", "av-row-description", ctx.t("Vector similarity over captured records. Embeddings run on demand.")) ); const semanticSearchLabel = copy2.querySelector(".av-row-label"); const input = document.createElement("input"); input.type = "search"; input.placeholder = ctx.t("Describe what you're looking for\u2026"); semanticSearchLabel.id = "av-semantic-search-label"; input.id = "av-semantic-search"; input.setAttribute("aria-labelledby", semanticSearchLabel.id); input.className = "av-text-input"; const results = ctx.el("div", "av-search-results"); let pending; let searchSequence = 0; input.addEventListener("input", () => { if (pending !== void 0) clearTimeout(pending); const sequence = ++searchSequence; const query = input.value.trim(); if (query.length === 0) { results.replaceChildren(); pending = void 0; return; } pending = setTimeout(() => { pending = void 0; void ctx.options.semanticSearchQuery(query).then((hits) => { if (sequence !== searchSequence || input.value.trim() !== query) return; results.replaceChildren(); if (hits.length === 0) { results.append(ctx.el("div", "av-row-description", ctx.t("No matches (or integration disabled)."))); return; } for (const hit of hits) { const item = ctx.el("div", "av-search-hit"); item.append( ctx.el("span", "av-row-label", `@${hit.handle ?? "anon"} \xB7 ${hit.tweetId ?? "unknown"} \xB7 score ${hit.score.toFixed(3)}`), ctx.el("span", "av-row-description", hit.text.slice(0, 200)) ); results.append(item); } }).catch((error) => { if (sequence === searchSequence && input.value.trim() === query) { ctx.options.onError("Semantic search failed", error); } }); }, 220); }); row.append(copy2, input, results); rows.push(row); } if (ctx.options.clearSemanticIndex) { rows.push( ctx.actionRow("Clear semantic index", "Forget every embedded record.", async () => { try { await ctx.options.clearSemanticIndex(); await ctx.save("Semantic index cleared."); } catch (error) { ctx.options.onError("Could not clear semantic index", error); ctx.setStatus("Could not clear semantic index."); } }) ); } if (ctx.options.clearIntegrationUsage) { rows.push( ctx.actionRow( "Clear AI and embedding usage", "Forget local request counters only. This does not remove the semantic index or provider credentials.", async () => { try { await ctx.options.clearIntegrationUsage(); await ctx.save("AI and embedding usage cleared."); } catch (error) { ctx.options.onError("Could not clear AI and embedding usage", error); ctx.setStatus("Could not clear AI and embedding usage."); } } ) ); } if (status) { const on = ctx.t("on"); const off = ctx.t("off"); const configured = ctx.t("configured"); const missingEndpoint = ctx.t("missing endpoint"); const missingCredentials = ctx.t("missing credentials"); const missingKeyModel = ctx.t("missing key/model"); const indexed = ctx.t("indexed"); const integrationLine = (name, enabled3, ready, missing) => ctx.formatCopy(ctx.t("{name}: {state} \xB7 {config}"), { name, state: enabled3 ? on : off, config: ready ? configured : missing }); const lines = [ integrationLine("Aria2", status.aria2.enabled, status.aria2.configured, missingEndpoint), integrationLine("Bluesky", status.bluesky.enabled, status.bluesky.configured, missingCredentials), integrationLine("Mastodon", status.mastodon.enabled, status.mastodon.configured, missingCredentials), integrationLine("AI", status.ai.enabled, status.ai.configured, missingKeyModel), ctx.formatCopy(ctx.t("{name}: {state} \xB7 {count} {indexed}"), { name: "Semantic", state: status.semanticSearch.enabled ? on : off, count: status.semanticSearch.indexed, indexed }) ]; rows.push(ctx.dataRow("Integration status", lines.join(" \xB7 "))); } if (ctx.options.recentIntegrationErrors) { const errors = ctx.options.recentIntegrationErrors(); if (errors.length === 0) { rows.push(ctx.readonlyRow("Recent integration errors", "None recorded.")); } else { const row = ctx.el("div", "av-row av-row-stack"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("Recent integration errors")), ctx.el("span", "av-row-description", ctx.t("Drawn from the audit log; only failed integration calls show up.")) ); const list = ctx.el("div", "av-search-results"); for (const error of errors.slice(0, 8)) { const item = ctx.el("div", "av-search-hit"); item.append( ctx.el("span", "av-row-label", `${error.kind} \xB7 ${error.at}`), ctx.el("span", "av-row-description", error.message.slice(0, 200)) ); list.append(item); } row.append(copy2, list); rows.push(row); } } return rows; } function buildBackupRows(ctx) { const rows = []; ctx.t("Redacted. Saved credentials will be kept."); ctx.t("Stop after the current collection and roll back anything already written."); ctx.t("Validate the backup and show the same conflicts without writing or removing any local data."); ctx.t("Apply the selected profile collections. A failed write rolls back the collections already changed."); ctx.t("Credentials are redacted; the values already saved in this profile will be kept."); if (ctx.options.resetSettings) { rows.push( ctx.actionRow( "Reset all preferences", "Restores Aviary's defaults: ad-free mode stays on and every other visual or behavior control returns to off. Saved posts, notes, bookmarks, and download history are kept.", async () => { try { await ctx.options.resetSettings(); ctx.render(); ctx.setStatus("Preferences reset. Ad-free mode is on."); } catch (error) { ctx.options.onError("Could not reset settings", error); ctx.setStatus("Could not reset settings."); } } ) ); } if (ctx.options.exportSettings) { rows.push( ctx.actionRow("Export settings", "Downloads your preferences as JSON. API keys and passwords are replaced with a placeholder, so the file is safe to share; importing it here keeps the credentials already saved on this machine.", async () => { try { await ctx.options.exportSettings(); ctx.setStatus("Settings exported."); } catch (error) { ctx.options.onError("Could not export settings", error); ctx.setStatus("Could not export settings."); } }) ); } if (ctx.options.importSettings) { rows.push( ctx.textareaRow( "Import settings (JSON)", "Paste a settings file exported from Aviary, then choose Import. Redacted credentials keep the values already saved here.", [], async (lines) => { const payload = lines.join("\n"); try { const report = await ctx.options.importSettings(payload); if (report.applied) { ctx.render(); const [first, ...rest] = report.warnings; const extra = rest.length > 0 ? ` (+${rest.length} more)` : ""; ctx.setStatusCopy("Settings imported. {warning}", { warning: first ? `${first}${extra}` : "" }); } else { ctx.setStatusCopy("Import failed: {errors}", { errors: report.errors.join("; ") }); } } catch (error) { ctx.options.onError("Could not import settings", error); ctx.setStatus("Could not import settings."); } }, "Import", "action" ) ); } if (ctx.options.exportLibraryBackup) { rows.push( ctx.actionRow( "Export full library backup", "Downloads one versioned JSON backup covering every profile on this machine, not only the one you have open. Credentials are excluded by default; restoring keeps the credentials already saved here.", async () => { try { const result = await ctx.options.exportLibraryBackup(); ctx.setStatusCopy("Library backup downloaded: {filename} ({collections} collections, {bytes}).", { filename: result.filename, collections: result.collections, bytes: ctx.formatBytes(result.bytes) }); } catch (error) { ctx.options.onError("Could not export full library backup", error); ctx.setStatus("Could not export full library backup."); } } ) ); } if (ctx.options.exportLibraryBackup) { rows.push( ctx.actionRow( "Export backup including credentials", "The same backup, plus the API keys and the WACZ signing identity saved in this browser. Anyone who opens the file can use them, so keep it somewhere you would keep a password.", async () => { try { const result = await ctx.options.exportLibraryBackup({ includeCredentials: true }); ctx.setStatusCopy( "Backup with credentials downloaded: {filename} ({collections} collections, {bytes}).", { filename: result.filename, collections: result.collections, bytes: ctx.formatBytes(result.bytes) } ); } catch (error) { ctx.options.onError("Could not export full library backup", error); ctx.setStatus("Could not export full library backup."); } } ) ); } if (ctx.options.previewLibraryRestore && ctx.options.restoreLibraryBackup) { const fileRow = ctx.el("div", "av-row av-row-stack"); const fileCopy = ctx.el("span", "av-row-copy"); fileCopy.append( ctx.el("span", "av-row-label", ctx.t("Choose a library backup")), ctx.el( "span", "av-row-description", ctx.t("Select a JSON backup to inspect its versions, counts, conflicts, and checksum before changing local data.") ) ); const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.className = "av-text-input"; fileInput.accept = ".json,application/json"; fileInput.setAttribute("aria-label", ctx.t("Choose a library backup")); fileInput.addEventListener("change", () => { const file = fileInput.files?.[0]; if (!file) return; ctx.state.pendingLibraryBackupPayload = null; ctx.state.pendingLibraryBackupPreview = null; ctx.setStatus("Reading library backup\u2026"); void file.text().then(async (payload) => { const preview = await ctx.options.previewLibraryRestore(payload); ctx.state.pendingLibraryBackupPayload = payload; ctx.state.pendingLibraryBackupPreview = preview; ctx.render(); ctx.setStatusCopy("Backup loaded: {collections} collections, {conflicts} changes.", { collections: preview.collections.length, conflicts: preview.conflictCount }); }).catch((error) => { ctx.state.pendingLibraryBackupPayload = null; ctx.state.pendingLibraryBackupPreview = null; ctx.options.onError("Could not read library backup", error); ctx.setStatus("Could not read library backup."); }); }); fileRow.append(fileCopy, fileInput); rows.push(fileRow); } const backupPreview = ctx.state.pendingLibraryBackupPreview; const backupPayload = ctx.state.pendingLibraryBackupPayload; if (backupPreview && backupPayload && ctx.options.restoreLibraryBackup) { rows.push(ctx.dataRow("Backup version", `v${backupPreview.schemaVersion} \xB7 ${backupPreview.createdAt}`)); rows.push( ctx.dataRow( "Backup collections", `${backupPreview.collections.length} \xB7 ${ctx.formatBytes(backupPreview.totalBytes)}` ) ); rows.push( ctx.dataRow( "Collection changes", backupPreview.collections.map((collection) => `${collection.label} v${collection.version}: ${collection.conflict}`).join(" \xB7 ") ) ); if (backupPreview.credentialsRedacted) { rows.push(ctx.readonlyRow("Credentials", "Redacted. Saved credentials will be kept.")); } if (backupPreview.warnings.length > 0) { rows.push( ctx.dataRow( "Backup warnings", backupPreview.warnings.map( (warning) => warning === "Credentials are redacted; the values already saved in this profile will be kept." ? ctx.t(warning) : warning ).join(" \xB7 ") ) ); } if (ctx.state.libraryRestoreRunning) { rows.push( ctx.actionRow( "Cancel restore", "Stop after the current collection and roll back anything already written.", async () => { ctx.state.libraryRestoreAbort?.abort(); ctx.setStatus("Cancelling restore\u2026"); }, "The restore could not be cancelled. It will stop at the end of the current collection on its own." ) ); } else { rows.push( ctx.actionRow( "Dry-run restore", "Validate the backup and show the same conflicts without writing or removing any local data.", async () => { try { const result = await ctx.options.restoreLibraryBackup(backupPayload, { dryRun: true, signal: new AbortController().signal }); if (result.errors.length === 0) { ctx.setStatus("Dry-run complete. No local data changed."); } else { ctx.setStatusCopy("Dry-run failed: {errors}", { errors: result.errors.join("; ") }); } } catch (error) { ctx.options.onError("Could not dry-run library restore", error); ctx.setStatus("Could not dry-run library restore."); } } ) ); rows.push( ctx.actionRow( "Restore this library backup", "Apply the selected profile collections. A failed write rolls back the collections already changed.", async () => { ctx.state.libraryRestoreRunning = true; ctx.state.libraryRestoreAbort = new AbortController(); ctx.render(); try { const result = await ctx.options.restoreLibraryBackup(backupPayload, { dryRun: false, signal: ctx.state.libraryRestoreAbort.signal }); if (result.applied) { ctx.state.pendingLibraryBackupPayload = null; ctx.state.pendingLibraryBackupPreview = null; ctx.setStatusCopy("Library backup restored ({collections} collections). Reloading\u2026", { collections: result.restoredKeys.length }); } else if (result.cancelled) { ctx.setStatus( result.rolledBack ? "Restore cancelled; local data was rolled back." : "Restore cancelled." ); } else { ctx.setStatusCopy("Restore failed: {errors}", { errors: result.errors.join("; ") }); } } catch (error) { ctx.options.onError("Could not restore library backup", error); ctx.setStatus("Could not restore library backup."); } finally { ctx.state.libraryRestoreRunning = false; ctx.state.libraryRestoreAbort = null; ctx.render(); } } ) ); } } if (ctx.options.getAuditSize) { rows.push( ctx.toggleRow( "Keep a local action log", "Records downloads, exports and settings changes on this device so you can review what Aviary did. Nothing is sent anywhere. Turning this off stops new entries immediately; existing ones stay until you clear them.", ctx.options.settings.privacy.auditLog, async (value) => { ctx.options.settings.privacy.auditLog = value; await ctx.save(value ? "Action log on." : "Action log off."); } ) ); rows.push(ctx.dataRow("Audit entries", String(ctx.options.getAuditSize()))); } if (ctx.options.clearAuditLog) { rows.push( ctx.actionRow("Clear audit log", "Drop the local action log.", async () => { try { await ctx.options.clearAuditLog(); await ctx.save("Audit log cleared."); } catch (error) { ctx.options.onError("Could not clear audit log", error); ctx.setStatus("Could not clear audit log."); } }) ); } return rows; } // src/ui/control-center/sections/data.ts var ARCHIVE_LAYOUT_LABELS = { current: "tweets.js", "tweet-js": "tweet.js", grailbird: "Grailbird", unknown: "unrecognised" }; function buildSnapshotRows(ctx) { const rows = []; if (ctx.options.getSnapshotStatus) { const status = ctx.options.getSnapshotStatus(); rows.push( ctx.dataRow( "Snapshots stored", status.latestAt ? ctx.localizedCopy("{count} entries \xB7 latest {kind} of {latestCount} @ {at}", { count: status.total, kind: status.latestKind ?? "snapshot", latestCount: status.latestCount, at: status.latestAt }) : ctx.localizedCopy("{count} entries", { count: status.total }) ) ); if (status.total === 0) { rows.push( ctx.readonlyRow( "No snapshots yet", ctx.t("Open a profile's followers or following list, then use Capture snapshot to record it.") ) ); } } if (ctx.options.captureSnapshot) { rows.push( ctx.actionRow( "Capture followers from this view", "Walks UserCell rows on the current page. Open a /handle/followers view first.", async () => { try { const result = await ctx.options.captureSnapshot("followers"); ctx.render(); if (result) { ctx.setStatusCopy( result.reachedEnd ? "Captured {count} followers for @{handle}. The list had finished loading, so this is all of them." : "Captured {count} followers for @{handle}. The list was still loading, so this is only what was on screen. Scroll to the end and capture again for the whole list.", { count: result.count, handle: result.handle } ); } else { ctx.setStatus("No UserCell rows found."); } } catch (error) { ctx.options.onError("Snapshot failed", error); ctx.setStatus("Snapshot failed."); } } ) ); rows.push( ctx.actionRow( "Capture following from this view", "Walks UserCell rows on the current page. Open a /handle/following view first.", async () => { try { const result = await ctx.options.captureSnapshot("following"); ctx.render(); if (result) { ctx.setStatusCopy( result.reachedEnd ? "Captured {count} following for @{handle}. The list had finished loading, so this is all of them." : "Captured {count} following for @{handle}. The list was still loading, so this is only what was on screen. Scroll to the end and capture again for the whole list.", { count: result.count, handle: result.handle } ); } else { ctx.setStatus("No UserCell rows found."); } } catch (error) { ctx.options.onError("Snapshot failed", error); ctx.setStatus("Snapshot failed."); } } ) ); } if (ctx.options.clearSnapshots) { rows.push( ctx.actionRow("Clear all snapshots", "Drop every stored follower/following snapshot.", async () => { try { await ctx.options.clearSnapshots(); await ctx.save("Snapshots cleared."); } catch (error) { ctx.options.onError("Could not clear snapshots", error); ctx.setStatus("Could not clear snapshots."); } }) ); } const archiveStatus = ctx.options.getArchiveImportStatus?.(); const archiveLibraryStatus = ctx.options.getArchiveLibraryStatus?.(); if (archiveLibraryStatus) { rows.push( ctx.dataRow( "Imported collections", ctx.localizedCopy( "{posts} posts \xB7 {likes} likes \xB7 {messages} direct messages (kept out of public search) \xB7 {media} media refs \xB7 {followers} followers \xB7 {following} following \xB7 {lists} lists", { posts: archiveLibraryStatus.authoredPosts, likes: archiveLibraryStatus.likes, messages: archiveLibraryStatus.directMessages, media: archiveLibraryStatus.media, followers: archiveLibraryStatus.followers, following: archiveLibraryStatus.following, lists: archiveLibraryStatus.lists } ) ) ); if (archiveLibraryStatus.hasImport) { rows.push( ctx.dataRow( "Offline archive repairs", ctx.localizedCopy( "{archiveLinks} archive links + {corpusLinks} captured links expanded \xB7 {participants} participant IDs resolved \xB7 {unresolved} kept as unresolved IDs \xB7 no requests made", { archiveLinks: archiveLibraryStatus.repairs.archiveLinksExpanded, corpusLinks: archiveLibraryStatus.repairs.corpusLinksExpanded, participants: archiveLibraryStatus.repairs.participantIdsResolved, unresolved: archiveLibraryStatus.repairs.participantIdsUnresolved } ) ) ); } } if (archiveStatus) { for (const job of archiveStatus.jobs) { rows.push( ctx.dataRow( "Archive import", `${ctx.localizedCopy("{status} \xB7 {filename} \xB7 {records} records \xB7 {files} files \xB7 {warnings} warnings", { status: job.status, filename: job.filename, records: job.recordCount, files: job.filesParsed, warnings: job.warningCount })}${job.error ? ` \xB7 ${job.error}` : ""}` ) ); if (job.status === "running" && ctx.options.pauseArchiveImport) { rows.push( ctx.actionRow( "Pause archive import", { source: "Pause {filename}.", values: { filename: job.filename } }, async () => { const result = await ctx.options.pauseArchiveImport(job.jobId); if (!result.ok) throw new Error(result.error ?? "Archive import could not be paused"); ctx.render(); ctx.setStatus("Archive import paused."); }, "The import could not be paused. It may have already finished. Reopen this section to see where it got to." ) ); } if ((job.status === "paused" || job.status === "queued") && ctx.options.resumeArchiveImport) { rows.push( ctx.actionRow( "Resume archive import", { source: "Resume {filename}.", values: { filename: job.filename } }, async () => { const result = await ctx.options.resumeArchiveImport(job.jobId); if (!result.ok) throw new Error(result.error ?? "Archive import could not be resumed"); ctx.render(); ctx.setStatus("Archive import resumed."); }, "The import could not be resumed. Its saved source may have been cleared. Retry it to start again from the file." ) ); } if ((job.status === "running" || job.status === "paused" || job.status === "queued") && ctx.options.cancelArchiveImport) { rows.push( ctx.actionRow( "Cancel archive import", { source: "Cancel {filename}.", values: { filename: job.filename } }, async () => { const result = await ctx.options.cancelArchiveImport(job.jobId); if (!result.ok) throw new Error(result.error ?? "Archive import could not be cancelled"); ctx.render(); ctx.setStatus("Archive import cancelled."); }, "The import could not be cancelled. It may have already finished. Reopen this section to see where it got to." ) ); } if ((job.status === "failed" || job.status === "cancelled") && ctx.options.retryArchiveImport) { rows.push( ctx.actionRow( "Retry archive import", { source: "Retry {filename}.", values: { filename: job.filename } }, async () => { const result = await ctx.options.retryArchiveImport(job.jobId); if (!result.ok) throw new Error(result.error ?? "Archive import could not be retried"); ctx.render(); ctx.setStatus("Archive import retry started."); }, "The import could not be retried. Pick the archive file again to start a fresh import." ) ); } } } if (ctx.options.importArchive) { const row = ctx.el("div", "av-row av-row-stack"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("Import official X archive")), ctx.el("span", "av-row-description", ctx.t("Pick a ZIP exported from x.com. STORE and DEFLATE entries are supported; the source stays local while it is resumable.")) ); const archiveLabel = copy2.querySelector(".av-row-label"); archiveLabel.id = "av-import-archive-label"; const input = document.createElement("input"); input.type = "file"; input.accept = ".zip,application/zip"; input.className = "av-file-input"; input.id = "av-import-archive"; input.setAttribute("aria-labelledby", archiveLabel.id); input.addEventListener("change", () => { const file = input.files?.[0]; if (!file) return; void (async () => { ctx.setStatus("Reading archive, large files take a moment\u2026"); try { const result = await ctx.options.importArchive(file); ctx.render(); const layout = ARCHIVE_LAYOUT_LABELS[result.vintage ?? "unknown"] ?? "unrecognised"; const absent = (result.collectionsAbsent ?? []).length > 0 ? ` ${ctx.t("Not in this layout:")} ${(result.collectionsAbsent ?? []).join(", ")}.` : ""; ctx.setStatusCopy( "Read a {layout} archive. Imported {records} records. Repairs: {archiveLinks} archive links, {corpusLinks} captured links, {participants} participant IDs resolved, {unresolved} kept unresolved. Warnings: {warnings}; errors: {errors}. Files: {recognized} recognized, {skipped} skipped, {malformed} malformed.{absent}", { records: result.records, archiveLinks: result.archiveLinksExpanded ?? 0, corpusLinks: result.corpusLinksExpanded ?? 0, participants: result.participantIdsResolved ?? 0, unresolved: result.participantIdsUnresolved ?? 0, warnings: result.warnings, errors: result.errors, recognized: result.recognizedFiles ?? 0, skipped: result.skippedFiles ?? 0, malformed: result.malformedFiles ?? 0, layout, absent } ); } catch (error) { ctx.options.onError("Archive import failed", error); ctx.setStatus("Archive import failed."); } finally { input.value = ""; } })(); }); row.append(copy2, input); rows.push(row); } if (ctx.options.searchArchive) { const row = ctx.el("div", "av-row av-row-stack"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("Search captured records")), ctx.el("span", "av-row-description", ctx.t("Full-text search across the latest export collector run.")) ); const archiveSearchLabel = copy2.querySelector(".av-row-label"); const input = document.createElement("input"); input.type = "search"; input.placeholder = ctx.t("@handle, keyword, phrase\u2026"); archiveSearchLabel.id = "av-search-archive-label"; input.id = "av-search-archive"; input.setAttribute("aria-labelledby", archiveSearchLabel.id); input.className = "av-text-input"; const results = ctx.el("div", "av-search-results"); results.setAttribute("role", "list"); results.setAttribute("aria-live", "polite"); const runSearch = () => { const query = input.value.trim(); results.replaceChildren(); if (query.length === 0) { results.append( ctx.el("div", "av-row-description", ctx.t("Type to search the records captured by export runs.")) ); return; } const hits = ctx.options.searchArchive(query); if (hits.length === 0) { results.append( ctx.el( "div", "av-row-description", ctx.formatCopy(ctx.t("No captured records match \u201C{query}\u201D."), { query }) ) ); return; } for (const hit of hits.slice(0, 10)) { const item = ctx.el("div", "av-search-hit"); item.setAttribute("role", "listitem"); const head2 = ctx.el("span", "av-row-label", `@${hit.handle ?? "anon"} \xB7 ${hit.tweetId ?? "unknown"}`); const body = ctx.el("span", "av-row-description", hit.text.slice(0, 140)); item.append(head2, body); results.append(item); } }; let searchTimer; input.addEventListener("input", () => { if (searchTimer !== void 0) { clearTimeout(searchTimer); } searchTimer = setTimeout(runSearch, 180); }); runSearch(); row.append(copy2, input, results); rows.push(row); } if (ctx.options.downloadReport) { rows.push( ctx.actionRow("Download Markdown report", "Audit log + snapshot diff + cleanup preview.", async () => { ctx.setStatus("Building report\u2026"); try { await ctx.options.downloadReport(); ctx.setStatus("Report downloaded."); } catch (error) { ctx.options.onError("Could not build report", error); ctx.setStatus("Could not build report."); } }) ); } if (ctx.options.getCleanupQueueSize) { const queueStatus = ctx.options.getCleanupQueueSize(); rows.push( ctx.dataRow( "Cleanup review queue", ctx.localizedCopy("{total} items \xB7 queued {queued} \xB7 approved {approved} \xB7 skipped {skipped}", { total: queueStatus.total, queued: queueStatus.queued, approved: queueStatus.approved, skipped: queueStatus.skipped }) ) ); rows.push( ctx.readonlyRow( "Destructive actions", "Aviary never deletes posts, likes, or follows. The queue is a review list; approving or skipping only writes to the audit log." ) ); } if (ctx.options.enqueueCleanupReview) { rows.push( ctx.actionRow( "Enqueue cleanup preview for review", "Append every non-protected candidate from the latest cleanup preview to the queue (no destructive action).", async () => { ctx.setStatus("Building cleanup preview\u2026"); try { const result = await ctx.options.enqueueCleanupReview(); ctx.render(); ctx.setStatusCopy("Enqueued {added} items ({protected} protected skipped).", { added: result.added, protected: result.protected }); } catch (error) { ctx.options.onError("Could not enqueue cleanup", error); ctx.setStatus("Could not enqueue cleanup."); } } ) ); } if (ctx.options.clearCleanupQueue) { rows.push( ctx.actionRow("Clear cleanup queue", "Drop every queued item without touching account data.", async () => { try { await ctx.options.clearCleanupQueue(); await ctx.save("Cleanup queue cleared."); } catch (error) { ctx.options.onError("Could not clear cleanup queue", error); ctx.setStatus("Could not clear queue."); } }) ); } return rows; } function libraryStorageRows(ctx) { const breakdown = ctx.libraryStorage(); if (breakdown === void 0) { return [ctx.readonlyRow("Library storage", "Measuring\u2026")]; } if (breakdown === null) { return [ ctx.readonlyRow( "Library storage", "This browser store cannot be weighed from here, so Aviary does not report a size for it." ) ]; } const rows = [ ctx.dataRow( "Library storage", ctx.formatCopy(ctx.t("{bytes} across {count} collections"), { bytes: ctx.formatBytes(breakdown.totalBytes), count: breakdown.collections.length }) ) ]; if (breakdown.collections.length > 0) { rows.push( ctx.dataRow( "Largest collections", breakdown.collections.slice(0, 8).map((entry) => `${entry.key} ${ctx.formatBytes(entry.bytes)}`).join(" \xB7 ") ) ); } rows.push( breakdown.usageDetails ? ctx.dataRow( "Browser storage report", Object.entries(breakdown.usageDetails).map(([name, bytes]) => `${name}: ${ctx.formatBytes(bytes)}`).join(" \xB7 ") ) : ctx.readonlyRow( "Browser storage report", "This browser does not break its storage report down by type, so only Aviary's own measurement is shown." ) ); return rows; } function libraryCaptureSizeRows(ctx) { const settings = ctx.options.settings.export; const megabytes = Math.round(settings.storageCapBytes / 1e6); return [ ctx.integerInputRow( "Storage cap warning", "Warn before a capture takes the local library past this many megabytes. 0 turns the warning off. Aviary never deletes anything to stay under it; removal is chosen in the cleanup preview.", megabytes, async (value) => { settings.storageCapBytes = value <= 0 ? 0 : value * 1e6; await ctx.save(value <= 0 ? "Storage cap warning off." : "Storage cap warning saved."); }, { min: 0, max: 1e6 } ), ctx.selectRow( "Downscale captured images", String(settings.captureImageScale), [ ["1", "Keep the original"], ["0.75", "Three quarters"], ["0.5", "Half"], ["0.25", "Quarter"] ], async (value) => { settings.captureImageScale = Number(value); await ctx.save( settings.captureImageScale === 1 ? "Captured images keep their original size." : "Captured images will be downscaled." ); }, "Applies to captures from here on. Nothing already stored changes, and each reduced record says it was reduced." ), ctx.toggleRow( "Video poster frames only", "Store the still X serves for a video instead of the video itself. The record says the video was left out, so a later export cannot present the still as the whole post.", settings.capturePosterFramesOnly, async (checked) => { settings.capturePosterFramesOnly = checked; await ctx.save(checked ? "Videos will be captured as poster frames." : "Videos will be captured in full."); } ) ]; } function buildLibraryRows(ctx) { const rows = []; const maintenanceRows = [...libraryStorageRows(ctx), ...libraryCaptureSizeRows(ctx)]; if (ctx.options.getUnderTheHoodStatus && ctx.options.importUnderTheHood) { const status = ctx.options.getUnderTheHoodStatus(); const intro = ctx.el("div", "av-row av-row-stack av-under-the-hood"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("X Under the Hood")), ctx.el( "span", "av-row-description", ctx.t("Read X's own monthly visibility summary locally. It reports aggregate labels, not production ranking weights or a complete post audit.") ) ); const file = document.createElement("input"); file.type = "file"; file.className = "av-text-input"; file.accept = ".json,application/json"; file.setAttribute("aria-label", ctx.t("Import X Under the Hood JSON")); file.addEventListener("change", () => { const selected = file.files?.[0]; if (!selected) return; ctx.setStatus("Reading Under the Hood report\u2026"); void selected.text().then(async (payload) => { const result = await ctx.options.importUnderTheHood(payload); if (!result.report) { ctx.setStatus(result.errors[0] ?? ctx.t("Under the Hood report could not be read.")); return; } ctx.render(); const warning = result.warnings.length > 0 ? ` ${result.warnings[0]}` : ""; ctx.setStatus(`${ctx.t("Under the Hood report saved locally.")} ${result.report.period.startDate.slice(0, 7)}.${warning}`); }).catch((error) => { ctx.options.onError("Under the Hood import failed", error); ctx.setStatus("Under the Hood report could not be read."); }); }); intro.append(copy2, file); maintenanceRows.push(intro); if (status.latest) { maintenanceRows.push( ctx.dataRow( "Latest Under the Hood report", `${status.latest.period} \xB7 ${status.latest.postCount} eligible posts \xB7 ${status.latest.postLabelCount} labeled posts \xB7 ${status.latest.accountLabelDayCount} account label-days` ) ); const labels = [ ...status.latest.postLabels.map((label) => `post: ${label}`), ...status.latest.accountLabels.map((label) => `account: ${label}`) ]; maintenanceRows.push( ctx.readonlyRow( "Labels in latest report", labels.length > 0 ? labels.join(" \xB7 ") : ctx.t("No visibility labels were reported for this month.") ) ); } else { maintenanceRows.push(ctx.readonlyRow("Under the Hood reports", ctx.t("No X report imported yet."))); } if (status.comparison && status.previous && status.latest) { const comparison = status.comparison; const signed = (value) => value > 0 ? `+${value}` : String(value); const labelChanges2 = [ ...comparison.addedPostLabels.map((label) => `new post: ${label}`), ...comparison.removedPostLabels.map((label) => `removed post: ${label}`), ...comparison.addedAccountLabels.map((label) => `new account: ${label}`), ...comparison.removedAccountLabels.map((label) => `removed account: ${label}`) ]; maintenanceRows.push( ctx.dataRow( "Month-over-month", `${comparison.earlier} \u2192 ${comparison.later} \xB7 posts ${signed(comparison.postCountDelta)} \xB7 labeled posts ${signed(comparison.postLabelCountDelta)} \xB7 account label-days ${signed(comparison.accountLabelDayCountDelta)}${labelChanges2.length > 0 ? ` \xB7 ${labelChanges2.join(" \xB7 ")}` : ""}` ) ); } else if (status.reportCount > 0) { maintenanceRows.push(ctx.readonlyRow("Month-over-month", ctx.t("Import another month to compare reports."))); } if (ctx.options.exportUnderTheHood) { maintenanceRows.push( ctx.actionRow( "Export saved Under the Hood reports", "Downloads the normalized reports as local JSON. This is user data from X; Aviary does not add ranking weights or infer a score.", async () => { try { const result = await ctx.options.exportUnderTheHood(); ctx.setStatus(`Under the Hood reports exported: ${result.filename} (${result.reports} reports, ${ctx.formatBytes(result.bytes)}).`); } catch (error) { ctx.options.onError("Under the Hood export failed", error); ctx.setStatus("Could not export Under the Hood reports."); } } ) ); } } if (ctx.options.offlineSearch) { const row = ctx.el("div", "av-row av-row-stack"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("Search all local collections")), ctx.el( "span", "av-row-description", ctx.t("Search posts, likes, bookmarks, notes, and captures.") ) ); const input = document.createElement("input"); input.type = "search"; input.className = "av-text-input"; input.value = ctx.state.libraryQuery; input.placeholder = ctx.t("Search local library"); input.setAttribute("aria-label", ctx.t("Search all local collections")); input.spellcheck = false; const semanticToggle = document.createElement("input"); semanticToggle.type = "checkbox"; semanticToggle.checked = ctx.state.unifiedSemantic; semanticToggle.setAttribute("aria-label", ctx.t("Semantic ranking")); const semanticCopy = ctx.el("span", "av-row-description", ctx.t("Semantic ranking")); const semanticRow = ctx.el("label", "av-inline-controls"); semanticRow.append(semanticToggle, semanticCopy); const results = ctx.el("div", "av-search-results"); results.setAttribute("role", "list"); results.setAttribute("aria-live", "polite"); let searchSequence = 0; const libraryTools = ctx.el("div", "av-inline-controls av-library-media-actions"); libraryTools.append(semanticRow); const mediaCount = ctx.el("span", "av-row-description av-library-media-count"); const updateMediaCount = () => { const count = ctx.options.getCapturedMediaCount?.(ctx.state.libraryQuery.trim()) ?? 0; mediaCount.textContent = ctx.formatCopy(ctx.t("{count} media"), { count }); }; if (ctx.options.runCapturedMediaBatch) { const download = ctx.el( "button", "av-button av-button-secondary av-library-media-download", ctx.t("Download media") ); download.type = "button"; const review = ctx.el("div", "av-media-review"); review.hidden = true; const selection = /* @__PURE__ */ new Set(); let filterKind = "all"; const closeReview = () => { review.hidden = true; review.replaceChildren(); selection.clear(); download.disabled = false; }; const runSelection = () => { const chosen = [...selection]; const query = ctx.state.libraryQuery.trim(); review.hidden = true; review.replaceChildren(); ctx.setStatusCopy("Downloading {count} selected files.", { count: chosen.length }); void ctx.options.runCapturedMediaBatch(query, filterKind, chosen).then((result) => { updateMediaCount(); ctx.setStatus( result.cancelled ? `Batch cancelled: ${result.downloaded} saved / ${result.started} running / ${result.opened} opened / ${result.duplicate} dup / ${result.failed} failed (of ${result.total}).` : `Batch finished: ${result.downloaded} saved / ${result.started} running / ${result.opened} opened / ${result.duplicate} dup / ${result.failed} failed (of ${result.total}).` ); }).catch((error) => { ctx.options.onError("Captured media download failed", error); ctx.setStatus("Captured media download failed."); }).finally(() => { selection.clear(); download.disabled = false; }); }; const openReview = () => { const preview = ctx.options.previewCapturedMediaBatch?.(ctx.state.libraryQuery.trim(), filterKind); review.replaceChildren(); if (!preview) return; selection.clear(); for (const item of preview.items) selection.add(item.id); const summary = ctx.el("p", "av-row-description av-media-review-summary"); const confirm = ctx.el( "button", "av-button av-button-primary av-media-review-confirm", ctx.t("Download selected") ); confirm.type = "button"; const refreshSummary = () => { summary.textContent = ctx.formatCopy( ctx.t("{selected} of {total} files selected. {unavailable} cannot be downloaded."), { selected: selection.size, total: preview.items.length, unavailable: preview.unavailable.length } ); confirm.disabled = selection.size === 0; }; const kindSelect = document.createElement("select"); kindSelect.className = "av-select av-media-review-kind"; kindSelect.setAttribute("aria-label", ctx.t("Media kind")); const kindChoices = [ ["all", ctx.t("Every kind")], ...preview.kinds.map((kind) => [kind, kind]) ]; for (const [value, label] of kindChoices) { const option = document.createElement("option"); option.value = value; option.textContent = label; if (value === filterKind) option.selected = true; kindSelect.append(option); } kindSelect.addEventListener("change", () => { filterKind = kindSelect.value; openReview(); }); const selectAll = document.createElement("input"); selectAll.type = "checkbox"; selectAll.checked = true; selectAll.className = "av-media-review-all"; const selectAllLabel = ctx.el("label", "av-chip av-media-review-all-label"); selectAllLabel.append(selectAll, ctx.el("span", "", ctx.t("Select all"))); const list = ctx.el("ul", "av-media-review-list"); const boxes = []; for (const item of preview.items) { const row2 = ctx.el("li", "av-media-review-item"); const box = document.createElement("input"); box.type = "checkbox"; box.checked = true; box.value = item.id; box.setAttribute("aria-label", item.filename); box.addEventListener("change", () => { if (box.checked) selection.add(item.id); else selection.delete(item.id); selectAll.checked = selection.size === preview.items.length; refreshSummary(); }); boxes.push(box); const label = ctx.el("label", "av-media-review-label"); const size = item.width && item.height ? ` \xB7 ${item.width}x${item.height}` : ""; label.append(box, ctx.el("span", "", `${item.filename} \xB7 ${item.kind} \xB7 ${item.qualityLabel}${size}`)); row2.append(label); list.append(row2); } selectAll.addEventListener("change", () => { selection.clear(); for (const box of boxes) { box.checked = selectAll.checked; if (selectAll.checked) selection.add(box.value); } refreshSummary(); }); const skipped = ctx.el("ul", "av-media-review-skipped"); for (const item of preview.unavailable) { skipped.append( ctx.el("li", "av-media-review-item", `${item.kind} \xB7 ${item.reason ?? ctx.t("Not available.")}`) ); } const cancel = ctx.el( "button", "av-button av-button-secondary av-media-review-cancel", ctx.t("Cancel") ); cancel.type = "button"; cancel.addEventListener("click", closeReview); confirm.addEventListener("click", runSelection); const actions = ctx.el("div", "av-inline-controls"); actions.append(confirm, cancel); if (preview.overLimit) { review.append( ctx.el( "p", "av-row-description", ctx.formatCopy(ctx.t("This search holds more than {limit} downloadable files. Narrow it first."), { limit: preview.limit }) ) ); } review.append(kindSelect, selectAllLabel, summary, list); if (preview.unavailable.length > 0) review.append(skipped); review.append(actions); refreshSummary(); review.hidden = false; confirm.focus(); }; download.addEventListener("click", () => { download.disabled = true; filterKind = "all"; openReview(); }); libraryTools.append(download, mediaCount); rows.push(review); } const renderUnified = async () => { const sequence = ++searchSequence; const query = input.value.trim(); ctx.state.libraryQuery = input.value; updateMediaCount(); results.replaceChildren(); if (query.length === 0) { results.append(ctx.el("div", "av-row-description", ctx.t("Try source:bookmarks, tag:reading, or has:media."))); return; } let matches2; try { matches2 = ctx.state.unifiedSemantic && ctx.options.offlineSemanticSearch ? await ctx.options.offlineSemanticSearch(query) : ctx.options.offlineSearch(query); } catch (error) { ctx.options.onError("Library search failed", error); ctx.setStatus("Library search failed. Check the embedding endpoint and key in Integrations."); return; } if (sequence !== searchSequence) return; if (matches2.length === 0) { results.append(ctx.el("div", "av-row-description", ctx.t("No local collections match this search."))); return; } for (const hit of matches2.slice(0, 30)) { const item = ctx.el("div", "av-search-hit"); item.setAttribute("role", "listitem"); const account = hit.document.account ? `@${hit.document.account}` : "local"; const signal = hit.mode === "hybrid" ? ctx.t("Text + semantic match") : hit.mode === "semantic" ? ctx.t("Semantic match") : ctx.t("Text match"); item.append( ctx.el("span", "av-row-label", `${hit.document.collection} \xB7 ${account} \xB7 ${signal}`), ctx.el("span", "av-row-description", hit.snippet || ctx.t("(no text)")) ); results.append(item); } }; input.addEventListener("input", () => void renderUnified()); semanticToggle.addEventListener("change", () => { ctx.state.unifiedSemantic = semanticToggle.checked; void renderUnified(); }); updateMediaCount(); results.append(ctx.el("div", "av-row-description", ctx.t("Try source:bookmarks, tag:reading, or has:media."))); row.append(copy2, input, libraryTools, results); rows.push(row); } if (ctx.options.getBookmarkStatus && ctx.options.searchBookmarks && ctx.options.updateBookmark && ctx.options.removeBookmark) { const status = ctx.options.getBookmarkStatus(); rows.push( ctx.dataRow( "Local bookmarks", ctx.localizedCopy("{saved} saved \xB7 {mirrored} mirrored \xB7 {due} due \xB7 {tags} tags \xB7 {folders} folders", { saved: status.total, mirrored: status.mirrored ?? 0, due: status.due, tags: status.tags.length, folders: status.folders.length }) ) ); const bookmarkRow = ctx.el("div", "av-row av-row-stack"); const bookmarkCopy = ctx.el("span", "av-row-copy"); bookmarkCopy.append( ctx.el("span", "av-row-label", ctx.t("Find local bookmarks")), ctx.el( "span", "av-row-description", ctx.t("Search saved posts by text, handle, tags, folder, or ID. Captured bookmarks only include posts X sent while you scrolled past them.") ) ); const bookmarkInput = document.createElement("input"); bookmarkInput.type = "search"; bookmarkInput.className = "av-text-input"; bookmarkInput.value = ctx.state.bookmarkQuery; bookmarkInput.placeholder = ctx.t("Search local bookmarks"); bookmarkInput.setAttribute("aria-label", ctx.t("Find local bookmarks")); bookmarkInput.spellcheck = false; const bookmarkResults = ctx.el("div", "av-search-results"); bookmarkResults.setAttribute("role", "list"); bookmarkResults.setAttribute("aria-live", "polite"); const renderBookmarks = () => { bookmarkResults.replaceChildren(); const matches2 = ctx.options.searchBookmarks(ctx.state.bookmarkQuery).slice(0, 30); if (matches2.length === 0) { const copy2 = status.total === 0 ? ctx.t("Nothing saved yet. Use Save locally on any post to keep a copy here.") : ctx.t("No local bookmarks match this search."); bookmarkResults.append(ctx.el("div", "av-row-description", copy2)); return; } for (const entry of matches2) { const item = ctx.el("div", "av-search-hit av-bookmark-hit"); item.setAttribute("role", "listitem"); const head2 = ctx.el("span", "av-row-label", `@${entry.handle ?? "anon"} \xB7 ${entry.tweetId ?? entry.id}`); const body = ctx.el( "span", "av-row-description", entry.text.slice(0, 180) || entry.url || ctx.t("(no text)") ); item.append(head2, body); const editor = ctx.el("div", "av-bookmark-editor"); const tags = ctx.bookmarkField("Bookmark tags", entry.tags.join(", "), "Tags, comma-separated"); const folder = ctx.bookmarkField("Bookmark folder", entry.folder ?? "", "Folder"); const reminder = ctx.bookmarkField( "Bookmark reminder", ctx.toDatetimeLocal(entry.remindAt), "Reminder" ); reminder.type = "datetime-local"; const notes = document.createElement("textarea"); notes.className = "av-textarea av-bookmark-notes"; notes.rows = 2; notes.value = entry.notes; notes.placeholder = ctx.t("Notes"); notes.setAttribute("aria-label", ctx.t("Bookmark notes")); editor.append(tags, folder, reminder, notes); const controls = ctx.el("div", "av-inline-controls"); const saveButton = ctx.el("button", "av-button av-button-secondary", ctx.t("Save")); saveButton.type = "button"; saveButton.addEventListener("click", () => { saveButton.disabled = true; void ctx.options.updateBookmark(entry.id, { tags: ctx.splitBookmarkTags(tags.value), folder: folder.value.trim() || null, remindAt: ctx.fromDatetimeLocal(reminder.value), notes: notes.value }).then(() => { ctx.setStatus("Bookmark updated."); ctx.render(); }).catch((error) => { ctx.options.onError("Bookmark update failed", error); ctx.setStatus("Could not update bookmark."); saveButton.disabled = false; }); }); const remove = ctx.el("button", "av-button av-button-secondary", ctx.t("Remove")); remove.type = "button"; remove.addEventListener("click", () => { remove.disabled = true; void ctx.options.removeBookmark(entry.id).then((removed) => { ctx.setStatus(removed ? "Bookmark removed." : "Bookmark was already removed."); ctx.render(); }).catch((error) => { ctx.options.onError("Bookmark removal failed", error); ctx.setStatus("Could not remove bookmark."); remove.disabled = false; }); }); controls.append(saveButton, remove); item.append(editor, controls); bookmarkResults.append(item); } }; bookmarkInput.addEventListener("input", () => { ctx.state.bookmarkQuery = bookmarkInput.value; renderBookmarks(); }); renderBookmarks(); bookmarkRow.append(bookmarkCopy, bookmarkInput, bookmarkResults); rows.push(bookmarkRow); if (ctx.options.exportBookmarks) { rows.push( ctx.actionRow( "Export local bookmarks", "Download JSON and CSV for every bookmark in this profile. The mirror only holds what X has sent to the page while you scrolled past it.", async () => { try { const result = await ctx.options.exportBookmarks(); ctx.setStatusCopy("Bookmarks exported: {records} records in {files} files.", { records: result.records, files: result.files }); } catch (error) { ctx.options.onError("Bookmark export failed", error); ctx.setStatus("Could not export bookmarks."); } } ) ); } if (ctx.options.exportBookmarksForManagers) { rows.push( ctx.actionRow( "Export for bookmark managers", "Download a browser bookmark file that Karakeep, Linkwarden, linkding and every browser import, plus the CSV Raindrop.io imports.", async () => { try { const result = await ctx.options.exportBookmarksForManagers(); ctx.setStatusCopy("Bookmarks exported: {records} records in {files} files.", { records: result.records, files: result.files }); } catch (error) { ctx.options.onError("Bookmark manager export failed", error); ctx.setStatus("Could not export bookmarks."); } } ) ); } if (ctx.options.clearBookmarks) { rows.push( ctx.actionRow("Clear local bookmarks", "Remove every saved local bookmark.", async () => { try { await ctx.options.clearBookmarks(); ctx.setStatus("Bookmarks cleared."); ctx.render(); } catch (error) { ctx.options.onError("Could not clear bookmarks", error); ctx.setStatus("Could not clear bookmarks."); } }) ); } } rows.push( ctx.toggleRow( "Show the AI button on posts", "Adds a button to every post that builds a Translate, Summarize, Explain or Fact-check prompt. Without an AI provider configured it copies the prompt to your clipboard; nothing is sent anywhere.", ctx.options.settings.ai.commandMenu, async (checked) => { ctx.options.settings.ai.commandMenu = checked; await ctx.save(checked ? "AI button on." : "AI button off."); } ) ); rows.push( ctx.toggleRow( "Unshorten t.co links", "Replace short `t.co` redirects with the destination from aria-labels and titles.", ctx.options.settings.links.expandTco, async (checked) => { ctx.options.settings.links.expandTco = checked; await ctx.save(checked ? "Unshorten on." : "Unshorten off."); } ) ); rows.push( ctx.toggleRow( "Clean tracking from links", "Strips share tokens and campaign parameters (utm_*, fbclid, and X's own t/s) from links in the timeline, so what you copy is the plain address.", ctx.options.settings.links.cleanShareButtons, async (checked) => { ctx.options.settings.links.cleanShareButtons = checked; await ctx.save(checked ? "Link cleaning on." : "Link cleaning off."); } ) ); rows.push( ctx.selectRow( "Copy post links as", ctx.options.settings.links.copyLinkHost, [ ["", "X (x.com)"], ["fxtwitter.com", "fxtwitter.com"], ["vxtwitter.com", "vxtwitter.com"], ["fixupx.com", "fixupx.com"], ["xcancel.com", "xcancel.com"] ], async (value) => { ctx.options.settings.links.copyLinkHost = isCopyLinkHost(value) ? value : DEFAULT_SETTINGS.links.copyLinkHost; await ctx.save( ctx.options.settings.links.copyLinkHost === "" ? "Copy link control off." : "Copy link control on." ); }, "Adds a Copy link control to each post that writes that post's address on the chosen host. Nothing X rendered is rewritten and no navigation is redirected. Only what you copy changes. Leave it on X to remove the control.", false ) ); if (ctx.options.getUserColors && ctx.options.setUserColor) { const colors = ctx.options.getUserColors(); const serializedColors = Object.entries(colors).map(([handle, color]) => `${handle}: ${color}`).sort(); rows.push( ctx.textareaRow( "Account colours", "Format: handle: colour. One per line. Colours are amber, rose, violet, sky, green, or slate. An empty line removes the tag.", serializedColors, async (lines) => { const seen = /* @__PURE__ */ new Set(); for (const line of lines) { const match = /^@?([A-Za-z0-9_]{1,15})\s*[:\-]\s*(\w*)$/.exec(line.trim()); if (!match) continue; const [, handle, color] = match; if (!handle) continue; seen.add(handle.toLowerCase()); await ctx.options.setUserColor(handle, (color ?? "").toLowerCase()); } for (const handle of Object.keys(colors)) { if (!seen.has(handle)) { await ctx.options.setUserColor(handle, ""); } } ctx.render(); await ctx.save("Account colours saved."); } ) ); } if (ctx.options.getUserNotes && ctx.options.setUserNote) { const notes = ctx.options.getUserNotes(); if (Object.keys(notes).length === 0) { rows.push( ctx.readonlyRow( "No account notes yet", ctx.t("Add one below as handle: note. Notes appear beside that account's posts.") ) ); } const serialized = Object.entries(notes).map(([handle, note]) => `${handle}: ${note}`).sort(); rows.push( ctx.textareaRow( "Account notes", "Format: handle: note. One per line. Empty notes remove the entry.", serialized, async (lines) => { const before = { ...notes }; const restore = async () => { const current = ctx.options.getUserNotes?.() ?? {}; for (const handle of Object.keys(current)) { if (!(handle in before)) await ctx.options.setUserNote(handle, ""); } for (const [handle, note] of Object.entries(before)) { await ctx.options.setUserNote(handle, note); } }; const seen = /* @__PURE__ */ new Set(); try { for (const line of lines) { const match = /^@?([A-Za-z0-9_]{1,15})\s*[:\-]\s*(.*)$/.exec(line); if (!match) continue; const [, handle, note] = match; if (handle) { seen.add(handle.toLowerCase()); await ctx.options.setUserNote(handle, note ?? ""); } } for (const handle of Object.keys(notes)) { if (!seen.has(handle)) { await ctx.options.setUserNote(handle, ""); } } } catch (error) { await restore(); throw error; } await ctx.save(`${seen.size} account note${seen.size === 1 ? "" : "s"} saved.`); return restore; } ) ); } if (ctx.options.clearUserNotes) { rows.push( ctx.actionRow("Clear all account notes", "Drop every persisted note.", async () => { try { await ctx.options.clearUserNotes(); await ctx.save("Account notes cleared."); } catch (error) { ctx.options.onError("Could not clear account notes", error); ctx.setStatus("Could not clear notes."); } }) ); } rows.push( ctx.textareaRow( "Composer snippets", "One snippet per line. Reusable replies / templates insert from the composer toolbar.", ctx.options.settings.composer.snippets, async (lines) => { ctx.options.settings.composer.snippets = lines.map((line) => line.trim()).filter((line) => line.length > 0).slice(0, 100); await ctx.save(`${ctx.options.settings.composer.snippets.length} snippet${ctx.options.settings.composer.snippets.length === 1 ? "" : "s"} saved.`); } ) ); rows.push(...maintenanceRows); return rows; } function buildExportRows(ctx) { const rows = []; rows.push( ctx.toggleRow( "Capture visible posts", "Accumulate posts visible on the active page for the next export run.", ctx.options.settings.export.enabled, async (checked) => { ctx.options.settings.export.enabled = checked; await ctx.save(checked ? "Export capture on." : "Export capture off."); } ) ); rows.push( ctx.textInputRow( "Export formats", "Comma-separated list. Supported: json, csv, html, markdown, xlsx.", ctx.options.settings.export.formats.join(","), async (value) => { const parsed = value.split(/[\s,]+/).map((entry) => entry.trim().toLowerCase()).filter((entry) => entry.length > 0); const supported = /* @__PURE__ */ new Set(["json", "csv", "html", "markdown", "xlsx"]); ctx.options.settings.export.formats = parsed.filter((entry) => supported.has(entry)); if (ctx.options.settings.export.formats.length === 0) { ctx.options.settings.export.formats = ["json"]; } await ctx.save(`Export formats: ${ctx.options.settings.export.formats.join(", ")}`); } ) ); rows.push( ctx.toggleRow( "Preserve raw payloads", "Also store the raw GraphQL responses X sends this tab, so records can be re-parsed later. Session tokens are stripped before anything is written.", ctx.options.settings.export.preserveRawPayloads, async (checked) => { ctx.options.settings.export.preserveRawPayloads = checked; await ctx.save("Raw payload preference saved."); } ) ); rows.push( ctx.toggleRow( "Capture media bytes in export", "Fetch media during the export action and include successful bytes with length and checksum; failed items remain retryable references.", ctx.options.settings.export.captureMediaBytes, async (checked) => { ctx.options.settings.export.captureMediaBytes = checked; await ctx.save(checked ? "Media byte capture on." : "Media byte capture off."); } ) ); rows.push( ctx.toggleRow( "Auto-discover query IDs", "Scan loaded scripts for X GraphQL operation IDs and cache them locally.", ctx.options.settings.export.autoDiscoverQueryIds, async (checked) => { ctx.options.settings.export.autoDiscoverQueryIds = checked; await ctx.save("Query discovery preference saved."); } ) ); rows.push( ctx.toggleRow( "Include protected posts in share exports", "Protected posts stay out of HTML, Markdown, WARC, WACZ, and static viewer output until you enable this explicitly. JSON and CSV remain archival and keep the audience field.", ctx.options.settings.export.includeProtected, async (checked) => { ctx.options.settings.export.includeProtected = checked; await ctx.save(checked ? "Protected post sharing enabled." : "Protected posts excluded from share exports."); } ) ); rows.push( ctx.toggleRow( "Include unknown-audience posts in share exports", "DOM-only, imported, and older records stay out of share-oriented exports until you enable this explicitly. JSON and CSV remain archival.", ctx.options.settings.export.includeUnknown, async (checked) => { ctx.options.settings.export.includeUnknown = checked; await ctx.save(checked ? "Unknown-audience sharing enabled." : "Unknown-audience posts excluded from share exports."); } ) ); rows.push( ctx.textInputRow( "Save folder hint", "Folder name (or path) used as the export ZIP root and download prefix.", ctx.options.settings.media.lastSaveFolder, async (value) => { ctx.options.settings.media.lastSaveFolder = value; await ctx.save("Save folder hint saved."); } ) ); const status = ctx.options.getExportStatus?.(); if (status) { rows.push( ctx.dataRow( "Export status", ctx.localizedCopy("{jobs} jobs tracked \xB7 {queries} GraphQL IDs cached", { jobs: status.jobCount, queries: status.knownQueries }) ) ); if (status.audience) { rows.push( ctx.dataRow( "Audience coverage", ctx.localizedCopy("{public} public \xB7 {protected} protected \xB7 {unknown} unknown \xB7 {excluded} excluded from share exports", { public: status.audience.public, protected: status.audience.protected, unknown: status.audience.unknown, excluded: status.audience.excludedProtected + status.audience.excludedUnknown }) ) ); } if (status.jobCount === 0) { rows.push( ctx.readonlyRow( "No export jobs yet", ctx.t("Turn Capture on, scroll a timeline, then export. Jobs and their records appear here.") ) ); } for (const job of (status.jobs ?? []).slice(-3)) { rows.push( ctx.dataRow( "Export job", `${ctx.localizedCopy("{status} \xB7 {records} records \xB7 {surface}", { status: job.status, records: job.recordCount, surface: job.surface })}${job.error ? ` \xB7 ${job.error}` : ""}` ) ); if (job.status === "running" && ctx.options.pauseExportJob) { rows.push( ctx.actionRow( "Pause export job", { source: "Pause {jobId}.", values: { jobId: job.jobId } }, async () => { const result = await ctx.options.pauseExportJob(job.jobId); if (!result.ok) throw new Error(result.error ?? "Export job could not be paused"); ctx.render(); ctx.setStatus("Export job paused."); }, "The export job could not be paused. It may have already finished. Reopen this section to see its current state." ) ); } if (job.status === "paused" && ctx.options.resumeExportJob) { rows.push( ctx.actionRow( "Resume export job", { source: "Resume {jobId}.", values: { jobId: job.jobId } }, async () => { const result = await ctx.options.resumeExportJob(job.jobId); if (!result.ok) throw new Error(result.error ?? "Export job could not be resumed"); ctx.render(); ctx.setStatus("Export job resumed."); }, "The export job could not be resumed. Its checkpoint may have been cleared. Start a new export instead." ) ); } if ((job.status === "running" || job.status === "paused" || job.status === "queued") && ctx.options.cancelExportJob) { rows.push( ctx.actionRow( "Cancel export job", { source: "Cancel {jobId}.", values: { jobId: job.jobId } }, async () => { const result = await ctx.options.cancelExportJob(job.jobId); if (!result.ok) throw new Error(result.error ?? "Export job could not be cancelled"); ctx.render(); ctx.setStatus("Export job cancelled."); }, "The export job could not be cancelled. It may have already finished. Reopen this section to see its current state." ) ); } } } if (ctx.options.runExport) { rows.push( ctx.actionRow("Export visible posts", "Collect the currently rendered posts and download a ZIP.", async () => { ctx.setStatus("Collecting visible posts\u2026"); try { const result = await ctx.options.runExport(); ctx.render(); const files = result.files ?? 1; if (result.records === 0) { ctx.setStatus("No posts found on this view. Scroll the timeline to load some, then export again."); } else if (files > 1) { ctx.setStatusCopy("Exported {records} records across {files} ZIPs \u2192 {filename}", { records: result.records, files, filename: result.filename }); } else if (result.records === 1) { ctx.setStatusCopy("Exported {records} record \u2192 {filename}", { records: result.records, filename: result.filename }); } else { ctx.setStatusCopy("Exported {records} records \u2192 {filename}", { records: result.records, filename: result.filename }); } } catch (error) { ctx.options.onError("Export failed", error); ctx.setStatus("Export failed. See diagnostics."); } }) ); } if (ctx.options.rebuildThreads) { rows.push( ctx.actionRow( "Rebuild captured threads", "Read captured replies in parent-first order. Missing parents stay visible as local gaps.", async () => { try { const result = await ctx.options.rebuildThreads(); ctx.render(); if (result.records === 0) { ctx.setStatus("No captured posts have thread metadata yet."); } else { ctx.setStatus("Captured thread reader exported."); } } catch (error) { ctx.options.onError("Thread rebuild failed", error); ctx.setStatus("Thread rebuild failed. See diagnostics."); } } ) ); } if (ctx.options.copyDiagnostics) { rows.push( ctx.actionRow("Copy diagnostics", "Copy support diagnostics (version, route, recent log).", async () => { try { await ctx.options.copyDiagnostics(); ctx.setStatus("Diagnostics copied to clipboard."); } catch (error) { ctx.options.onError("Could not copy diagnostics", error); ctx.setStatus("Could not copy diagnostics."); } }) ); } if (ctx.options.downloadWarc || ctx.options.downloadWacz) { rows.push(preservationArchiveRow(ctx)); } if (ctx.options.downloadSignedWacz || ctx.options.exportWaczSigningKey) { rows.push(waczSigningRow(ctx)); } if (ctx.options.exportToTarget) { const targets = [ { id: "clipboard-markdown", label: "Copy as Markdown", description: "Push a plain Markdown export onto the clipboard." }, { id: "obsidian", label: "Save Obsidian Markdown", description: "Markdown with YAML frontmatter and Aviary tags." }, { id: "notion", label: "Save Notion Markdown", description: "Heading-first Markdown that Notion imports cleanly." }, { id: "raw-json", label: "Save records JSON", description: "Raw ExportRecord[] JSON without ZIP wrapping." } ]; for (const target of targets) { rows.push( ctx.actionRow(target.label, target.description, async () => { try { const result = await ctx.options.exportToTarget(target.id); if (result.copied) { ctx.setStatusCopy("Copied {records} records to clipboard.", { records: result.records }); } else { ctx.setStatusCopy("Exported {records} records to {target}.", { records: result.records, target: ctx.t(target.label) }); } } catch (error) { ctx.options.onError("External export failed", error); ctx.setStatus("External export failed."); } }) ); } } if (ctx.options.getRetentionPolicy && ctx.options.saveRetentionPolicy) { rows.push( ctx.integerInputRow( "Records per ZIP", "Split a long export across several archives instead of one huge file (25-1000).", ctx.options.settings.media.zipChunkSize, async (value) => { ctx.options.settings.media.zipChunkSize = value; await ctx.save("Records per ZIP saved."); }, { min: 25, max: 1e3 } ) ); const policy = ctx.options.getRetentionPolicy(); rows.push( ctx.integerInputRow( "Maximum export jobs", "Keep the newest jobs. Use 0 for unlimited.", policy.maxJobs, async (value) => { const before = ctx.options.getRetentionPolicy(); await ctx.options.saveRetentionPolicy({ ...before, maxJobs: value }); await ctx.save("Export job retention saved."); return async () => ctx.options.saveRetentionPolicy(before); } ) ); rows.push( ctx.integerInputRow( "Maximum records per job", "Keep the newest records in each job. Use 0 for unlimited.", policy.maxRecordsPerJob, async (value) => { const before = ctx.options.getRetentionPolicy(); await ctx.options.saveRetentionPolicy({ ...before, maxRecordsPerJob: value }); await ctx.save("Record retention saved."); return async () => ctx.options.saveRetentionPolicy(before); } ) ); rows.push( ctx.integerInputRow( "Maximum export age (days)", "Remove older jobs at boot. Use 0 to disable age-based cleanup.", policy.maxAgeDays, async (value) => { const before = ctx.options.getRetentionPolicy(); await ctx.options.saveRetentionPolicy({ ...before, maxAgeDays: value }); await ctx.save("Age-based retention saved."); return async () => ctx.options.saveRetentionPolicy(before); } ) ); } return rows; } function preservationArchiveRow(ctx) { const row = ctx.el("div", "av-row av-preservation-row"); row.dataset.avLabel = "Preservation archive"; const copy2 = ctx.el("span", "av-row-copy"); const description = ctx.el( "span", "av-row-description", ctx.t("Download a raw WARC or a replay-ready WACZ. WACZ keeps archive and index members uncompressed.") ); const estimate = ctx.options.getWaczEstimate?.(); if (estimate) { description.append(document.createTextNode(` ${ctx.localizedCopy( "Estimated WACZ: {size} for {records} records.", { size: ctx.formatBytes(estimate.estimatedBytes), records: estimate.records } )}`)); } copy2.append(ctx.el("span", "av-row-label", ctx.t("Preservation archive")), description); const actions = ctx.el("div", "av-preservation-actions"); actions.setAttribute("role", "group"); actions.setAttribute("aria-label", ctx.t("Preservation archive actions")); const archiveButtons = []; const run = async (button3, status, operation) => { archiveButtons.forEach((candidate) => { candidate.disabled = true; }); button3.setAttribute("aria-busy", "true"); ctx.setStatus(status); try { await operation(); } finally { button3.removeAttribute("aria-busy"); archiveButtons.forEach((candidate) => { candidate.disabled = false; }); } }; if (ctx.options.downloadWarc) { const warc = ctx.button("WARC", "av-button av-button-secondary"); archiveButtons.push(warc); warc.addEventListener("click", () => { void run(warc, ctx.t("Building WARC archive\u2026"), async () => { try { const result = await ctx.options.downloadWarc(); ctx.setStatusCopy("WARC downloaded ({records} records).", { records: result.records }); } catch (error) { ctx.options.onError("WARC export failed", error); ctx.setStatus("WARC export failed."); } }); }); actions.append(warc); } if (ctx.options.downloadWacz) { const wacz = ctx.button("WACZ", "av-button av-button-primary"); archiveButtons.push(wacz); let waczController; const cancelWacz = ctx.button("Cancel", "av-button av-button-secondary"); cancelWacz.type = "button"; cancelWacz.hidden = true; cancelWacz.setAttribute("aria-hidden", "true"); cancelWacz.addEventListener("click", () => { waczController?.abort(); cancelWacz.disabled = true; }); wacz.addEventListener("click", () => { void run(wacz, ctx.t("Building WACZ archive\u2026"), async () => { waczController = new AbortController(); cancelWacz.hidden = false; cancelWacz.removeAttribute("aria-hidden"); try { const result = await ctx.options.downloadWacz({ signal: waczController.signal, onProgress: (progress) => { ctx.setStatus(`${ctx.t("Building WACZ archive\u2026")} ${Math.round(progress * 100)}%`); } }); ctx.setStatusCopy("WACZ downloaded ({records} records, {size}).", { records: result.records, size: ctx.formatBytes(result.bytes) }); } catch (error) { if (error instanceof DOMException && error.name === "AbortError") { ctx.setStatus("Export job cancelled."); } else { ctx.options.onError("WACZ export failed", error); ctx.setStatus("WACZ export failed. Free some disk space or export fewer records, then try again."); } } finally { waczController = void 0; cancelWacz.hidden = true; cancelWacz.setAttribute("aria-hidden", "true"); cancelWacz.disabled = false; } }); }); actions.append(wacz); actions.append(cancelWacz); } const replay = ctx.el("a", "av-button av-button-secondary av-replay-link", ctx.t("Open replayweb.page")); replay.href = "https://replayweb.page/"; replay.target = "_blank"; replay.rel = "noopener noreferrer"; actions.append(replay); row.append(copy2, actions); return row; } function waczSigningRow(ctx) { const row = ctx.el("div", "av-row av-preservation-row"); row.dataset.avLabel = "Aviary-only WACZ proof"; const copy2 = ctx.el("span", "av-row-copy"); const description = ctx.el("span", "av-row-description"); copy2.append(ctx.el("span", "av-row-label", ctx.t("Aviary-only WACZ proof")), description); const actions = ctx.el("div", "av-preservation-actions"); actions.setAttribute("role", "group"); actions.setAttribute("aria-label", ctx.t("Aviary-only WACZ proof actions")); let actionButtons = []; let signingController; const cancelSigning = ctx.button("Cancel", "av-button av-button-secondary"); cancelSigning.type = "button"; cancelSigning.hidden = true; cancelSigning.setAttribute("aria-hidden", "true"); cancelSigning.addEventListener("click", () => { signingController?.abort(); cancelSigning.disabled = true; }); const run = async (button3, status, operation) => { if (ctx.guardDraft()) return; actionButtons.forEach((candidate) => { candidate.disabled = true; }); button3.setAttribute("aria-busy", "true"); ctx.setStatus(status); try { await operation(); } finally { button3.removeAttribute("aria-busy"); actionButtons.forEach((candidate) => { candidate.disabled = false; }); } }; const refresh = () => { const signing = ctx.options.getWaczSigningStatus?.() ?? { state: "missing", fingerprint: null, createdAt: null }; if (signing.state === "ready" && signing.fingerprint) { description.textContent = ctx.localizedCopy( "Local identity {fingerprint}. It proves continuity of this key, not what X served.", { fingerprint: shortFingerprint(signing.fingerprint) } ); } else if (signing.state === "invalid") { description.textContent = ctx.t("The stored keypair is invalid. Replace it before signing another archive."); } else { description.textContent = ctx.t("First use creates a local P-384 identity. Signing stays off for ordinary WACZ downloads."); } actionButtons = []; actions.replaceChildren(); if (signing.state === "invalid" && ctx.options.replaceWaczSigningKey) { const replace = ctx.button("Replace keypair", "av-button av-button-secondary"); actionButtons.push(replace); replace.addEventListener("click", () => { void run(replace, ctx.t("Creating a new signing identity\u2026"), async () => { try { await ctx.options.replaceWaczSigningKey(); refresh(); actionButtons[0]?.focus({ preventScroll: true }); ctx.setStatus("Signing identity replaced."); } catch (error) { ctx.options.onError("Signing identity replacement failed", error); ctx.setStatus("Could not replace the signing identity."); } }); }); actions.append(replace); return; } if (ctx.options.downloadSignedWacz) { const signed = ctx.button("Aviary-only WACZ proof", "av-button av-button-primary"); actionButtons.push(signed); signed.addEventListener("click", () => { void run(signed, ctx.t("Creating Aviary-only WACZ proof\u2026"), async () => { signingController = new AbortController(); cancelSigning.hidden = false; cancelSigning.removeAttribute("aria-hidden"); try { const result = await ctx.options.downloadSignedWacz({ signal: signingController.signal, onProgress: (progress) => { ctx.setStatus(`${ctx.t("Creating Aviary-only WACZ proof\u2026")} ${Math.round(progress * 100)}%`); } }); refresh(); ctx.setStatusCopy("Aviary-only WACZ proof downloaded ({records} records, {size}).", { records: result.records, size: ctx.formatBytes(result.bytes) }); } catch (error) { if (error instanceof DOMException && error.name === "AbortError") { ctx.setStatus("Export job cancelled."); } else { ctx.options.onError("Aviary-only WACZ proof export failed", error); ctx.setStatus("Aviary-only WACZ proof export failed."); } } finally { signingController = void 0; cancelSigning.hidden = true; cancelSigning.setAttribute("aria-hidden", "true"); cancelSigning.disabled = false; } }); }); actions.append(signed); actions.append(cancelSigning); } if (ctx.options.exportWaczSigningKey) { const exportKey = ctx.button("Export keypair", "av-button av-button-secondary"); actionButtons.push(exportKey); exportKey.addEventListener("click", () => { void run(exportKey, ctx.t("Preparing signing keypair\u2026"), async () => { try { const result = await ctx.options.exportWaczSigningKey(); refresh(); ctx.setStatusCopy("Signing keypair downloaded: {filename}.", { filename: result.filename }); } catch (error) { ctx.options.onError("Signing keypair export failed", error); ctx.setStatus("Signing keypair export failed."); } }); }); actions.append(exportKey); } }; refresh(); row.append(copy2, actions); return row; } function shortFingerprint(value) { return value.slice(0, 16).toUpperCase().replace(/(.{4})(?=.)/g, "$1 "); } function buildMediaRows(ctx) { const rows = []; ctx.t("The download preference applies to every media control."); rows.push( ctx.toggleRow( "Show download buttons", "Add one Download action to each media post, plus per-asset controls. Turning this off also hides Copy media links.", ctx.options.settings.media.buttons, async (checked) => { ctx.options.settings.media.buttons = checked; await ctx.save(checked ? "Media buttons on." : "Media buttons off."); } ) ); rows.push( ctx.toggleRow( "Show Copy media links", "Add a post action that copies the best direct image, GIF, video, audio, and caption URLs, one per line. It copies only that post's own media and requires the media controls above.", ctx.options.settings.media.copyMediaLinks, async (checked) => { ctx.options.settings.media.copyMediaLinks = checked; await ctx.save(checked ? "Copy media links on." : "Copy media links off."); } ) ); rows.push( ctx.toggleRow( "Prefer original quality", "Try source-format name=orig first, then 4096x4096 if it fails.", ctx.options.settings.media.preferOriginalImages, async (checked) => { ctx.options.settings.media.preferOriginalImages = checked; await ctx.save("Original quality preference saved."); } ) ); rows.push( ctx.readonlyRow( "Original quality status", ctx.options.settings.media.buttons ? "The download preference applies to every media control." : "Original quality is applied when download controls are enabled." ) ); rows.push( ctx.toggleRow( "Show images at original quality", "Loads timeline photos at full size instead of the version X picks for the slot. Sharper, and several times the bytes.", ctx.options.settings.media.inlineOriginalImages, async (checked) => { ctx.options.settings.media.inlineOriginalImages = checked; await ctx.save(checked ? "Full-size images on." : "Full-size images off."); } ) ); rows.push( ctx.selectRow( "Media layout", ctx.options.settings.media.layout, MEDIA_LAYOUT_OPTIONS, async (value) => { ctx.options.settings.media.layout = ctx.coerceLayout(value); await ctx.save("Media layout saved."); } ) ); rows.push( ctx.textInputRow( "Filename template", "Fields: {handle}, {account}, {tweetId}, {mediaId}, {index}, {total}, {date}, {text}, {ext}. {account} is an alias for the publishing handle and can create per-account folders.", ctx.options.settings.media.filenameTemplate, async (value) => { ctx.options.settings.media.filenameTemplate = value.length > 0 ? value : "{handle}_{tweetId}_{index}"; await ctx.save("Filename template saved."); } ) ); rows.push( ctx.selectRow( "Metadata sidecar", ctx.options.settings.media.sidecarFormat, [ ["off", "Off"], ["text", "Text"], ["json", "JSON"] ], async (value) => { if (value === "off" || value === "text" || value === "json") { ctx.options.settings.media.sidecarFormat = value; await ctx.save("Media sidecar preference saved."); } }, "Save a local text or JSON companion after each completed media download." ) ); rows.push( ctx.toggleRow( "Match visually similar images", "Compare a 256-bit visual signature too. Similar flat compositions can be mistaken for a match, so this stays off by default.", ctx.options.settings.media.perceptualDedup, async (checked) => { ctx.options.settings.media.perceptualDedup = checked; await ctx.save(checked ? "Visual duplicate matching on." : "Visual duplicate matching off."); } ) ); rows.push( ctx.toggleRow( "Duplicate history", "Skip the same X asset or exact image bytes without storing its source URL.", ctx.options.settings.media.downloadHistory, async (checked) => { ctx.options.settings.media.downloadHistory = checked; await ctx.save(checked ? "Duplicate history on." : "Duplicate history off."); } ) ); rows.push( ctx.integerInputRow( "Concurrent downloads", "Maximum media downloads in flight during a batch (1-6).", ctx.options.settings.jobs.concurrentDownloads, async (value) => { ctx.options.settings.jobs.concurrentDownloads = Math.max(1, Math.min(6, Math.trunc(value))); await ctx.save("Concurrent download limit saved."); }, { min: 1, max: 6 } ) ); rows.push( ctx.selectRow( "Download pacing", ctx.options.settings.jobs.rateLimitMode, [ ["conservative", "Conservative"], ["balanced", "Balanced"] ], async (value) => { if (value === "conservative" || value === "balanced") { ctx.options.settings.jobs.rateLimitMode = value; await ctx.save("Download pacing saved."); } }, "Controls the opening burst and sustained pace of batch media requests." ) ); if (ctx.options.runMediaBatch) { rows.push( ctx.actionRow( "Download all visible media", "Queue every photo, video, GIF, thumbnail, audio track, and caption track currently visible on this page.", async () => { ctx.setStatus("Downloading media from this view\u2026"); try { const result = await ctx.options.runMediaBatch(); ctx.render(); ctx.setStatus( result.cancelled ? `Batch cancelled: ${result.downloaded} saved / ${result.started} running / ${result.opened} opened / ${result.duplicate} dup / ${result.failed} failed (of ${result.total}).` : `Batch finished: ${result.downloaded} saved / ${result.started} running / ${result.opened} opened / ${result.duplicate} dup / ${result.failed} failed (of ${result.total}).` ); } catch (error) { ctx.options.onError("Batch download failed", error); ctx.setStatus("Batch download failed."); } } ) ); } const status = ctx.options.getMediaStatus?.(); if (status) { rows.push( ctx.dataRow( "Download status", `${status.running} running / ${status.queued ?? 0} queued / ${status.paused ?? 0} paused / ${status.completed} done / ${status.opened ?? 0} opened / ${status.duplicate} dup / ${status.failed} failed` ) ); if (status.batch) { rows.push( ctx.dataRow( "Active media batch", `${status.batch.status} \xB7 ${status.batch.downloaded} saved / ${status.batch.started} running / ${status.batch.opened} opened / ${status.batch.duplicate} dup / ${status.batch.failed} failed of ${status.batch.total}` ) ); } rows.push(ctx.dataRow("History entries", String(status.historySize))); rows.push( ctx.dataRow( "Duplicate matches", `${status.historyMatches.exact} exact / ${status.historyMatches.identity} same X asset / ${status.historyMatches.perceptual} visual` ) ); if (status.qualityReceipts) { rows.push( ctx.dataRow( "Quality receipts", `${status.qualityReceipts.original} original / ${status.qualityReceipts.bestDirect} best direct / ${status.qualityReceipts.fallback} fallback / ${status.qualityReceipts.unknown} unknown` ) ); } rows.push( ctx.dataRow( "Last duplicate match", status.lastHistoryMatch === "exact" ? "Exact downloaded bytes" : status.lastHistoryMatch === "identity" ? "Same X media asset" : status.lastHistoryMatch === "perceptual" ? "Visually similar image" : "No duplicate match recorded" ) ); } if (ctx.options.clearMediaHistory) { rows.push( ctx.actionRow("Clear download history", "Reset the local dedup index.", async () => { try { await ctx.options.clearMediaHistory?.(); await ctx.save("History cleared."); } catch (error) { ctx.options.onError("Could not clear download history", error); ctx.setStatus("Could not clear history."); } }) ); } if (ctx.options.exportMediaHistory) { const row = ctx.el("div", "av-row av-row-stack av-media-history-export"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("Export download history")), ctx.el("span", "av-row-description", ctx.t("Export the local dedup records as JSON and CSV for a chosen date range. Source media URLs are never included.")) ); const controls = ctx.el("div", "av-inline-controls"); const from = document.createElement("input"); from.type = "date"; from.className = "av-text-input"; from.setAttribute("aria-label", ctx.t("History start date")); const to = document.createElement("input"); to.type = "date"; to.className = "av-text-input"; to.setAttribute("aria-label", ctx.t("History end date")); const exportButton = ctx.button(ctx.t("Export range"), "av-button av-button-secondary"); exportButton.addEventListener("click", () => { exportButton.disabled = true; void ctx.options.exportMediaHistory({ from: from.value || null, to: to.value || null }).then((result) => { ctx.setStatusCopy("History exported: {records} records in {files} files.", { records: result.records, files: result.files }); }).catch((error) => { ctx.options.onError("Download history export failed", error); ctx.setStatus("Could not export download history."); }).finally(() => { exportButton.disabled = false; }); }); controls.append(from, to, exportButton); row.append(copy2, controls); rows.push(row); } if (ctx.options.getCapturedMediaCount && ctx.options.runCapturedMediaBatch) { const followOns = [ [ "audio", ctx.t("Download captured audio"), ctx.t("Download audio tracks already present in local captures. No metadata discovery request is made.") ], [ "subtitle", ctx.t("Download captured captions"), ctx.t("Download caption tracks already present in local captures. No metadata discovery request is made.") ] ]; for (const [kind, label, description] of followOns) { const count = ctx.options.getCapturedMediaCount("", kind); if (count === 0) continue; rows.push( ctx.actionRow( label, { source: `${description} {count} available.`, values: { count } }, async () => { const result = await ctx.options.runCapturedMediaBatch("", kind); ctx.render(); ctx.setStatusCopy("Captured media finished: {downloaded} saved / {duplicate} dup / {failed} failed.", { downloaded: result.downloaded, duplicate: result.duplicate, failed: result.failed }); }, "That batch could not run. Grant download access on the Aviary permissions page, then try again." ) ); } } const mediaControlAction = (label, description, action, success) => { rows.push( ctx.actionRow( label, description, async () => { const result = action(); if (!result.ok) { throw new Error(result.error ?? `${label} failed`); } ctx.render(); ctx.setStatus(success); }, "The batch did not take that instruction. It may have already finished. Reopen this section to see its current state." ) ); }; if (ctx.options.pauseMediaBatch) { mediaControlAction( "Pause media batch", "Stop starting new downloads; the current downloads finish and the queue remains resumable.", ctx.options.pauseMediaBatch, "Media batch paused." ); } if (ctx.options.resumeMediaBatch) { mediaControlAction( "Resume media batch", "Continue the active batch from its durable queue.", ctx.options.resumeMediaBatch, "Media batch resumed." ); } if (ctx.options.cancelMediaBatch) { mediaControlAction( "Cancel media batch", "Stop scheduling new downloads and leave unfinished queue entries available for recovery.", ctx.options.cancelMediaBatch, "Media batch cancelling." ); } if (ctx.options.resumePendingMediaJobs) { rows.push( ctx.actionRow( "Resume queued media", "Recover paused or queued downloads from an earlier session.", async () => { const result = await ctx.options.resumePendingMediaJobs(); ctx.render(); ctx.setStatus( result.cancelled ? `Queued media recovery cancelled after ${result.downloaded} saved, ${result.started} still running, and ${result.opened} opened.` : `Queued media recovery finished: ${result.downloaded} saved / ${result.started} running / ${result.opened} opened / ${result.failed} failed.` ); }, "The queued downloads could not be resumed. Grant download access on the Aviary permissions page, then try again." ) ); } if (ctx.options.retryFailedMediaJobs) { rows.push( ctx.actionRow( "Retry failed media", "Retry every failed or cancelled media job in the durable queue.", async () => { const result = await ctx.options.retryFailedMediaJobs(); ctx.render(); ctx.setStatus( result.total === 0 ? "No failed media jobs to retry." : `Media retry finished: ${result.downloaded} saved / ${result.started} running / ${result.opened} opened / ${result.failed} failed.` ); }, "The failed downloads could not be retried. Grant download access on the Aviary permissions page, then try again." ) ); } return rows; } // src/ui/control-center/sections/reading.ts function buildAppearanceRows(ctx) { const rows = [ ctx.selectRow("Theme", ctx.options.settings.appearance.theme, [ ["off", "Off (X's own theme)"], ["dim", "Dim"], ["lightsOut", "Lights out"], ["graphite", "Graphite"], ["plum", "Plum"], ["midnight", "Midnight"], ["noir", "Noir (default)"] ], async (value) => { if (!ctx.isThemeId(value)) { ctx.setStatus("Theme value is not supported."); return; } ctx.options.settings.appearance.theme = value; await ctx.save("Theme updated."); }, "Noir is applied automatically. Choose Off to use X's own styling."), ctx.toggleRow("Dense mode", "Tighten timeline spacing for scanning.", ctx.options.settings.appearance.denseMode, async (checked) => { ctx.options.settings.appearance.denseMode = checked; await ctx.save("Density updated."); }), ctx.selectRow( "Timeline width", ctx.options.settings.appearance.timelineWidth, [ ["default", "Default"], ["comfortable", "Comfortable"], ["wide", "Wide (default)"] ], async (value) => { ctx.options.settings.appearance.timelineWidth = value; await ctx.save("Timeline width updated."); }, "Wide uses a centered reading lane and hides the discovery rail. Comfortable keeps that rail." ), ctx.toggleRow( "Restore the Chirp font", "Force X's own Chirp typeface where the site has fallen back to a system font.", ctx.options.settings.appearance.restoreChirp, async (checked) => { ctx.options.settings.appearance.restoreChirp = checked; await ctx.save(checked ? "Chirp font on." : "Chirp font off."); } ), ctx.toggleRow( "Hide engagement counts", "Master switch for the four numbers below. The controls still work and screen readers still announce the totals.", ctx.options.settings.appearance.hideCounts, async (checked) => { ctx.options.settings.appearance.hideCounts = checked; await ctx.save(checked ? "Engagement counts hidden." : "Engagement counts shown."); } ), ctx.toggleRow( "Hide reply counts", "Applies while Hide engagement counts is on.", ctx.options.settings.appearance.countMetrics.replies, async (checked) => { ctx.options.settings.appearance.countMetrics = { ...ctx.options.settings.appearance.countMetrics, replies: checked }; await ctx.save("Count preference saved."); } ), ctx.toggleRow( "Hide repost counts", "Applies while Hide engagement counts is on.", ctx.options.settings.appearance.countMetrics.reposts, async (checked) => { ctx.options.settings.appearance.countMetrics = { ...ctx.options.settings.appearance.countMetrics, reposts: checked }; await ctx.save("Count preference saved."); } ), ctx.toggleRow( "Hide like counts", "Applies while Hide engagement counts is on.", ctx.options.settings.appearance.countMetrics.likes, async (checked) => { ctx.options.settings.appearance.countMetrics = { ...ctx.options.settings.appearance.countMetrics, likes: checked }; await ctx.save("Count preference saved."); } ), ctx.toggleRow( "Hide view counts", "Applies while Hide engagement counts is on. The view total lives in an analytics link, not an action button.", ctx.options.settings.appearance.countMetrics.views, async (checked) => { ctx.options.settings.appearance.countMetrics = { ...ctx.options.settings.appearance.countMetrics, views: checked }; await ctx.save("Count preference saved."); } ), ctx.toggleRow( "Hide the tab title badge", "Remove X's unread count from the browser tab title, so a hidden notification badge is not restored by the tab.", ctx.options.settings.appearance.hideTitleBadge, async (checked) => { ctx.options.settings.appearance.hideTitleBadge = checked; await ctx.save(checked ? "Tab title badge hidden." : "Tab title badge shown."); } ), ctx.toggleRow( "Absolute timestamps", "Show the exact date and time on every post instead of X's relative text.", ctx.options.settings.appearance.absoluteTimestamps, async (checked) => { ctx.options.settings.appearance.absoluteTimestamps = checked; await ctx.save(checked ? "Absolute timestamps on." : "Absolute timestamps off."); } ), ctx.toggleRow( "Use Aviary's tab icon", "Replace X's favicon with Aviary's mark so its tabs are easy to pick out. Restores X's own icon when off.", ctx.options.settings.appearance.replaceFavicon, async (checked) => { ctx.options.settings.appearance.replaceFavicon = checked; await ctx.save(checked ? "Aviary tab icon on." : "X tab icon restored."); } ), ctx.toggleRow( "Hide row borders", "Remove the 1px divider under each timeline post and the primary column's side rules.", ctx.options.settings.appearance.hideBorders, async (checked) => { ctx.options.settings.appearance.hideBorders = checked; await ctx.save(checked ? "Row borders hidden." : "Row borders restored."); } ), ctx.toggleRow("High contrast", "Use stronger borders and text contrast.", ctx.options.settings.accessibility.highContrast, async (checked) => { ctx.options.settings.accessibility.highContrast = checked; await ctx.save("Contrast preference saved."); }), ctx.selectRow( "Reduced motion", ctx.options.settings.accessibility.reduceMotion, [ ["system", "Follow system setting"], ["always", "Always reduce"], ["never", "Never reduce"] ], async (value) => { ctx.options.settings.accessibility.reduceMotion = ctx.coerceReduceMotion(value); await ctx.save("Motion preference saved."); } ) ]; const cssRows = [ ["posts", "Posts CSS", "Scoped to rendered posts. Example: article { border-radius: 18px; }"], ["media", "Media actions CSS", "Scoped to Aviary media buttons and their contents."], ["navigation", "Navigation CSS", "Scoped to X's navigation rail."], ["sidebar", "Sidebar CSS", "Scoped to X's discovery sidebar."], ["composer", "Composer CSS", "Scoped to the composer toolbar and text area."] ]; rows.push( ctx.readonlyRow( "Custom CSS", "Optional local overrides for the scoped surfaces below. CSS never leaves this profile and is not covered by bug-report expectations." ) ); for (const [scope, label, description] of cssRows) { rows.push( ctx.textareaRow( label, description, ctx.options.settings.appearance.customCss[scope].split(/\r?\n/), async (lines) => { const candidate = lines.join("\n"); const sanitized = sanitizeCustomCss(candidate); ctx.options.settings.appearance.customCss[scope] = sanitized.value; await ctx.save( sanitized.changed && sanitized.value.length === 0 ? `${label} rejected unsafe or malformed CSS.` : `${label} saved.` ); }, "Apply" ) ); } return rows; } function buildLayoutRows(ctx) { const hooks = ctx.options.getPageHooks?.(); ctx.t("Protection starts at document load."); const rows = [ ctx.toggleRow( "Ad-free mode", "Collapse sponsored posts, paid partnerships, promoted trends, house promos, and visible pre-rolls. Aviary also refuses X's separate promoted-content logging call without blocking timeline delivery.", ctx.options.settings.privacy.blockAds, async (checked) => { ctx.options.settings.privacy.blockAds = checked; await ctx.save(checked ? "Ad-free mode on." : "Ad-free mode off."); } ), ctx.toggleRow( "Refuse X's ad logging call", "Only applies while Ad-free mode is on. Aviary refuses exactly one request (X's separate promoted-content logging call) and nothing else, including the checks X uses to notice an ad blocker. Turn this off if X complains anyway: sponsored posts stay hidden and Aviary stops refusing any request at all.", ctx.options.settings.privacy.networkShield, async (checked) => { ctx.options.settings.privacy.networkShield = checked; await ctx.save(checked ? "Ad logging refused." : "Ad logging allowed."); } ), hooks ? ctx.dataRow( "Ad protection status", `${hooks.hiddenPlacements} placements removed \xB7 ${hooks.blockedAdRequests} logging calls refused${hooks.suppressedVideoAds > 0 ? ` \xB7 ${hooks.suppressedVideoAds} pre-rolls suppressed` : ""}` ) : ctx.readonlyRow("Ad protection status", "Protection starts at document load."), ctx.toggleRow("Hide right sidebar", "Reduce trends, recommendations, and footer noise.", ctx.options.settings.layout.hideRightSidebar, async (checked) => { ctx.options.settings.layout.hideRightSidebar = checked; await ctx.save("Sidebar preference saved."); }), ctx.toggleRow("Hide trends", "Remove trending topics and news modules.", ctx.options.settings.layout.hideTrends, async (checked) => { ctx.options.settings.layout.hideTrends = checked; await ctx.save("Trend preference saved."); }), ctx.toggleRow( "Hide follow suggestions", "Remove Who to follow cards without hiding the rest of the sidebar.", ctx.options.settings.layout.hideFollowSuggestions, async (checked) => { ctx.options.settings.layout.hideFollowSuggestions = checked; await ctx.save("Layout preference saved."); } ), ctx.toggleRow( "Hide home composer", "Remove the quick-post composer from Home. The Post button still opens it when needed.", ctx.options.settings.layout.hideHomeComposer, async (checked) => { ctx.options.settings.layout.hideHomeComposer = checked; await ctx.save("Layout preference saved."); } ), ctx.toggleRow( "Hide thread recommendations", "Stop a conversation at its last real reply by collapsing the Discover more block and the suggested posts below it.", ctx.options.settings.layout.hideThreadRecommendations, async (checked) => { ctx.options.settings.layout.hideThreadRecommendations = checked; await ctx.save("Layout preference saved."); } ), ctx.toggleRow("Hide Grok surfaces", "Remove the Grok drawer, navigation link, image-generation entries, and per-post actions where detected.", ctx.options.settings.layout.hideGrok, async (checked) => { ctx.options.settings.layout.hideGrok = checked; await ctx.save("Grok preference saved."); }), ctx.toggleRow( "Suppress hover previews", "Stop X opening a profile card or tooltip when the pointer rests on a name, avatar or control, and remove native tooltip bubbles. Menus you click, labels, and screen-reader names are left alone.", ctx.options.settings.layout.suppressHoverPreviews, async (checked) => { ctx.options.settings.layout.suppressHoverPreviews = checked; await ctx.save("Hover preference saved."); } ), ctx.toggleRow( "Focus mode", "Outside the hours below, cover the reading column with a calm local panel. Navigation stays usable and a five-minute override is one click away. Nothing is blocked and nothing leaves this device.", ctx.options.settings.layout.focusMode, async (checked) => { ctx.options.settings.layout.focusMode = checked; await ctx.save(checked ? "Focus mode on." : "Focus mode off."); } ), ctx.textInputRow( "Reading hours start", "24-hour time, for example 09:00.", ctx.options.settings.layout.focusStart, async (value) => { ctx.options.settings.layout.focusStart = value; await ctx.save("Reading hours saved."); } ), ctx.textInputRow( "Reading hours end", "24-hour time. An end before the start wraps past midnight.", ctx.options.settings.layout.focusEnd, async (value) => { ctx.options.settings.layout.focusEnd = value; await ctx.save("Reading hours saved."); } ), ctx.integerInputRow( "Stop the timeline after", "Posts to show before the feed stops extending, with a control to continue. Zero leaves X's endless scroll alone. Nothing already on screen moves, and the control appears below the last post rather than above it.", ctx.options.settings.layout.timelineStopAfter, async (value) => { ctx.options.settings.layout.timelineStopAfter = value; await ctx.save( value > 0 ? `Timeline stops after ${value} posts.` : "Timeline scrolls without stopping." ); }, { min: 0, max: 1e3 } ), ctx.toggleRow( "Expand long posts automatically", "Click only the post's own Show more control after scrolling stops. Replies, sidebars, quoted posts, and other Show more links are left alone.", ctx.options.settings.layout.autoExpandPostText, async (checked) => { ctx.options.settings.layout.autoExpandPostText = checked; await ctx.save(checked ? "Long posts expand automatically." : "Long posts stay collapsed."); } ), ctx.toggleRow( "Restore position after Back", "Return to the same visible post after opening a post or another X page and using the browser Back button. Any wheel, touch, pointer, or keyboard scroll cancels the restore immediately.", ctx.options.settings.layout.restoreTimelinePosition, async (checked) => { ctx.options.settings.layout.restoreTimelinePosition = checked; await ctx.save(checked ? "Back navigation restores your place." : "Back navigation uses X's position."); } ), ctx.toggleRow( "Show read marker", "Keep a local position for each feed and show a new since you last looked line. It never adds an unread badge.", ctx.options.settings.layout.readMarker, async (checked) => { ctx.options.settings.layout.readMarker = checked; await ctx.save(checked ? "Read marker on." : "Read marker off."); } ), ctx.surfaceRow( "Read marker surfaces", "Choose where the local position marker and new-post separator appear.", ctx.options.settings.layout.readMarkerSurfaces, async (surfaces) => { ctx.options.settings.layout.readMarkerSurfaces = surfaces; await ctx.save("Read marker surfaces saved."); } ), ctx.toggleRow( "Writer mode", "While focus is in the composer, fade the sidebar and the timeline behind it. Everything returns the moment you click away.", ctx.options.settings.layout.writerMode, async (checked) => { ctx.options.settings.layout.writerMode = checked; await ctx.save(checked ? "Writer mode on." : "Writer mode off."); } ), ctx.toggleRow( "Open Following instead of For you", "Selects the second home tab each time you arrive at the timeline. Switch back to For you and it stays there until you navigate away.", ctx.options.settings.layout.forceFollowing, async (checked) => { ctx.options.settings.layout.forceFollowing = checked; await ctx.save(checked ? "Following timeline on." : "Following timeline off."); } ), ctx.toggleRow( "Hide For You tab", "Selects Following, then collapses the first Home tab. It only affects Home and restores immediately when turned off.", ctx.options.settings.layout.hideForYouTab, async (checked) => { ctx.options.settings.layout.hideForYouTab = checked; await ctx.save(checked ? "For You tab hidden." : "For You tab restored."); } ), ctx.toggleRow( "Open posts from the reply icon only", "X makes the whole row a link, so a press on the text or beside a control opens a post you did not choose. This takes the click target off the row and gives it to the reply icon, which opens the post rather than the inline composer. Links, buttons, media and quoted posts keep working.", ctx.options.settings.layout.openFromReplyOnly, async (checked) => { ctx.options.settings.layout.openFromReplyOnly = checked; await ctx.save(checked ? "Posts open from the reply icon." : "Posts open from the row again."); } ) ]; rows.push( ctx.textareaRow( "Hide navigation items", "One stable X navigation id per line: home, explore, notifications, follow, chat, messages, grok, history, studio, premium, profile, or more.", ctx.options.settings.layout.hideNavItems, async (lines) => { ctx.options.settings.layout.hideNavItems = [...new Set( lines.map((line) => line.trim().toLowerCase()).filter((line) => HIDE_NAV_ITEM_IDS.has(line)) )].slice(0, 24); await ctx.save("Navigation visibility saved."); } ) ); return rows; } function buildPerformanceRows(ctx) { const rows = []; rows.push( ctx.toggleRow( "Pause video that scrolls out of view", "Stops decoding timeline video once it leaves the screen, and resumes it when it comes back. A video you paused yourself stays paused.", ctx.options.settings.performance.pauseOffscreenVideo, async (checked) => { ctx.options.settings.performance.pauseOffscreenVideo = checked; await ctx.save(checked ? "Offscreen video paused." : "Offscreen video left playing."); } ) ); rows.push( ctx.toggleRow( "Keep video playing when the tab loses focus", "X stops a playing video when you switch tabs. This resumes it when you come back. A video you paused yourself stays paused.", ctx.options.settings.performance.keepVideoPlaying, async (checked) => { ctx.options.settings.performance.keepVideoPlaying = checked; await ctx.save(checked ? "Video keeps playing." : "Video pauses with the tab."); } ) ); rows.push( ctx.toggleRow( "Loop videos", "Restart a video when it reaches the end instead of stopping.", ctx.options.settings.performance.loopVideos, async (checked) => { ctx.options.settings.performance.loopVideos = checked; await ctx.save(checked ? "Video looping on." : "Video looping off."); } ) ); rows.push( ctx.toggleRow( "Pin video playlists to their best rendition", "When X hands Aviary a playlist listing several qualities, keep only the highest. X often settles below the best available on a fast connection. This uses more data, and it can only act on playlists Aviary sees.", ctx.options.settings.performance.forceVideoQuality, async (checked) => { ctx.options.settings.performance.forceVideoQuality = checked; await ctx.save(checked ? "Playlist pinning on." : "Playlist pinning off."); } ) ); const hooks = ctx.options.getPageHooks?.(); if (hooks && ctx.options.settings.performance.forceVideoQuality) { rows.push( ctx.dataRow( "Playlists rewritten", ctx.localizedCopy("{count} this session", { count: hooks.rewrittenPlaylists }) ) ); } return rows; } function buildFilterRows(ctx) { const rows = []; ctx.t("Rules are active on the selected routes."); rows.push( ctx.toggleRow( "Enable filters", "Master switch for keyword, regex, premium, and media filters.", ctx.options.settings.filter.enabled, async (checked) => { ctx.options.settings.filter.enabled = checked; await ctx.save(checked ? "Filters enabled." : "Filters disabled."); } ) ); rows.push( ctx.readonlyRow( "Rule status", ctx.options.settings.filter.enabled ? "Rules are active on the selected routes." : "Inactive until filters are enabled. You can edit rules before turning them on." ) ); rows.push( ctx.toggleRow( "Dim posts you have already seen", "Fade a post the second time it scrolls past, and keep a local catch-up copy of posts Aviary has rendered. Hovering a faded post brings it back.", ctx.options.settings.filter.dimSeenPosts, async (checked) => { ctx.options.settings.filter.dimSeenPosts = checked; await ctx.save(checked ? "Seen-post dimming on." : "Seen-post dimming off."); } ) ); rows.push( ctx.surfaceRow( "Hide seen posts on", "Choose the feed surfaces where posts you have already seen are dimmed.", ctx.options.settings.filter.dimSeenSurfaces, async (surfaces) => { ctx.options.settings.filter.dimSeenSurfaces = surfaces; await ctx.save("Seen-post surfaces saved."); } ) ); if (ctx.options.clearSeenPosts) { rows.push( ctx.actionRow( "Forget seen posts", "Clear the stored post IDs so everything reads as unseen again.", async () => { try { await ctx.options.clearSeenPosts(); ctx.setStatus("Seen posts forgotten."); } catch (error) { ctx.options.onError("Could not clear seen posts", error); ctx.setStatus("Could not clear seen posts."); } } ) ); } rows.push( ctx.textareaRow( "Filter rules", "One rule per line: field, optional not, operator, value. Fields are text, handle, media, verified, link; operators are contains, is, starts, ends, matches. Join with and / or, and prefix dim: to fade instead of hide. Name a rule by starting the line with [a title], and give it a limited life with for 7d from . Example: [Weekend sales] dim for 7d from 2026-08-19T10:00:00.000Z: text contains sale and media is photo", ctx.options.settings.filter.rules, async (lines) => { ctx.options.settings.filter.rules = lines.slice(0, 100); await ctx.save("Filter rules saved."); } ) ); const ruleProblems = ctx.options.getFilterRuleErrors?.() ?? []; if (ruleProblems.length > 0) { rows.push( ctx.dataRow( "Rules that could not be read", // Both editors number from their own line 1, so the box has to be named or the reader is // sent to an innocent line in the wrong one. ruleProblems.map((problem) => { const box = problem.origin === "regex" ? ctx.t("Regex rules") : ctx.t("Filter rules"); return `${box} ${ctx.t("line")} ${problem.line}: ${problem.message}`; }).join(" \xB7 ") ) ); } if (ctx.options.exportFilterRules && ctx.options.previewFilterRuleImport && ctx.options.applyFilterRuleImport) { rows.push(portableRuleSetRow(ctx)); } const expiredRules2 = ctx.options.getExpiredFilterRules?.() ?? []; if (expiredRules2.length > 0) { rows.push( ctx.dataRow( "Expired rules", expiredRules2.map((rule) => rule.title ?? rule.source).join(" \xB7 ") ) ); if (ctx.options.renewFilterRules) { rows.push( ctx.actionRow( "Renew expired rules", "Restart each expired rule's own window from now. Nothing is deleted when a rule expires, so a rule can always be brought back.", async () => { try { const renewed = await ctx.options.renewFilterRules(); ctx.setStatusCopy(renewed === 1 ? "Renewed {count} rule." : "Renewed {count} rules.", { count: String(renewed) }); ctx.render(); } catch (error) { ctx.options.onError("Could not renew filter rules", error); ctx.setStatus("Could not renew the expired rules."); } } ) ); } } rows.push( ctx.textareaRow( "Keyword rules", "One keyword or phrase per line. Case-insensitive substring match.", ctx.options.settings.filter.keywordRules, async (lines) => { ctx.options.settings.filter.keywordRules = lines.slice(0, 200); await ctx.save(`Saved ${ctx.options.settings.filter.keywordRules.length} keyword rules.`); } ) ); rows.push( ctx.textareaRow( "Regex rules", "One pattern per line. Use /pattern/flags or a bare pattern (case-insensitive).", ctx.options.settings.filter.regexRules, async (lines) => { ctx.options.settings.filter.regexRules = lines.slice(0, 100); await ctx.save(`Saved ${ctx.options.settings.filter.regexRules.length} regex rules.`); } ) ); rows.push( ctx.textareaRow( "Whitelist handles", "Handles (one per line, no @) that are never filtered.", ctx.options.settings.filter.whitelist, async (lines) => { ctx.options.settings.filter.whitelist = lines.map((line) => line.replace(/^@/, "").trim()).filter((line) => /^[A-Za-z0-9_]{1,15}$/.test(line)).slice(0, 200); await ctx.save(`Saved ${ctx.options.settings.filter.whitelist.length} whitelist handles.`); } ) ); rows.push( ctx.selectRow( "Premium / verified posts", ctx.options.settings.filter.premiumRule, FILTER_ACTION_OPTIONS, async (value) => { ctx.options.settings.filter.premiumRule = ctx.coerceFilterAction(value); await ctx.save("Premium filter saved."); } ) ); rows.push( ctx.selectRow( "Quote posts", ctx.options.settings.filter.quotePosts, FILTER_ACTION_OPTIONS, async (value) => { ctx.options.settings.filter.quotePosts = ctx.coerceFilterAction(value); await ctx.save("Quote post filter saved."); }, "Posts that quote another post." ) ); rows.push( ctx.toggleRow( "Hide replies with images, GIFs or video", "Under a post you opened, drop every reply that carries a photo, a GIF or a video. Text alongside it makes no difference, since most memes come captioned. The post itself and the thread above it are untouched, and a reply that only quotes a post with a picture stays. This works on its own, without the filters above, because pointing those at a conversation would hide the post you came to read.", ctx.options.settings.filter.hideMediaReplies, async (checked) => { ctx.options.settings.filter.hideMediaReplies = checked; await ctx.save(checked ? "Media replies hidden." : "Media replies shown again."); } ) ); rows.push( ctx.selectRow( "Say why a post was filtered", ctx.options.settings.filter.showReason, FILTER_REASON_OPTIONS, async (value) => { ctx.options.settings.filter.showReason = isFilterReasonMode(value) ? value : ctx.options.settings.filter.showReason; await ctx.save("Filter reason setting saved."); }, "A filter that hides silently is hard to tell from a bug. Dimmed posts can name what caught them at no cost to the layout; the third setting also turns a hidden post into a one-line strip that says why and opens when you hover or tab into it." ) ); rows.push( ctx.selectRow( "Low-engagement posts", ctx.options.settings.filter.engagementRule, FILTER_ACTION_OPTIONS, async (value) => { ctx.options.settings.filter.engagementRule = ctx.coerceFilterAction(value); await ctx.save("Engagement filter saved."); }, "Posts under the minimum below. A post whose count Aviary cannot read is never filtered on it." ) ); rows.push( ctx.selectRow( "Engagement measured in", ctx.options.settings.filter.engagementMetric, ENGAGEMENT_METRIC_OPTIONS, async (value) => { ctx.options.settings.filter.engagementMetric = isEngagementMetric(value) ? value : ctx.options.settings.filter.engagementMetric; await ctx.save("Engagement metric saved."); }, "Which of the counts under a post the minimum applies to." ) ); rows.push( ctx.integerInputRow( "Minimum engagement", "Posts below this count are filtered. Zero leaves every post alone.", ctx.options.settings.filter.engagementMin, async (value) => { ctx.options.settings.filter.engagementMin = value; await ctx.save(`Engagement floor set to ${value}`); }, { min: 0, max: 1e6 } ) ); for (const key of FILTER_MEDIA_KEYS) { const label = FILTER_MEDIA_LABELS[key]; const current = ctx.options.settings.filter.mediaTypes[key] === true; rows.push( ctx.toggleRow( `Hide posts with ${label.toLowerCase()}`, `Filter posts containing ${label.toLowerCase()}.`, current, async (checked) => { ctx.options.settings.filter.mediaTypes = { ...ctx.options.settings.filter.mediaTypes, [key]: checked }; await ctx.save(`${label} filter ${checked ? "on" : "off"}`); } ) ); } rows.push( ctx.surfaceRow( "Active on", "Routes where filters run.", ctx.options.settings.filter.surfaces, async (next) => { ctx.options.settings.filter.surfaces = next; await ctx.save( next.length > 0 ? `Filters active on ${next.length} route${next.length === 1 ? "" : "s"}` : "Filters off on every route." ); } ) ); rows.push( ctx.readonlyRow( "Blocked accounts / self-reposts", "Pending an authenticated fixture; controls stay disabled." ) ); return rows; } function portableRuleSetRow(ctx) { const row = ctx.el("div", "av-row av-row-stack av-rule-set-row"); row.dataset.avLabel = "Portable rule set"; const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("Portable rule set")), ctx.el( "span", "av-row-description", ctx.t("Export plain text, or paste a set to preview before adding or replacing rules.") ) ); const textarea = document.createElement("textarea"); textarea.className = "av-textarea av-rule-set-input"; textarea.value = ctx.state.pendingFilterRuleImport; textarea.placeholder = ctx.t("Paste rules here"); textarea.rows = 4; textarea.spellcheck = false; textarea.setAttribute("aria-label", ctx.t("Portable rule set")); const actions = ctx.el("div", "av-rule-set-actions"); const exportButton = ctx.button("Export .txt", "av-button av-button-secondary"); const previewButton = ctx.button("Preview", "av-button av-button-secondary"); const addButton = ctx.button("Add rules", "av-button av-button-primary"); const replaceButton = ctx.button("Replace rules", "av-button av-button-secondary"); const previewCopy = ctx.el("div", "av-rule-set-preview", ctx.t("Paste rules to see both import choices.")); previewCopy.setAttribute("role", "status"); previewCopy.setAttribute("aria-live", "polite"); const showPreview = () => { const preview = ctx.state.pendingFilterRulePreview; addButton.disabled = !preview || preview.add.errors.length > 0; replaceButton.disabled = !preview || preview.replace.errors.length > 0; previewCopy.dataset.avState = "ready"; if (!preview) { previewCopy.textContent = ctx.t("Paste rules to see both import choices."); return; } const parseErrors = preview.replace.errors; if (parseErrors.length > 0) { previewCopy.dataset.avState = "error"; previewCopy.textContent = parseErrors.map((problem) => `line ${problem.line}: ${problem.message}`).join(" \xB7 "); return; } if (preview.add.errors.length > 0) { previewCopy.dataset.avState = "error"; const problem = preview.add.errors[0]; previewCopy.textContent = ctx.localizedCopy( "{imported} rules found. Replace is ready. Add is blocked at line {line}: {error}", { imported: preview.imported, line: problem.line, error: problem.message } ); return; } previewCopy.textContent = ctx.localizedCopy( "{imported} rules found. Add {added}; {duplicates} already present. Replace {replaced} with {total}.", { imported: preview.imported, added: preview.add.added, duplicates: preview.add.duplicates, replaced: preview.replace.replaced, total: preview.replace.total } ); }; textarea.addEventListener("input", () => { ctx.state.pendingFilterRuleImport = textarea.value; ctx.state.pendingFilterRulePreview = null; showPreview(); }); exportButton.addEventListener("click", () => { if (ctx.guardDraft()) return; exportButton.disabled = true; void ctx.options.exportFilterRules().then((result) => { ctx.setStatusCopy("Rule set exported: {filename} ({count} lines).", { filename: result.filename, count: result.rules }); }).catch((error) => { ctx.options.onError("Could not export filter rules", error); ctx.setStatus("Could not export the rule set."); }).finally(() => { exportButton.disabled = false; }); }); previewButton.addEventListener("click", () => { try { ctx.state.pendingFilterRuleImport = textarea.value; ctx.state.pendingFilterRulePreview = ctx.options.previewFilterRuleImport( textarea.value, ctx.options.settings.filter.rules ); showPreview(); const errors = ctx.state.pendingFilterRulePreview.replace.errors.length; ctx.setStatus(errors > 0 ? "Rule set needs attention." : "Rule-set preview ready."); } catch (error) { ctx.options.onError("Could not preview filter rules", error); ctx.setStatus("Could not preview the rule set."); } }); const apply2 = (mode, button3) => { if (ctx.guardDraft()) return; button3.disabled = true; void ctx.options.applyFilterRuleImport(textarea.value, mode).then((plan) => { if (plan.errors.length > 0) { ctx.state.pendingFilterRulePreview = ctx.options.previewFilterRuleImport( textarea.value, ctx.options.settings.filter.rules ); showPreview(); ctx.setStatus("Rule set needs attention."); return; } ctx.options.settings.filter.rules = [...plan.lines]; ctx.state.pendingFilterRuleImport = ""; ctx.state.pendingFilterRulePreview = null; ctx.render(); if (mode === "add") { ctx.setStatusCopy("Added {count} rules.", { count: plan.added }); } else { ctx.setStatusCopy("Replaced the rule set with {count} rules.", { count: plan.total }); } }).catch((error) => { ctx.options.onError("Could not import filter rules", error); ctx.setStatus("Could not import the rule set."); }).finally(() => { button3.disabled = false; }); }; addButton.addEventListener("click", () => apply2("add", addButton)); replaceButton.addEventListener("click", () => apply2("replace", replaceButton)); actions.append(exportButton, previewButton, addButton, replaceButton); row.append(copy2, textarea, actions, previewCopy); showPreview(); return row; } function buildCatchUpRows(ctx) { const rows = []; const status = ctx.options.getCatchUpStatus?.(); if (!status?.tracking) { rows.push( ctx.readonlyRow( "Catch-up is waiting", "Turn on Dim posts you have already seen in Filtering. Catch-up uses only rows Aviary has already rendered." ) ); } else { rows.push( ctx.dataRow( "Posts available", `${status.records} rendered post${status.records === 1 ? "" : "s"} kept locally for 30 days.` ) ); } if (ctx.options.openCatchUp) { rows.push( ctx.actionRow( "Open catch-up digest", "Review a time window, filter by post type, group by author, and open the original post. No requests are made.", async () => { const result = ctx.options.openCatchUp(); ctx.setStatus(`Catch-up opened with ${result.count} post${result.count === 1 ? "" : "s"}.`); }, "The catch-up digest could not be opened. Nothing was lost, so reload the page and try again." ) ); } rows.push( ctx.readonlyRow( "What it includes", "Everything Aviary saw in the active browser profile. Filtered posts keep the reason written by the active filter rule." ) ); return rows; } function buildHiddenPostRows(ctx) { const rows = []; ctx.t("Hide buttons follow the setting above."); rows.push( ctx.toggleRow( "Hide dismissed posts", "Keep posts you hid collapsed so the next post rises to the top.", ctx.options.settings.hidden.enabled, async (checked) => { ctx.options.settings.hidden.enabled = checked; await ctx.save(checked ? "Hidden posts applied." : "Hidden posts revealed."); } ) ); rows.push( ctx.toggleRow( "Show hide buttons", "Adds a Hide control to every post next to the More menu.", ctx.options.settings.hidden.buttons, async (checked) => { ctx.options.settings.hidden.buttons = checked; await ctx.save(checked ? "Hide buttons on." : "Hide buttons off."); } ) ); rows.push( ctx.readonlyRow( "Hide button status", ctx.options.settings.hidden.enabled ? "Hide buttons follow the setting above." : "Activates when Hide dismissed posts is on." ) ); rows.push( ctx.surfaceRow( "Active on", "Routes where hiding and the Hide button apply.", ctx.options.settings.hidden.surfaces, async (next) => { ctx.options.settings.hidden.surfaces = next; await ctx.save( next.length > 0 ? `Hiding active on ${next.length} route${next.length === 1 ? "" : "s"}` : "Hiding off on every route." ); }, ["status"] ) ); rows.push( ctx.integerInputRow( "Maximum remembered posts", "Oldest entries are dropped once the store passes this size (100-50000).", ctx.options.settings.hidden.maxEntries, async (value) => { ctx.options.settings.hidden.maxEntries = value; await ctx.save(`Hidden post limit set to ${ctx.options.settings.hidden.maxEntries}`); }, // The same range the description states and the normalizer clamps to. Without it the panel // accepted anything, confirmed it, and let the next reload substitute a different number. { min: 100, max: 5e4 } ) ); const status = ctx.options.getHiddenPostsStatus?.(); if (!status) { rows.push(ctx.readonlyRow("Hidden posts", "Hidden post store unavailable in this build.")); return rows; } rows.push( ctx.dataRow( "Hidden posts stored", `${status.total}${status.updatedAt ? ` \xB7 updated ${status.updatedAt}` : ""}` ) ); if (ctx.options.undoLastHide) { rows.push( ctx.actionRow("Undo last hide", "Restores the most recently hidden post.", async () => { try { const result = await ctx.options.undoLastHide(); ctx.setStatus( result.restored ? `Restored ${result.handle ? `@${result.handle}` : "the last hidden post"}.` : "Nothing left to restore." ); ctx.render(); } catch (error) { ctx.options.onError("Could not undo the last hide", error); ctx.setStatus("Could not undo the last hide."); } }) ); } for (const entry of status.recent) { const row = ctx.el("div", "av-row av-row-stack"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", entry.handle ? `@${entry.handle}` : "Unknown account"), ctx.el( "span", "av-row-description", `${entry.hiddenAt} \xB7 ${entry.text.length > 0 ? entry.text : "(no text)"}` ) ); const restore = ctx.el("button", "av-button av-button-secondary", ctx.t("Restore")); restore.type = "button"; restore.addEventListener("click", () => { restore.disabled = true; void ctx.options.unhidePost?.(entry.key).then((restored) => { ctx.setStatus(restored ? "Post restored." : "That post was already restored."); ctx.render(); }).catch((error) => { ctx.options.onError("Could not restore the post", error); ctx.setStatus("Could not restore the post."); restore.disabled = false; }); }); row.append(copy2, restore); rows.push(row); } if (ctx.options.clearHiddenPosts && status.total > 0) { rows.push( ctx.actionRow( "Clear hidden posts", "Forgets every hidden post and brings them all back.", async () => { try { const removed = await ctx.options.clearHiddenPosts(); ctx.setStatusCopy( removed === 1 ? "Cleared {removed} hidden post." : "Cleared {removed} hidden posts.", { removed } ); ctx.render(); } catch (error) { ctx.options.onError("Could not clear hidden posts", error); ctx.setStatus("Could not clear hidden posts."); } } ) ); } return rows; } // src/ui/control-center/sections/presets.ts var COMMON_TASKS = [ { title: "Make X quieter", description: "Hide ads, trends, suggestions, and navigation you do not use.", section: "layout" }, { title: "Hide unwanted posts", description: "Filter by words, media, badges, or page.", section: "filtering" }, { title: "Save photos and videos", description: "Choose quality, filenames, duplicate checks, and queue behavior.", section: "media" }, { title: "Delete account activity", description: "Remove posts, replies, reposts, likes, or bookmarks.", section: "account" } ]; function buildPresetRows(ctx) { const rows = [buildCommonTasks(ctx)]; if (!ctx.options.listPresets || !ctx.options.applyPreset) { rows.push(ctx.readonlyRow("Ready-made setups", "Preset packs unavailable in this build.")); return rows; } for (const preset of ctx.options.listPresets()) { const row = ctx.el("div", "av-row av-row-stack av-preset-card"); row.dataset.avPreset = preset.id; row.dataset.avLabel = preset.label; const cardHeader = ctx.el("div", "av-preset-header"); const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t(preset.label)), ctx.el("span", "av-row-description", ctx.t(preset.description)) ); cardHeader.append(ctx.presetIcon(preset.id), copy2); const highlights = ctx.el("div", "av-preset-highlights"); for (const highlight of preset.highlights ?? []) { const preview = ctx.el("div", "av-preset-highlight"); preview.append( ctx.el("span", "av-preset-highlight-label", ctx.t(highlight.label)), ctx.el("span", "av-preset-highlight-value", ctx.t(highlight.value)) ); highlights.append(preview); } const apply2 = ctx.el("button", "av-button av-button-secondary", ctx.t("Apply")); apply2.type = "button"; apply2.addEventListener("click", () => { if (ctx.guardDraft()) return; apply2.disabled = true; void ctx.options.applyPreset(preset.id).then((result) => { ctx.render(); if (result.applied) { ctx.setStatusCopy("Preset applied: {preset} ({changes})", { preset: ctx.t(preset.label), changes: result.changes.length }); } else { ctx.setStatusCopy("Preset already applied: {preset}", { preset: ctx.t(preset.label) }); } }).catch((error) => { ctx.options.onError("Could not apply preset", error); ctx.setStatus("Could not apply preset."); }).finally(() => { apply2.disabled = false; }); }); row.append(cardHeader); if (highlights.childElementCount > 0) { row.append(highlights); } row.append(apply2); rows.push(row); } if (ctx.options.listLocales) { rows.push( ctx.selectRow( "Locale", ctx.options.settings.i18n.locale, ctx.options.listLocales().map((entry) => [entry.code, entry.label]), async (value) => { ctx.options.settings.i18n.locale = value; const entry = ctx.options.listLocales?.().find((locale) => locale.code === value); await ctx.save(`Locale set to ${entry?.label ?? value}`); }, "Translates the panel and sets reading direction, right-to-left for Arabic and Hebrew. Trust shows how much of the chosen locale is filled in; anything missing stays English.", false ) ); } return rows; } function buildCommonTasks(ctx) { const guide = ctx.el("div", "av-start-guide"); guide.dataset.avLabel = "Common tasks"; const note = ctx.el("div", "av-start-note"); note.setAttribute("role", "note"); note.append( ctx.el("strong", "av-start-note-title", ctx.t("How saving works")), ctx.el( "span", "av-start-note-copy", ctx.t("Switches and fields wait for Save. Buttons such as Apply, Export, Preview, and Delete run right away.") ) ); const cards = ctx.el("div", "av-start-task-grid"); for (const task of COMMON_TASKS) { const card = ctx.el("button", "av-start-task"); card.type = "button"; card.dataset.avOpenSection = task.section; card.append( ctx.el("span", "av-start-task-copy"), ctx.el("span", "av-start-task-action", ctx.t("Open settings")) ); const copy2 = card.querySelector(".av-start-task-copy"); copy2.append( ctx.el("strong", "av-start-task-title", ctx.t(task.title)), ctx.el("span", "av-start-task-description", ctx.t(task.description)) ); card.addEventListener("click", () => ctx.openSection(task.section)); cards.append(card); } guide.append(note, cards); return guide; } // src/features/account-cleanup/state.ts var ACCOUNT_CLEANUP_KEY = "aviary.accountCleanup.v1"; var ACCOUNT_CLEANUP_TAB_TOKEN_KEY = "aviary.accountCleanup.tabToken.v1"; var ACCOUNT_CLEANUP_CATEGORIES = [ "bookmarks", "likes", "reposts", "replies", "posts" ]; var ACCOUNT_CLEANUP_CATEGORY_DEFINITIONS = { bookmarks: { label: "Bookmarks", description: "Remove saved posts from X History.", route: () => "/i/history", acceptedRoutes: () => ["/i/history", "/i/bookmarks"] }, likes: { label: "Likes", description: "Remove likes from X History.", route: () => "/i/history/likes", acceptedRoutes: (handle) => ["/i/history/likes", `/${handle}/likes`] }, reposts: { label: "Reposts", description: "Undo reposts from your Reposts tab.", route: (handle) => `/${handle}/reposts`, acceptedRoutes: (handle) => [`/${handle}/reposts`] }, replies: { label: "Replies", description: "Delete replies written by you without touching parent posts.", route: (handle) => `/${handle}/with_replies`, acceptedRoutes: (handle) => [`/${handle}/with_replies`] }, posts: { label: "Posts", description: "Delete posts and quote posts written by you.", route: (handle) => `/${handle}`, acceptedRoutes: (handle) => [`/${handle}`] } }; var ACCOUNT_CLEANUP_PACING = { careful: { label: "Careful", minDelayMs: 2e3, maxDelayMs: 3500, batchSize: 40, batchPauseMs: 2e4 }, balanced: { label: "Balanced", minDelayMs: 1e3, maxDelayMs: 1800, batchSize: 60, batchPauseMs: 12e3 }, brisk: { label: "Brisk", minDelayMs: 400, maxDelayMs: 900, batchSize: 80, batchPauseMs: 6e3 } }; var ACCOUNT_CLEANUP_TIMING = { actionTimeoutMs: 8e3, menuTimeoutMs: 2500, scrollPauseMs: 1600, idleScrollLimit: 14, maxScrollsWithoutAction: 60, /** Consecutive stale outcomes for one item before it counts as a failed action. */ staleRetryLimit: 3, /** How long the signed-in handle may stay unreadable mid-pass before the run blocks. */ missingHandleLimitMs: 12e3, missingHandlePollMs: 500, requiredEmptyVerificationPasses: 1, likeRateWindowActionLimit: 500, likeRateWindowMs: 15 * 6e4, rateWindowGraceMs: 5e3, recoveryFailureThreshold: 2, maxPageRecoveryAttempts: 5, recoveryPauseBaseMs: 3e4, recoveryPauseMaxMs: 3e5, failureBackoffBaseMs: 4e3, failureBackoffMaxMs: 9e4, leaseMs: 3e4, leaseRenewMs: 1e4 }; function cleanupCopy(text, values) { return values ? { text, values } : { text }; } function formatAccountCleanupCopy(copy2, translate = (text) => text) { const values = localizeAccountCleanupValues(copy2, translate); return translate(copy2.text).replace( /\{(\w+)\}/g, (placeholder, key) => values[key] === void 0 ? placeholder : String(values[key]) ); } function localizeAccountCleanupValues(copy2, translate = (text) => text) { const values = {}; for (const [key, value] of Object.entries(copy2.values ?? {})) { if ((key === "category" || key === "categoryLower") && isAccountCleanupCategory(value)) { const label = translate(ACCOUNT_CLEANUP_CATEGORY_DEFINITIONS[value].label); values.category ??= label; values.categoryLower ??= label.toLocaleLowerCase(); } else { values[key] = value; } } return values; } var RESERVED_PATHS = /* @__PURE__ */ new Set([ "compose", "explore", "home", "i", "messages", "notifications", "search", "settings" ]); var HANDLE_PATTERN = /^[A-Za-z0-9_]{1,30}$/; function normalizeAccountCleanupHandle(value) { const candidate = String(value ?? "").trim().replace(/^@/, ""); if (!HANDLE_PATTERN.test(candidate)) return null; if (RESERVED_PATHS.has(candidate.toLocaleLowerCase())) return null; return candidate; } function accountCleanupHandleFromHref(href) { if (!href) return null; try { const parsed = new URL(href, "https://x.com"); return normalizeAccountCleanupHandle(parsed.pathname.split("/").filter(Boolean)[0]); } catch { return null; } } function readActiveAccountHandle(documentObject = document) { const profileLink = documentObject.querySelector( 'a[data-testid="AppTabBar_Profile_Link"]' ); const fromProfileLink = accountCleanupHandleFromHref(profileLink?.getAttribute("href")); if (fromProfileLink) return fromProfileLink; const accountSwitcher = documentObject.querySelector( '[data-testid="SideNav_AccountSwitcher_Button"]' ); const handleText = accountSwitcher?.textContent?.match(/@([A-Za-z0-9_]{1,30})/); return normalizeAccountCleanupHandle(handleText?.[1]); } function sameAccountCleanupHandle(left, right) { return Boolean(left && right && left.toLocaleLowerCase() === right.toLocaleLowerCase()); } function accountCleanupRouteFor(category, handle) { return ACCOUNT_CLEANUP_CATEGORY_DEFINITIONS[category].route(handle); } function accountCleanupRouteMatches(category, handle, pathname) { const normalized = normalizePath2(pathname).toLocaleLowerCase(); return ACCOUNT_CLEANUP_CATEGORY_DEFINITIONS[category].acceptedRoutes(handle).some( (route) => normalizePath2(route).toLocaleLowerCase() === normalized ); } function defaultAccountCleanupCategories() { return Object.fromEntries( ACCOUNT_CLEANUP_CATEGORIES.map((category) => [category, false]) ); } function normalizeAccountCleanupSettings(value) { const source = value && typeof value === "object" ? value : {}; const categories = Object.fromEntries( ACCOUNT_CLEANUP_CATEGORIES.map((category) => [ category, source.categories?.[category] === true ]) ); const pacing = source.pacing && source.pacing in ACCOUNT_CLEANUP_PACING ? source.pacing : "balanced"; return { mode: source.mode === "cleanup" ? "cleanup" : "preview", categories, pacing, maxActions: clampInteger(source.maxActions, 0, 1e5, 0) }; } function createAccountCleanupStats() { return Object.fromEntries( ACCOUNT_CLEANUP_CATEGORIES.map((category) => [category, { completed: 0, previewed: 0, failed: 0, skipped: 0 }]) ); } function normalizeAccountCleanupRun(value) { if (!value || typeof value !== "object") return null; const source = value; if (source.schema !== 1) return null; const account = normalizeAccountCleanupHandle(source.account); if (!account || typeof source.id !== "string" || typeof source.ownerId !== "string") return null; const settings = normalizeAccountCleanupSettings(source.settings); const plan = Array.isArray(source.plan) ? source.plan.filter(isAccountCleanupCategory) : []; const stats = createAccountCleanupStats(); for (const category of ACCOUNT_CLEANUP_CATEGORIES) { const incoming = source.stats?.[category]; stats[category] = { completed: clampInteger(incoming?.completed, 0, 1e7, 0), previewed: clampInteger(incoming?.previewed, 0, 1e7, 0), failed: clampInteger(incoming?.failed, 0, 1e7, 0), skipped: clampInteger(incoming?.skipped, 0, 1e7, 0) }; } const processed = Object.fromEntries( ACCOUNT_CLEANUP_CATEGORIES.map((category) => { const ids = Array.isArray(source.processed?.[category]) ? source.processed[category].filter((id) => /^\d+$/.test(String(id))).map(String).slice(-5e3) : []; return [category, [...new Set(ids)]]; }) ); const failures = Object.fromEntries( Object.entries(source.failures ?? {}).filter(([key]) => /^(bookmarks|likes|reposts|replies|posts):\d+$/.test(key)).slice(-2e3).map(([key, attempts]) => [key, clampInteger(attempts, 0, 20, 0)]).filter(([, attempts]) => attempts > 0) ); const status = isAccountCleanupStatus(source.status) ? source.status : "paused"; return { schema: 1, id: source.id, ownerId: source.ownerId, account, status, phase: typeof source.phase === "string" ? source.phase : "idle", reason: typeof source.reason === "string" ? source.reason : null, plan, stepIndex: clampInteger(source.stepIndex, 0, plan.length, 0), settings, stats, processed, failures, pageRecoveryAttempts: clampInteger( source.pageRecoveryAttempts, 0, ACCOUNT_CLEANUP_TIMING.maxPageRecoveryAttempts, 0 ), categoryVerificationPasses: clampInteger( source.categoryVerificationPasses, 0, ACCOUNT_CLEANUP_TIMING.requiredEmptyVerificationPasses, 0 ), likeRateWindowStartedAt: source.likeRateWindowStartedAt === null ? null : finiteNumber(source.likeRateWindowStartedAt, null), likeRateWindowActions: clampInteger( source.likeRateWindowActions, 0, ACCOUNT_CLEANUP_TIMING.likeRateWindowActionLimit, 0 ), actionsThisSession: clampInteger(source.actionsThisSession, 0, 1e7, 0), startedAt: finiteNumber(source.startedAt, Date.now()), updatedAt: finiteNumber(source.updatedAt, Date.now()), finishedAt: source.finishedAt === null ? null : finiteNumber(source.finishedAt, null), leaseUntil: finiteNumber(source.leaseUntil, 0) }; } function createAccountCleanupRun(input) { const now6 = input.now ?? Date.now(); const settings = normalizeAccountCleanupSettings({ ...input.options, mode: input.mode }); const plan = ACCOUNT_CLEANUP_CATEGORIES.filter((category) => settings.categories[category]); return { schema: 1, id: createAccountCleanupToken(), ownerId: input.ownerId, account: normalizeAccountCleanupHandle(input.account) ?? input.account, status: "running", phase: "starting", reason: null, plan, stepIndex: 0, settings, stats: createAccountCleanupStats(), processed: Object.fromEntries( ACCOUNT_CLEANUP_CATEGORIES.map((category) => [category, []]) ), failures: {}, pageRecoveryAttempts: 0, categoryVerificationPasses: 0, likeRateWindowStartedAt: null, likeRateWindowActions: 0, actionsThisSession: 0, startedAt: now6, updatedAt: now6, finishedAt: null, leaseUntil: now6 + ACCOUNT_CLEANUP_TIMING.leaseMs }; } function accountCleanupNeedsResume(value) { const run = normalizeAccountCleanupRun(value); if (!run || run.status !== "running") return false; return readAccountCleanupTabToken() === run.ownerId; } function readAccountCleanupTabToken(storage) { try { return (storage ?? globalThis.sessionStorage)?.getItem(ACCOUNT_CLEANUP_TAB_TOKEN_KEY) ?? null; } catch { return null; } } function writeAccountCleanupTabToken(token, storage) { try { const target = storage ?? globalThis.sessionStorage; if (token) target?.setItem(ACCOUNT_CLEANUP_TAB_TOKEN_KEY, token); else target?.removeItem(ACCOUNT_CLEANUP_TAB_TOKEN_KEY); } catch { } } function createAccountCleanupToken() { return globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`; } function clearAccountCleanupTransientState(run) { for (const category of ACCOUNT_CLEANUP_CATEGORIES) run.processed[category] = []; run.failures = {}; run.pageRecoveryAttempts = 0; run.categoryVerificationPasses = 0; run.likeRateWindowStartedAt = null; run.likeRateWindowActions = 0; run.leaseUntil = 0; } function normalizePath2(pathname) { const withoutTrailingSlash = String(pathname || "/").replace(/\/+$/, ""); return withoutTrailingSlash || "/"; } function isAccountCleanupCategory(value) { return typeof value === "string" && ACCOUNT_CLEANUP_CATEGORIES.includes( value ); } function isAccountCleanupStatus(value) { return value === "running" || value === "paused" || value === "blocked" || value === "complete" || value === "stopped"; } function clampInteger(value, minimum, maximum, fallback) { const numeric = Number(value); if (!Number.isFinite(numeric)) return fallback; return Math.min(maximum, Math.max(minimum, Math.trunc(numeric))); } function finiteNumber(value, fallback) { return typeof value === "number" && Number.isFinite(value) ? value : fallback; } // src/ui/control-center/sections/account.ts function buildAccountCleanupRows(ctx) { const status = ctx.options.getAccountCleanupStatus?.(); const run = status?.run ?? null; const selectedPlan = ACCOUNT_CLEANUP_CATEGORIES.filter( (category) => ctx.state.accountCleanupCategories[category] ); const hasSelection = selectedPlan.length > 0; const activeJob = run?.status === "running" || run?.status === "paused" || run?.status === "blocked"; return [ categoryPicker(ctx, activeJob), actionWorkspace(ctx, { activeJob, activeHandle: status?.activeHandle ?? null, hasSelection, run, runStatus: run?.status ?? null, statusText: status?.copy ? formatAccountCleanupCopy(status.copy, ctx.t) : ctx.t(status?.message ?? "Delete X activity is still loading.") }), advancedOptions(ctx, activeJob) ]; } function categoryPicker(ctx, disabled) { const fieldset = ctx.el("fieldset", "av-row av-row-stack av-cleanup-categories"); fieldset.dataset.avLabel = "What to delete"; const legend = ctx.el("legend", "av-row-label", ctx.t("What to delete")); const description = ctx.el( "span", "av-row-description", ctx.t("Selected activity is removed in this order: bookmarks, likes, reposts, replies, posts.") ); const choices = ctx.el("div", "av-cleanup-category-grid"); for (const category of ACCOUNT_CLEANUP_CATEGORIES) { const definition = ACCOUNT_CLEANUP_CATEGORY_DEFINITIONS[category]; const choice = ctx.el("label", "av-cleanup-category"); const input = document.createElement("input"); input.type = "checkbox"; input.checked = ctx.state.accountCleanupCategories[category]; input.disabled = disabled; input.addEventListener("change", () => { ctx.state.accountCleanupCategories[category] = input.checked; ctx.render(); }); const copy2 = ctx.el("span", "av-cleanup-category-copy"); copy2.append( ctx.el("strong", "av-cleanup-category-title", ctx.t(definition.label)), ctx.el("span", "av-cleanup-category-description", ctx.t(definition.description)) ); choice.append(input, copy2); choices.append(choice); } fieldset.append(legend, description, choices); return fieldset; } function pacingRow(ctx, disabled) { const row = ctx.selectRow( "Speed", ctx.state.accountCleanupPacing, [ ["careful", "Careful"], ["balanced", "Balanced"], ["brisk", "Brisk"] ], async (value) => { if (value === "careful" || value === "balanced" || value === "brisk") { ctx.state.accountCleanupPacing = value; } }, "Adds a randomized delay between account actions and longer rests after each batch.", true, "action" ); const select2 = row.querySelector("select"); if (select2) select2.disabled = disabled; return row; } function actionLimitRow(ctx, disabled) { const row = ctx.el("label", "av-row"); row.dataset.avLabel = "Actions per batch"; const copy2 = ctx.el("span", "av-row-copy"); copy2.append( ctx.el("span", "av-row-label", ctx.t("Actions per batch")), ctx.el("span", "av-row-description", ctx.t("Pause after this many matches. Use 0 for no limit. Resume starts a fresh batch.")) ); const input = document.createElement("input"); input.type = "number"; input.className = "av-cleanup-number"; input.min = "0"; input.max = "100000"; input.step = "1"; input.value = String(ctx.state.accountCleanupMaxActions); input.disabled = disabled; input.setAttribute("aria-label", ctx.t("Actions per batch")); input.addEventListener("input", () => { const numeric = Number(input.value); ctx.state.accountCleanupMaxActions = Number.isFinite(numeric) ? Math.min(1e5, Math.max(0, Math.trunc(numeric))) : 0; }); row.append(copy2, input); return row; } function advancedOptions(ctx, disabled) { const details = ctx.el("details", "av-cleanup-advanced"); details.dataset.avLabel = "Advanced options"; const summary = ctx.el("summary", "av-cleanup-advanced-summary"); const copy2 = ctx.el("span", "av-cleanup-advanced-copy"); copy2.append( ctx.el("strong", "av-cleanup-advanced-title", ctx.t("Advanced options")), ctx.el( "span", "av-cleanup-advanced-description", ctx.t("Change deletion speed or pause after a set number of actions.") ) ); summary.append(copy2); const body = ctx.el("div", "av-cleanup-advanced-body"); body.append(pacingRow(ctx, disabled), actionLimitRow(ctx, disabled)); details.append(summary, body); return details; } function actionWorkspace(ctx, input) { const workspace = ctx.el("div", "av-cleanup-workspace"); workspace.dataset.avLabel = "Run"; const status = input.run ? `${input.statusText} ${describeTotals(ctx, input.run)}` : input.activeHandle ? ctx.localizedCopy("Ready to run on @{handle}.", { handle: input.activeHandle }) : ctx.t("Sign in to X before running."); const needsSelection = !input.activeJob && !input.hasSelection; if (!(needsSelection && !input.run && input.activeHandle)) { workspace.append(ctx.el("span", "av-cleanup-guidance", status)); } if (needsSelection) { const hint = ctx.el( "span", "av-cleanup-guidance av-cleanup-selection-hint", ctx.t("Select at least one kind of activity to enable Run.") ); hint.id = "av-cleanup-selection-hint"; workspace.append(hint); } workspace.append(ctx.el( "span", "av-cleanup-guidance av-cleanup-irreversible", ctx.t("Deleted posts and replies can't be restored. Aviary can't bring back removed likes, reposts or bookmarks.") )); const controls = ctx.el("div", "av-cleanup-buttons"); if (input.runStatus === "running") { const pause = ctx.button("Pause", "av-button av-button-secondary"); pause.type = "button"; pause.disabled = !ctx.options.pauseAccountCleanup; pause.addEventListener("click", () => { void runCommand(ctx, "Pausing deletion\u2026", () => invoke(ctx.options.pauseAccountCleanup)); }); controls.append(pause); } if (input.runStatus === "paused" || input.runStatus === "blocked") { const resume = ctx.button("Resume", "av-button av-button-secondary"); resume.type = "button"; resume.disabled = !ctx.options.resumeAccountCleanup; resume.addEventListener("click", () => { void runCommand(ctx, "Resuming deletion\u2026", () => invoke(ctx.options.resumeAccountCleanup)); }); controls.append(resume); } if (input.activeJob) { const stop3 = ctx.button("Stop", "av-button av-button-secondary"); stop3.type = "button"; stop3.disabled = !ctx.options.stopAccountCleanup; stop3.addEventListener("click", () => { void runCommand(ctx, "Stopping deletion\u2026", () => invoke(ctx.options.stopAccountCleanup)); }); controls.append(stop3); } if (input.activeJob) { workspace.append(controls); return workspace; } const run = ctx.button("Run", "av-button av-button-danger av-cleanup-primary-action"); run.type = "button"; run.dataset.avCleanupPrimary = "1"; run.disabled = !input.activeHandle || !input.hasSelection || !ctx.options.startAccountCleanup; if (needsSelection) run.setAttribute("aria-describedby", "av-cleanup-selection-hint"); run.addEventListener("click", () => { setPendingButton(run, ctx.t("Starting deletion\u2026")); void runCommand(ctx, "Starting deletion\u2026", async () => { const result = await ctx.options.startAccountCleanup?.(startOptions(ctx)); return result ?? { ok: false, reason: "not_ready" }; }); }); controls.append(run); workspace.append(controls); return workspace; } function setPendingButton(button3, label) { button3.disabled = true; button3.setAttribute("aria-busy", "true"); button3.textContent = label; } function startOptions(ctx) { return { categories: { ...ctx.state.accountCleanupCategories }, pacing: ctx.state.accountCleanupPacing, maxActions: ctx.state.accountCleanupMaxActions }; } async function runCommand(ctx, pendingMessage, command) { ctx.setStatus(pendingMessage); try { const result = await command(); const status = ctx.options.getAccountCleanupStatus?.(); if (status?.copy) ctx.setStatusCopy(status.copy.text, localizeAccountCleanupValues(status.copy, ctx.t)); else ctx.setStatus(status?.message ?? (result.ok ? "Deletion updated." : "Deletion command failed.")); ctx.render(); } catch (error) { ctx.options.onError("Deletion command failed", error); ctx.setStatus("Deletion command failed."); ctx.render(); } } function invoke(command) { return command?.() ?? Promise.resolve({ ok: false, reason: "not_ready" }); } function describeTotals(ctx, run) { return run.plan.map((category) => { const stats = run.stats[category]; const count = run.settings.mode === "preview" ? stats.previewed : stats.completed; return `${ctx.t(ACCOUNT_CLEANUP_CATEGORY_DEFINITIONS[category].label)} ${count}`; }).join(" \xB7 "); } // src/ui/control-center/section-manifest.ts var CONTROL_CENTER_SECTION_MANIFEST = [ { id: "presets", title: "Quick setup", group: "Start here", summary: "Choose a ready-made setup or jump to a common task.", icon: "presets" }, { id: "appearance", title: "Look & feel", group: "Everyday", summary: "Change colors, spacing, text, and the numbers shown on posts.", icon: "appearance" }, { id: "layout", title: "Page cleanup", group: "Everyday", summary: "Hide ads and parts of X you do not use.", icon: "layout" }, { id: "filtering", title: "Content filters", group: "Everyday", summary: "Hide or dim posts by words, media, account badges, or page.", icon: "filtering" }, { id: "media", title: "Downloads", group: "Everyday", summary: "Set up download buttons, quality, filenames, and queues.", icon: "media" }, { id: "library", title: "Saved posts", group: "Your data", summary: "Search and manage posts stored in this browser.", icon: "library" }, { id: "export", title: "Import & export", group: "Your data", summary: "Capture posts on the page and download portable copies.", icon: "export" }, { id: "account", title: "Delete X activity", group: "Your data", summary: "Select activity and press Run. Deletion starts immediately.", icon: "account" }, { id: "catchup", title: "Catch up", group: "More tools", summary: "Review posts Aviary already saw without asking X for more.", icon: "catchup" }, { id: "hidden", title: "Hidden posts", group: "More tools", summary: "Choose where hidden posts stay hidden, or bring them back.", icon: "hidden" }, { id: "performance", title: "Video playback", group: "More tools", summary: "Pause videos after they leave the screen.", icon: "performance" }, { id: "snapshots", title: "X archive", group: "More tools", summary: "Import an official X archive or compare follower snapshots.", icon: "snapshots" }, { id: "integrations", title: "Connections", group: "More tools", summary: "Set up optional local services and AI providers.", icon: "integrations" }, { id: "backup", title: "Backup & reset", group: "More tools", summary: "Back up local data, restore it, or reset Aviary.", icon: "backup" }, { id: "trust", title: "Privacy & diagnostics", group: "More tools", summary: "See what stays local and check whether Aviary still works with X.", icon: "trust" } ]; // src/ui/control-center.ts var AVIARY_VERSION2 = false ? "dev" : "1.54.0"; var MORE_TOOLS_GROUP = "More tools"; var SECTION_GROUP_BREAKS = { presets: [ { before: "Common tasks", title: "Common tasks" }, { before: "Quiet Reader", title: "Ready-made setups" }, { before: "Locale", title: "Language" } ], appearance: [ { before: "Theme", title: "Look & layout" }, { before: "Hide engagement counts", title: "Post details" }, { before: "High contrast", title: "Accessibility" }, { before: "Custom CSS", title: "Advanced styling" } ], layout: [ { before: "Ad-free mode", title: "Ad protection" }, { before: "Hide right sidebar", title: "Page chrome" }, { before: "Open Following instead of For you", title: "Reading flow" }, { before: "Hide navigation items", title: "Navigation" } ], filtering: [ { before: "Enable filters", title: "Filter status" }, { before: "Keyword rules", title: "Rules" }, { before: "Premium / verified posts", title: "Content types" }, { before: "Active on", title: "Routes" } ], catchup: [{ before: "Open catch-up digest", title: "Digest" }], hidden: [ { before: "Hide dismissed posts", title: "Status" }, { before: "Active on", title: "Coverage" }, { before: "Maximum remembered posts", title: "Retention" }, { before: "Hidden posts stored", title: "Recovery" } ], performance: [{ before: "Pause video that scrolls out of view", title: "Playback" }], media: [ { before: "Show download buttons", title: "On-post controls" }, { before: "Filename template", title: "File naming" }, { before: "Match visually similar images", title: "Duplicate matching" }, { before: "Duplicate history", title: "Batch behavior" }, { before: "Download all visible media", title: "Queue actions" }, { before: "Download status", title: "Queue status" } ], export: [ { before: "Capture visible posts", title: "Capture" }, { before: "Export formats", title: "Package" }, { before: "Save folder hint", title: "Destination" }, { before: "Export visible posts", title: "Jobs" }, { before: "Preservation archive", title: "Preservation" } ], library: [ { before: "Search all local collections", title: "Universal search" }, { before: "Local bookmarks", title: "Bookmarks" }, { before: "Show the AI button on posts", title: "Post tools" }, { before: "Account notes", title: "Writing tools" }, { before: "Library storage", title: "Storage & reports" } ], account: [ { before: "Run", title: "Run" } ], snapshots: [ { before: "Snapshots stored", title: "Live snapshots" }, { before: "Imported collections", title: "Official archive" }, { before: "Search captured records", title: "Search & reports" } ], integrations: [ { before: "Aria2 handoff", title: "Connections" }, { before: "AI provider", title: "Intelligence" }, { before: "Recent integration errors", title: "Health" } ], backup: [ { before: "Reset all preferences", title: "Preferences" }, { before: "Export full library backup", title: "Library backup" }, { before: "Keep a local action log", title: "Audit history" } ], trust: [ { before: "Storage", title: "Privacy boundary" }, { before: "Page access", title: "Page hooks" }, { before: "Telemetry", title: "Local data" }, { before: "Panel language", title: "Compatibility" } ] }; function mountControlCenter(options) { const existing = document.getElementById("av-control-center"); existing?.remove(); document.getElementById("av-control-center-nav")?.remove(); panelLocale = options.settings.i18n.locale; resetCoverageTally(); const host = document.createElement("div"); host.id = "av-control-center"; host.dataset.avOwned = "true"; host.dir = localeDirection(panelLocale); document.documentElement.append(host); const shadow = host.attachShadow({ mode: "open" }); const style = document.createElement("style"); style.textContent = CONTROL_CENTER_CSS; const shell = el("div", "av-shell"); const launcher = button("Aviary", "av-launcher"); launcher.type = "button"; launcher.setAttribute("aria-expanded", "false"); launcher.setAttribute("aria-controls", "av-control-panel"); launcher.setAttribute("aria-haspopup", "dialog"); launcher.hidden = true; const navLauncherHost = document.createElement("div"); navLauncherHost.id = "av-control-center-nav"; navLauncherHost.dataset.avOwned = "true"; navLauncherHost.dir = localeDirection(panelLocale); const navLauncherShadow = navLauncherHost.attachShadow({ mode: "open" }); const navLauncherStyle = document.createElement("style"); navLauncherStyle.textContent = NAV_LAUNCHER_CSS; const navLauncher = document.createElement("button"); navLauncher.type = "button"; navLauncher.className = "av-nav-launcher"; navLauncher.setAttribute("aria-expanded", "false"); navLauncher.setAttribute("aria-haspopup", "dialog"); navLauncher.setAttribute("aria-label", t("Aviary settings")); const navLauncherPill = el("span", "av-nav-launcher-pill"); const navLauncherLabel = el("span", "av-nav-launcher-label", t("Aviary")); navLauncherPill.append(navLauncherIcon(), navLauncherLabel); navLauncher.append(navLauncherPill); navLauncherShadow.append(navLauncherStyle, navLauncher); const overlay = el("div", "av-overlay"); overlay.setAttribute("aria-hidden", "true"); overlay.toggleAttribute("inert", true); const panel = el("section", "av-panel"); panel.id = "av-control-panel"; panel.setAttribute("popover", "auto"); panel.setAttribute("role", "dialog"); panel.setAttribute("aria-label", t("Aviary settings")); panel.setAttribute("aria-modal", "true"); panel.tabIndex = -1; const header = el("header", "av-panel-header"); const titleWrap = el("div", "av-title-wrap"); const titleRow = el("div", "av-title-row"); const title = el("h2", "av-title", t("Aviary settings")); title.id = "av-control-title"; panel.setAttribute("aria-labelledby", title.id); const version = el("span", "av-version", `v${AVIARY_VERSION2}`); titleRow.append(title, version); const subtitle = el("p", "av-subtitle", t("Quieter X. Local data.")); titleWrap.append(titleRow, subtitle); const close = button("Close", "av-button av-button-secondary"); close.type = "button"; const status = el("div", "av-status", t("Saved locally")); status.setAttribute("role", "status"); status.setAttribute("aria-live", "polite"); status.dataset.state = "saved"; host.dataset.avSaveState = "saved"; const transactionBar = el("footer", "av-transaction-bar"); const transactionStatus = el("div", "av-transaction-status"); const transactionActions = el("div", "av-transaction-actions"); const revertDraftButton = button("Revert", "av-button av-button-secondary av-transaction-revert"); revertDraftButton.type = "button"; revertDraftButton.disabled = true; const saveDraftButton = button("Save", "av-button av-button-primary av-transaction-save"); saveDraftButton.type = "button"; saveDraftButton.disabled = true; transactionActions.append(revertDraftButton, saveDraftButton); const transactionHint = el( "span", "av-transaction-hint", t("Switches and fields wait for Save. Buttons run right away.") ); transactionStatus.append(status, transactionHint); transactionBar.append(transactionStatus, transactionActions); const searchBar = el("div", "av-searchbar"); const search = document.createElement("input"); search.type = "search"; search.className = "av-search-input"; search.placeholder = t("Search ads, downloads, filters, and more"); search.setAttribute("aria-label", t("Search settings")); search.spellcheck = false; searchBar.append(searchIcon(), search); header.append(titleWrap, searchBar, close); const body = el("div", "av-panel-body"); panel.append(header, body, transactionBar); overlay.append(panel); shell.append(launcher, overlay); shadow.append(style, shell); let open = false; let dirtyWhileBusy = false; let activeSectionId = "presets"; let moreToolsExpanded = false; let searchQuery = ""; const savedAccountCleanup = options.getAccountCleanupStatus?.().run?.settings; const panelState = { bookmarkQuery: "", libraryQuery: "", unifiedSemantic: false, pendingFilterRuleImport: "", pendingFilterRulePreview: null, pendingLibraryBackupPayload: null, pendingLibraryBackupPreview: null, libraryRestoreRunning: false, libraryRestoreAbort: null, accountCleanupCategories: savedAccountCleanup ? { ...savedAccountCleanup.categories } : defaultAccountCleanupCategories(), accountCleanupPacing: savedAccountCleanup?.pacing ?? "balanced", accountCleanupMaxActions: savedAccountCleanup?.maxActions ?? 0 }; const draftSettings = cloneSettings(options.settings); const panelOptions = { ...options, settings: draftSettings }; const dirtyControls = /* @__PURE__ */ new Set(); const draftCommits = /* @__PURE__ */ new Map(); let stagingDepth = 0; let transactionSaving = false; let lastDraftMessage = "Saved locally"; let lastChangedLabel = null; let lastStatusEnglish = "Saved locally"; let lastStatusValues = {}; let bodyWasInert = false; let focusTrapAttached = false; let mountedPrimaryNav = null; let launcherMountDestroyed = false; let launcherReconcileQueued = false; const findPrimaryNav = () => { const tab = document.querySelector('[data-testid^="AppTabBar_"]'); return tab?.closest("nav") ?? null; }; const syncNavLauncherLayout = (nav) => { const width = nav.getBoundingClientRect().width; navLauncherHost.dataset.avCompact = String(width > 0 && width < 120); }; const navResizeObserver = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(() => { if (mountedPrimaryNav?.isConnected) syncNavLauncherLayout(mountedPrimaryNav); }); const destroyLauncherMount = () => { if (launcherMountDestroyed) return; launcherMountDestroyed = true; launcherObserver?.disconnect(); navResizeObserver?.disconnect(); navLauncherHost.remove(); mountedPrimaryNav = null; }; const reconcileLauncherMount = () => { if (launcherMountDestroyed || !host.isConnected) return; const nav = findPrimaryNav(); if (!nav) { navResizeObserver?.disconnect(); navLauncherHost.remove(); mountedPrimaryNav = null; launcher.hidden = false; return; } launcher.hidden = true; if (navLauncherHost.parentElement !== nav) { navResizeObserver?.disconnect(); nav.append(navLauncherHost); mountedPrimaryNav = nav; navResizeObserver?.observe(nav); } syncNavLauncherLayout(nav); }; const queueLauncherReconcile = () => { if (launcherReconcileQueued || launcherMountDestroyed) return; launcherReconcileQueued = true; queueMicrotask(() => { launcherReconcileQueued = false; reconcileLauncherMount(); }); }; const launcherObserver = new MutationObserver(() => { if (!host.isConnected) { destroyLauncherMount(); return; } if (!navLauncherHost.isConnected) queueLauncherReconcile(); }); launcherObserver.observe(document.documentElement, { childList: true, subtree: true }); const launcherForFocus = () => navLauncherHost.isConnected ? navLauncher : launcher; const selectorHealthDegraded = () => { try { const health = options.getSelectorHealth?.(); return Boolean(health?.enabled && health.missingRequired.length > 0); } catch { return false; } }; const syncSelectorHealthIndicator = () => { const degraded = selectorHealthDegraded(); const state2 = degraded ? "degraded" : "healthy"; host.dataset.avSelectorHealth = state2; navLauncherHost.dataset.avSelectorHealth = state2; launcher.dataset.avSelectorHealth = state2; navLauncher.dataset.avSelectorHealth = state2; const baseLabel = t("Aviary settings"); const label = degraded ? `${baseLabel}: ${t("Selector health")}` : baseLabel; launcher.setAttribute("aria-label", label); navLauncher.setAttribute("aria-label", label); }; const modalFocusables = () => Array.from(panel.querySelectorAll(FOCUSABLE_SELECTOR)).filter((node) => { if (node.hasAttribute("disabled") || node.getAttribute("aria-hidden") === "true") { return false; } return node.getClientRects().length > 0; }); const handlePanelKeyDown = (event) => { if (!open) return; if (event.key !== "Tab") return; const focusables = modalFocusables(); if (focusables.length === 0) { event.preventDefault(); panel.focus({ preventScroll: true }); return; } const active2 = shadow.activeElement; const index = active2 ? focusables.indexOf(active2) : -1; if (event.shiftKey && (active2 === panel || index <= 0)) { event.preventDefault(); focusables[focusables.length - 1].focus({ preventScroll: true }); } else if (!event.shiftKey && (active2 === panel || index === focusables.length - 1 || index < 0)) { event.preventDefault(); focusables[0].focus({ preventScroll: true }); } }; const handleModalFocusIn = (event) => { if (!open) return; const target = event.target; if (event.composedPath().includes(panel) || target instanceof Node && panel.contains(target)) return; event.stopPropagation(); panel.focus({ preventScroll: true }); }; panel.addEventListener("keydown", handlePanelKeyDown); const nativePanel = panel; const setOpen = (value, fromNative = false) => { if (open === value) { if (value) panel.focus({ preventScroll: true }); return; } open = value; if (open && selectorHealthDegraded()) { activeSectionId = "trust"; moreToolsExpanded = true; } launcher.setAttribute("aria-expanded", String(open)); navLauncher.setAttribute("aria-expanded", String(open)); overlay.setAttribute("aria-hidden", String(!open)); const firstRunNotice = document.getElementById("av-first-run"); if (firstRunNotice) firstRunNotice.hidden = open; overlay.toggleAttribute("inert", !open); panel.toggleAttribute("inert", !open); if (!fromNative) { try { if (open) nativePanel.showPopover?.(); else nativePanel.hidePopover?.(); } catch { panel.classList.toggle("av-popover-unavailable", open); } } if (open) { bodyWasInert = document.body?.hasAttribute("inert") ?? false; document.body?.setAttribute("inert", ""); document.addEventListener("focusin", handleModalFocusIn, true); focusTrapAttached = true; if (dirtyWhileBusy && !transactionDirty() && !transactionSaving) { dirtyWhileBusy = false; render(); } if (selectorHealthDegraded() && !transactionDirty() && !transactionSaving) { activeSectionId = "trust"; render(); } panel.focus({ preventScroll: true }); } else { if (document.body) { if (bodyWasInert) document.body.setAttribute("inert", ""); else document.body.removeAttribute("inert"); } if (focusTrapAttached) { document.removeEventListener("focusin", handleModalFocusIn, true); focusTrapAttached = false; } launcherForFocus().focus({ preventScroll: true }); } }; panel.addEventListener("toggle", (event) => { const nextState = event.newState === "open"; if (nextState !== open) { setOpen(nextState, true); } }); const transactionDirty = () => dirtyControls.size > 0; const updateTransactionButtons = () => { const disabled = !transactionDirty() || transactionSaving; saveDraftButton.disabled = disabled; revertDraftButton.disabled = disabled; if (transactionSaving) { transactionBar.setAttribute("aria-busy", "true"); } else { transactionBar.removeAttribute("aria-busy"); } host.dataset.avDraftState = transactionSaving ? "saving" : transactionDirty() ? "dirty" : "clean"; }; const isBusy = () => { if (transactionDirty() || transactionSaving) { return true; } const active2 = shadow.activeElement; if (!active2) { return false; } return active2 !== panel; }; const setStatus = (message) => { lastStatusEnglish = message; lastStatusValues = {}; status.textContent = t(message); status.dataset.state = statusState(message); host.dataset.avSaveState = status.dataset.state; updateTransactionButtons(); }; const setStatusCopy = (source, values) => { lastStatusEnglish = source; lastStatusValues = { ...values }; status.textContent = formatCopy(t(source), lastStatusValues); status.dataset.state = statusState(source); host.dataset.avSaveState = status.dataset.state; updateTransactionButtons(); }; const statusState = (source) => { if (source === "Saving...") return "saving"; if (source === "Unsaved changes" || source.startsWith("Save or revert")) return "dirty"; if (/could not|failed|error|invalid/i.test(source)) return "error"; return "saved"; }; const draftHooks = { update(control, label, dirty) { if (dirty) { dirtyControls.add(control); lastChangedLabel = label; } else { dirtyControls.delete(control); } setStatus(transactionDirty() ? "Unsaved changes" : "Saved locally"); }, register(control, label, commit) { draftCommits.set(control, { label, commit }); }, stage(change) { stagingDepth += 1; void change().catch((error) => { try { options.onError("Control Center could not stage settings", error); } catch { } setStatus("Could not save settings. Try again."); }).finally(() => { stagingDepth = Math.max(0, stagingDepth - 1); updateTransactionButtons(); }); }, guard() { return holdDirtyDraft(); } }; const holdDirtyDraft = () => { if (!transactionDirty() && !transactionSaving) return false; setStatus("Save or revert your changes before leaving this section."); const firstDirty = [...dirtyControls].find((control) => control.isConnected); (firstDirty ?? saveDraftButton).focus({ preventScroll: true }); return true; }; let pendingActionFocus = null; let pendingActionLabel = null; const focusIdentity = (node) => { if (!node || !body.contains(node)) { return null; } const row = node.closest(".av-row"); const sectionTitle = node.closest(".av-section")?.querySelector(".av-section-title")?.textContent ?? ""; const label = row?.querySelector(".av-row-label")?.textContent ?? ""; const scope = row ?? body; const index = Array.from(scope.querySelectorAll(FOCUSABLE_SELECTOR)).indexOf( node ); if (label) { return `row|${sectionTitle}|${label}|${node.tagName}|${index}`; } return `path|${positionalPath(body, node)}`; }; const findByIdentity = (identity) => { for (const candidate of Array.from(body.querySelectorAll(FOCUSABLE_SELECTOR))) { if (focusIdentity(candidate) === identity) { return candidate; } } return null; }; const findActionButton = (label) => { const expected = t(label); return Array.from(body.querySelectorAll("button")).find( (candidate) => candidate.textContent === expected && !candidate.disabled ) ?? null; }; const actionRow = (label, description, onClick, failureMessage = "Action failed.") => buildActionRow( label, description, async () => { if (holdDirtyDraft()) return; await onClick(); }, (error) => { try { options.onError(`${label} failed`, error); } catch { } setStatus(failureMessage); }, (button3) => { pendingActionFocus = focusIdentity(button3); pendingActionLabel = label; }, (button3) => { if (pendingActionFocus && (!shadow.activeElement || shadow.activeElement === panel)) { const target = button3.isConnected ? button3 : findByIdentity(pendingActionFocus) ?? (pendingActionLabel ? findActionButton(pendingActionLabel) : null); if (!target) return; target.focus({ preventScroll: true }); pendingActionFocus = null; pendingActionLabel = null; } } ); const render = () => { if (!transactionDirty()) { replaceSettings(draftSettings, options.settings); draftCommits.clear(); dirtyWhileBusy = false; } const active2 = shadow.activeElement; const identity = focusIdentity(active2) ?? pendingActionFocus; const selection = captureSelection(active2); const contentScrollTop = body.querySelector(".av-content")?.scrollTop ?? 0; const navScrollTop = body.querySelector(".av-nav")?.scrollTop ?? 0; const pendingDrafts = [...dirtyControls].filter((control) => control.isConnected).map((control) => ({ identity: focusIdentity(control), value: control.value, registered: draftCommits.has(control) })).filter( (entry) => entry.identity !== null ); dirtyControls.clear(); panelLocale = draftSettings.i18n.locale; host.dir = localeDirection(panelLocale); resetCoverageTally(); title.textContent = t("Aviary settings"); subtitle.textContent = t("Quieter X. Local data."); close.textContent = t("Close"); launcher.textContent = t("Aviary"); navLauncherLabel.textContent = t("Aviary"); navLauncher.setAttribute("aria-label", t("Aviary settings")); navLauncherHost.dir = localeDirection(panelLocale); panel.setAttribute("aria-label", t("Aviary settings")); search.placeholder = t("Search ads, downloads, filters, and more"); search.setAttribute("aria-label", t("Search settings")); revertDraftButton.textContent = t("Revert"); saveDraftButton.textContent = t("Save"); transactionHint.textContent = t("Switches and fields wait for Save. Buttons run right away."); status.textContent = formatCopy(t(lastStatusEnglish), lastStatusValues); host.dataset.avMotion = prefersReducedMotion(draftSettings) ? "reduce" : "full"; navLauncherHost.dataset.avMotion = host.dataset.avMotion; host.dataset.avColorMode = controlCenterColorMode(draftSettings); navLauncherHost.dataset.avColorMode = host.dataset.avColorMode; syncSelectorHealthIndicator(); reconcileLauncherMount(); const registry = sectionRegistry(); if (!registry.some((entry) => entry.id === activeSectionId)) { activeSectionId = registry[0]?.id ?? "presets"; } const activeEntry = registry.find((entry) => entry.id === activeSectionId) ?? registry[0]; panel.style.setProperty("--av-page-accent", activeEntry?.accent ?? "rgb(77, 199, 255)"); body.replaceChildren(buildNav(registry), buildContent(registry)); const coverage = body.querySelector(`.${COVERAGE_ROW_CLASS} .av-row-description`); if (coverage) { coverage.textContent = coverageSummary(); } const content = body.querySelector(".av-content"); if (content) content.scrollTop = contentScrollTop; const rail = body.querySelector(".av-nav"); if (rail) rail.scrollTop = navScrollTop; for (const pending of pendingDrafts) { const control = findByIdentity(pending.identity); if (!control) continue; if (pending.registered) { if (!draftCommits.has(control)) continue; control.value = pending.value; } dirtyControls.add(control); } if (identity || pendingActionLabel) { const target = (identity ? findByIdentity(identity) : null) ?? (pendingActionLabel ? findActionButton(pendingActionLabel) : null); if (target) { target.focus({ preventScroll: true }); restoreSelection(target, selection); pendingActionFocus = null; pendingActionLabel = null; } } }; const openSection = (section2) => { if (holdDirtyDraft()) return; activeSectionId = section2; if (CONTROL_CENTER_SECTION_MANIFEST.find((entry) => entry.id === section2)?.group === MORE_TOOLS_GROUP) { moreToolsExpanded = true; } searchQuery = ""; search.value = ""; render(); }; const panelContext = { options: panelOptions, settings: draftSettings, state: panelState, t, formatCopy, localizedCopy, setStatus, setStatusCopy, save: (message) => save(message), render, openSection: (section2) => openSection(section2), guardDraft: holdDirtyDraft, actionRow, toggleRow: (label, description, checked, onChange) => toggleRow(label, description, checked, onChange, draftHooks), selectRow: (label, value, rowOptions, onChange, description, translateOptions, mode) => selectRow(label, value, rowOptions, onChange, description, translateOptions, draftHooks, mode), readonlyRow, dataRow, textInputRow: (label, description, value, onChange, mode, actionLabel) => textInputRow(label, description, value, onChange, draftHooks, mode, actionLabel), secretInputRow: (label, description, value, onChange, mode) => secretInputRow(label, description, value, onChange, draftHooks, mode), integerInputRow: (label, description, value, onChange, bounds, mode, actionLabel) => integerInputRow(label, description, value, onChange, bounds, draftHooks, mode, actionLabel), textareaRow: (label, description, lines, onChange, actionLabel, mode) => textareaRow(label, description, lines, onChange, actionLabel, draftHooks, mode), surfaceRow: (label, description, selected, onChange, exclude) => surfaceRow(label, description, selected, onChange, draftHooks, exclude), bookmarkField, splitBookmarkTags, toDatetimeLocal, fromDatetimeLocal, coerceReduceMotion, coerceFilterAction, coerceLayout, formatBytes, defaultAiEndpoint, isThemeId, el, button, presetIcon, coverageRow: () => coverageRow(), libraryStorage: () => options.getLibraryStorage?.(), storageHealthRow: () => storageHealthRow(), storageStatusRow: () => storageStatusRow(), beaconRows: () => beaconRows(), pageScopeReason: (code) => pageScopeReason(code), selectorHealthRows: () => selectorHealthRows(), selectorSummary: () => selectorSummary() }; const panelSection = (id, build) => { const metadata = CONTROL_CENTER_SECTION_MANIFEST.find((entry) => entry.id === id); if (!metadata) throw new Error(`Missing Control Center section metadata: ${id}`); return { ...metadata, accent: "rgb(72, 211, 193)", build }; }; const sectionRegistry = () => [ panelSection("presets", () => buildPresetRows(panelContext)), panelSection("appearance", () => buildAppearanceRows(panelContext)), panelSection("layout", () => buildLayoutRows(panelContext)), panelSection("filtering", () => buildFilterRows(panelContext)), panelSection("media", () => buildMediaRows(panelContext)), panelSection("library", () => buildLibraryRows(panelContext)), panelSection("export", () => buildExportRows(panelContext)), panelSection("account", () => buildAccountCleanupRows(panelContext)), panelSection("catchup", () => buildCatchUpRows(panelContext)), panelSection("hidden", () => buildHiddenPostRows(panelContext)), panelSection("performance", () => buildPerformanceRows(panelContext)), panelSection("snapshots", () => buildSnapshotRows(panelContext)), panelSection("integrations", () => buildIntegrationRows(panelContext)), panelSection("backup", () => buildBackupRows(panelContext)), panelSection("trust", () => buildTrustRows(panelContext)) ]; const buildNav = (registry) => { const nav = el("nav", "av-nav"); nav.setAttribute("aria-label", t("Settings sections")); const moreToolsCount = registry.filter((entry) => entry.group === MORE_TOOLS_GROUP).length; let currentGroup = ""; for (const entry of registry) { if (entry.group !== currentGroup) { currentGroup = entry.group; if (currentGroup === MORE_TOOLS_GROUP) { const groupToggle = el("button", "av-nav-group av-nav-group-toggle"); groupToggle.type = "button"; groupToggle.setAttribute("aria-expanded", String(moreToolsExpanded)); groupToggle.setAttribute("aria-label", t(MORE_TOOLS_GROUP)); const count = el("span", "av-nav-group-count", String(moreToolsCount)); count.setAttribute("aria-hidden", "true"); groupToggle.append(el("span", "av-nav-group-label", t(MORE_TOOLS_GROUP)), count); groupToggle.addEventListener("click", () => { moreToolsExpanded = !moreToolsExpanded; groupToggle.setAttribute("aria-expanded", String(moreToolsExpanded)); for (const secondary of nav.querySelectorAll("[data-av-secondary='true']")) { secondary.hidden = !moreToolsExpanded; } }); nav.append(groupToggle); } else { nav.append(el("p", "av-nav-group", t(currentGroup))); } } const item = el("button", "av-nav-item", t(entry.title)); item.type = "button"; item.dataset.avSection = entry.id; if (entry.group === MORE_TOOLS_GROUP) { item.dataset.avSecondary = "true"; item.hidden = !moreToolsExpanded; } item.style.setProperty("--av-page-accent", entry.accent); const selected = searchQuery.trim().length === 0 && entry.id === activeSectionId; item.classList.toggle("is-active", selected); item.setAttribute("aria-current", selected ? "true" : "false"); item.addEventListener("click", () => { openSection(entry.id); }); nav.append(item); } return nav; }; const buildSection = (entry) => { try { return section(entry, entry.build()); } catch (error) { try { options.onError(`Control Center could not draw the ${entry.title} section`, error); } catch { } const message = error instanceof Error ? error.message : String(error); return section(entry, [ dataRow( "This section could not be drawn", `${t("The rest of the panel still works. Reported to diagnostics.")} ${message}` ) ]); } }; const buildContent = (registry) => { const content = el("div", "av-content"); if (searchQuery.trim().length > 0) { content.append(...searchResults(registry)); return content; } const entry = registry.find((candidate) => candidate.id === activeSectionId) ?? registry[0]; content.append(buildSection(entry)); return content; }; const foldForSearch = (value) => value.trim().toLowerCase().normalize("NFD").replace(/\p{Diacritic}/gu, ""); const searchResults = (registry) => { const needle = foldForSearch(searchQuery); const out = []; let matches2 = 0; for (const entry of registry) { let rows; try { rows = entry.build(); } catch { continue; } const hits = rows.filter((row) => foldForSearch(row.textContent ?? "").includes(needle)); if (hits.length === 0) { continue; } matches2 += hits.length; out.push(section(entry, hits)); } if (matches2 === 0) { const empty = el("div", "av-empty"); empty.append( el("p", "av-empty-title", t("Nothing matches that search.")), el("p", "av-empty-hint", t("Try a shorter word, or pick a section on the left.")) ); return [empty]; } return out; }; const save = async (message) => { if (stagingDepth > 0 || transactionSaving) { lastDraftMessage = message; return; } setStatus("Saving..."); try { await options.onChange(); render(); setStatus(message); } catch (error) { try { options.onError("Control Center could not save settings", error); } catch { } setStatus("Could not save settings. Try again."); } }; const focusChangedRow = (label) => { if (!label) return; const row = Array.from(body.querySelectorAll(".av-row")).find( (candidate) => candidate.dataset.avLabel === label ); row?.querySelector(FOCUSABLE_SELECTOR)?.focus({ preventScroll: true }); }; const commitDraft = async () => { if (!transactionDirty() || transactionSaving) return; const controls = [...dirtyControls].filter((control) => control.isConnected); if (controls.length === 0) { dirtyControls.clear(); setStatus("That change could not be saved. Make it again and save."); return; } const invalid = controls.find((control) => !control.checkValidity()); if (invalid) { setStatus("Fix invalid values before saving."); invalid.focus({ preventScroll: true }); invalid.reportValidity(); return; } const liveBefore = cloneSettings(options.settings); const focusLabel = lastChangedLabel; const rollbacks = []; transactionSaving = true; setStatus("Saving..."); try { for (const control of controls) { const entry = draftCommits.get(control); if (!entry) continue; const rollback = await entry.commit(); if (typeof rollback === "function") rollbacks.push(rollback); } replaceSettings(options.settings, draftSettings); await options.onChange(); dirtyControls.clear(); draftCommits.clear(); transactionSaving = false; replaceSettings(draftSettings, options.settings); render(); setStatus(lastDraftMessage); focusChangedRow(focusLabel); lastChangedLabel = null; lastDraftMessage = "Saved locally"; } catch (error) { replaceSettings(options.settings, liveBefore); for (const rollback of rollbacks.reverse()) { try { await rollback(); } catch (rollbackError) { try { options.onError("Control Center could not roll back a failed page save", rollbackError); } catch { } } } transactionSaving = false; try { options.onError("Control Center could not save settings", error); } catch { } setStatus("Could not save settings. Try again."); focusChangedRow(focusLabel); } }; const revertDraft = () => { if (!transactionDirty() || transactionSaving) return; const focusLabel = lastChangedLabel; replaceSettings(draftSettings, options.settings); dirtyControls.clear(); draftCommits.clear(); lastChangedLabel = null; lastDraftMessage = "Saved locally"; render(); setStatus("Saved locally"); focusChangedRow(focusLabel); }; saveDraftButton.addEventListener("click", () => { void commitDraft(); }); revertDraftButton.addEventListener("click", revertDraft); const coverageRow = () => { const row = dataRow("Panel language", ""); row.classList.add(COVERAGE_ROW_CLASS); return row; }; const coverageSummary = () => { const label = options.listLocales?.().find((entry) => entry.code === panelLocale)?.label ?? panelLocale; if (renderedStrings === 0) { return label; } const percent = Math.round(translatedStrings / renderedStrings * 100); if (translatedStrings === renderedStrings) { return `${label}: every panel string translated (${renderedStrings}).`; } return `${label}: ${translatedStrings} of ${renderedStrings} panel strings translated (${percent}%). The rest fall back to English.`; }; const storageHealthRow = () => { const failures = options.diagnostics().filter((event) => event.level === "error" && event.message.includes("failed to save")); if (failures.length === 0) { return readonlyRow("Saving", "Working. Every change has been written."); } const last = failures[failures.length - 1]?.message ?? ""; return dataRow( "Saving", `${t("Some changes could not be saved. The browser store may be full.")} ${last} (${failures.length})` ); }; const storageStatusRow = () => { const status2 = options.getStorageStatus?.(); if (!status2) { return readonlyRow("Storage", "Settings stay in this browser."); } const backend = status2.backend === "indexeddb" ? "IndexedDB" : status2.backend === "indexeddb-fallback" ? "IndexedDB fallback" : status2.backend === "userscript-manager" ? "Userscript manager" : "Browser storage"; const usage = status2.usageBytes === null ? "usage unavailable" : `${formatBytes(status2.usageBytes)} used`; const quota = status2.quotaBytes === null ? "quota unavailable" : `${formatBytes(status2.quotaBytes)} available`; const error = status2.lastError ? ` \xB7 ${status2.lastError}` : ""; const pending = status2.pendingWrites > 0 ? ` \xB7 ${status2.pendingWrites} change${status2.pendingWrites === 1 ? "" : "s"} waiting for the next reload` : ""; const persistence = status2.persistence === "persisted" ? t("Kept: the browser will not clear this library to reclaim space.") : status2.persistence === "best-effort" ? t("Best effort: the browser may clear this library when disk space runs low. Keep a backup.") : t("The browser did not say whether it will keep this library. Keep a backup."); return dataRow( "Storage", `${backend} \xB7 schema v${status2.schemaVersion} \xB7 ${usage} \xB7 ${quota} \xB7 ${status2.migratedKeys} stores migrated${pending}${error} \xB7 ${persistence}` ); }; const beaconRows = () => { if (!options.getPageHooks) { return []; } const hooks = options.getPageHooks(); const rows = [ dataRow( "Page access", hooks.reachable ? t("Connected to the page") : pageScopeReason(hooks.reason) ) ]; if (hooks.reachable && options.settings.privacy.blockAnalyticsBeacons) { rows.push(dataRow("Beacons refused", String(hooks.blockedBeacons))); } if (options.settings.privacy.blockAds) { const prerolls = hooks.suppressedVideoAds > 0 ? ` \xB7 ${hooks.suppressedVideoAds} pre-rolls suppressed` : ""; rows.push( dataRow( "Ad protection", `${hooks.hiddenPlacements} placements removed \xB7 ${hooks.blockedAdRequests} logging calls refused${prerolls}` ) ); } return rows; }; const pageScopeReason = (code) => { if (code === "no-page-scope") { return t("This userscript manager does not give Aviary access to the page itself."); } if (code === "agent-absent") { return t("This browser did not load Aviary's page script."); } if (code === "agent-taken") { return t( "Aviary's page script is loaded, but something else answered it first, most likely another extension. Network-level ad protection is not under Aviary's control on this page." ); } return t("Unavailable in this browser."); }; const selectorSummary = () => { const last = [...options.diagnostics()].reverse().find((event) => event.message.includes("Selector")); return last?.message ?? t("Monitoring active"); }; const selectorHealthRows = () => { const health = options.getSelectorHealth?.(); if (!health) { return [dataRow("Selector health", selectorSummary())]; } if (!health.enabled) { return [dataRow("Selector health", "Disabled")]; } if (health.required === 0) { return [dataRow("Selector health", selectorSummary())]; } t("Selector matches"); t("Missing required surfaces"); t("Optional surfaces missing"); t("Fallback selectors in use"); t("Affected features"); t("Last selector transition"); t("Ad observations"); t("Ad marker counts"); t("Ad contract drift"); t("Retained ad observations"); t("Native"); t("Trend"); t("House promo"); t("Video"); const rows = [ dataRow( "Selector health", `${health.state === "healthy" ? "Healthy" : "Degraded"} \xB7 ${health.route} \xB7 ${health.requiredMatched}/${health.required} required \xB7 ${health.optionalMatched}/${health.optional} optional` ), dataRow( "Selector matches", health.surfaces.filter((surface) => surface.relevance !== "inapplicable").map((surface) => `${surface.surface}: ${surface.matched}`).join(" \xB7 ") ), dataRow( "Missing required surfaces", health.missingRequired.length > 0 ? health.missingRequired.join(", ") : "None" ) ]; if (health.missingRequired.length > 0 && options.copySelectorBreakReport) { rows.push( actionRow( "Copy diagnostics", "Copy support diagnostics (version, route, recent log).", async () => { await options.copySelectorBreakReport(); setStatus("Diagnostics copied to clipboard."); }, "Could not copy diagnostics." ) ); } if (health.optionalMissing.length > 0) { rows.push(dataRow("Optional surfaces missing", health.optionalMissing.join(", "))); } if (health.fallbackMatches.length > 0) { rows.push( dataRow( "Fallback selectors in use", health.fallbackMatches.map((entry) => `${entry.surface}: ${entry.selector}`).join(" \xB7 ") ) ); } if (health.affectedFeatures.length > 0) { rows.push(dataRow("Affected features", health.affectedFeatures.join(", "))); } if (health.lastTransition) { rows.push( dataRow( "Last selector transition", `${health.lastTransition.to} \xB7 ${health.lastTransition.route} \xB7 ${health.lastTransition.at}` ) ); } const ads = health.adObservations; rows.push( dataRow( "Ad observations", ads.lastObservedAt && ads.lastRoute ? `${ads.lastRoute} \xB7 ${ads.lastObservedAt}` : "None" ), dataRow( "Ad marker counts", `${t("Native")} ${ads.counts.native} \xB7 ${t("Trend")} ${ads.counts.trend} \xB7 ${t("House promo")} ${ads.counts.housePromo} \xB7 ${t("Video")} ${ads.counts.video}` ), dataRow("Retained ad observations", String(ads.retained)) ); if (ads.missingContracts.length > 0) { const labels = { native: t("Native"), trend: t("Trend"), housePromo: t("House promo"), video: t("Video") }; rows.push( dataRow( "Ad contract drift", localizedCopy("Formerly observed markers are no longer detected: {markers}.", { markers: ads.missingContracts.map((kind) => labels[kind]).join(", ") }) ) ); } return rows; }; launcher.addEventListener("click", () => { setOpen(!open); }); navLauncher.addEventListener("click", () => { setOpen(!open); }); close.addEventListener("click", () => { setOpen(false); }); search.addEventListener("input", () => { if (holdDirtyDraft()) { search.value = searchQuery; return; } searchQuery = search.value; render(); }); render(); updateTransactionButtons(); return { destroy() { if (open) setOpen(false); if (focusTrapAttached) { document.removeEventListener("focusin", handleModalFocusIn, true); focusTrapAttached = false; } destroyLauncherMount(); host.remove(); }, refresh() { reconcileLauncherMount(); syncSelectorHealthIndicator(); if (!open || isBusy()) { dirtyWhileBusy = true; return; } render(); }, openSelectorHealth() { activeSectionId = "trust"; moreToolsExpanded = true; if (!open) { setOpen(true); return; } if (!isBusy()) render(); } }; } function controlCenterColorMode(settings) { if (settings.appearance.theme !== "off") return "dark"; for (const node of [ document.querySelector('[data-testid="primaryColumn"]'), document.body, document.documentElement ]) { if (!node) continue; const match = getComputedStyle(node).backgroundColor.match( /rgba?\(\s*(\d+(?:\.\d+)?)\D+(\d+(?:\.\d+)?)\D+(\d+(?:\.\d+)?)(?:\D+(\d*(?:\.\d+)?))?\s*\)/i ); if (!match || match[4] !== void 0 && Number(match[4]) === 0) continue; const perceived = Number(match[1]) * 0.299 + Number(match[2]) * 0.587 + Number(match[3]) * 0.114; return perceived >= 170 ? "light" : "dark"; } return globalThis.matchMedia?.("(prefers-color-scheme: light)").matches ? "light" : "dark"; } var FOCUSABLE_SELECTOR = "button, input, select, textarea, a[href], [tabindex]:not([tabindex='-1'])"; var COVERAGE_ROW_CLASS = "av-locale-coverage"; function replaceSettings(target, source) { Object.assign(target, cloneSettings(source)); } var panelLocale = "en"; var seenStrings = /* @__PURE__ */ new Set(); var renderedStrings = 0; var translatedStrings = 0; function resetCoverageTally() { seenStrings.clear(); renderedStrings = 0; translatedStrings = 0; } function t(text) { if (text.length > 0 && !seenStrings.has(text)) { seenStrings.add(text); renderedStrings += 1; if (hasTranslation(panelLocale, text)) { translatedStrings += 1; } } return translateText(panelLocale, text); } function formatCopy(template, values) { return Object.entries(values).reduce( (result, [key, value]) => result.replaceAll(`{${key}}`, String(value)), template ); } function localizedCopy(source, values) { return formatCopy(t(source), values); } function captureSelection(node) { if (!isTextField(node)) { return null; } return { start: node.selectionStart, end: node.selectionEnd }; } function restoreSelection(node, selection) { if (!selection || !isTextField(node) || selection.start === null || selection.end === null) { return; } try { node.setSelectionRange(selection.start, selection.end); } catch { } } function isTextField(node) { if (node instanceof HTMLTextAreaElement) { return true; } return node instanceof HTMLInputElement && node.type !== "checkbox" && node.type !== "radio"; } function positionalPath(root, node) { const steps = []; let current = node; while (current && current !== root) { const parent = current.parentElement; if (!parent) break; steps.unshift(Array.prototype.indexOf.call(parent.children, current)); current = parent; } return steps.join("."); } function prefersReducedMotion(settings) { if (settings.accessibility.reduceMotion === "always") return true; if (settings.accessibility.reduceMotion === "never") return false; return globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false; } function section(entry, rows) { const node = el("section", "av-section"); node.dataset.avSection = entry.id; node.style.setProperty("--av-page-accent", entry.accent); const heading = el("div", "av-page-header"); const headingCopy = el("div", "av-page-heading-copy"); headingCopy.append( el("p", "av-page-kicker", t(entry.group)), el("h3", "av-section-title", t(entry.title)), el("p", "av-page-summary", t(entry.summary)) ); heading.append(sectionIcon(entry.icon), headingCopy); const grid = el("div", "av-page-grid"); const breaks = new Map( (SECTION_GROUP_BREAKS[entry.id] ?? []).map((group) => [group.before, group.title]) ); for (const row of rows) { const groupTitle = row.dataset.avLabel ? breaks.get(row.dataset.avLabel) : void 0; if (groupTitle) { grid.append(el("h4", "av-group-title", t(groupTitle))); } grid.append(row); } node.append(heading, grid); return node; } function searchIcon() { const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.classList.add("av-search-icon"); svg.setAttribute("viewBox", "0 0 24 24"); svg.setAttribute("aria-hidden", "true"); svg.setAttribute("focusable", "false"); const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle"); circle.setAttribute("cx", "11"); circle.setAttribute("cy", "11"); circle.setAttribute("r", "6"); const handle = document.createElementNS("http://www.w3.org/2000/svg", "path"); handle.setAttribute("d", "m16 16 4 4"); svg.append(circle, handle); return svg; } function navLauncherIcon() { const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.classList.add("av-nav-launcher-icon"); svg.setAttribute("viewBox", "0 0 24 24"); svg.setAttribute("aria-hidden", "true"); svg.setAttribute("focusable", "false"); const path = document.createElementNS("http://www.w3.org/2000/svg", "path"); path.setAttribute( "d", "M21 4h-7M10 4H3M14 2v4M21 12h-9M8 12H3M8 10v4M21 20h-5M12 20H3M16 18v4" ); svg.append(path); return svg; } function sectionIcon(icon) { const paths = { presets: ["M12 3v18M3 12h18M5.6 5.6l12.8 12.8M18.4 5.6 5.6 18.4"], appearance: ["M12 3a9 9 0 1 0 0 18V3Z"], layout: ["M4 4h16v16H4zM4 9h16M9 9v11"], filtering: ["M4 5h16l-6 7v5l-4 2v-7L4 5Z"], catchup: ["M4 5h16v14H4z", "M8 9h8M8 13h5"], hidden: ["M3 12s3.5-6 9-6 9 6 9 6-3.5 6-9 6-9-6-9-6Z", "M4 4l16 16"], performance: ["M4 17a8 8 0 0 1 16 0", "M12 17l4-6"], media: ["M4 5h16v14H4z", "M7 16l3-4 3 3 2-2 3 3", "M9 9h.01"], export: ["M12 3v12", "M7 10l5 5 5-5", "M5 21h14"], library: ["M5 4h14v16H5z", "M8 8h8M8 12h8M8 16h5"], account: ["M12 3l7 3v5c0 5-3 8-7 10-4-2-7-5-7-10V6l7-3Z", "M8 12h8M12 8v8"], snapshots: ["M12 7v5l3 2", "M4.9 4.9A10 10 0 1 1 2 12", "M2 5v7h7"], integrations: ["M8 3v4M16 3v4", "M6 7h12v5a6 6 0 0 1-12 0V7Z", "M12 18v3"], backup: ["M4 4v5h5", "M4.8 8.8A8 8 0 1 1 6.3 17.7", "M12 8v5l3 2"], trust: ["M12 3l7 3v5c0 5-3 8-7 10-4-2-7-5-7-10V6l7-3Z", "M9 12l2 2 4-4"] }; const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.classList.add("av-page-icon"); svg.setAttribute("viewBox", "0 0 24 24"); svg.setAttribute("aria-hidden", "true"); svg.setAttribute("focusable", "false"); for (const data of paths[icon]) { const path = document.createElementNS("http://www.w3.org/2000/svg", "path"); path.setAttribute("d", data); svg.append(path); } return svg; } function presetIcon(id) { const paths = { "quiet-reader": ["M4 5.5c2.8-.8 5.5-.3 8 1.5v13c-2.5-1.8-5.2-2.3-8-1.5v-13Z", "M20 5.5c-2.8-.8-5.5-.3-8 1.5v13c2.5-1.8 5.2-2.3 8-1.5v-13Z"], "media-archivist": ["M3 7h7l2 2h9l-2 10H5L3 7Z", "M5 7l1-3h5l2 3"], creator: ["M4 20l4.5-1 10-10a2.1 2.1 0 0 0-3-3l-10 10L4 20Z", "M13.5 7.5l3 3"], researcher: ["M10.5 18a7.5 7.5 0 1 0 0-15 7.5 7.5 0 0 0 0 15Z", "M16 16l5 5"], classic: ["M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z"], minimal: ["M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18Z", "M8 12h8"] }; const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.classList.add("av-preset-icon"); svg.setAttribute("viewBox", "0 0 24 24"); svg.setAttribute("aria-hidden", "true"); svg.setAttribute("focusable", "false"); for (const data of paths[id] ?? paths["quiet-reader"]) { const path = document.createElementNS("http://www.w3.org/2000/svg", "path"); path.setAttribute("d", data); svg.append(path); } return svg; } function toggleRow(label, description, checked, onChange, drafts, mode = "page") { const row = el("label", "av-row"); row.dataset.avLabel = label; const copy2 = el("span", "av-row-copy"); copy2.append(el("span", "av-row-label", t(label)), el("span", "av-row-description", t(description))); const input = document.createElement("input"); input.type = "checkbox"; input.checked = checked; input.addEventListener("change", () => { if (mode === "page" && drafts) { drafts.update(input, label, input.checked !== checked); drafts.stage(() => onChange(input.checked)); } else { if (drafts?.guard()) return; void onChange(input.checked); } }); const toggleControl = el("span", "av-toggle-control"); const toggle = el("span", "av-toggle"); toggle.setAttribute("aria-hidden", "true"); toggleControl.append(input, toggle); row.append(copy2, toggleControl); return row; } function selectRow(label, value, options, onChange, description, translateOptions = true, drafts, mode = "page") { const row = el("label", "av-row"); row.dataset.avLabel = label; if (description) { const copy2 = el("span", "av-row-copy"); copy2.append(el("span", "av-row-label", t(label)), el("span", "av-row-description", t(description))); row.append(copy2); } else { row.append(el("span", "av-row-label", t(label))); } const select2 = document.createElement("select"); select2.className = "av-select"; for (const [optionValue, optionLabel] of options) { const option = document.createElement("option"); option.value = optionValue; option.textContent = translateOptions ? t(optionLabel) : optionLabel; option.selected = optionValue === value; select2.append(option); } select2.addEventListener("change", () => { if (mode === "page" && drafts) { drafts.update(select2, label, select2.value !== value); drafts.stage(() => onChange(select2.value)); } else { if (drafts?.guard()) { select2.value = value; return; } void onChange(select2.value); } }); row.append(select2); return row; } function readonlyRow(label, value) { const row = el("div", "av-row av-row-readonly"); row.dataset.avLabel = label; row.append(el("span", "av-row-label", t(label)), el("span", "av-row-description", t(value))); return row; } function dataRow(label, value) { const row = el("div", "av-row av-row-readonly"); row.dataset.avLabel = label; row.append(el("span", "av-row-label", t(label)), el("span", "av-row-description", value)); return row; } function formatBytes(value) { if (value < 1024) return `${Math.round(value)} B`; if (value < 1024 * 1024) return `${Math.round(value / 1024)} KiB`; return `${(value / (1024 * 1024)).toFixed(1)} MiB`; } function defaultAiEndpoint(provider) { return provider === "anthropic" ? "https://api.anthropic.com/v1/messages" : "https://api.openai.com/v1/chat/completions"; } function textInputRow(label, description, value, onChange, drafts, mode = "page", actionLabel = "Apply") { const row = el("div", "av-row av-row-stack"); row.dataset.avLabel = label; const copy2 = el("span", "av-row-copy"); copy2.append(el("span", "av-row-label", t(label)), el("span", "av-row-description", t(description))); row.append(copy2); const input = document.createElement("input"); input.type = "text"; input.className = "av-text-input"; input.value = value; input.spellcheck = false; input.setAttribute("aria-label", t(label)); if (mode === "page" && drafts) { drafts.register(input, label, () => onChange(input.value.trim())); input.addEventListener("input", () => drafts.update(input, label, input.value !== value)); row.append(input); } else { const apply2 = el("button", "av-button av-button-secondary", t(actionLabel)); apply2.type = "button"; apply2.addEventListener("click", () => { if (drafts?.guard()) return; void onChange(input.value.trim()); }); row.append(input, apply2); } return row; } function secretInputRow(label, description, value, onChange, drafts, mode = "page") { const row = el("div", "av-row av-row-stack"); row.dataset.avLabel = label; const copy2 = el("span", "av-row-copy"); copy2.append(el("span", "av-row-label", t(label)), el("span", "av-row-description", t(description))); row.append(copy2); const input = document.createElement("input"); input.type = "password"; input.className = "av-text-input"; input.value = value; input.spellcheck = false; input.autocomplete = "off"; input.setAttribute("aria-label", t(label)); if (mode === "page" && drafts) { drafts.register(input, label, () => onChange(input.value.trim())); input.addEventListener("input", () => drafts.update(input, label, input.value !== value)); } const controls = el("div", "av-inline-controls"); const reveal2 = el("button", "av-button av-button-secondary", t("Show")); reveal2.type = "button"; reveal2.setAttribute("aria-label", `${t("Show")} ${t(label)}`); reveal2.setAttribute("aria-pressed", "false"); reveal2.addEventListener("click", () => { const masked = input.type === "password"; input.type = masked ? "text" : "password"; reveal2.textContent = masked ? t("Hide") : t("Show"); reveal2.setAttribute("aria-pressed", String(masked)); reveal2.setAttribute("aria-label", `${masked ? t("Hide") : t("Show")} ${t(label)}`); }); controls.append(reveal2); if (mode === "action") { const apply2 = el("button", "av-button av-button-secondary", t("Apply")); apply2.type = "button"; apply2.addEventListener("click", () => { if (drafts?.guard()) return; void onChange(input.value.trim()); }); controls.append(apply2); } row.append(input, controls); return row; } function integerInputRow(label, description, value, onChange, bounds = {}, drafts, mode = "page", actionLabel = "Apply") { const row = el("div", "av-row av-row-stack"); row.dataset.avLabel = label; const copy2 = el("span", "av-row-copy"); copy2.append(el("span", "av-row-label", t(label)), el("span", "av-row-description", t(description))); row.append(copy2); const input = document.createElement("input"); input.type = "number"; input.min = String(bounds.min ?? 0); if (bounds.max !== void 0) { input.max = String(bounds.max); } input.step = "1"; input.className = "av-text-input"; input.value = String(value); input.setAttribute("aria-label", t(label)); const commit = () => { const parsed = Number.parseInt(input.value, 10); return onChange(Number.isFinite(parsed) ? parsed : 0); }; if (mode === "page" && drafts) { drafts.register(input, label, commit); input.addEventListener("input", () => drafts.update(input, label, input.value !== String(value))); row.append(input); } else { const apply2 = el("button", "av-button av-button-secondary", t(actionLabel)); apply2.type = "button"; apply2.addEventListener("click", () => { if (drafts?.guard()) return; void commit(); }); row.append(input, apply2); } return row; } function buildActionRow(label, description, onClick, onReject, onStart, onFinish) { const row = el("div", "av-row"); row.dataset.avLabel = label; const copy2 = el("span", "av-row-copy"); copy2.append( el("span", "av-row-label", t(label)), el( "span", "av-row-description", typeof description === "string" ? t(description) : localizedCopy(description.source, description.values) ) ); row.append(copy2); const button3 = el("button", "av-button av-button-secondary", t(label)); button3.type = "button"; button3.addEventListener("click", () => { onStart?.(button3); button3.disabled = true; void Promise.resolve().then(onClick).catch((error) => { try { onReject?.(error); } catch { } }).finally(() => { button3.disabled = false; onFinish?.(button3); }); }); row.append(button3); return row; } function textareaRow(label, description, lines, onChange, actionLabel = "Save list", drafts, mode = "page") { const row = el("div", "av-row av-row-stack"); row.dataset.avLabel = label; const copy2 = el("span", "av-row-copy"); copy2.append(el("span", "av-row-label", t(label)), el("span", "av-row-description", t(description))); row.append(copy2); const textarea = document.createElement("textarea"); textarea.className = "av-textarea"; textarea.value = lines.join("\n"); textarea.spellcheck = false; textarea.rows = 4; textarea.setAttribute("aria-label", t(label)); const initialValue = lines.join("\n"); const commit = () => { const next = textarea.value.split(/\r?\n/).map((line) => line.trim()).filter((line, index, array) => line.length > 0 && array.indexOf(line) === index); return onChange(next); }; if (mode === "page" && drafts) { drafts.register(textarea, label, commit); textarea.addEventListener("input", () => drafts.update(textarea, label, textarea.value !== initialValue)); row.append(textarea); } else { const apply2 = el("button", "av-button av-button-secondary", t(actionLabel)); apply2.type = "button"; apply2.addEventListener("click", () => { if (drafts?.guard()) return; void commit(); }); row.append(textarea, apply2); } return row; } function bookmarkField(label, value, placeholder) { const input = document.createElement("input"); input.type = "text"; input.className = "av-text-input av-bookmark-field"; input.value = value; input.placeholder = t(placeholder); input.setAttribute("aria-label", t(label)); input.spellcheck = false; return input; } function splitBookmarkTags(value) { return value.split(/[\s,]+/).map((tag) => tag.trim()).filter((tag, index, all) => tag.length > 0 && all.indexOf(tag) === index); } function toDatetimeLocal(value) { if (!value) return ""; const date = new Date(value); if (!Number.isFinite(date.getTime())) return ""; const pad = (part) => String(part).padStart(2, "0"); return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad( date.getHours() )}:${pad(date.getMinutes())}`; } function fromDatetimeLocal(value) { if (value.trim().length === 0) return null; const date = new Date(value); return Number.isFinite(date.getTime()) ? date.toISOString() : null; } function surfaceRow(label, description, selected, onChange, drafts, exclude) { const row = el("div", "av-row av-row-stack"); row.dataset.avLabel = label; const copy2 = el("span", "av-row-copy"); copy2.append(el("span", "av-row-label", t(label)), el("span", "av-row-description", t(description))); row.append(copy2); const group = el("div", "av-chip-group"); group.setAttribute("role", "group"); group.setAttribute("aria-label", t(label)); const state2 = new Set(selected); const available2 = exclude ? FILTER_SURFACES.filter((s) => !exclude.includes(s)) : FILTER_SURFACES; for (const surface of available2) { const chip = document.createElement("label"); chip.className = "av-chip"; const input = document.createElement("input"); input.type = "checkbox"; input.checked = state2.has(surface); input.value = surface; input.addEventListener("change", () => { if (input.checked) { state2.add(surface); } else { state2.delete(surface); } drafts?.update(input, label, input.checked !== selected.includes(surface)); if (drafts) { drafts.stage(() => onChange(FILTER_SURFACES.filter((value) => state2.has(value)))); } else { void onChange(FILTER_SURFACES.filter((value) => state2.has(value))); } }); const text = el("span", "av-chip-label", t(FILTER_SURFACE_LABELS[surface])); chip.append(input, text); group.append(chip); } row.append(group); return row; } function coerceReduceMotion(value) { return value === "always" || value === "never" ? value : "system"; } function coerceFilterAction(value) { return value === "hide" || value === "dim" ? value : "off"; } function coerceLayout(value) { return value === "stacked" || value === "grid" ? value : "default"; } function button(label, className) { const node = document.createElement("button"); node.className = className; node.textContent = t(label); return node; } function el(tag, className, text) { const node = document.createElement(tag); node.className = className; if (text !== void 0) { node.textContent = text; } return node; } var NAV_LAUNCHER_CSS = ` :host { display: block; width: 100%; --av-nav-surface: rgb(12, 18, 24); --av-nav-border: rgb(52, 67, 79); --av-nav-text: rgb(238, 242, 245); --av-nav-accent: rgb(110, 194, 226); color: var(--av-nav-text); font-family: inherit; font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; } :host([data-av-color-mode="light"]) { --av-nav-surface: rgb(241, 246, 248); --av-nav-border: rgb(176, 192, 201); --av-nav-text: rgb(15, 24, 31); --av-nav-accent: rgb(0, 126, 132); } .av-nav-launcher { box-sizing: border-box; display: flex; align-items: center; width: 100%; min-height: 58px; margin: 0; padding: 4px 0; border: 0; border-radius: 10px; background: transparent; color: inherit; cursor: pointer; font-family: inherit; font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; text-align: start; } .av-nav-launcher-pill { box-sizing: border-box; display: flex; align-items: center; min-width: 50px; min-height: 50px; padding: 12px; border-radius: 9px; background-color: var(--av-nav-surface); color: var(--av-nav-text); box-shadow: inset 0 0 0 1px var(--av-nav-border); transition: background-color 110ms ease-out, box-shadow 110ms ease-out; } .av-nav-launcher-icon { width: 26px; height: 26px; flex: 0 0 26px; fill: none; stroke: currentColor; stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; } .av-nav-launcher-label { margin-inline: 20px 16px; overflow: hidden; font-size: 20px; font-weight: 400; line-height: 24px; text-overflow: ellipsis; white-space: nowrap; } .av-nav-launcher:hover .av-nav-launcher-pill { background-color: color-mix(in srgb, var(--av-nav-accent) 7%, var(--av-nav-surface)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--av-nav-accent) 56%, var(--av-nav-border)); } .av-nav-launcher[aria-expanded="true"] .av-nav-launcher-pill { background: color-mix(in srgb, var(--av-nav-accent) 11%, var(--av-nav-surface)); color: var(--av-nav-text); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--av-nav-accent) 68%, var(--av-nav-border)); } .av-nav-launcher:focus-visible { outline: none; } .av-nav-launcher:focus-visible .av-nav-launcher-pill { outline: 2px solid var(--av-nav-accent); outline-offset: 2px; } :host([data-av-selector-health="degraded"]) .av-nav-launcher-pill { color: var(--av-danger, #f4212e); } :host([data-av-selector-health="degraded"]) .av-nav-launcher-pill::after { content: ""; width: 7px; height: 7px; margin-inline-start: 8px; border-radius: 50%; background: currentColor; } :host([data-av-compact="true"]) .av-nav-launcher { justify-content: center; } :host([data-av-compact="true"]) .av-nav-launcher-pill { width: 50px; justify-content: center; } :host([data-av-compact="true"]) .av-nav-launcher-label { display: none; } /* Same single source as the panel: the host attribute already carries the decision, and a media query here would override a reader who chose "never". */ :host([data-av-motion="reduce"]) .av-nav-launcher-pill { transition: none; } `; var CONTROL_CENTER_CSS = ` :host { direction: ltr; --av-bg: rgb(5, 9, 13); --av-surface: rgb(10, 16, 22); --av-surface-raised: rgb(17, 25, 33); --av-border: rgb(43, 56, 67); --av-text: rgb(243, 247, 249); --av-muted: rgb(163, 175, 185); --av-accent: rgb(77, 211, 208); --av-danger: rgb(255, 130, 140); --av-warn: rgb(248, 190, 100); --av-ok: rgb(92, 219, 168); color-scheme: dark; font-family: TwitterChirp, Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } :host([data-av-color-mode="light"]) { --av-bg: rgb(237, 243, 246); --av-surface: rgb(250, 252, 253); --av-surface-raised: rgb(229, 237, 241); --av-border: rgb(194, 207, 214); --av-text: rgb(15, 24, 31); --av-muted: rgb(78, 94, 105); --av-accent: rgb(0, 126, 132); --av-danger: rgb(183, 36, 50); --av-warn: rgb(139, 91, 0); --av-ok: rgb(0, 115, 75); color-scheme: light; } :host([dir="rtl"]) { direction: rtl; } .av-shell { position: fixed; inset: 0; pointer-events: none; } .av-launcher { position: fixed; inset-inline-end: 18px; bottom: 18px; min-width: 78px; min-height: 42px; border: 1px solid color-mix(in srgb, var(--av-accent, rgb(29, 155, 240)) 70%, transparent); border-radius: 8px; /* Opaque, and deliberately so. This was a translucent accent wash over whatever the page had behind it, which worked only because Aviary used to force X dark. With the default now "leave X alone", the same wash sat on X's light mode at 1.12:1 against its own near-white label, invisible. The launcher is Aviary's own chrome and must not depend on the page. Measured in tests/injected-ui-contract.test.mjs by compositing on canvas. */ background: rgb(20, 32, 42); color: var(--av-text, rgb(239, 243, 244)); box-shadow: 0 12px 34px rgba(0, 0, 0, 0.42); cursor: pointer; font-weight: 700; font-size: 13px; line-height: 1.1; font-family: inherit; letter-spacing: 0; pointer-events: auto; transition: border-color 110ms ease-out; } .av-launcher[hidden] { display: none !important; } .av-launcher:hover { border-color: var(--av-accent, rgb(29, 155, 240)); background: rgb(24, 42, 54); } .av-launcher[data-av-selector-health="degraded"] { border-color: var(--av-danger, #f4212e); box-shadow: 0 0 0 3px color-mix(in srgb, var(--av-danger, #f4212e) 18%, transparent), 0 12px 34px rgba(0, 0, 0, 0.42); } /* The forced-colors block below already lists .av-nav-item and textarea; leaving them out here meant the panel's primary navigation fell back to the UA ring in ordinary rendering while every control beside it carried Aviary's. */ .av-launcher:focus-visible, .av-button:focus-visible, .av-select:focus-visible, .av-nav-item:focus-visible, .av-nav-group-toggle:focus-visible, .av-start-task:focus-visible, input:focus-visible, textarea:focus-visible { outline: 2px solid var(--av-accent, rgb(29, 155, 240)); outline-offset: 3px; } .av-overlay { display: contents; } .av-panel { position: fixed; inset: 0; margin: auto; width: min(1280px, calc(100vw - 32px)); height: min(860px, calc(100vh - 32px)); overflow: hidden; display: flex; flex-direction: column; border: 1px solid var(--av-border, rgb(43, 56, 67)); border-radius: 10px; background: var(--av-surface, rgb(10, 16, 22)); box-shadow: 0 28px 88px rgba(0, 0, 0, 0.5); pointer-events: auto; } /* The UA hides a closed popover with [popover]:not(:popover-open) { display: none }, which is UA-origin and therefore loses to the author display: flex above. Without this rule the closed panel is laid out and painted full-screen on every page load while inert keeps it dead to input -- a settings window that covers X and cannot be dismissed. Authored here so the author sheet stops fighting the UA sheet. */ .av-panel:not(:popover-open) { display: none; } /* The escape hatch for a host with the selector above but no showPopover to satisfy it. The class is repeated to carry more weight than the rule it overrides rather than tying with it: this sheet lives in a shadow root, so there is no html element here to qualify with, and a tie would be settled by source order alone. */ .av-panel.av-popover-unavailable.av-popover-unavailable { display: flex; } .av-panel::backdrop { background: rgba(0, 0, 0, 0.5); } /* The panel takes focus when it opens; the UA default paints a hard white halo around the whole dialog. Keep the indicator, make it read as a highlighted edge instead. */ .av-panel:focus-visible { outline: 2px solid transparent; border-color: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 34%, var(--av-border)); } .av-panel-header { display: grid; grid-template-columns: 220px minmax(320px, 520px) minmax(80px, 1fr); align-items: center; gap: 20px; height: 56px; min-height: 56px; padding: 8px 18px; box-sizing: border-box; border-bottom: 1px solid var(--av-border, rgb(47, 51, 54)); background: color-mix(in srgb, var(--av-surface, rgb(10, 16, 22)) 94%, var(--av-bg)); } .av-panel-header > .av-button { justify-self: end; } .av-title-row { display: flex; align-items: baseline; gap: 8px; } /* Quiet by default -- it is a build marker, not a heading. Carries the accent so a reload reads as a different build at a glance. */ .av-version { padding: 0; border: 0; border-radius: 0; background: transparent; color: var(--av-muted, rgb(132, 139, 145)); font-weight: 600; font-size: 12px; line-height: 1.4; font-family: inherit; letter-spacing: 0.02em; font-variant-numeric: tabular-nums; white-space: nowrap; } .av-title { margin: 0; color: var(--av-text, rgb(239, 243, 244)); font-size: 16px; line-height: 1.25; } .av-subtitle { margin: 2px 0 0; color: var(--av-muted, rgb(132, 139, 145)); font-size: 12px; line-height: 1.35; } .av-button, .av-select { min-height: 34px; border: 1px solid var(--av-border, rgb(47, 51, 54)); border-radius: 8px; background: var(--av-surface-raised, rgb(17, 25, 33)); color: var(--av-text, rgb(239, 243, 244)); font-weight: 650; font-size: 13px; line-height: 1.2; font-family: inherit; } .av-button { padding: 0 12px; cursor: pointer; transition: border-color 140ms ease, background 140ms ease, color 140ms ease; } .av-button:hover:not(:disabled) { border-color: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 54%, transparent); background: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 10%, var(--av-surface-raised, rgb(22, 24, 28))); } .av-button-primary { border-color: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 82%, white 18%); background: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 78%, white 8%); color: rgb(5, 10, 15); box-shadow: none; } .av-button-primary:hover:not(:disabled) { border-color: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 68%, white 32%); background: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 84%, white 12%); } .av-button-primary:disabled { border-color: var(--av-border, rgb(47, 51, 54)); background: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 24%, var(--av-surface-raised, rgb(22, 24, 28))); color: var(--av-muted, rgb(132, 139, 145)); box-shadow: none; } .av-button:disabled { cursor: not-allowed; opacity: 0.55; } .av-searchbar { position: relative; min-width: 0; } .av-search-icon { position: absolute; inset-block-start: 50%; inset-inline-start: 13px; width: 17px; height: 17px; transform: translateY(-50%); fill: none; stroke: var(--av-muted, rgb(132, 139, 145)); stroke-width: 1.8; stroke-linecap: round; pointer-events: none; } .av-search-input { width: 100%; height: 36px; padding-block: 0; padding-inline: 40px 14px; border: 1px solid transparent; border-radius: 8px; background: var(--av-surface-raised, rgb(17, 25, 33)); color: var(--av-text, rgb(239, 243, 244)); font-size: 13px; line-height: 1.4; font-family: inherit; } .av-search-input::placeholder { color: var(--av-muted, rgb(132, 139, 145)); } .av-search-input:focus-visible { border-color: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 70%, transparent); outline-color: var(--av-page-accent, rgb(77, 199, 255)); } /* Two panes: a fixed rail and a scrolling content column. Each scrolls independently, so moving through a long section never scrolls the section list out of reach. */ .av-panel-body { display: grid; grid-template-columns: 220px minmax(0, 1fr); min-height: 0; flex: 1; overflow: hidden; } .av-nav { display: flex; flex-direction: column; gap: 2px; padding: 12px 10px; overflow-y: auto; /* Reserved so the list does not reflow the moment it becomes scrollable. */ scrollbar-gutter: stable; border-inline-end: 1px solid var(--av-border, rgb(47, 51, 54)); background: color-mix(in srgb, var(--av-surface, rgb(10, 16, 22)) 94%, var(--av-bg)); /* The rail scrolls at thirteen sections and a short viewport, and nothing said so -- the last item rendered cut through its own baseline, which reads as a rendering fault rather than a list with more below. The mask only bites where content actually reaches the bottom edge, so a rail that fits is untouched. */ mask-image: none; } .av-nav, .av-content { scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--av-muted, rgb(132, 139, 145)) 58%, transparent) transparent; } .av-nav::-webkit-scrollbar, .av-content::-webkit-scrollbar { width: 6px; height: 6px; } .av-nav::-webkit-scrollbar-thumb, .av-content::-webkit-scrollbar-thumb { border-radius: 3px; background: color-mix(in srgb, var(--av-muted, rgb(132, 139, 145)) 58%, transparent); } .av-nav-group { /* The rail is sized so all twelve sections fit without scrolling at the default panel height; a sliced-in-half last item reads as a rendering bug rather than as "more below". */ margin: 11px 0 4px; padding: 0 10px; color: var(--av-muted, rgb(132, 139, 145)); font-size: 11.5px; font-weight: 800; line-height: 1.2; letter-spacing: 0.08em; text-transform: uppercase; } .av-nav-group:first-child { margin-top: 0; } .av-nav-group-toggle { display: grid; grid-template-columns: minmax(0, 1fr) auto 10px; align-items: center; gap: 7px; width: 100%; min-height: 34px; margin-top: 11px; padding-block: 0; padding-inline: 10px 8px; border: 1px solid transparent; border-radius: 6px; background: transparent; font-family: inherit; text-align: start; cursor: pointer; } .av-nav-group-toggle:hover, .av-nav-group-toggle:focus-visible { border-color: var(--av-border, rgb(47, 51, 54)); background: var(--av-surface-raised, rgb(22, 24, 28)); color: var(--av-text, rgb(239, 243, 244)); } .av-nav-group-toggle::after { content: ""; width: 6px; height: 6px; border-inline-end: 1.5px solid currentColor; border-block-end: 1.5px solid currentColor; transform: rotate(45deg) translate(-1px, -1px); transition: transform 140ms ease; } .av-nav-group-toggle[aria-expanded="true"]::after { transform: rotate(225deg) translate(-1px, -1px); } .av-nav-group-label { min-width: 0; } .av-nav-group-count { min-width: 20px; padding: 2px 4px; border: 1px solid var(--av-border, rgb(47, 51, 54)); border-radius: 4px; color: var(--av-muted, rgb(132, 139, 145)); font-size: 10px; line-height: 1.1; text-align: center; } .av-nav-item { position: relative; min-height: 33px; padding-block: 0; padding-inline: 18px 12px; border: 0; border-radius: 6px; background: transparent; color: color-mix(in srgb, var(--av-text, rgb(239, 243, 244)) 70%, var(--av-muted, rgb(132, 139, 145))); font-weight: 600; font-size: 14px; line-height: 1.2; font-family: inherit; text-align: start; cursor: pointer; } .av-nav-item::before { content: ""; position: absolute; inset-block: 8px; inset-inline-start: 4px; width: 2px; border-radius: 2px; background: transparent; } .av-nav-item:hover { background: var(--av-surface-raised, rgb(22, 24, 28)); color: var(--av-text, rgb(239, 243, 244)); } .av-nav-item.is-active { background: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 10%, var(--av-surface-raised, rgb(22, 24, 28))); color: var(--av-text, rgb(239, 243, 244)); } .av-nav-item.is-active::before { background: var(--av-page-accent, rgb(77, 199, 255)); box-shadow: none; } .av-content { display: grid; align-content: start; gap: 12px; padding: 16px 28px 22px; overflow-y: auto; min-height: 0; scrollbar-gutter: stable; background: var(--av-surface, rgb(10, 16, 22)); } .av-empty { display: grid; gap: 6px; padding: 24px 4px; } .av-empty-title { margin: 0; color: var(--av-text, rgb(239, 243, 244)); font-size: 14px; } .av-empty-hint { margin: 0; color: var(--av-muted, rgb(132, 139, 145)); font-size: 13px; line-height: 1.4; } .av-section { display: grid; gap: 10px; min-width: 0; } .av-page-header { display: flex; align-items: center; gap: 0; min-height: 52px; padding-bottom: 10px; border-bottom: 1px solid var(--av-border, rgb(47, 51, 54)); } .av-page-icon { display: none; } .av-page-heading-copy { display: grid; gap: 3px; min-width: 0; } .av-page-kicker { display: none; } .av-section-title { margin: 0; color: var(--av-text, rgb(239, 243, 244)); font-size: 24px; font-weight: 760; line-height: 1.12; letter-spacing: -0.025em; } .av-page-summary { margin: 0; color: var(--av-muted, rgb(132, 139, 145)); font-size: 13.5px; line-height: 1.4; max-width: 760px; overflow-wrap: anywhere; } .av-page-grid { display: grid; grid-template-columns: minmax(0, 1fr); align-items: stretch; gap: 0; min-width: 0; } .av-section[data-av-section="presets"] .av-page-grid { grid-template-columns: minmax(0, 1fr); gap: 8px; } .av-section[data-av-section="presets"] .av-page-grid > .av-row:not(.av-preset-card) { grid-column: 1 / -1; min-height: 52px; padding: 8px 12px; } .av-section[data-av-section="appearance"] .av-page-grid, .av-section[data-av-section="hidden"] .av-page-grid, .av-section[data-av-section="performance"] .av-page-grid { grid-template-columns: minmax(0, 1fr); gap: 0; } .av-section[data-av-section="media"] .av-page-grid { grid-template-columns: minmax(0, 1fr); } .av-section[data-av-section="media"] .av-group-title, .av-section[data-av-section="media"] .av-row[data-av-label="Show download buttons"], .av-section[data-av-section="media"] .av-row[data-av-label="Prefer original quality"], .av-section[data-av-section="media"] .av-row[data-av-label="Original quality status"], .av-section[data-av-section="media"] .av-row[data-av-label="Show images at original quality"], .av-section[data-av-section="media"] .av-row[data-av-label="Media layout"], .av-section[data-av-section="media"] .av-row[data-av-label="Filename template"], .av-section[data-av-section="media"] .av-row[data-av-label="Download all visible media"] { grid-column: 1 / -1; } .av-section[data-av-section="media"] .av-row[data-av-label="Download all visible media"] > .av-button { border-color: transparent; background: var(--av-page-accent, rgb(72, 211, 193)); color: rgb(3, 20, 24); font-weight: 780; } .av-section[data-av-section="media"] .av-row[data-av-label="Download all visible media"] > .av-button:hover:not(:disabled) { background: color-mix(in srgb, var(--av-page-accent, rgb(72, 211, 193)) 86%, white); } .av-section[data-av-section="media"] .av-row[data-av-label="Concurrent downloads"] { display: flex; grid-column: 1 / -1; flex-direction: row; align-items: center; } .av-section[data-av-section="media"] .av-row[data-av-label="Concurrent downloads"] > .av-text-input { flex: 0 0 64px; width: 64px; } .av-section[data-av-section="media"] .av-row[data-av-label="Download pacing"] .av-select { min-width: 118px; } .av-group-title { grid-column: 1 / -1; margin: 13px 0 3px; color: var(--av-muted, rgb(132, 139, 145)); font-size: 11.5px; font-weight: 820; line-height: 1.2; letter-spacing: 0.09em; text-transform: uppercase; } .av-group-title:first-child { margin-top: 0; } .av-start-guide { grid-column: 1 / -1; display: grid; gap: 10px; min-width: 0; } .av-start-note { display: grid; gap: 3px; padding: 10px 12px; border: 1px solid color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 32%, var(--av-border, rgb(47, 51, 54))); border-inline-start: 3px solid var(--av-page-accent, rgb(77, 199, 255)); border-radius: 8px; background: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 6%, var(--av-surface-raised, rgb(17, 25, 33))); } .av-start-note-title, .av-start-task-title { color: var(--av-text, rgb(239, 243, 244)); font-size: 13px; line-height: 1.3; } .av-start-note-copy, .av-start-task-description { color: var(--av-muted, rgb(132, 139, 145)); font-size: 12px; line-height: 1.4; } .av-start-task-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } .av-start-task { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 12px; min-height: 64px; padding: 10px 12px; border: 1px solid var(--av-border, rgb(47, 51, 54)); border-radius: 8px; background: var(--av-surface-raised, rgb(17, 25, 33)); font-family: inherit; text-align: start; cursor: pointer; transition: border-color 140ms ease, background 140ms ease; } .av-start-task:hover { border-color: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 58%, var(--av-border, rgb(47, 51, 54))); background: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 8%, var(--av-surface-raised, rgb(17, 25, 33))); } .av-start-task-copy { display: grid; gap: 3px; min-width: 0; } .av-start-task-action { color: var(--av-page-accent, rgb(77, 199, 255)); font-size: 12px; font-weight: 720; line-height: 1.2; white-space: nowrap; } .av-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; min-width: 0; min-height: 50px; padding: 7px 0; box-sizing: border-box; /* Rows share one surface. A single divider keeps groups scannable without boxing each item. */ border: 0; border-bottom: 1px solid var(--av-border, rgb(47, 51, 54)); border-radius: 0; background: transparent; transition: background 140ms ease, color 140ms ease; } .av-row:hover { background: color-mix(in srgb, var(--av-surface-raised, rgb(22, 24, 28)) 46%, transparent); } .av-page-grid > .av-row + .av-row { margin-top: 0; } .av-group-title + .av-row, .av-page-grid > .av-row:first-child { border-start-start-radius: 0; border-start-end-radius: 0; } .av-row:has(+ .av-group-title), .av-page-grid > .av-row:last-child { border-end-start-radius: 0; border-end-end-radius: 0; } .av-section[data-av-section="appearance"] .av-row, .av-section[data-av-section="hidden"] .av-row, .av-section[data-av-section="performance"] .av-row { margin-top: 0; border-radius: 0; } .av-page-grid > .av-row-stack:not(.av-preset-card), .av-page-grid > .av-row:has(.av-textarea), .av-page-grid > .av-row:has(.av-text-input), .av-page-grid > .av-row:has(.av-file-input), .av-page-grid > .av-row:has(.av-search-results) { grid-column: 1 / -1; } .av-row-stack { flex-direction: column; align-items: stretch; gap: 7px; } .av-row-stack:has(> .av-text-input), .av-row-stack:has(> .av-textarea), .av-row-stack:has(> .av-file-input) { display: grid; grid-template-columns: minmax(210px, 0.75fr) minmax(280px, 1.25fr) auto; align-items: center; gap: 12px; } .av-row-stack:has(> .av-textarea) { align-items: start; } .av-section[data-av-section="library"] .av-row-stack:has(> .av-library-media-actions) { grid-template-columns: minmax(320px, 1fr) auto; } .av-section[data-av-section="library"] .av-row-stack:has(> .av-library-media-actions) > .av-row-copy { grid-column: 1 / -1; } .av-row-stack:has(> .av-textarea) > .av-button { margin-top: 2px; } .av-rule-set-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; } .av-rule-set-actions .av-button { min-width: 0; min-height: 32px; padding-inline: 10px; } .av-rule-set-preview { grid-column: 2 / -1; min-height: 18px; color: var(--av-muted, rgb(132, 139, 145)); font-size: 12px; line-height: 1.35; } .av-rule-set-preview[data-av-state="error"] { color: var(--av-danger, rgb(244, 33, 46)); } .av-preservation-row { grid-column: 1 / -1; display: grid; grid-template-columns: minmax(280px, 1fr) auto; align-items: center; min-height: 64px; } .av-preservation-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 6px; } .av-preservation-actions .av-button { min-width: 0; min-height: 34px; padding-inline: 12px; } .av-replay-link { display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; text-decoration: none; } .av-preset-card { position: relative; display: grid; grid-template-columns: minmax(260px, 1.15fr) minmax(300px, 1fr) auto; align-items: center; min-height: 68px; gap: 16px; padding: 10px 8px 10px 16px; overflow: hidden; border-radius: 0; } .av-preset-card::before { content: ""; position: absolute; inset-block: 0; inset-inline-start: 0; width: 3px; background: var(--av-card-accent, var(--av-page-accent, rgb(77, 199, 255))); } .av-preset-card { --av-card-accent: var(--av-page-accent, rgb(72, 211, 193)); } .av-preset-card .av-row-label { color: var(--av-text, rgb(239, 243, 244)); font-size: 14px; } .av-preset-header { display: flex; align-items: start; gap: 10px; min-width: 0; } .av-preset-icon { flex: 0 0 auto; width: 28px; height: 28px; padding: 2px; box-sizing: border-box; fill: none; stroke: var(--av-card-accent, var(--av-page-accent, rgb(77, 199, 255))); stroke-width: 1.65; stroke-linecap: round; stroke-linejoin: round; } .av-preset-card .av-row-description { display: block; overflow: visible; } .av-preset-highlights { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 4px 10px; padding: 0; border: 0; } .av-preset-highlight { display: flex; align-items: center; justify-content: flex-start; gap: 4px; min-width: 0; font-size: 12px; line-height: 1.2; } .av-preset-highlight-label { color: var(--av-muted, rgb(132, 139, 145)); white-space: normal; } .av-preset-highlight-value { flex: 0 0 auto; color: var(--av-card-accent, var(--av-page-accent, rgb(77, 199, 255))); font-weight: 700; } .av-row-stack.av-preset-card > .av-button { margin-top: 0; width: auto; min-width: 84px; min-height: 34px; } /* Text fields and textareas want the full row width; an action button does not. At the old 386px panel a stretched button looked deliberate. At 780px it reads as a banner. */ .av-row-stack > .av-button { align-self: start; width: auto; min-width: 132px; } .av-textarea, .av-text-input { width: 100%; padding: 8px 10px; border: 1px solid var(--av-border, rgb(47, 51, 54)); border-radius: 8px; background: var(--av-surface, rgb(15, 20, 25)); color: var(--av-text, rgb(239, 243, 244)); font: 12px/1.4 ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace; } .av-textarea { min-height: 76px; resize: vertical; } .av-text-input { height: 38px; } .av-file-input { width: 100%; color: var(--av-text, rgb(239, 243, 244)); font: 12px/1.4 ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace; } .av-search-results { display: grid; gap: 6px; max-height: 220px; overflow: auto; } .av-row-stack > .av-search-results { grid-column: 1 / -1; } .av-library-media-actions { align-items: center; justify-content: flex-end; flex-wrap: nowrap; } .av-library-media-actions > .av-inline-controls { align-items: center; white-space: nowrap; } .av-library-media-actions .av-library-media-download { flex: 0 0 auto; min-width: 132px; } .av-library-media-count { min-width: 54px; text-align: end; white-space: nowrap; } .av-search-hit { display: grid; gap: 2px; padding: 6px 8px; border: 0; border-inline-start: 2px solid color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 58%, transparent); border-radius: 0; background: color-mix(in srgb, var(--av-surface-raised, rgb(17, 25, 33)) 66%, transparent); } .av-bookmark-editor { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; margin-top: 6px; } .av-bookmark-editor .av-bookmark-notes { grid-column: 1 / -1; min-height: 54px; } .av-bookmark-hit > .av-inline-controls { margin-top: 2px; } .av-textarea:focus-visible { outline: 2px solid var(--av-accent, rgb(29, 155, 240)); outline-offset: 2px; } .av-chip-group { display: flex; flex-wrap: wrap; gap: 6px; } .av-chip { display: inline-flex; align-items: center; gap: 6px; min-height: 30px; padding: 4px 10px; border: 1px solid transparent; border-radius: 6px; background: var(--av-surface-raised, rgb(17, 25, 33)); color: var(--av-text, rgb(239, 243, 244)); cursor: pointer; font-size: 12px; line-height: 1.2; } .av-chip input[type="checkbox"] { width: 14px; height: 14px; } .av-chip-label { font-weight: 650; } .av-row-copy { display: grid; gap: 3px; min-width: 0; } .av-inline-controls { display: flex; gap: 8px; } .av-inline-controls .av-button { flex: 1 1 auto; } .av-row-label { color: var(--av-text, rgb(239, 243, 244)); font-size: 14.5px; font-weight: 720; line-height: 1.25; } /* Descriptions are never clamped: some carry syntax a reader needs in full, such as the filter rule grammar, and a clamp gave no way to expand them. The a11y sweep fails on any clipping. */ .av-row-description { color: var(--av-muted, rgb(132, 139, 145)); font-size: 13.5px; line-height: 1.4; } input[type="checkbox"] { width: 18px; height: 18px; accent-color: var(--av-page-accent, var(--av-accent, rgb(29, 155, 240))); } .av-toggle-control { position: relative; flex: 0 0 38px; width: 38px; height: 22px; } .av-toggle-control > input[type="checkbox"] { position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; margin: 0; appearance: none; opacity: 0; cursor: pointer; } .av-toggle { position: absolute; inset: 0; border: 1px solid color-mix(in srgb, var(--av-border, rgb(47, 51, 54)) 70%, var(--av-text, rgb(239, 243, 244)) 30%); border-radius: 6px; background: color-mix(in srgb, var(--av-surface, rgb(15, 20, 25)) 78%, black); transition: border-color 140ms ease, background 140ms ease; } .av-toggle::before { content: ""; position: absolute; inset-block-start: 3px; inset-inline-start: 3px; width: 14px; height: 14px; border-radius: 3px; background: var(--av-muted, rgb(132, 139, 145)); transition: transform 140ms ease, background 140ms ease; } .av-toggle-control > input[type="checkbox"]:checked + .av-toggle { border-color: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 72%, transparent); background: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 28%, var(--av-surface, rgb(15, 20, 25))); } .av-toggle-control > input[type="checkbox"]:checked + .av-toggle::before { background: var(--av-page-accent, rgb(77, 199, 255)); transform: translateX(16px); } :host([dir="rtl"]) .av-toggle-control > input[type="checkbox"]:checked + .av-toggle::before { transform: translateX(-16px); } .av-toggle-control > input[type="checkbox"]:focus-visible + .av-toggle { outline: 2px solid var(--av-page-accent, rgb(77, 199, 255)); outline-offset: 2px; } .av-select { max-width: 178px; padding: 0 10px; } .av-button-danger { border-color: color-mix(in srgb, var(--av-danger, rgb(244, 33, 46)) 76%, white 12%); background: color-mix(in srgb, var(--av-danger, rgb(244, 33, 46)) 82%, black 10%); color: white; } .av-button-danger:hover:not(:disabled) { border-color: color-mix(in srgb, var(--av-danger, rgb(244, 33, 46)) 62%, white 38%); background: var(--av-danger, rgb(244, 33, 46)); } .av-cleanup-workspace, .av-cleanup-advanced { grid-column: 1 / -1; border: 1px solid var(--av-border, rgb(47, 51, 54)); border-radius: 8px; background: color-mix(in srgb, var(--av-surface-raised, rgb(22, 24, 28)) 68%, transparent); } .av-cleanup-categories { grid-column: 1 / -1; margin: 0; } .av-cleanup-categories > legend { padding: 0; } .av-cleanup-category-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; width: 100%; } .av-cleanup-category { display: flex; align-items: flex-start; gap: 9px; min-width: 0; padding: 10px; border: 1px solid var(--av-border, rgb(47, 51, 54)); border-radius: 8px; background: var(--av-surface, rgb(15, 20, 25)); cursor: pointer; } .av-cleanup-category:has(input:checked) { border-color: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 64%, transparent); background: color-mix(in srgb, var(--av-page-accent, rgb(77, 199, 255)) 8%, var(--av-surface, rgb(15, 20, 25))); } .av-cleanup-category:has(input:disabled) { cursor: not-allowed; opacity: 0.62; } .av-cleanup-category input { flex: 0 0 auto; margin: 1px 0 0; } .av-cleanup-category-copy { display: grid; gap: 3px; min-width: 0; } .av-cleanup-category-title { color: var(--av-text, rgb(239, 243, 244)); font-size: 12px; } .av-cleanup-category-description { color: var(--av-muted, rgb(132, 139, 145)); font-size: 11px; line-height: 1.35; } .av-cleanup-number { width: 96px; min-height: 34px; padding: 0 10px; border: 1px solid var(--av-border, rgb(47, 51, 54)); border-radius: 8px; background: var(--av-surface-raised, rgb(17, 25, 33)); color: var(--av-text, rgb(239, 243, 244)); font-family: inherit; font-size: 13px; font-weight: 650; line-height: 1.2; } .av-cleanup-workspace { display: grid; gap: 12px; padding: 14px; border-color: color-mix(in srgb, var(--av-danger, rgb(244, 33, 46)) 34%, var(--av-border, rgb(47, 51, 54))); } .av-cleanup-buttons { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; } .av-cleanup-guidance { color: var(--av-text, rgb(239, 243, 244)); font-size: 13px; line-height: 1.45; } .av-cleanup-primary-action { min-width: 180px; min-height: 42px; padding-inline: 22px; font-size: 14px; font-weight: 780; } .av-cleanup-advanced { overflow: hidden; } .av-cleanup-advanced-summary { min-height: 48px; padding: 10px 14px; color: var(--av-text, rgb(239, 243, 244)); cursor: pointer; } .av-cleanup-advanced-summary:focus-visible { outline: 2px solid var(--av-page-accent, rgb(77, 199, 255)); outline-offset: -3px; } .av-cleanup-advanced-copy { display: inline-grid; gap: 2px; padding-inline-start: 6px; vertical-align: middle; } .av-cleanup-advanced-title { font-size: 13px; line-height: 1.3; } .av-cleanup-advanced-description { color: var(--av-muted, rgb(132, 139, 145)); font-size: 11px; line-height: 1.4; } .av-cleanup-advanced-body { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); padding: 0 12px 12px; } .av-cleanup-advanced-body .av-row { min-width: 0; } .av-transaction-bar { display: flex; align-items: center; justify-content: space-between; gap: 20px; min-height: 54px; padding: 8px 18px; border-top: 1px solid var(--av-border, rgb(47, 51, 54)); background: color-mix(in srgb, var(--av-surface, rgb(10, 16, 22)) 94%, var(--av-bg)); box-shadow: none; } .av-transaction-status { display: grid; flex: 1 1 auto; gap: 2px; min-width: 0; } .av-status { display: flex; align-items: center; flex: 1 1 auto; gap: 8px; min-width: 0; color: var(--av-muted, rgb(132, 139, 145)); font-size: 13px; line-height: 1.3; } .av-transaction-hint { color: var(--av-muted, rgb(132, 139, 145)); font-size: 11px; line-height: 1.25; } .av-transaction-actions { display: flex; flex: 0 0 auto; align-items: center; gap: 8px; } .av-transaction-actions .av-button { min-width: 82px; } .av-status::before { content: ""; width: 7px; height: 7px; border-radius: 2px; background: var(--av-ok, rgb(72, 211, 147)); box-shadow: none; } .av-status[data-state="dirty"] { color: var(--av-warn, rgb(247, 183, 73)); } .av-status[data-state="dirty"]::before { background: var(--av-warn, rgb(247, 183, 73)); box-shadow: none; } .av-status[data-state="saving"]::before { background: var(--av-page-accent, rgb(77, 199, 255)); box-shadow: none; } .av-status[data-state="error"] { color: var(--av-danger, rgb(255, 120, 128)); } .av-status[data-state="error"]::before { background: var(--av-danger, rgb(255, 120, 128)); box-shadow: none; } /* Touch and viewport rules must live in this stylesheet: a sheet in document.head cannot reach into the shadow root, so the page-level av-touch / av-mobile classes never styled these controls. Media queries evaluate against the viewport and do work here. */ @media (pointer: coarse) { .av-row { min-height: 56px; } .av-button, .av-select { min-height: 44px; } .av-chip { min-height: 44px; } .av-text-input { height: 44px; } input[type="checkbox"] { width: 24px; height: 24px; } .av-chip input[type="checkbox"] { width: 18px; height: 18px; } } /* * Windows High Contrast and any other forced-colors mode. * * The UA overrides author colours, drops non-url() background-image to none, and drops box-shadow * to none. This panel signalled a great deal through exactly those three, so before this block a * forced-colors user got a settings cockpit whose controls were largely indistinguishable from each * other -- worst of all the toggle, which carried its entire on/off state in a background colour * and a background-coloured ::before knob. * * The toggle is the important case and the fix is to stop competing with the UA: the real checkbox * is normally opacity:0 with appearance:none, so here it is handed back its native rendering and * the painted track is hidden. The UA draws a checked box in system colours that are guaranteed to * contrast, which no author styling can promise. System colours also follow *native* element * semantics rather than ARIA roles, so a styled span could never have earned ButtonText here. * * Everywhere else, borders replace the shadows and tints that carried structure. */ @media (forced-colors: active) { .av-toggle-control > input[type="checkbox"] { opacity: 1; appearance: auto; inset: auto; width: auto; height: auto; position: static; } .av-toggle { display: none; } .av-toggle-control { flex-basis: auto; width: auto; display: flex; justify-content: flex-end; align-items: center; } /* Structure that was carried by elevation or tint needs an explicit edge. */ .av-panel, .av-row, .av-button, .av-select, .av-preset-card, .av-start-note, .av-start-task, .av-nav-group-toggle, .av-transaction-bar, .av-nav-launcher-pill, input, textarea { border: 1px solid ButtonBorder; } .av-panel, .av-row, .av-preset-card { background: Canvas; color: CanvasText; } .av-button { background: ButtonFace; color: ButtonText; } /* A selected destination was distinguished only by its background tint. */ .av-nav-item[aria-current="page"], .av-nav-item.is-active { background: Highlight; color: HighlightText; forced-color-adjust: none; } /* The focus ring must not be the same colour as an ordinary border. */ .av-launcher:focus-visible, .av-button:focus-visible, .av-select:focus-visible, .av-nav-item:focus-visible, .av-nav-group-toggle:focus-visible, .av-start-task:focus-visible, input:focus-visible, textarea:focus-visible { outline: 2px solid Highlight; outline-offset: 2px; } /* Status tone was colour-only; keep the text and let the UA colour it. */ .av-status { border: 1px solid ButtonBorder; } /* * Keep the commit bar edge explicit when the UA replaces the authored surface colours. */ .av-transaction-bar { background: Canvas; color: CanvasText; } } @media (max-width: 1100px) { .av-panel { width: min(960px, calc(100vw - 32px)); } .av-panel-body { grid-template-columns: 190px minmax(0, 1fr); } .av-content { padding-inline: 20px; } .av-preset-card { grid-template-columns: minmax(0, 1fr) auto; } .av-preset-highlights { grid-column: 1 / -1; justify-content: flex-start; } .av-section[data-av-section="media"] .av-page-grid { grid-template-columns: minmax(0, 1fr); } .av-transaction-hint { display: none; } } @media (max-width: 900px) { .av-start-task-grid { grid-template-columns: minmax(0, 1fr); } /* Keep form rows usable before the compact rail breakpoint. The old three-column minimums were wider than the content pane once the browser reserved space for its scrollbar. */ .av-row-stack:has(> .av-text-input), .av-row-stack:has(> .av-textarea), .av-row-stack:has(> .av-file-input) { grid-template-columns: minmax(0, 1fr); } .av-row-stack:has(> .av-textarea) > .av-rule-set-actions, .av-row-stack:has(> .av-textarea) > .av-rule-set-preview { grid-column: 1 / -1; } .av-rule-set-actions { justify-content: flex-start; } .av-section[data-av-section="library"] .av-row-stack:has(> .av-library-media-actions) { grid-template-columns: minmax(0, 1fr); } } @media (max-width: 760px) { .av-launcher { inset-inline-end: 12px; bottom: 12px; min-width: 92px; min-height: 48px; } .av-panel { width: min(420px, calc(100vw - 16px)); height: min(86vh, calc(100vh - 60px)); } .av-panel-header { grid-template-columns: minmax(0, 1fr) auto; gap: 10px 12px; height: auto; min-height: 0; padding: 12px; } .av-searchbar { grid-column: 1 / -1; grid-row: 2; } .av-subtitle { display: none; } /* No room for a side rail. It becomes a horizontal strip of chips above the content, which keeps every section one tap away instead of hiding them behind a menu. */ .av-panel-body { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr); } .av-nav { flex-direction: row; gap: 6px; padding: 10px 12px; overflow-x: auto; overflow-y: hidden; border-inline-end: 0; border-bottom: 1px solid var(--av-border, rgb(47, 51, 54)); mask-image: none; scrollbar-width: none; } .av-nav::-webkit-scrollbar { display: none; } .av-nav-item { flex: 0 0 auto; min-height: 44px; } /* Static group headings only make sense stacked. The More tools disclosure remains reachable. */ .av-nav-group:not(.av-nav-group-toggle) { display: none; } .av-nav-group-toggle { display: grid; flex: 0 0 auto; width: auto; min-height: 44px; margin: 0; padding-inline: 12px 10px; border-color: var(--av-border, rgb(47, 51, 54)); color: var(--av-muted, rgb(132, 139, 145)); } .av-content { padding: 18px 14px 22px; } .av-transaction-bar { gap: 10px; padding: 9px 12px; } .av-transaction-actions .av-button { min-width: 72px; padding-inline: 10px; } .av-page-header { gap: 12px; padding-bottom: 14px; } .av-page-icon { width: 42px; height: 42px; padding: 9px; } .av-section-title { font-size: 21px; } .av-page-grid, .av-section[data-av-section="presets"] .av-page-grid { grid-template-columns: minmax(0, 1fr); } .av-cleanup-category-grid, .av-cleanup-advanced-body { grid-template-columns: minmax(0, 1fr); } .av-rule-set-preview { grid-column: auto; } .av-preservation-row { grid-template-columns: minmax(0, 1fr); align-items: stretch; } .av-preservation-actions { justify-content: flex-start; } .av-section[data-av-section="library"] .av-row-stack:has(> .av-library-media-actions) { grid-template-columns: minmax(0, 1fr); } .av-section[data-av-section="appearance"] .av-page-grid, .av-section[data-av-section="hidden"] .av-page-grid, .av-section[data-av-section="performance"] .av-page-grid { grid-template-columns: minmax(0, 1fr); } .av-preset-card, .av-row-stack:has(> .av-text-input), .av-row-stack:has(> .av-textarea), .av-row-stack:has(> .av-file-input) { grid-template-columns: minmax(0, 1fr); } .av-start-task-grid { grid-template-columns: minmax(0, 1fr); } .av-preset-highlights { grid-column: auto; } .av-library-media-actions { justify-content: flex-start; flex-wrap: wrap; } .av-library-media-count { text-align: start; } .av-row, .av-preset-card { min-height: 76px; } } @media (max-width: 420px) { .av-row { flex-direction: column; align-items: stretch; gap: 8px; } .av-row > .av-button, .av-row > .av-select, .av-row > .av-text-input, .av-row > .av-toggle-control { align-self: flex-start; max-width: 100%; } .av-row > .av-select { width: 100%; } .av-inline-controls { width: 100%; flex-wrap: wrap; } .av-inline-controls .av-text-input { flex: 1 1 120px; min-width: 0; } .av-inline-controls .av-button { flex: 1 1 100%; } .av-cleanup-buttons { align-items: stretch; } .av-cleanup-primary-action { flex: 1 1 100%; width: 100%; } .av-start-task { grid-template-columns: minmax(0, 1fr); } .av-transaction-bar { flex-direction: column; align-items: stretch; } .av-transaction-actions { justify-content: flex-end; } } /* Motion reduction is decided once, in prefersReducedMotion(), and stamped on the host as data-av-motion, because a page-level class cannot cross into this shadow tree. There is deliberately no @media (prefers-reduced-motion: reduce) block beside this. That block used to sit here naming .av-launcher and .av-panel, and it was wrong twice over: .av-panel has no transition to stop, and the media query does not know about the reduceMotion setting, so a reader who had explicitly chosen "never" still had their animations taken away by the OS preference. Under the OS preference the host already reads "reduce", so the block added nothing it did not also break. The selector is the whole tree rather than a list of controls. The list version named two and missed five: the toggle and its knob, buttons and rows, which is every control a reader touches while changing a setting. A tree-wide rule cannot fall behind a control added later. It sits last in the stylesheet deliberately, because it ties on specificity with the rules it overrides and wins on order. */ :host([data-av-motion="reduce"]) *, :host([data-av-motion="reduce"]) *::before, :host([data-av-motion="reduce"]) *::after { transition: none; } /* The launcher's resting lift is a transform rather than a transition, so it needs saying separately. */ :host([data-av-motion="reduce"]) .av-launcher, :host([data-av-motion="reduce"]) .av-launcher:hover { transform: none; } `; // src/features/privacy/page-hooks.ts var blockedBeacons = 0; var blockedAdRequests = 0; var rewrittenPlaylists = 0; var bridgeStatus = "connecting"; var bridgeReason = ""; var subscribedBridge; var blockedHandler; var playlistHandler; var pageHooksFeature = { id: "privacy.pageHooks", title: "Page-world hooks", category: "privacy", init(ctx) { const bridge = ctx.pageBridge; if (!bridge) { bridgeStatus = "unavailable"; bridgeReason = "No page bridge was created for this build."; return; } if (subscribedBridge !== bridge) { detachBridgeHandlers(); subscribedBridge = bridge; blockedHandler = (payload) => { const blocked = payload; if (blocked?.category === "ad") { blockedAdRequests += 1; ctx.diagnostics.info("Promoted-content logging call refused", { via: blocked?.via, url: blocked?.url }); return; } blockedBeacons += 1; ctx.diagnostics.info("Analytics beacon refused", { via: blocked?.via, url: blocked?.url }); }; bridge.on("blocked", blockedHandler); playlistHandler = (payload) => { rewrittenPlaylists += 1; const rewrite = payload; ctx.diagnostics.info("Video playlist pinned to its best rendition", { variantsBefore: rewrite?.variantsBefore }); }; bridge.on("playlist", playlistHandler); } pushConfig(ctx); }, apply(ctx) { pushConfig(ctx); }, destroy(ctx) { ctx.pageBridge?.configure({ blockAds: false, blockBeacons: false, captureGraphql: false, captureMediaMetadata: false, forceVideoQuality: false }); blockedBeacons = 0; blockedAdRequests = 0; rewrittenPlaylists = 0; if (subscribedBridge === ctx.pageBridge) { detachBridgeHandlers(); subscribedBridge = void 0; } }, getStatus() { if (bridgeStatus === "unavailable") { return { ok: false, message: bridgeReason || "Aviary cannot reach the page's own network layer." }; } if (bridgeStatus === "connecting") { return { ok: true, message: "Connecting to the page\u2026" }; } const parts = []; if (blockedAdRequests > 0) { parts.push(`${blockedAdRequests} ad call${blockedAdRequests === 1 ? "" : "s"} refused`); } if (blockedBeacons > 0) { parts.push(`${blockedBeacons} beacon${blockedBeacons === 1 ? "" : "s"} refused`); } if (rewrittenPlaylists > 0) { parts.push( `${rewrittenPlaylists} video${rewrittenPlaylists === 1 ? "" : "s"} pinned to best quality` ); } return { ok: true, message: parts.length > 0 ? parts.join(" \xB7 ") : "Connected to the page" }; } }; function pushConfig(ctx) { const bridge = ctx.pageBridge; if (!bridge) { return; } bridgeStatus = bridge.status(); bridgeReason = bridge.reason(); bridge.configure({ // The page-world logger stub is the network half; structural suppression is separate. blockAds: ctx.settings.privacy.blockAds && ctx.settings.privacy.networkShield, blockBeacons: ctx.settings.privacy.blockAnalyticsBeacons, captureGraphql: ctx.settings.export.preserveRawPayloads, captureMediaMetadata: ctx.settings.media.buttons, forceVideoQuality: ctx.settings.performance.forceVideoQuality }); } function pageHookCounters() { return { blockedBeacons, blockedAdRequests, rewrittenPlaylists }; } function detachBridgeHandlers() { if (blockedHandler) subscribedBridge?.off("blocked", blockedHandler); if (playlistHandler) subscribedBridge?.off("playlist", playlistHandler); blockedHandler = void 0; playlistHandler = void 0; } // src/features/privacy/ad-protection.ts var STYLE_ID3 = "av-ad-protection"; var HIDDEN_ATTRIBUTE = "data-av-ad-hidden"; var ARTICLE_SELECTOR2 = 'article[data-testid="tweet"]'; var TREND_SELECTOR = '[data-testid="trend"]'; var VIDEO_SELECTOR = '[data-testid="videoPlayer"], [data-testid="videoComponent"]'; var HOUSE_PROMO_SELECTOR = [ 'aside[aria-label="Subscribe to Premium"]', '[data-testid^="super-upsell"]', 'aside[role="complementary"]:has(a[href*="grok.com"])' ].join(", "); var AD_LABELS = /* @__PURE__ */ new Set([ "Ad", "Promoted", "Sponsored", "Paid partnership", "Anuncio", "Promocionado", "Patrocinado", "Colaboraci\xF3n pagada", "Publicit\xE9", "Sponsoris\xE9", "Partenariat r\xE9mun\xE9r\xE9", "Anzeige", "Gesponsert", "Bezahlte Partnerschaft", "\u5E83\u544A", "\u30D7\u30ED\u30E2\u30FC\u30B7\u30E7\u30F3", "\u30BF\u30A4\u30A2\u30C3\u30D7", "\uAD11\uACE0", "\uD504\uB85C\uBAA8\uC158", "\uC720\uB8CC \uD30C\uD2B8\uB108\uC2ED", "An\xFAncio", "Promovido", "Parceria paga", "\u0625\u0639\u0644\u0627\u0646", "\u0645\u064F\u0631\u0648\u064E\u0651\u062C", "\u0634\u0631\u0627\u0643\u0629 \u0645\u062F\u0641\u0648\u0639\u0629", "\u05DE\u05D5\u05D3\u05E2\u05D4", "\u05DE\u05E7\u05D5\u05D3\u05DD", "\u05E9\u05D5\u05EA\u05E4\u05D5\u05EA \u05D1\u05EA\u05E9\u05DC\u05D5\u05DD" ]); var LABELLED_LANGUAGES = /* @__PURE__ */ new Set(["en", "es", "fr", "de", "ja", "ko", "pt", "ar", "he"]); function documentLanguage() { const raw = document.documentElement.getAttribute("lang") ?? ""; return raw.trim().toLowerCase().split("-")[0] ?? ""; } function adLabelLanguageSupported(language = documentLanguage()) { return language.length === 0 || LABELLED_LANGUAGES.has(language); } var PROMOTED_TREND_PREFIXES = [ "Promoted by", "Sponsored by", "Promocionado por", "Patrocinado por", "Sponsoris\xE9 par", "Gesponsert von", "\u30D7\u30ED\u30E2\u30FC\u30B7\u30E7\u30F3", "\uD504\uB85C\uBAA8\uC158", "Promovido por", "\u0645\u064F\u0631\u0648\u064E\u0651\u062C \u0628\u0648\u0627\u0633\u0637\u0629", "\u05DE\u05E7\u05D5\u05D3\u05DD \u05E2\u05DC \u05D9\u05D3\u05D9" ]; var VIDEO_AD_MARKERS = [ /Video will play after ad/i, /Skip Ad(?: in \d+ seconds?)?/i, /Ad will end in \d+ seconds?/i ]; var hiddenPlacements = 0; var suppressedVideoAds = 0; function installEarlyAdShield() { if (typeof document === "undefined") return; document.documentElement.classList.add("av-block-ads"); ensureStyle(); } var adProtectionFeature = { id: "privacy.adProtection", title: "Ad protection", category: "privacy", init(ctx) { ensureStyle(); applyAdProtection(ctx, document); }, apply(ctx, root, addedNodes) { ensureStyle(); applyAdProtection(ctx, root, addedNodes); }, destroy(ctx) { document.documentElement.classList.remove("av-block-ads"); clearMarked(document); document.getElementById(STYLE_ID3)?.remove(); hiddenPlacements = 0; suppressedVideoAds = 0; ctx.diagnostics.info("Ad protection destroyed"); }, getStatus() { const parts = [`${hiddenPlacements} placement${hiddenPlacements === 1 ? "" : "s"} removed`]; if (suppressedVideoAds > 0) { parts.push(`${suppressedVideoAds} pre-roll${suppressedVideoAds === 1 ? "" : "s"} suppressed`); } return { ok: true, message: parts.join(" \xB7 ") }; } }; function adProtectionCounters() { return { hiddenPlacements, suppressedVideoAds }; } function observeAdMarkers(root = document) { const detected = detectPlacements(root); return { native: detected.native.length, trend: detected.trend.length, housePromo: detected.housePromo.length, video: detected.video.length }; } function applyAdProtection(ctx, root, addedNodes) { const enabled3 = ctx.settings.privacy.blockAds; document.documentElement.classList.toggle("av-block-ads", enabled3); if (!enabled3) { clearMarked(document); return; } const scopes = addedNodes && addedNodes.length > 0 ? addedNodes : [root]; for (const scope of scopes) { const detected = detectPlacements(scope); for (const article of detected.native) { hidePlacement(article, "post"); } for (const trend of detected.trend) { hidePlacement(trend, "trend"); } for (const promo of detected.housePromo) { hidePlacement(promo, "house"); } for (const video of detected.video) { hidePlacement(video, "video"); } for (const video of candidates(scope, VIDEO_SELECTOR)) { if (!detected.video.includes(video) && video.getAttribute(HIDDEN_ATTRIBUTE) === "video") { video.removeAttribute(HIDDEN_ATTRIBUTE); } } } } function detectPlacements(root) { return { native: candidates(root, ARTICLE_SELECTOR2).filter(isSponsoredArticle), trend: candidates(root, TREND_SELECTOR).filter(isPromotedTrend), housePromo: candidates(root, HOUSE_PROMO_SELECTOR), video: candidates(root, VIDEO_SELECTOR).filter(containsVideoAdMarker) }; } function candidates(root, selector) { const found = /* @__PURE__ */ new Set(); if (root instanceof Element) { try { if (root.matches(selector)) found.add(root); const ancestor = root.closest(selector); if (ancestor) found.add(ancestor); } catch { } } try { for (const element2 of Array.from(root.querySelectorAll(selector))) found.add(element2); } catch { } return [...found]; } function isSponsoredArticle(article) { if (article.querySelector( 'a[href*="twclid="], a[href*="ad.doubleclick.net"], a[href*="/rules-and-policies/paid-partnerships-policy"]' )) { return true; } const structuralPlacement = article.querySelector('[data-testid="placementTracking"]') !== null; const lacksTimestamp = article.querySelector("time") === null; return (structuralPlacement || lacksTimestamp) && containsExactLabel(article, AD_LABELS); } function isPromotedTrend(trend) { const lines = textLines(trend); return lines.some((line) => PROMOTED_TREND_PREFIXES.some((prefix) => line.startsWith(prefix))); } function containsExactLabel(root, labels) { if (labels.has((root.textContent ?? "").trim())) return true; for (const node of Array.from(root.querySelectorAll("span, div"))) { if (labels.has((node.textContent ?? "").trim())) return true; } return false; } function containsVideoAdMarker(video) { return textLines(video).some((line) => VIDEO_AD_MARKERS.some((pattern) => pattern.test(line))); } function textLines(root) { return (root.innerText || root.textContent || "").split(/\r?\n/).map((line) => line.trim()).filter(Boolean); } function hidePlacement(element2, kind) { const target = kind === "post" ? element2.closest('[data-testid="cellInnerDiv"]') ?? element2 : element2; if (target.hasAttribute(HIDDEN_ATTRIBUTE)) return; target.setAttribute(HIDDEN_ATTRIBUTE, kind); if (kind === "video") suppressedVideoAds += 1; else hiddenPlacements += 1; } function clearMarked(root) { if (root instanceof Element && root.hasAttribute(HIDDEN_ATTRIBUTE)) { root.removeAttribute(HIDDEN_ATTRIBUTE); } for (const element2 of Array.from(root.querySelectorAll(`[${HIDDEN_ATTRIBUTE}]`))) { element2.removeAttribute(HIDDEN_ATTRIBUTE); } } function ensureStyle() { if (document.getElementById(STYLE_ID3)) return; const style = document.createElement("style"); style.id = STYLE_ID3; style.textContent = AD_PROTECTION_CSS; (document.head ?? document.documentElement).append(style); } var AD_PROTECTION_CSS = ` html.av-block-ads [${HIDDEN_ATTRIBUTE}] { display: none !important; } /* Collapse the virtualizer cell, not just its article, so an ad cannot leave a feed-sized gap. */ html.av-block-ads [data-testid="cellInnerDiv"]:has(${ARTICLE_SELECTOR2} a[href*="twclid="]), html.av-block-ads [data-testid="cellInnerDiv"]:has(${ARTICLE_SELECTOR2} a[href*="ad.doubleclick.net"]), html.av-block-ads [data-testid="cellInnerDiv"]:has(${ARTICLE_SELECTOR2} a[href*="/rules-and-policies/paid-partnerships-policy"]), html.av-block-ads [data-testid="cellInnerDiv"]:has(${ARTICLE_SELECTOR2} [data-testid="placementTracking"]):not(:has(${ARTICLE_SELECTOR2} time)), html.av-block-ads ${ARTICLE_SELECTOR2}:has(a[href*="twclid="]), html.av-block-ads ${ARTICLE_SELECTOR2}:has(a[href*="ad.doubleclick.net"]), html.av-block-ads ${ARTICLE_SELECTOR2}:has(a[href*="/rules-and-policies/paid-partnerships-policy"]), html.av-block-ads ${ARTICLE_SELECTOR2}:not(:has(time)):has([data-testid="placementTracking"]), html.av-block-ads aside[aria-label="Subscribe to Premium"], html.av-block-ads [data-testid^="super-upsell"], html.av-block-ads aside[role="complementary"]:has(a[href*="grok.com"]) { display: none !important; } `; // src/platform/selectors.ts var SURFACE_SELECTORS = [ { surface: "App root", stable: "#react-root", fallback: "body > div:first-child", churnRisk: "Medium", note: "Readiness anchor only; do not use as the scan scope after boot.", feature: "Boot and timeline scope" }, { surface: "Primary column", stable: '[data-testid="primaryColumn"]', fallback: ".r-150rngu.r-16y2uox", churnRisk: "Medium", note: "Main observer scope for timeline pages.", feature: "Boot and timeline scope" }, { surface: "Sidebar", stable: '[data-testid="sidebarColumn"]', fallback: ".r-1ifxtd0.r-1udh08x", churnRisk: "High", note: "Optional because the sidebar collapses by viewport.", feature: "Layout declutter" }, { surface: "Tweet", stable: 'article[data-testid="tweet"]', fallback: "article .css-175oi2r, article", churnRisk: "High", note: "Process added articles only and mark processed nodes.", feature: "Filtering and export" }, { surface: "Tweet text", stable: '[data-testid="tweetText"]', fallback: "article div[lang] span", churnRisk: "Medium", note: "Text extraction source with article textContent fallback.", feature: "Filtering and export" }, { surface: "Composer", stable: '[data-testid="tweetTextarea_0"]', fallback: 'div[role="textbox"][aria-label]', churnRisk: "High", note: "Draft.js-aware insertion required for later composer features.", feature: "Composer and crosspost" }, { surface: "Media photo", stable: '[data-testid="tweetPhoto"] img[src*="pbs.twimg.com/media"]', fallback: 'img[src*="format="], [data-testid^="profile-photo-grid-"] img[src*="pbs.twimg.com/media"]', churnRisk: "Medium", note: "Normalize image URLs to original quality before download.", feature: "Media controls" }, { surface: "Video", stable: '[data-testid="videoPlayer"], [data-testid="videoComponent"]', fallback: 'video[src], div[aria-label*="Video"]', churnRisk: "High", note: "Network capture is required for complete video variants.", feature: "Media controls" }, { surface: "Navigation", stable: '[data-testid^="AppTabBar_"], [data-testid="SideNav_NewTweet_Button"]', fallback: 'nav[aria-label] a[role="link"]', churnRisk: "High", note: "Support full, compact, and mobile navigation.", feature: "Layout declutter" }, { surface: "Grok", stable: '[data-testid="GrokDrawer"], [data-testid="grokImgGen"], a[href="/i/grok"], button[aria-label="Grok actions"]', fallback: 'div[id*="grok" i]', churnRisk: "High", note: "Drawer, navigation, image-generation, and per-post Grok surfaces change frequently; isolate all tweaks.", feature: "Grok declutter" }, // Below: the selectors features actually depend on. Watching only the ten foundational surfaces // meant a rename anywhere else silently disabled its owning feature with no diagnostic -- the // exact failure the fixture discipline exists to prevent, happening outside the fixture's reach. { surface: "Timeline cell", stable: '[data-testid="cellInnerDiv"]', fallback: 'section[role="region"] > div > div', churnRisk: "High", note: "The hide/dim boundary and the thread-recommendation cut both anchor here.", feature: "Filtering, hidden posts, thread recommendations" }, { surface: "Post actions", stable: '[data-testid="toolBar"]', fallback: 'article[data-testid="tweet"] [role="group"]', churnRisk: "High", note: "Where the media, AI and snippet controls mount.", feature: "Media buttons, AI menu, composer snippets" }, { surface: "Engagement counts", stable: '[data-testid="app-text-transition-container"]', fallback: 'article[data-testid="tweet"] [role="group"] span', churnRisk: "High", note: "The per-metric count hiding scopes to this container.", feature: "Hide engagement counts" }, { surface: "Author name", stable: '[data-testid="User-Name"]', fallback: 'article[data-testid="tweet"] a[role="link"] time', churnRisk: "Medium", note: "Handle extraction for notes, colours, whitelists and filter rules.", feature: "Account notes, colours, handle rules" }, { surface: "Video component", stable: '[data-testid="videoComponent"]', fallback: 'article[data-testid="tweet"] video', churnRisk: "Medium", note: "Offscreen pause, keep-playing and loop all scope to this container.", feature: "Video playback preferences" }, { surface: "Trends", stable: '[data-testid="trend"]', fallback: '[aria-label*="Trending"]', churnRisk: "High", note: "Trend declutter hides these rows.", feature: "Hide trends" }, { surface: "News sidebar", stable: '[data-testid="news_sidebar"]', fallback: '[data-testid="sidebarColumn"] section', churnRisk: "High", note: "The right-rail news module.", feature: "Sidebar declutter" }, { surface: "Who to follow", stable: '[data-testid="UserCell"]', fallback: '[data-testid="sidebarColumn"] [role="button"] img', churnRisk: "Medium", note: "Follow-suggestion rows in the rail and between timeline cells.", feature: "Hide follow suggestions" }, { surface: "Home tab link", stable: '[data-testid="AppTabBar_Home_Link"]', fallback: 'nav[role="navigation"] a[href="/home"]', churnRisk: "Medium", note: "Navigation declutter and the Following-first behaviour both need it.", feature: "Navigation declutter, open Following first" }, { surface: "Search box", stable: '[data-testid="SearchBox_Search_Input"]', fallback: 'input[role="combobox"]', churnRisk: "Medium", note: "Present on every route that carries the rail.", feature: "Sidebar declutter" }, { surface: "Promoted placement", stable: '[data-testid="placementTracking"]', fallback: 'article[data-testid="tweet"] [data-testid="placementTracking"]', churnRisk: "High", note: "Observed for ad-contract drift only -- never used alone to hide a post.", feature: "Ad contract observations" } ]; function getSelectorHealthForRoute(root = document, route = "unknown") { return SURFACE_SELECTORS.map((entry) => { const stableCount = countMatches(root, entry.stable); const fallbackCount = countMatches(root, entry.fallback); const matched = stableCount > 0 ? "stable" : fallbackCount > 0 ? "fallback" : "missing"; return { surface: entry.surface, stable: entry.stable, fallback: entry.fallback, stableCount, fallbackCount, churnRisk: entry.churnRisk, healthy: stableCount > 0 || fallbackCount > 0, relevance: selectorRelevance(entry.surface, route, root), matched, matchedSelector: matched === "stable" ? entry.stable : matched === "fallback" ? entry.fallback : null, feature: entry.feature }; }); } var CONTENT_SURFACES = /* @__PURE__ */ new Set([ "home", "status", "profile", "notifications", "search" ]); function selectorRelevance(surface, route, root) { const entry = SURFACE_SELECTORS.find((item) => item.surface === surface); if (entry?.requiredOn) { if (entry.requiredOn.includes(route)) return "required"; return CONTENT_SURFACES.has(route) ? "optional" : "inapplicable"; } if (surface === "App root" || surface === "Navigation") { return "required"; } if (surface === "Primary column") { return route === "settings" ? "inapplicable" : "required"; } if (surface === "Grok") { return route === "grok" ? "required" : "optional"; } if (surface === "Post actions") { return CONTENT_SURFACES.has(route) && countMatches(root, 'article[data-testid="tweet"]') > 0 ? "required" : "inapplicable"; } if (["Tweet", "Tweet text", "Composer", "Media photo", "Video"].includes(surface)) { return CONTENT_SURFACES.has(route) ? "optional" : "inapplicable"; } if (surface === "Sidebar") { return route === "settings" ? "inapplicable" : "optional"; } return "optional"; } var SELECTOR_FEATURE_IDS = { "Boot and timeline scope": ["core.boot"], "Layout declutter": ["layout.declutter"], "Filtering and export": ["filtering.engine", "export.core"], "Composer and crosspost": ["composer.snippets", "integrations.crosspost"], "Media controls": ["media.buttons", "media.presentation"], "Grok declutter": ["layout.declutter"], "Filtering, hidden posts, thread recommendations": [ "filtering.engine", "filtering.hiddenPosts", "layout.threadRecommendations" ], "Media buttons, AI menu, composer snippets": [ "media.buttons", "ai.commandMenu", "composer.snippets" ], "Hide engagement counts": ["appearance.theme"], "Account notes, colours, handle rules": ["library.userNotes", "filtering.engine"], "Video playback preferences": ["performance.videoPlayback", "performance.pauseOffscreenVideo"], "Hide trends": ["layout.declutter"], "Sidebar declutter": ["layout.declutter"], "Hide follow suggestions": ["layout.declutter"], "Navigation declutter, open Following first": ["layout.declutter", "layout.forceFollowing"], "Ad contract observations": ["privacy.adProtection", "core.selectorHealth"] }; function getSelectorFeatureIds(feature) { const known = SELECTOR_FEATURE_IDS[feature]; if (known) return known; const slug = feature.toLowerCase().replace(/[^a-z0-9]+/g, ".").replace(/^\.|\.$/g, ""); return [`selector.${slug || "unknown"}`]; } function countMatches(root, selector) { try { const self = root instanceof Element && root.matches(selector) ? 1 : 0; return self + root.querySelectorAll(selector).length; } catch { return 0; } } // src/features/core/feature-i18n.ts function ft(ctx, english) { return translateText(ctx.settings.i18n.locale, english); } // src/features/core/feature-toast.ts var TOAST_HOST_ID = "av-feature-toast"; var DEFAULT_TIMEOUT_MS = 4e3; var dismissTimer; function showFeatureToast(message, options = {}) { if (typeof document === "undefined") { return; } const shadow = ensureHost(); const host = document.getElementById(TOAST_HOST_ID); if (host && options.ctx) { host.dataset.avMotion = prefersReducedMotion2(options.ctx) ? "reduce" : "full"; } const card = shadow.querySelector(".av-ftoast"); const text = shadow.querySelector(".av-ftoast-text"); if (!(card instanceof HTMLElement) || !(text instanceof HTMLElement)) { return; } text.textContent = message; card.dataset.tone = options.tone ?? "info"; card.classList.add("is-open"); try { const nativeCard = card; if (!card.matches(":popover-open")) { nativeCard.showPopover?.(); } } catch { } if (dismissTimer !== void 0) { clearTimeout(dismissTimer); } dismissTimer = setTimeout(() => { card.classList.remove("is-open"); try { card.hidePopover?.(); } catch { } dismissTimer = void 0; }, options.timeoutMs ?? DEFAULT_TIMEOUT_MS); } function removeFeatureToast() { if (dismissTimer !== void 0) { clearTimeout(dismissTimer); dismissTimer = void 0; } if (typeof document === "undefined") { return; } const host = document.getElementById(TOAST_HOST_ID); const card = host?.shadowRoot?.querySelector(".av-ftoast"); if (card) { card.classList.remove("is-open"); try { card.hidePopover?.(); } catch { } } host?.remove(); } function prefersReducedMotion2(ctx) { if (ctx.settings.accessibility.reduceMotion === "always") return true; if (ctx.settings.accessibility.reduceMotion === "never") return false; return globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false; } function ensureHost() { const existing = document.getElementById(TOAST_HOST_ID); if (existing?.shadowRoot) { existing.dir = document.documentElement.dir || "ltr"; return existing.shadowRoot; } const host = document.createElement("div"); host.id = TOAST_HOST_ID; host.dataset.avOwned = "true"; host.dir = document.documentElement.dir || "ltr"; document.documentElement.append(host); const shadow = host.attachShadow({ mode: "open" }); const style = document.createElement("style"); style.textContent = TOAST_CSS; const card = document.createElement("div"); card.className = "av-ftoast"; card.setAttribute("popover", "manual"); card.setAttribute("role", "status"); card.setAttribute("aria-live", "polite"); const text = document.createElement("span"); text.className = "av-ftoast-text"; card.append(text); shadow.append(style, card); return shadow; } var TOAST_CSS = ` .av-ftoast { position: fixed; inset: auto; inset-inline-end: 16px; bottom: 132px; margin: 0; display: flex; align-items: center; max-width: 340px; padding: 10px 12px; border: 1px solid var(--av-border, rgb(47, 51, 54)); border-inline-start: 3px solid var(--av-accent, rgb(29, 155, 240)); border-radius: 10px; background: color-mix(in srgb, var(--av-surface-raised, rgb(22, 24, 28)) 97%, black); color: var(--av-text, rgb(239, 243, 244)); font-weight: 500; font-size: 13px; line-height: 1.35; font-family: TwitterChirp, Inter, ui-sans-serif, system-ui, sans-serif; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45); opacity: 0; pointer-events: none; transform: translateY(8px); transition: opacity 140ms ease, transform 140ms ease; } /* Tone is carried by the accent rule AND the wording, never by colour alone. */ .av-ftoast[data-tone="error"] { border-inline-start-color: rgb(220, 110, 110); } .av-ftoast.is-open { opacity: 1; pointer-events: auto; transform: translateY(0); } .av-ftoast:popover-open { opacity: 1; pointer-events: auto; transform: translateY(0); } @media (prefers-reduced-motion: reduce) { .av-ftoast { transition: none; transform: none; } } :host([data-av-motion="reduce"]) .av-ftoast { transition: none; transform: none; } `; // src/features/core/ad-observations.ts var AD_OBSERVATIONS_KEY = "aviary.adObservations.v1"; var AD_OBSERVATION_LIMIT = 64; var AD_OBSERVATION_RETENTION_MS = 30 * 24 * 60 * 60 * 1e3; var AD_OBSERVATION_REFRESH_MS = 15 * 60 * 1e3; var MAX_MARKER_COUNT = 1e4; var ROUTES = /* @__PURE__ */ new Set([ "home", "status", "profile", "notifications", "messages", "settings", "search", "grok", "unknown" ]); var MARKER_KINDS = ["native", "trend", "housePromo", "video"]; var AdObservationStore = class { #storage; #limit; #now; #observations = []; constructor(storage, options = {}) { this.#storage = storage; this.#limit = Math.max(1, Math.min(AD_OBSERVATION_LIMIT, options.limit ?? AD_OBSERVATION_LIMIT)); this.#now = options.now ?? Date.now; } async load() { const stored = await this.#storage.get(AD_OBSERVATIONS_KEY, { version: 1, observations: [] }); this.#observations = normalizeObservations(stored, this.#now(), this.#limit); const normalized = { version: 1, observations: this.observations() }; if (JSON.stringify(stored) !== JSON.stringify(normalized)) { await this.#storage.set(AD_OBSERVATIONS_KEY, normalized); } } async observe(route, counts) { const now6 = this.#now(); const next = { at: new Date(now6).toISOString(), route: ROUTES.has(route) ? route : "unknown", counts: normalizeCounts(counts) }; const previous = this.#observations.at(-1); const sameSample = previous && sameObservation(previous, next); const previousAt = previous ? Date.parse(previous.at) : 0; if (!sameSample || !Number.isFinite(previousAt) || now6 - previousAt >= AD_OBSERVATION_REFRESH_MS) { this.#observations.push(next); this.#observations = trimObservations(this.#observations, now6, this.#limit); await this.#persist(); } return this.snapshot(); } snapshot() { const last = this.#observations.at(-1); if (!last) return emptyAdObservationSnapshot(); const priorForRoute = this.#observations.slice(0, -1).filter((entry) => entry.route === last.route); const missingContracts = MARKER_KINDS.filter( (kind) => last.counts[kind] === 0 && priorForRoute.some((entry) => entry.counts[kind] > 0) ); return { lastObservedAt: last.at, lastRoute: last.route, counts: { ...last.counts }, retained: this.#observations.length, missingContracts, degradedReason: missingContracts.length > 0 ? `Formerly observed ${missingContracts.join(", ")} ad markers are no longer detected on ${last.route}.` : null }; } observations() { return this.#observations.map((entry) => ({ ...entry, counts: { ...entry.counts } })); } async clear() { this.#observations = []; await this.#storage.remove(AD_OBSERVATIONS_KEY); } async #persist() { const payload = { version: 1, observations: this.observations() }; await this.#storage.set(AD_OBSERVATIONS_KEY, payload); } }; function emptyAdObservationSnapshot() { return { lastObservedAt: null, lastRoute: null, counts: emptyCounts(), retained: 0, missingContracts: [], degradedReason: null }; } function normalizeObservations(raw, now6, limit) { const source = isRecord2(raw) && Array.isArray(raw.observations) ? raw.observations : []; const cutoff = now6 - AD_OBSERVATION_RETENTION_MS; const normalized = []; for (const candidate of source) { if (!isRecord2(candidate) || typeof candidate.at !== "string") continue; const at = Date.parse(candidate.at); if (!Number.isFinite(at) || at < cutoff || at > now6 + 6e4) continue; const route = typeof candidate.route === "string" && ROUTES.has(candidate.route) ? candidate.route : "unknown"; normalized.push({ at: new Date(at).toISOString(), route, counts: normalizeCounts(candidate.counts) }); } normalized.sort((a, b) => Date.parse(a.at) - Date.parse(b.at)); return normalized.slice(-limit); } function trimObservations(observations, now6, limit) { const cutoff = now6 - AD_OBSERVATION_RETENTION_MS; return observations.filter((entry) => Date.parse(entry.at) >= cutoff).slice(-limit); } function normalizeCounts(raw) { const value = isRecord2(raw) ? raw : {}; return { native: normalizeCount(value.native), trend: normalizeCount(value.trend), housePromo: normalizeCount(value.housePromo), video: normalizeCount(value.video) }; } function normalizeCount(value) { if (typeof value !== "number" || !Number.isFinite(value)) return 0; return Math.max(0, Math.min(MAX_MARKER_COUNT, Math.trunc(value))); } function sameObservation(a, b) { return a.route === b.route && MARKER_KINDS.every((kind) => a.counts[kind] === b.counts[kind]); } function emptyCounts() { return { native: 0, trend: 0, housePromo: 0, video: 0 }; } function isRecord2(value) { return typeof value === "object" && value !== null; } // src/features/core/selector-health.ts var CRITICAL_SURFACES = /* @__PURE__ */ new Set(["App root", "Primary column"]); var MIN_LOG_INTERVAL_MS = 5e3; var lastLogAt = 0; var lastHealthSignature = ""; var lastCriticalSignature = ""; var lastNoticeSignature = ""; var previousState = null; var currentSnapshot = emptySnapshot(); var adObservations; var selectorHealthFeature = { id: "core.selectorHealth", title: "Selector health diagnostics", category: "core", async init(ctx) { resetState(); if (!ctx.settings.diagnostics.selectorHealth) { return; } await updateSnapshot(ctx); ctx.diagnostics.info("Selector health initialized", snapshotDetails(currentSnapshot)); }, async apply(ctx) { if (!ctx.settings.diagnostics.selectorHealth) { if (currentSnapshot.enabled || lastNoticeSignature) { resetState(); removeFeatureToast(); ctx.refreshControlCenter?.(); } return; } await updateSnapshot(ctx); ctx.refreshControlCenter?.(); const missingRequired = currentSnapshot.missingRequired; const noticeSignature = missingRequired.length > 0 ? [ctx.route.surface, ...missingRequired, ...currentSnapshot.affectedFeatures].join(":") : ""; if (noticeSignature !== lastNoticeSignature) { lastNoticeSignature = noticeSignature; if (noticeSignature) { showFeatureToast( `${ft(ctx, "Selector health")}: ${ft(ctx, "Missing required surfaces")}`, { tone: "error", ctx } ); } else { removeFeatureToast(); } } const missingCritical = currentSnapshot.surfaces.filter( (item) => item.relevance === "required" && !item.healthy && CRITICAL_SURFACES.has(item.surface) ); const adDegradedReason = currentSnapshot.adObservations.degradedReason; if (missingCritical.length === 0 && !adDegradedReason) { return; } const signature = [ ctx.route.surface, missingCritical.map((item) => item.surface).join(","), currentSnapshot.adObservations.missingContracts.join(",") ].join(":"); const now6 = Date.now(); if (signature !== lastCriticalSignature || now6 - lastLogAt >= MIN_LOG_INTERVAL_MS) { lastCriticalSignature = signature; lastLogAt = now6; ctx.diagnostics.warn( missingCritical.length > 0 ? "Critical selector health degraded" : "Ad contract health degraded", { route: ctx.route.surface, missing: missingCritical.map((item) => item.surface), missingAdContracts: currentSnapshot.adObservations.missingContracts, degradedReason: adDegradedReason, affectedFeatures: currentSnapshot.affectedFeatures } ); } }, destroy(ctx) { resetState(); removeFeatureToast(); ctx.diagnostics.info("Selector health destroyed"); }, getStatus() { return { ok: currentSnapshot.state === "healthy", message: currentSnapshot.adObservations.degradedReason ?? `${currentSnapshot.requiredMatched}/${currentSnapshot.required} required selector surfaces detected`, details: snapshotDetails(currentSnapshot) }; } }; function getSelectorHealthSnapshot() { return { ...currentSnapshot, missingRequired: [...currentSnapshot.missingRequired], optionalMissing: [...currentSnapshot.optionalMissing], fallbackMatches: currentSnapshot.fallbackMatches.map((entry) => ({ ...entry })), affectedFeatures: [...currentSnapshot.affectedFeatures], surfaces: currentSnapshot.surfaces.map((entry) => ({ ...entry })), adObservations: { ...currentSnapshot.adObservations, counts: { ...currentSnapshot.adObservations.counts }, missingContracts: [...currentSnapshot.adObservations.missingContracts] }, lastTransition: currentSnapshot.lastTransition ? { ...currentSnapshot.lastTransition } : null }; } async function clearAdObservations(storage) { if (adObservations) { await adObservations.clear(); } else if (storage) { await storage.remove(AD_OBSERVATIONS_KEY); } const affectedFeatures = currentSnapshot.affectedFeatures.filter((feature) => feature !== "Ad protection"); const nextState = currentSnapshot.missingRequired.length === 0 ? "healthy" : "degraded"; const lastTransition = currentSnapshot.state === nextState ? currentSnapshot.lastTransition : { at: (/* @__PURE__ */ new Date()).toISOString(), from: currentSnapshot.state, to: nextState, route: currentSnapshot.route }; previousState = nextState; lastHealthSignature = ""; lastCriticalSignature = ""; currentSnapshot = { ...currentSnapshot, state: nextState, affectedFeatures, adObservations: emptyAdObservationSnapshot(), lastTransition }; } async function updateSnapshot(ctx) { const surfaces = getSelectorHealthForRoute(document, ctx.route.surface).map( (item) => item.relevance === "required" && !selectorEnabledForContext(ctx, item) ? { ...item, relevance: "inapplicable" } : item ); const required = surfaces.filter((item) => item.relevance === "required"); const optional = surfaces.filter((item) => item.relevance === "optional"); const missingRequired = required.filter((item) => !item.healthy).map((item) => item.surface); const optionalMissing = optional.filter((item) => !item.healthy).map((item) => item.surface); const fallbackMatches = surfaces.filter((item) => item.relevance !== "inapplicable" && item.matched === "fallback" && item.matchedSelector).map((item) => ({ surface: item.surface, selector: item.matchedSelector })); const affectedFeatures = [...new Set( surfaces.filter((item) => item.relevance !== "inapplicable" && !item.healthy).map((item) => item.feature) )]; if (!adObservations) { adObservations = new AdObservationStore(ctx.storage); await adObservations.load(); } let adObservationSnapshot; try { adObservationSnapshot = await adObservations.observe( ctx.route.surface, observeAdMarkers(document) ); } catch (error) { adObservationSnapshot = adObservations.snapshot(); ctx.diagnostics.error("Ad observations failed to save", errorDetails(error)); } if (adObservationSnapshot.degradedReason) { affectedFeatures.push("Ad protection"); } const state2 = missingRequired.length === 0 && !adObservationSnapshot.degradedReason ? "healthy" : "degraded"; const signature = [ ctx.route.surface, state2, ...surfaces.map((item) => `${item.surface}:${item.relevance}:${item.matched}:${item.stableCount}:${item.fallbackCount}`), `ads:${adObservationSnapshot.lastRoute}:${adObservationSnapshot.counts.native}:${adObservationSnapshot.counts.trend}:${adObservationSnapshot.counts.housePromo}:${adObservationSnapshot.counts.video}:${adObservationSnapshot.missingContracts.join(",")}` ].join("|"); let lastTransition = currentSnapshot.lastTransition; if (signature !== lastHealthSignature) { lastTransition = { at: (/* @__PURE__ */ new Date()).toISOString(), from: previousState, to: state2, route: ctx.route.surface }; previousState = state2; lastHealthSignature = signature; } currentSnapshot = { enabled: true, route: ctx.route.surface, state: state2, required: required.length, requiredMatched: required.filter((item) => item.healthy).length, optional: optional.length, optionalMatched: optional.filter((item) => item.healthy).length, missingRequired, optionalMissing, fallbackMatches, affectedFeatures, surfaces, lastTransition, adObservations: adObservationSnapshot }; } function resetState() { lastLogAt = 0; lastHealthSignature = ""; lastCriticalSignature = ""; lastNoticeSignature = ""; previousState = null; adObservations = void 0; currentSnapshot = emptySnapshot(); } function selectorHealthHasBreak(snapshot) { return snapshot.enabled && snapshot.missingRequired.length > 0; } function selectorEnabledForContext(ctx, selector) { if (selector.surface === "Grok") { return ctx.settings.layout.hideGrok; } if (selector.surface === "Post actions") { return Boolean( ctx.settings.media.buttons || ctx.settings.ai.commandMenu || Array.isArray(ctx.settings.composer.snippets) && ctx.settings.composer.snippets.length > 0 ); } return true; } function emptySnapshot() { return { enabled: false, route: "unknown", state: "healthy", required: 0, requiredMatched: 0, optional: 0, optionalMatched: 0, missingRequired: [], optionalMissing: [], fallbackMatches: [], affectedFeatures: [], surfaces: [], lastTransition: null, adObservations: emptyAdObservationSnapshot() }; } function snapshotDetails(snapshot) { return { enabled: snapshot.enabled, route: snapshot.route, state: snapshot.state, required: snapshot.required, requiredMatched: snapshot.requiredMatched, optional: snapshot.optional, optionalMatched: snapshot.optionalMatched, missingRequired: snapshot.missingRequired, optionalMissing: snapshot.optionalMissing, fallbackMatches: snapshot.fallbackMatches, affectedFeatures: snapshot.affectedFeatures, lastTransition: snapshot.lastTransition, adObservations: snapshot.adObservations }; } function errorDetails(error) { return error instanceof Error ? { name: error.name, message: error.message } : { message: String(error) }; } // src/features/core/presets.ts var PRESETS = [ { id: "quiet-reader", label: "Quiet Reader", description: "Hide trends, row borders and engagement counts, dim premium posts, strip t.co, dense + dim theme.", highlights: [ { label: "Hide right sidebar", value: "Enabled" }, { label: "Suppress hover previews", value: "Enabled" }, { label: "Hide engagement counts", value: "Enabled" }, { label: "Theme", value: "Dim" } ], overrides: { appearance: { theme: "dim", denseMode: true, hideCounts: true, hideBorders: true }, layout: { hideRightSidebar: true, hideTrends: true, hideGrok: true, autoExpandPostText: true, restoreTimelinePosition: true }, filter: { enabled: true, premiumRule: "dim" }, links: { expandTco: true, cleanShareButtons: true } } }, { id: "media-archivist", label: "Media Archivist", description: "Original-quality downloads, deterministic filenames, dedup history, stacked media.", highlights: [ { label: "Prefer original quality", value: "Enabled" }, { label: "Media layout", value: "Stacked" }, { label: "Show download buttons", value: "Enabled" } ], overrides: { appearance: { theme: "lightsOut" }, media: { buttons: true, copyMediaLinks: true, preferOriginalImages: true, downloadHistory: true, layout: "stacked" }, filter: { enabled: false } } }, { id: "creator", label: "Creator", description: "Writer mode, composer snippets, share-button cleanup, sidebar and trends hidden.", highlights: [ { label: "Writer mode", value: "Enabled" }, { label: "Hide trends", value: "Enabled" }, { label: "Media layout", value: "Strict grid" } ], overrides: { appearance: { theme: "midnight" }, layout: { hideRightSidebar: true, hideTrends: true, hideGrok: true, writerMode: true }, media: { layout: "grid" }, links: { cleanShareButtons: true, expandTco: true } } }, { id: "researcher", label: "Researcher", description: "Export capture on, JSON+CSV+HTML+MD formats, auto-discover query IDs, raw payloads.", highlights: [ { label: "Capture visible posts", value: "Enabled" }, { label: "Preserve raw payloads", value: "Enabled" }, { label: "Export formats", value: "JSON, CSV, HTML, Markdown" } ], overrides: { filter: { enabled: false }, export: { enabled: true, formats: ["json", "csv", "html", "markdown"], preserveRawPayloads: true, autoDiscoverQueryIds: true }, media: { layout: "default" }, links: { cleanShareButtons: true } } }, { id: "classic", label: "Classic", description: "Restore dim, keep sidebar, hide Grok only, no premium filtering.", highlights: [ { label: "Theme", value: "Dim" }, { label: "Dense mode", value: "Disabled" }, { label: "Hide Grok surfaces", value: "Enabled" } ], overrides: { appearance: { theme: "dim", denseMode: false }, layout: { hideRightSidebar: false, hideTrends: false, hideGrok: true }, filter: { enabled: false, premiumRule: "off" } } }, { id: "minimal", label: "Minimal", description: "Maximum declutter: no counts, no borders, no trends, big text safe zones.", highlights: [ { label: "Hide engagement counts", value: "Enabled" }, { label: "Hide right sidebar", value: "Enabled" }, { label: "Theme", value: "Noir" } ], overrides: { appearance: { theme: "noir", denseMode: false, timelineWidth: "wide", hideCounts: true, hideBorders: true }, layout: { hideRightSidebar: true, hideTrends: true, hideFollowSuggestions: true, hideHomeComposer: true, hideGrok: true, suppressHoverPreviews: true, hideForYouTab: true, hideNavItems: ["follow", "grok", "history", "studio", "premium"] }, filter: { enabled: true, premiumRule: "hide" }, accessibility: { reduceMotion: "always" } } } ]; function listPresets() { return PRESETS.map((preset) => ({ ...preset, highlights: preset.highlights.map((highlight) => ({ ...highlight })), overrides: cloneOverrides(preset.overrides) })); } function getPreset(id) { return listPresets().find((preset) => preset.id === id); } function applyPreset(current, preset) { const next = cloneSettings(current); for (const [section2, overrides] of Object.entries(preset.overrides)) { if (!overrides) continue; const target = next[section2]; if (!target) continue; for (const [key, value] of Object.entries(overrides)) { target[key] = value; } } return normalizeSettings(next); } function describePresetDelta(current, preset) { const result = []; const next = applyPreset(current, preset); for (const section2 of Object.keys(preset.overrides)) { const currentSection = current[section2] ?? {}; const nextSection = next[section2] ?? {}; for (const key of Object.keys(preset.overrides[section2] ?? {})) { const before = JSON.stringify(currentSection[key]); const after = JSON.stringify(nextSection[key]); if (before !== after) { result.push(`${section2}.${key}: ${before} \u2192 ${after}`); } } } return result; } function cloneOverrides(overrides) { return JSON.parse(JSON.stringify(overrides)); } // src/features/core/feature-bisect.ts var BISECT_PROTECTED_FEATURES = ["core.controlCenter", "core.i18n"]; function bisectCandidates(registry) { const protectedIds = new Set(BISECT_PROTECTED_FEATURES); return registry.ids().filter((id) => registry.isActive(id) && !protectedIds.has(id)); } var BisectSession = class { #candidates; #remaining; #disabled; #phase; #round; #result = null; constructor(candidates2) { this.#candidates = [...new Set(candidates2)]; this.#remaining = [...this.#candidates]; if (this.#candidates.length === 0) { this.#disabled = []; this.#phase = "done"; this.#round = 0; this.#result = { kind: "nothing-to-test" }; return; } this.#disabled = [...this.#candidates]; this.#phase = "confirming"; this.#round = 1; } get phase() { return this.#phase; } /** What must be off for the question currently being asked. Empty once the search is over. */ get disabled() { return [...this.#disabled]; } get remaining() { return [...this.#remaining]; } get round() { return this.#round; } /** One confirming round, then a halving round per bit of the candidate count. */ get totalRounds() { const n = this.#candidates.length; return n === 0 ? 0 : 1 + Math.ceil(Math.log2(n)); } get result() { return this.#result; } status() { return { phase: this.#phase, disabled: this.disabled, remaining: this.remaining, round: this.#round, totalRounds: this.totalRounds, result: this.#result }; } answer(verdict) { if (this.#phase === "done" || this.#phase === "idle") { return; } if (this.#phase === "confirming") { if (verdict === "still-wrong") { this.#finish({ kind: "not-aviary" }); return; } this.#narrow(this.#candidates); return; } const offThisRound = new Set(this.#disabled); this.#narrow( verdict === "fixed" ? this.#remaining.filter((id) => offThisRound.has(id)) : this.#remaining.filter((id) => !offThisRound.has(id)) ); } /** Stops the search where it stands; the runner still puts every feature back. */ abandon() { if (this.#phase === "done") { return; } this.#finish({ kind: "abandoned" }); } #narrow(suspects) { this.#remaining = [...suspects]; const only = this.#remaining.at(0); if (this.#remaining.length === 1 && only !== void 0) { this.#finish({ kind: "culprit", featureId: only }); return; } if (this.#remaining.length === 0) { this.#finish({ kind: "nothing-to-test" }); return; } this.#phase = "narrowing"; this.#round += 1; this.#disabled = this.#remaining.slice(0, Math.ceil(this.#remaining.length / 2)); } #finish(result) { this.#phase = "done"; this.#result = result; this.#disabled = []; } }; var IDLE = { phase: "idle", disabled: [], remaining: [], round: 0, totalRounds: 0, result: null }; var FeatureBisect = class { #session = null; #recorded = false; status() { return this.#session ? this.#session.status() : { ...IDLE }; } get running() { return this.#session !== null && this.#session.phase !== "done"; } async start(ctx) { const registry = ctx.registry; if (!registry) { return { ...IDLE }; } if (this.#session) { await this.cancel(ctx); } this.#session = new BisectSession(bisectCandidates(registry)); this.#recorded = false; void ctx.auditLog.record("bisect.start", { features: this.#session.remaining.length }); await this.#sync(ctx, registry); return this.status(); } async answer(ctx, verdict) { const registry = ctx.registry; if (!this.#session || !registry) { return this.status(); } this.#session.answer(verdict); await this.#sync(ctx, registry); this.#recordResult(ctx); return this.status(); } /** * Drops the search without touching the registry. * * For the one case where resuming would be wrong: the whole app is being torn down, so the * features this search is holding off are about to be destroyed anyway. Re-initializing them * on the way out would leave features running with no registry to destroy them. */ forget() { this.#session = null; this.#recorded = false; } /** Abandoning is a first-class outcome: the page must come back exactly as it was. */ async cancel(ctx) { const registry = ctx.registry; if (!this.#session) { return { ...IDLE }; } this.#session.abandon(); if (registry) { await this.#sync(ctx, registry); } this.#recordResult(ctx); const status = this.status(); this.#session = null; return status; } #recordResult(ctx) { const result = this.#session?.result; if (!result || this.#recorded) { return; } this.#recorded = true; void ctx.auditLog.record("bisect.result", { outcome: result.kind, ...result.kind === "culprit" ? { feature: result.featureId } : {} }); } async #sync(ctx, registry) { const wanted = new Set(this.#session?.disabled ?? []); const held = registry.suspendedIds(); const toResume = held.filter((id) => !wanted.has(id)); const toSuspend = [...wanted].filter((id) => !held.includes(id)); if (toSuspend.length > 0) { await registry.suspend(ctx, toSuspend); } if (toResume.length > 0) { await registry.resume(ctx, toResume); } await ctx.requestApply(); } }; function describeBisectResult(status) { const result = status.result; if (!result) { return `Bisect in progress: round ${status.round} of ${status.totalRounds}, ${status.remaining.length} feature(s) still suspect.`; } switch (result.kind) { case "culprit": return `Bisect result: ${result.featureId} (found in ${status.round} round(s)).`; case "not-aviary": return "Bisect result: the page was still wrong with every Aviary feature off."; case "nothing-to-test": return "Bisect result: no features were running to test."; case "abandoned": return `Bisect abandoned at round ${status.round}; ${status.remaining.length} feature(s) were still suspect.`; } } // src/features/core/structural-observation.ts var STRUCTURAL_OBSERVATION_PLAN = { testIds: { appRoot: "react-root", primaryColumn: "primaryColumn", sidebarColumn: "sidebarColumn", post: "tweet", postText: "tweetText", composer: "tweetTextarea_0", photo: "tweetPhoto", videoPlayer: "videoPlayer", videoComponent: "videoComponent", cell: "cellInnerDiv", toolBar: "toolBar", metricContainer: "app-text-transition-container", authorName: "User-Name", avatar: "Tweet-User-Avatar", verifiedIcon: "icon-verified", caret: "caret", reply: "reply", repost: "retweet", like: "like", bookmark: "bookmark", trend: "trend", newsSidebar: "news_sidebar", userCell: "UserCell", homeTabLink: "AppTabBar_Home_Link", exploreTabLink: "AppTabBar_Explore_Link", composeButton: "SideNav_NewTweet_Button", searchInput: "SearchBox_Search_Input", placement: "placementTracking", grokDrawer: "GrokDrawer", grokImageGen: "grokImgGen", tabStrip: "ScrollSnap-List" }, roles: { post: "article", banner: "banner", navigation: "navigation", main: "main", timeline: "region", actionGroup: "group", tabStrip: "tablist", tab: "tab", link: "link", button: "button", heading: "heading", searchBox: "combobox" }, aria: { postLabelledBy: "aria-labelledby", quoteBoundaryTabIndex: "0", verifiedLabel: "Verified account", photoLabel: "Image", videoLabel: "Embedded video", caretLabel: "More", grokActionsLabel: "Grok actions", shareLabel: "Share post", bookmarkLabel: "Bookmark", analyticsLabelSuffix: "views. View post analytics", replyLabelSuffix: "Replies. Reply", repostLabelSuffix: "reposts. Repost", likeLabelSuffix: "Likes. Like", hiddenSeparator: "aria-hidden" } }; var COUNTED = { cells: "cell", posts: "post", postTexts: "postText", photos: "photo", videoPlayers: "videoPlayer", videoComponents: "videoComponent", verifiedIcons: "verifiedIcon", authorNames: "authorName", placements: "placement", userCells: "userCell", trends: "trend", carets: "caret", metricContainers: "metricContainer" }; var ROUTE_TEMPLATES = { home: "https://x.com/home", status: "https://x.com//status/", other: "other" }; function observeStructure(documentObject, windowObject, options) { const plan = STRUCTURAL_OBSERVATION_PLAN; const byTestId = (key) => [...documentObject.querySelectorAll(`[data-testid="${plan.testIds[key]}"]`)]; const route = routeKind(options.pathname); const testIds = {}; for (const key of Object.keys(plan.testIds)) { testIds[key] = key === "appRoot" ? documentObject.querySelectorAll(`#${plan.testIds.appRoot}`).length : byTestId(key).length; } const roles = {}; for (const [key, role] of Object.entries(plan.roles)) { roles[key] = key === "post" ? documentObject.querySelectorAll(`article[data-testid="${plan.testIds.post}"]`).length : documentObject.querySelectorAll(`[role="${role}"]`).length; } const labels = [...documentObject.querySelectorAll("[aria-label]")].map( (node) => node.getAttribute("aria-label") ?? "" ); const aria = {}; for (const [key, value] of Object.entries(plan.aria)) { if (key.endsWith("LabelSuffix")) aria[key] = labels.filter((label) => label.endsWith(value)).length; else if (key.endsWith("Label")) aria[key] = labels.filter((label) => label === value).length; else if (key === "quoteBoundaryTabIndex") { aria[key] = documentObject.querySelectorAll(`article div[role="link"][tabindex="${value}"]`).length; } else aria[key] = documentObject.querySelectorAll(`[${value}]`).length; } const firstIn = (key) => byTestId(key)[0] ?? null; const post = documentObject.querySelector(`article[data-testid="${plan.testIds.post}"]`); const primary = firstIn("primaryColumn"); const nesting = { cellToArticle: wrappersBetween(post, `[data-testid="${plan.testIds.cell}"]`), timelineToCell: hopsTo(firstIn("cell"), `[role="${plan.roles.timeline}"]`), mainToPrimaryColumn: wrappersBetween(primary, `[role="${plan.roles.main}"]`), mediaToPhoto: wrappersBetween(firstIn("photo"), "[aria-labelledby]") }; const observedCounts = {}; for (const [name, key] of Object.entries(COUNTED)) observedCounts[name] = byTestId(key).length; const width = (node) => node ? Math.round(node.getBoundingClientRect().width) : null; const primaryStyle = primary ? windowObject.getComputedStyle(primary) : null; const main = documentObject.querySelector(`[role="${plan.roles.main}"]`); const mainStyle = main ? windowObject.getComputedStyle(main) : null; const sidebar = firstIn("sidebarColumn"); const layout = { viewportWidth: windowObject.innerWidth, navColumnWidth: width(documentObject.querySelector(`header[role="${plan.roles.banner}"]`)), sidebarColumnWidth: width(sidebar), primaryColumnWidth: width(primary), primaryColumnMaxWidth: pixels(primaryStyle?.maxWidth), primaryColumnFlex: primaryStyle?.flex ?? null, primaryColumnDisplay: primaryStyle?.display ?? null, primaryColumnDirection: primaryStyle?.flexDirection ?? null, firstPostWidth: width(post), mainFlex: mainStyle?.flex ?? null, mainAlignItems: mainStyle?.alignItems ?? null, sidebarFlex: sidebar ? windowObject.getComputedStyle(sidebar).flex : null }; return { $comment: "Structural observation copied from Aviary. Counts, nesting depths and computed layout only: no text, names, handles, links or ids. testIds, roles and aria here are COUNTS keyed by the schema's names; keep the schema's own maps and use these only to confirm each is present. Copy routes..observedCounts, nesting and the layout widths into _decoded/dom-schema.json, keep its titles, labels and cells, and set derivedFrom.capturedOn to this date.", ceilingDays: 90, warnDays: 30, derivedFrom: { capturedOn: options.now.toISOString().slice(0, 10), sources: [`Aviary ${options.build} structural observation of the ${route} route`], notes: "Measured in the signed-in page by Privacy & diagnostics > Copy structural observation." }, testIds, roles, aria, nesting, layout, routes: { [route]: { route: ROUTE_TEMPLATES[route], lang: normalizeLang(documentObject.documentElement.getAttribute("lang")), observedCounts } } }; } function routeKind(pathname) { if (/^\/home\/?$/.test(pathname)) return "home"; if (/^\/[A-Za-z0-9_]{1,30}\/status\/\d+\/?$/.test(pathname)) return "status"; return "other"; } function hopsTo(node, selector) { let hops = 0; for (let current = node?.parentElement ?? null; current; current = current.parentElement) { hops += 1; if (current.matches(selector)) return hops; } return null; } function wrappersBetween(node, selector) { const hops = hopsTo(node, selector); return hops === null ? null : hops - 1; } function pixels(value) { const match = /^(\d+(?:\.\d+)?)px$/.exec(value ?? ""); return match ? Math.round(Number(match[1])) : null; } function normalizeLang(value) { return value && /^[a-z]{2,3}(?:-[a-z]{4})?(?:-(?:[a-z]{2}|\d{3}))?$/i.test(value) ? value : null; } // src/platform/storage-value-hash.ts async function hashStorageValue(value) { const subtle = globalThis.crypto?.subtle; if (!subtle) { throw new Error("SHA-256 is unavailable in this browser context"); } const bytes = new TextEncoder().encode(JSON.stringify(canonicalValue(value, /* @__PURE__ */ new Set()))); const digest = new Uint8Array(await subtle.digest("SHA-256", bytes)); return Array.from(digest, (byte) => byte.toString(16).padStart(2, "0")).join(""); } function storageValueBytes(value) { const serialized = JSON.stringify(value); if (serialized === void 0) { return new TextEncoder().encode(String(value)).byteLength; } return new TextEncoder().encode(serialized).byteLength; } function canonicalValue(value, seen) { if (value === null) return null; if (typeof value === "string") return value; if (typeof value === "boolean") return ["boolean", value]; if (typeof value === "number") { if (Number.isNaN(value)) return ["number", "NaN"]; if (value === Number.POSITIVE_INFINITY) return ["number", "Infinity"]; if (value === Number.NEGATIVE_INFINITY) return ["number", "-Infinity"]; if (Object.is(value, -0)) return ["number", "-0"]; return ["number", String(value)]; } if (typeof value === "bigint") return ["bigint", value.toString()]; if (value === void 0 || typeof value === "function" || typeof value === "symbol") { return ["undefined"]; } if (seen.has(value)) { throw new Error("Storage values must not contain cycles"); } seen.add(value); try { if (value instanceof Date) return ["date", value.toISOString()]; if (value instanceof ArrayBuffer) { return ["bytes", Array.from(new Uint8Array(value))]; } if (ArrayBuffer.isView(value)) { return [ "bytes", Array.from(new Uint8Array(value.buffer, value.byteOffset, value.byteLength)) ]; } if (Array.isArray(value)) { return ["array", value.map((entry) => canonicalValue(entry, seen))]; } const entries = Object.keys(value).sort().map((key) => [ key, canonicalValue(value[key], seen) ]); return ["object", entries]; } finally { seen.delete(value); } } // src/platform/storage-fence.ts var STORAGE_FENCE_MESSAGE = "AVIARY_STORAGE_FENCE"; var STORAGE_FENCE_VERSION = 1; var STORAGE_FENCE_OPERATION_PREFIX = "aviary.fence.v1.op."; var STORAGE_FENCE_RECEIPT_SUFFIX = ".receipt"; var StorageFenceLostError = class extends Error { code = "storage-fence-lost"; constructor(message = "The storage lease expired before the write could commit.") { super(message); this.name = "StorageFenceLostError"; } }; var StorageFenceUnavailableError = class extends Error { code = "storage-fence-unavailable"; constructor(message = "The storage backend cannot prove this write still owns its lease.") { super(message); this.name = "StorageFenceUnavailableError"; } }; function isStorageFenceError(error) { return error instanceof StorageFenceLostError || error instanceof StorageFenceUnavailableError || isRecord3(error) && (error.code === "storage-fence-lost" || error.code === "storage-fence-unavailable"); } function isStorageLockFence(value) { if (!isRecord3(value)) return false; return value.version === STORAGE_FENCE_VERSION && typeof value.name === "string" && value.name.length > 0 && value.name.length <= 512 && typeof value.owner === "string" && value.owner.length > 0 && value.owner.length <= 256 && typeof value.generation === "number" && Number.isSafeInteger(value.generation) && value.generation >= 0 && typeof value.expiresAt === "number" && Number.isFinite(value.expiresAt); } var activeStorageFences = []; async function withStorageFenceContext(fence, lockKey, exclusive, run) { if (!fence) return run(); const active2 = { fence, lockKey, exclusive }; activeStorageFences.push(active2); try { return await run(); } finally { const index = activeStorageFences.lastIndexOf(active2); if (index >= 0) activeStorageFences.splice(index, 1); } } function inferStorageFence(key) { for (let index = activeStorageFences.length - 1; index >= 0; index -= 1) { const active2 = activeStorageFences[index]; if (active2.exclusive || key === active2.lockKey || key === `aviary.${active2.lockKey}` || key === active2.fence.name || key === active2.fence.name.replace(/^aviary\./, "")) { return active2.fence; } } return void 0; } function hasExtensionFenceTransport() { return Boolean( globalThis.chrome?.runtime?.id && typeof globalThis.chrome.runtime.getManifest === "function" && typeof globalThis.chrome.runtime.sendMessage === "function" ); } async function sendStorageFenceControl(operation, fence) { if (!hasExtensionFenceTransport()) return void 0; const response = await sendExtensionMessage({ type: STORAGE_FENCE_MESSAGE, operation, fence }); return readFenceResponse(response, operation === "release"); } async function sendStorageFenceMutation(operation, key, fence, value) { if (!hasExtensionFenceTransport()) { throw new StorageFenceUnavailableError( "The extension background did not expose its fenced storage authority." ); } const response = await sendExtensionMessage({ type: STORAGE_FENCE_MESSAGE, operation, key, ...operation === "set" ? { value } : {}, fence }); readFenceResponse(response, true); } async function sendExtensionMessage(message) { const runtime = globalThis.chrome?.runtime; if (!runtime?.sendMessage) { throw new StorageFenceUnavailableError( "The extension background did not expose its fenced storage authority." ); } return new Promise((resolve, reject) => { let settled = false; const finish2 = (value, error) => { if (settled) return; settled = true; if (error) reject(error); else resolve(value); }; try { const pending = runtime.sendMessage(message, (value) => { const error = runtime.lastError?.message; finish2(value, error ? new Error(`Storage fence message failed: ${error}`) : void 0); }); if (pending && typeof pending.then === "function") { pending.then( (value) => finish2(value), (error) => finish2(void 0, error) ); } } catch (error) { finish2(void 0, error); } }); } function readFenceResponse(value, release) { const response = isRecord3(value) ? value : {}; if (response.ok !== true) { const message = typeof response.error === "string" ? response.error : void 0; if (response.code === "storage-fence-unavailable") { throw new StorageFenceUnavailableError(message); } throw new StorageFenceLostError(message); } if (release) return void 0; if (!isStorageLockFence(response.result)) { throw new StorageFenceUnavailableError( "The extension background returned no valid storage fence." ); } return response.result; } function isRecord3(value) { return Boolean(value && typeof value === "object" && !Array.isArray(value)); } // src/platform/storage.ts var USERSCRIPT_MANAGER_VALUE_LIMIT_BYTES = 16 * 1024 * 1024; var userscriptFenceOperationSequence = 0; var UserscriptStorageCapacityError = class extends Error { code = "userscript-storage-capacity"; key; measuredBytes; limitBytes; constructor(key, measuredBytes, limitBytes) { super( `The userscript manager refused ${key}: ${measuredBytes} bytes exceeds Aviary's ${limitBytes}-byte per-value safety limit.` ); this.name = "UserscriptStorageCapacityError"; this.key = key; this.measuredBytes = measuredBytes; this.limitBytes = limitBytes; } }; var onWriteError; function setStorageErrorSink(sink) { onWriteError = sink; } function reportStorageError(key, error, op) { onWriteError?.(key, error, op); } function createStorageGateway(namespace = "aviary", options = {}) { const scoped = (key) => { if (namespace.length === 0 || key.startsWith(`${namespace}.`)) { return key; } return `${namespace}.${key}`; }; const globals = globalThis; const mode = options.mode ?? "auto"; const managerLimit = Math.max( 1, Math.floor(options.userscriptValueLimitBytes ?? USERSCRIPT_MANAGER_VALUE_LIMIT_BYTES) ); if (mode === "userscript" && (typeof globals.GM_getValue !== "function" || typeof globals.GM_setValue !== "function" || typeof globals.GM_deleteValue !== "function" || typeof globals.GM_listValues !== "function")) { throw new Error("The userscript manager did not expose its storage API"); } if (mode === "extension" && !globalThis.chrome?.storage?.local) { throw new Error("Extension storage is unavailable"); } return { async get(key, fallback) { const storageKey = scoped(key); try { if (mode !== "extension" && typeof globals.GM_getValue === "function") { if (typeof globals.GM_listValues === "function") { const committed = await readCommittedUserscriptOperation(globals, storageKey, fallback); if (committed.found) return committed.value; } return await globals.GM_getValue(storageKey, fallback); } if (mode !== "userscript" && globalThis.chrome?.storage?.local) { const extensionStorage = globalThis.chrome.storage.local; const committed = await readCommittedExtensionOperation(extensionStorage, storageKey, fallback); if (committed.found) return committed.value; const result = await extensionStorage.get(storageKey); return result[storageKey] === void 0 ? fallback : result[storageKey]; } const raw = mode === "auto" ? globalThis.localStorage?.getItem(storageKey) : null; return raw === null || raw === void 0 ? fallback : JSON.parse(raw); } catch (error) { reportStorageError(storageKey, error, "read"); return fallback; } }, async set(key, value, fence) { const storageKey = scoped(key); const effectiveFence = fence ?? inferStorageFence(storageKey); try { if (effectiveFence && typeof globals.GM_setValue === "function") { await writeUserscriptFenceOperation(globals, storageKey, value, effectiveFence, managerLimit); return; } if (effectiveFence && hasExtensionFenceTransport()) { await sendStorageFenceMutation("set", storageKey, effectiveFence, value); return; } if (effectiveFence) { throw new StorageFenceUnavailableError(); } if (mode !== "extension" && typeof globals.GM_setValue === "function") { const measuredBytes = storageValueBytes(value); if (measuredBytes > managerLimit) { throw new UserscriptStorageCapacityError(storageKey, measuredBytes, managerLimit); } await globals.GM_setValue(storageKey, value); return; } if (mode !== "userscript" && globalThis.chrome?.storage?.local) { await globalThis.chrome.storage.local.set({ [storageKey]: value }); return; } if (mode === "auto" && globalThis.localStorage) { globalThis.localStorage.setItem(storageKey, JSON.stringify(value)); return; } throw new Error(`No storage backend is available for ${storageKey}`); } catch (error) { reportStorageError(storageKey, error, "write"); throw error; } }, async remove(key, fence) { const storageKey = scoped(key); const effectiveFence = fence ?? inferStorageFence(storageKey); try { if (effectiveFence && typeof globals.GM_deleteValue === "function") { await writeUserscriptFenceOperation(globals, storageKey, void 0, effectiveFence, managerLimit, "remove"); return; } if (effectiveFence && hasExtensionFenceTransport()) { await sendStorageFenceMutation("remove", storageKey, effectiveFence); return; } if (effectiveFence) { throw new StorageFenceUnavailableError(); } if (mode !== "extension" && typeof globals.GM_deleteValue === "function") { await globals.GM_deleteValue(storageKey); return; } if (mode !== "userscript" && globalThis.chrome?.storage?.local) { await globalThis.chrome.storage.local.remove(storageKey); return; } if (mode === "auto" && globalThis.localStorage) { globalThis.localStorage.removeItem(storageKey); return; } throw new Error(`No storage backend is available for ${storageKey}`); } catch (error) { reportStorageError(storageKey, error, "write"); throw error; } }, async keys() { const prefix = namespace.length > 0 ? `${namespace}.` : ""; if (mode !== "extension" && typeof globals.GM_listValues === "function") { return (await globals.GM_listValues()).filter( (key) => key.startsWith(prefix) && !key.startsWith(STORAGE_FENCE_OPERATION_PREFIX) ); } if (mode !== "userscript" && globalThis.chrome?.storage?.local) { return Object.keys(await globalThis.chrome.storage.local.get(null)).filter((key) => key.startsWith(prefix) && !key.startsWith(STORAGE_FENCE_OPERATION_PREFIX)); } if (mode === "auto" && globalThis.localStorage) { const keys = []; for (let index = 0; index < globalThis.localStorage.length; index += 1) { const key = globalThis.localStorage.key(index); if (key?.startsWith(prefix)) keys.push(key); } return keys; } return []; } }; } async function writeUserscriptFenceOperation(globals, storageKey, value, fence, managerLimit, kind = "set") { if (!isStorageLockFence(fence)) { throw new StorageFenceUnavailableError("The storage fence was malformed before the write."); } const operationId = `${Date.now().toString(36)}-${(++userscriptFenceOperationSequence).toString(36)}-${Math.random().toString(36).slice(2)}`; const operationKey = `${STORAGE_FENCE_OPERATION_PREFIX}${encodeURIComponent(storageKey)}.${encodeURIComponent(operationId)}`; const operation = { version: 1, operationId, storageKey, kind, ...kind === "set" ? { value } : {}, fence }; const measuredBytes = storageValueBytes(operation); if (measuredBytes > managerLimit) { throw new UserscriptStorageCapacityError(storageKey, measuredBytes, managerLimit); } await globals.GM_setValue(operationKey, operation); const receipt = { version: 1, operationId, committedAt: Date.now() }; await globals.GM_setValue(`${operationKey}${STORAGE_FENCE_RECEIPT_SUFFIX}`, receipt); try { if (kind === "set") await globals.GM_setValue(storageKey, value); else await globals.GM_deleteValue(storageKey); } catch (error) { reportStorageError(storageKey, error, "write"); throw error; } } async function readCommittedUserscriptOperation(globals, storageKey, fallback) { const keys = await globals.GM_listValues(); const prefix = `${STORAGE_FENCE_OPERATION_PREFIX}${encodeURIComponent(storageKey)}.`; const rawPresent = keys.includes(storageKey); const rawValue = rawPresent ? await globals.GM_getValue(storageKey, void 0) : void 0; let best; const allOperations = []; for (const operationKey of keys.filter( (key) => key.startsWith(prefix) && !key.endsWith(STORAGE_FENCE_RECEIPT_SUFFIX) && !key.endsWith(".materialized") )) { const operation = await globals.GM_getValue(operationKey, void 0); const receipt = await globals.GM_getValue( `${operationKey}${STORAGE_FENCE_RECEIPT_SUFFIX}`, void 0 ); if (!isUserscriptFenceOperation(operation, storageKey) || !isUserscriptFenceReceipt(receipt)) { continue; } const candidate = { operationKey, operation, receipt }; allOperations.push(candidate); if (receipt.operationId !== operation.operationId || receipt.committedAt > operation.fence.expiresAt) { continue; } if (!best || compareUserscriptOperations(best, candidate) < 0) best = candidate; } if (!best) return { found: false, value: fallback }; if (rawPresent && !allOperations.some( (candidate) => candidate.operation.kind === "set" && storageValuesEqual(rawValue, candidate.operation.value) )) { return { found: true, value: rawValue }; } return { found: true, value: best.operation.kind === "remove" ? fallback : best.operation.value }; } async function readCommittedExtensionOperation(storage, storageKey, fallback) { const values = await storage.get(null); const keys = Object.keys(values); const prefix = `${STORAGE_FENCE_OPERATION_PREFIX}${encodeURIComponent(storageKey)}.`; const rawPresent = Object.prototype.hasOwnProperty.call(values, storageKey); const rawValue = rawPresent ? values[storageKey] : void 0; let best; const allOperations = []; for (const operationKey of keys.filter( (key) => key.startsWith(prefix) && !key.endsWith(STORAGE_FENCE_RECEIPT_SUFFIX) && !key.endsWith(".materialized") )) { const operation = values[operationKey]; const receipt = values[`${operationKey}${STORAGE_FENCE_RECEIPT_SUFFIX}`]; if (!isUserscriptFenceOperation(operation, storageKey) || !isUserscriptFenceReceipt(receipt)) { continue; } const candidate = { operationKey, operation, receipt }; allOperations.push(candidate); if (receipt.operationId !== operation.operationId || receipt.committedAt > operation.fence.expiresAt) { continue; } if (!best || compareUserscriptOperations(best, candidate) < 0) best = candidate; } if (!best) return { found: false, value: fallback }; if (rawPresent && !allOperations.some( (candidate) => candidate.operation.kind === "set" && storageValuesEqual(rawValue, candidate.operation.value) )) { return { found: true, value: rawValue }; } return { found: true, value: best.operation.kind === "remove" ? fallback : best.operation.value }; } function isUserscriptFenceOperation(value, storageKey) { if (!value || typeof value !== "object" || Array.isArray(value)) return false; const operation = value; return operation.version === 1 && typeof operation.operationId === "string" && operation.operationId.length > 0 && operation.storageKey === storageKey && (operation.kind === "set" || operation.kind === "remove") && isStorageLockFence(operation.fence); } function isUserscriptFenceReceipt(value) { if (!value || typeof value !== "object" || Array.isArray(value)) return false; const receipt = value; return receipt.version === 1 && typeof receipt.operationId === "string" && receipt.operationId.length > 0 && typeof receipt.committedAt === "number" && Number.isFinite(receipt.committedAt); } function storageValuesEqual(left, right) { if (Object.is(left, right)) return true; if (Array.isArray(left) || Array.isArray(right)) { return Array.isArray(left) && Array.isArray(right) && left.length === right.length && left.every((value, index) => storageValuesEqual(value, right[index])); } if (left && right && typeof left === "object" && typeof right === "object" && !Array.isArray(left) && !Array.isArray(right)) { const leftRecord = left; const rightRecord = right; const leftKeys = Object.keys(leftRecord).sort(); const rightKeys = Object.keys(rightRecord).sort(); return leftKeys.length === rightKeys.length && leftKeys.every( (key, index) => key === rightKeys[index] && storageValuesEqual(leftRecord[key], rightRecord[key]) ); } return false; } function compareUserscriptOperations(left, right) { if (left.operation.fence.name === right.operation.fence.name) { const generation2 = left.operation.fence.generation - right.operation.fence.generation; if (generation2 !== 0) return generation2; } return left.receipt.committedAt - right.receipt.committedAt || left.operation.fence.owner.localeCompare(right.operation.fence.owner) || left.operationKey.localeCompare(right.operationKey); } // src/platform/storage-lock-register.ts var STORAGE_LOCK_REGISTER_MESSAGE = "AVIARY_STORAGE_LOCK_REGISTER"; async function sendStorageLockRegister(request) { const runtime = globalThis.chrome?.runtime; if (typeof runtime?.sendMessage !== "function") { throw new Error("The extension lock register authority is unavailable."); } const response = await new Promise((resolve, reject) => { let settled = false; const finish2 = (value, error) => { if (settled) return; settled = true; if (error) reject(error); else resolve(value); }; try { const pending = runtime.sendMessage(request, (value) => { const error = runtime.lastError?.message; finish2(value, error ? new Error(`Storage lock register message failed: ${error}`) : void 0); }); if (pending && typeof pending.then === "function") { pending.then( (value) => finish2(value), (error) => finish2(void 0, error) ); } } catch (error) { finish2(void 0, error); } }); if (!response || typeof response !== "object" || response.ok !== true) { const message = response && typeof response === "object" && typeof response.error === "string" ? response.error : "The extension lock register rejected the request."; throw new Error(message); } return response; } // src/platform/storage-lock.ts var LIBRARY_RESTORE_LOCK = "aviary.library.restore"; var chains = /* @__PURE__ */ new Map(); var storageGateQueue = []; var storageGateReaders = 0; var storageGateWriter = false; var lockOwnerSequence = 0; var SHARED_LOCK_PREFIX = "aviary.lock.v1"; var SHARED_LOCK_LEASE_MS = 3e4; var SHARED_LOCK_RENEW_MS = 8e3; var SHARED_LOCK_POLL_MS = 12; var USERSCRIPT_LOCK_SETTLE_MS = 200; function lockManager() { const locks = globalThis.navigator?.locks; return typeof locks?.request === "function" ? locks : void 0; } async function withStorageLock(name, run, options = {}) { if (options.restoreGate === false) return withNamedStorageLock(name, run); return withStorageRestoreGate("shared", () => withNamedStorageLock(name, run)); } async function withExclusiveStorageGate(run) { return withStorageRestoreGate("exclusive", run); } async function withNamedStorageLock(name, run) { const previous = chains.get(name) ?? Promise.resolve(); const attempt = previous.then( () => runUnderBrowserLock(name, run), // A failure ahead of us released its lock; it is not a reason to refuse this write. () => runUnderBrowserLock(name, run) ); const settled = attempt.then( () => void 0, () => void 0 ); chains.set(name, settled); void settled.then(() => { if (chains.get(name) === settled) { chains.delete(name); } }); return attempt; } function withStorageRestoreGate(mode, run) { return new Promise((resolve, reject) => { storageGateQueue.push({ mode, run, resolve: (value) => resolve(value), reject }); drainStorageGate(); }); } function drainStorageGate() { if (storageGateWriter || storageGateQueue.length === 0) return; if (storageGateReaders > 0 && storageGateQueue[0]?.mode === "exclusive") return; if (storageGateQueue[0]?.mode === "exclusive") { const request = storageGateQueue.shift(); storageGateWriter = true; runStorageGateRequest(request); return; } while (storageGateQueue[0]?.mode === "shared" && !storageGateWriter) { const request = storageGateQueue.shift(); storageGateReaders += 1; runStorageGateRequest(request); } } function runStorageGateRequest(request) { void runUnderSharedStorageLock( LIBRARY_RESTORE_LOCK, request.mode, request.run, LIBRARY_RESTORE_LOCK, request.mode === "exclusive" ).then( request.resolve, request.reject ).finally(() => { if (request.mode === "exclusive") storageGateWriter = false; else storageGateReaders -= 1; drainStorageGate(); }); } async function runUnderBrowserLock(name, run) { return runUnderSharedStorageLock(`aviary.${name}`, "exclusive", run, name, false); } async function runUnderSharedStorageLock(name, mode, run, contextKey = name, exclusiveContext = false) { const registerStore = sharedLockRegisterStore(); if (registerStore) { return runUnderRegisterLock( registerStore, name, mode, (fence) => withStorageFenceContext(fence, contextKey, exclusiveContext, () => run(fence)) ); } const locks = lockManager(); if (!locks) { return run(void 0); } let result; let failure; let failed = false; const callback = async () => { try { result = await run(void 0); } catch (error) { failed = true; failure = error; } }; if (mode === "shared") await locks.request(name, { mode }, callback); else await locks.request(name, callback); if (failed) { throw failure; } return result; } async function runUnderRegisterLock(store6, name, mode, run) { const encodedName = encodeURIComponent(name); if (encodedName.length > 320) throw new Error("The storage lock name is too long"); const prefix = `${SHARED_LOCK_PREFIX}.${encodedName}`; const owner = nextLockOwner(); const key = `${prefix}.${owner}`; let contender = { version: 1, owner, phase: "choosing", ticket: 0, mode, expiresAt: Date.now() + SHARED_LOCK_LEASE_MS }; await store6.write(prefix, key, contender); try { const initial = await readLockContenders(store6, prefix, owner); contender = { ...contender, phase: "waiting", ticket: Math.max(0, ...initial.map((entry) => entry.ticket)) + 1, expiresAt: Date.now() + SHARED_LOCK_LEASE_MS }; await store6.write(prefix, key, contender); if (store6.kind === "userscript") await waitForUserscriptLockSettle(); while (!await lockCanEnter(store6, prefix, contender)) { await waitForLockPoll(); contender = await renewLockContender(store6, key, contender); } const localFence = { version: 1, name, owner, generation: contender.ticket, expiresAt: contender.expiresAt }; const needsFence = mode === "exclusive" || store6.kind === "userscript"; const remoteFence = needsFence ? await sendStorageFenceControl("acquire", localFence) : void 0; let fence = needsFence ? remoteFence ?? (store6.kind === "userscript" ? localFence : void 0) : void 0; if (needsFence && !fence && hasExtensionFenceTransport()) { throw new Error("The extension background did not return a storage fence"); } let renewal = Promise.resolve(); let renewalFailure; const renew = () => { renewal = renewal.then(async () => { try { contender = await renewLockContender(store6, key, contender); if (fence) { const renewed = { ...fence, expiresAt: contender.expiresAt }; const remoteRenewed = await sendStorageFenceControl("renew", renewed); fence = remoteRenewed ?? (store6.kind === "userscript" ? renewed : void 0); if (!fence && hasExtensionFenceTransport()) { throw new Error("The extension background did not renew the storage fence"); } } } catch (error) { renewalFailure = error; } }); }; const timer2 = globalThis.setInterval(renew, SHARED_LOCK_RENEW_MS); try { const result = await run(fence); await renewal; if (renewalFailure) throw renewalFailure; return result; } finally { globalThis.clearInterval(timer2); await renewal; try { if (fence) await sendStorageFenceControl("release", fence); } catch { } } } finally { await store6.remove(prefix, key); } } async function lockCanEnter(store6, prefix, contender) { const contenders = await readLockContenders(store6, prefix); const self = contenders.find((entry) => entry.owner === contender.owner); if (!self || self.phase !== contender.phase || self.ticket !== contender.ticket || self.mode !== contender.mode) { await store6.write(prefix, `${prefix}.${contender.owner}`, contender); return false; } const peers = contenders.filter((entry) => entry.owner !== contender.owner); if (peers.some((peer) => peer.phase === "choosing")) return false; return !peers.some((peer) => { if (peer.phase !== "waiting") return false; if (contender.mode === "shared" && peer.mode === "shared") return false; return compareLockContenders(peer, contender) < 0; }); } async function readLockContenders(store6, prefix, excludedOwner) { const now6 = Date.now(); const contenders = []; for (const [key, value] of await store6.entries(prefix)) { if (!isSharedLockContender(value) || value.expiresAt <= now6) { await store6.remove(prefix, key); continue; } if (value.owner !== excludedOwner) contenders.push(value); } return contenders; } async function renewLockContender(store6, key, contender) { if (contender.expiresAt - Date.now() > SHARED_LOCK_RENEW_MS * 2) return contender; const renewed = { ...contender, expiresAt: Date.now() + SHARED_LOCK_LEASE_MS }; await store6.write(prefixFromRegisterKey(key), key, renewed); return renewed; } function compareLockContenders(left, right) { return left.ticket - right.ticket || left.owner.localeCompare(right.owner); } function isSharedLockContender(value) { if (!value || typeof value !== "object") return false; const contender = value; return contender.version === 1 && typeof contender.owner === "string" && contender.owner.length > 0 && (contender.phase === "choosing" || contender.phase === "waiting") && typeof contender.ticket === "number" && Number.isSafeInteger(contender.ticket) && contender.ticket >= 0 && (contender.mode === "shared" || contender.mode === "exclusive") && typeof contender.expiresAt === "number" && Number.isFinite(contender.expiresAt); } function nextLockOwner() { const random = globalThis.crypto?.randomUUID?.().replaceAll("-", "") ?? Math.random().toString(36).slice(2); return `${Date.now().toString(36)}-${(++lockOwnerSequence).toString(36)}-${random}`; } function waitForLockPoll() { return new Promise((resolve) => { globalThis.setTimeout(resolve, SHARED_LOCK_POLL_MS); }); } function waitForUserscriptLockSettle() { return new Promise((resolve) => { globalThis.setTimeout(resolve, USERSCRIPT_LOCK_SETTLE_MS); }); } function sharedLockRegisterStore() { const runtime = globalThis.chrome?.runtime; const extensionStorage = runtime?.id && typeof runtime.getManifest === "function" ? runtime.sendMessage : void 0; if (typeof extensionStorage === "function") { return { kind: "extension", async entries(prefix) { const response = await sendStorageLockRegister({ type: STORAGE_LOCK_REGISTER_MESSAGE, version: 1, operation: "entries", prefix }); return response.entries ?? []; }, async write(prefix, key, value) { await sendStorageLockRegister({ type: STORAGE_LOCK_REGISTER_MESSAGE, version: 1, operation: "write", prefix, key, value }); }, async remove(prefix, key) { await sendStorageLockRegister({ type: STORAGE_LOCK_REGISTER_MESSAGE, version: 1, operation: "remove", prefix, key }); } }; } if (typeof globalThis.GM_listValues === "function" && typeof globalThis.GM_getValue === "function" && typeof globalThis.GM_setValue === "function" && typeof globalThis.GM_deleteValue === "function") { return { kind: "userscript", async entries(prefix) { const raw = await ensureUserscriptRoster(prefix); return readUserscriptRoster(prefix, raw); }, async write(prefix, key, value) { await updateUserscriptRoster(prefix, key, value); }, async remove(prefix, key) { await updateUserscriptRoster(prefix, key, void 0, true); } }; } return void 0; } function prefixFromRegisterKey(key) { const separator = key.lastIndexOf("."); return separator > 0 ? key.slice(0, separator) : key; } var USERSCRIPT_ROSTER_VERSION = 1; var migratedUserscriptRosterPrefixes = /* @__PURE__ */ new Set(); function lockRosterKey(prefix) { return `${SHARED_LOCK_PREFIX}.roster.${encodeURIComponent(prefix)}`; } function readUserscriptRoster(prefix, raw) { if (!raw || typeof raw !== "object") return []; const value = raw; if (value.version !== USERSCRIPT_ROSTER_VERSION || value.prefix !== prefix || !Array.isArray(value.entries)) { return []; } return value.entries.filter( (entry) => Array.isArray(entry) && entry.length === 2 && typeof entry[0] === "string" && entry[0].startsWith(`${prefix}.`) ); } async function migrateUserscriptRoster(prefix) { if (typeof globalThis.GM_listValues !== "function") return; const keys = (await globalThis.GM_listValues()).filter((key) => key.startsWith(`${prefix}.`)); const entries = await Promise.all(keys.map(async (key) => [ key, await globalThis.GM_getValue(key, void 0) ])); await globalThis.GM_setValue(lockRosterKey(prefix), { version: USERSCRIPT_ROSTER_VERSION, prefix, entries }); migratedUserscriptRosterPrefixes.add(prefix); } async function ensureUserscriptRoster(prefix) { const key = lockRosterKey(prefix); const current = await globalThis.GM_getValue(key, void 0); if (current !== void 0) return current; if (migratedUserscriptRosterPrefixes.has(prefix)) return void 0; await migrateUserscriptRoster(prefix); return globalThis.GM_getValue(key, void 0); } async function updateUserscriptRoster(prefix, key, value, remove = false) { const rosterKey = lockRosterKey(prefix); for (let attempt = 0; attempt < 8; attempt += 1) { const raw = await ensureUserscriptRoster(prefix); const entries = new Map(readUserscriptRoster(prefix, raw)); if (remove) entries.delete(key); else entries.set(key, value); if (entries.size === 0) { await globalThis.GM_deleteValue(rosterKey); migratedUserscriptRosterPrefixes.add(prefix); return; } await globalThis.GM_setValue(rosterKey, { version: USERSCRIPT_ROSTER_VERSION, prefix, entries: [...entries.entries()] }); const confirmed = new Map(readUserscriptRoster(prefix, await globalThis.GM_getValue(rosterKey, void 0))); if (remove ? !confirmed.has(key) : valuesEqual(confirmed.get(key), value)) return; } throw new Error("The userscript lock roster did not settle"); } function valuesEqual(left, right) { try { return JSON.stringify(left) === JSON.stringify(right); } catch { return false; } } async function mutateStored(storage, key, fallback, mutate, options = {}) { return withStorageLock(key, async (fence) => { const stored = await storage.get(key, fallback); const next = await mutate(stored); await storage.set(key, next, fence); return next; }, options); } async function replaceStored(storage, key, value) { await withStorageLock(key, async (fence) => { await storage.set(key, value, fence); }); } function mergeKeyed(stored, added, removed = []) { const merged = new Map(stored); for (const [key, value] of added) { merged.set(key, value); } for (const key of removed) { merged.delete(key); } return merged; } // src/platform/durable-storage.ts var DURABLE_STORAGE_SCHEMA_VERSION = 1; var PENDING_WRITES_KEY = "aviary.durable.pending"; var PENDING_WRITES_SCHEMA_VERSION = 2; var PENDING_WRITES_LOCK = "durable.pending-writes"; var DURABLE_STORAGE_KEYS = [ "aviary.profiles.v1", "aviary.profile.active.v1", "aviary.profile.migration.v1", "aviary.settings.v1", "aviary.integration.usage.v1", "aviary.export.checkpoints.v1", "aviary.queryIds.v1", "aviary.media.history.v1", "aviary.media.queue.v1", "aviary.aria2.history.v1", "aviary.hiddenPosts.v1", "aviary.seenPosts.v1", "aviary.readingMarkers.v1", "aviary.catchUp.v1", "aviary.media.last-download.v1", "aviary.cleanupQueue.v1", "aviary.accountCleanup.v1", "aviary.userNotes.v1", "aviary.audit.v1", "aviary.firstRun.v1", "aviary.diagnostics.v1", "aviary.background.diagnostics.v1", "aviary.adObservations.v1", "aviary.library.bookmarks.v1", "aviary.snapshots.v1", "aviary.library.underTheHood.v1", "aviary.semanticIndex.v1", "aviary.archive.imports.v1", "aviary.archive.library.v1", "aviary.waczSigning.v1" ]; var DURABLE_DATABASE_NAME = "aviary.durable.v1"; var DURABLE_OBJECT_STORE = "values"; var DurableStorageGateway = class { #legacy; #backend; #namespace; #legacyBackend; #initialized = false; #usable = true; #status = { backend: "legacy", schemaVersion: 0, migratedKeys: 0, usageBytes: null, quotaBytes: null, persistence: "unknown", pendingWrites: 0, lastError: null }; constructor(legacy, backend, namespace = "aviary", legacyBackend = "legacy") { this.#legacy = legacy; this.#backend = backend; this.#namespace = namespace; this.#legacyBackend = legacyBackend; if (backend) { this.#status.backend = "indexeddb"; } else { this.#status.backend = legacyBackend; if (legacyBackend === "userscript-manager") { this.#status.schemaVersion = DURABLE_STORAGE_SCHEMA_VERSION; } } } async initialize(keys = DURABLE_STORAGE_KEYS) { if (this.#initialized) { return this.getStatus(); } this.#initialized = true; if (!this.#backend) { return this.getStatus(); } try { await this.#reconcilePendingWrites(); const previous = await this.#backend.getMeta(); const migratedKeys = new Set(previous?.migratedKeys ?? []); const entries = []; const discoveredKeys = this.#legacy.keys ? await this.#legacy.keys() : []; const scopedKeys = [.../* @__PURE__ */ new Set([ ...keys.map((key) => this.#scope(key)), ...discoveredKeys.filter((key) => this.#isDurable(key)).map((key) => this.#scope(key)) ])]; for (const key of scopedKeys) { const existing = await readDurableBackend(this.#backend, key); if (existing.found) { migratedKeys.add(key); continue; } const legacy = await this.#legacy.get(key, void 0); if (legacy !== void 0) { entries.push([key, legacy]); migratedKeys.add(key); } } const meta = { schemaVersion: DURABLE_STORAGE_SCHEMA_VERSION, migratedKeys: [...migratedKeys].sort(), migratedAt: (/* @__PURE__ */ new Date()).toISOString() }; await this.#backend.putMany(entries, meta); await Promise.all( entries.map(([key, value]) => verifyBackendValue(this.#backend, key, value)) ); for (const [key] of entries) { try { await this.#legacy.remove(key); } catch (error) { reportStorageError(key, error, "write"); } } this.#status.schemaVersion = meta.schemaVersion; this.#status.migratedKeys = meta.migratedKeys.length; await this.refreshEstimate(); } catch (error) { this.#fallback(error); } return this.getStatus(); } getStatus() { return { ...this.#status }; } async refreshEstimate() { if (!this.#backend || !this.#usable) { return this.getStatus(); } try { const estimate = await this.#backend.estimate(); this.#status.usageBytes = finiteOrNull(estimate.usage); this.#status.quotaBytes = finiteOrNull(estimate.quota); this.#status.persistence = estimate.persisted === void 0 ? "unknown" : estimate.persisted ? "persisted" : "best-effort"; } catch (error) { reportStorageError("aviary.durable.estimate", error, "read"); } return this.getStatus(); } /** * The measured breakdown, or `null` where this session's backend cannot enumerate itself. * * A userscript manager and the legacy fallback both store values behind an API with no cursor, * so they answer nothing rather than a total assembled from the keys Aviary happens to remember. */ async measureCollections() { await this.#ensureInitialized(); if (!this.#backend || !this.#usable || typeof this.#backend.measure !== "function") { return null; } try { const breakdown = await this.#backend.measure(); return { totalBytes: breakdown.totalBytes, collections: breakdown.collections.map((entry) => ({ ...entry, key: this.#unscope(entry.key) })), usageDetails: breakdown.usageDetails }; } catch (error) { reportStorageError("aviary.durable.measure", error, "read"); return null; } } async get(key, fallback) { if (!this.#isDurable(key)) { return this.#legacy.get(key, fallback); } await this.#ensureInitialized(); if (!this.#backend || !this.#usable) { return this.#backend ? this.#getFallbackValue(key, fallback) : this.#legacy.get(key, fallback); } const scopedKey = this.#scope(key); try { const stored = await readDurableBackend(this.#backend, scopedKey); if (stored.found) { return stored.removed ? fallback : stored.value; } const legacy = await this.#legacy.get(key, void 0); if (legacy !== void 0) { await this.#backend.put(scopedKey, legacy, void 0, createDurableOperation()); await verifyBackendValue(this.#backend, scopedKey, legacy); try { await this.#legacy.remove(key); } catch (error) { reportStorageError(scopedKey, error, "write"); } return legacy; } return fallback; } catch (error) { this.#fallback(error); return this.#getFallbackValue(key, fallback); } } async set(key, value, fence) { const effectiveFence = fence ?? inferStorageFence(this.#scope(key)); if (!this.#isDurable(key)) { await this.#legacy.set(key, value, effectiveFence); return; } await this.#ensureInitialized(); const operation = createDurableOperation(); if (!this.#backend || !this.#usable) { if (this.#backend) { await this.#markPending(key, "put", value, effectiveFence, operation); } else { await this.#legacy.set(key, value, effectiveFence); } return; } const scopedKey = this.#scope(key); try { await this.#backend.put(scopedKey, value, effectiveFence, operation); try { await this.#legacy.remove(key, effectiveFence); } catch (error) { if (effectiveFence && isStorageFenceError(error)) throw error; reportStorageError(scopedKey, error, "write"); await this.#markPending(key, "put", value, effectiveFence, operation); } await this.refreshEstimate(); } catch (error) { if (effectiveFence && isStorageFenceError(error)) throw error; this.#fallback(error); await this.#markPending(key, "put", value, effectiveFence, operation); } } async remove(key, fence) { const effectiveFence = fence ?? inferStorageFence(this.#scope(key)); if (!this.#isDurable(key)) { await this.#legacy.remove(key, effectiveFence); return; } await this.#ensureInitialized(); const operation = createDurableOperation(); if (!this.#backend || !this.#usable) { if (this.#backend) { await this.#markPending(key, "remove", void 0, effectiveFence, operation); } else { await this.#legacy.remove(key, effectiveFence); } return; } const scopedKey = this.#scope(key); try { await this.#backend.remove(scopedKey, effectiveFence, operation); try { await this.#legacy.remove(key, effectiveFence); } catch (error) { if (effectiveFence && isStorageFenceError(error)) throw error; reportStorageError(scopedKey, error, "write"); await this.#markPending(key, "remove", void 0, effectiveFence, operation); } await this.refreshEstimate(); } catch (error) { if (effectiveFence && isStorageFenceError(error)) throw error; this.#fallback(error); await this.#markPending(key, "remove", void 0, effectiveFence, operation); } } async #ensureInitialized() { if (!this.#initialized) { await this.initialize(); } } #isDurable(key) { const scoped = this.#scope(key); return scoped.startsWith(`${this.#namespace}.`) && /\.v\d+$/.test(scoped); } #scope(key) { if (this.#namespace.length === 0 || key.startsWith(`${this.#namespace}.`)) { return key; } return `${this.#namespace}.${key}`; } /** The name a store knows itself by, with this profile's namespace taken back off. */ #unscope(key) { const prefix = `${this.#namespace}.`; return this.#namespace.length > 0 && key.startsWith(prefix) ? key.slice(prefix.length) : key; } #fallback(error) { this.#usable = false; this.#status.backend = "indexeddb-fallback"; this.#status.lastError = error instanceof Error ? error.message : String(error); reportStorageError("aviary.durable", error, "write"); } /** * Records that `key` was written (or removed) into legacy while the backend was unavailable, so * the next healthy boot knows legacy holds the newer value. Kept in the legacy store on purpose: * the backend is the thing that just failed. */ async #markPending(key, kind, value, _fence, operation) { try { this.#status.pendingWrites = await withStorageLock(PENDING_WRITES_LOCK, async (fence) => { const pending = await this.#readPendingWrites(); addPendingWrite(pending, { id: createPendingWriteId(), key, kind, ...kind === "put" ? { value } : {}, ...operation ?? {} }); await this.#writePendingWrites(pending, fence); return pending.size; }, { restoreGate: false }); } catch (error) { reportStorageError(PENDING_WRITES_KEY, error, "write"); throw error; } } /** * Folds a previous fallback session's writes back into the backend. Legacy wins here -- and only * here -- because a key reaches this list only by being written while the backend was down. */ async #reconcilePendingWrites() { if (!this.#backend) { return; } await withStorageLock(PENDING_WRITES_LOCK, async (fence) => { const pending = await this.#readPendingWrites(); this.#status.pendingWrites = pending.size; if (pending.size === 0) return; for (const write of pending.values()) { const scopedWrite = { ...write, key: this.#scope(write.key) }; try { await this.#backend.stagePendingWrite(scopedWrite, fence); const receipt = await this.#backend.commitPendingWrite(scopedWrite, fence); await verifyPendingWriteReceipt(scopedWrite, receipt); } catch (error) { reportStorageError(write.key, error, "write"); throw error; } } for (const write of pending.values()) { try { await this.#legacy.remove(write.key, fence); } catch (error) { reportStorageError(write.key, error, "write"); throw error; } } try { await this.#writePendingWrites(/* @__PURE__ */ new Map(), fence); } catch (error) { reportStorageError(PENDING_WRITES_KEY, error, "write"); throw error; } this.#status.pendingWrites = 0; }, { restoreGate: false }); } async #getFallbackValue(key, fallback) { return withStorageLock(PENDING_WRITES_LOCK, async () => { const pending = await this.#readPendingWrites(); const write = pending.get(key); if (write?.kind === "put") return write.value; if (write?.kind === "remove") return fallback; return this.#legacy.get(key, fallback); }, { restoreGate: false }); } async #readPendingWrites() { const stored = await this.#legacy.get(PENDING_WRITES_KEY, []); const pending = /* @__PURE__ */ new Map(); if (Array.isArray(stored)) { for (const key of stored) { if (typeof key !== "string" || !this.#isDurable(key) || pending.has(key)) continue; const value = await this.#legacy.get(key, void 0); const kind = value === void 0 ? "remove" : "put"; const fingerprint2 = await hashStorageValue({ key, kind, value }); addPendingWrite(pending, { id: `legacy-${fingerprint2}`, key, kind, ...kind === "put" ? { value } : {} }); } return pending; } if (!isPendingWriteLedger(stored)) return pending; for (const write of stored.entries) { if (this.#isDurable(write.key)) addPendingWrite(pending, write); } return pending; } async #writePendingWrites(pending, fence) { if (pending.size === 0) { await this.#legacy.remove(PENDING_WRITES_KEY, fence); return; } const compacted = /* @__PURE__ */ new Map(); for (const write of pending.values()) addPendingWrite(compacted, write); await this.#legacy.set(PENDING_WRITES_KEY, { schemaVersion: PENDING_WRITES_SCHEMA_VERSION, entries: [...compacted.values()] }, fence); } }; function createDurableStorageGateway(legacy, options = {}) { const backend = options.backend ?? null; return new DurableStorageGateway( legacy, backend, options.namespace ?? "aviary", options.legacyBackend ?? "legacy" ); } function storageCapReport(input) { const capBytes = Number.isFinite(input.capBytes) && input.capBytes > 0 ? Math.round(input.capBytes) : 0; const storedBytes = Math.max(0, Math.round(input.storedBytes)); const incomingBytes = Math.max(0, Math.round(input.incomingBytes ?? 0)); if (capBytes === 0) { return { state: "off", capBytes: 0, storedBytes, incomingBytes }; } const state2 = storedBytes >= capBytes ? "over" : storedBytes + incomingBytes >= capBytes ? "would-cross" : "under"; return { state: state2, capBytes, storedBytes, incomingBytes }; } function isDurableStorageMeta(value) { if (!value || typeof value !== "object") return false; const record = value; return record.schemaVersion === DURABLE_STORAGE_SCHEMA_VERSION && Array.isArray(record.migratedKeys) && record.migratedKeys.every((key) => typeof key === "string") && (record.migratedAt === null || typeof record.migratedAt === "string"); } function isDurablePendingWrite(value) { if (!value || typeof value !== "object") return false; const write = value; return validPendingWriteId(write.id) && typeof write.key === "string" && write.key.length > 0 && write.key.length <= 512 && (write.kind === "put" && "value" in write || write.kind === "remove") && (write.operationId === void 0 || validPendingWriteId(write.operationId)) && (write.operationOrder === void 0 || validOperationOrder(write.operationOrder)); } function isDurableOperation(value) { if (!value || typeof value !== "object") return false; const operation = value; return validPendingWriteId(operation.operationId) && validOperationOrder(operation.operationOrder); } function finiteOrNull(value) { return typeof value === "number" && Number.isFinite(value) ? value : null; } async function readDurableBackend(backend, key) { if (typeof backend.read === "function") { return backend.read(key); } const value = await backend.get(key); return value === void 0 ? { found: false, removed: false } : { found: true, removed: false, value }; } async function verifyBackendValue(backend, key, expectedValue) { const actualValue = await backend.get(key); if (actualValue === void 0) { throw new Error(`Durable migration did not retain ${key}`); } const [expectedHash, actualHash] = await Promise.all([ hashStorageValue(expectedValue), hashStorageValue(actualValue) ]); if (expectedHash !== actualHash) { throw new Error(`Durable migration hash mismatch for ${key}`); } } async function verifyPendingWriteReceipt(write, receipt) { const expectedHash = write.kind === "put" ? await hashStorageValue(write.value) : null; if (receipt.id !== write.id || receipt.key !== write.key || receipt.kind !== write.kind || receipt.valueHash !== expectedHash) { throw new Error(`Durable reconciliation receipt mismatch for ${write.key}`); } } function isPendingWriteLedger(value) { if (!value || typeof value !== "object") return false; const ledger = value; return ledger.schemaVersion === PENDING_WRITES_SCHEMA_VERSION && Array.isArray(ledger.entries) && ledger.entries.every(isDurablePendingWrite); } function validPendingWriteId(value) { return typeof value === "string" && value.length > 0 && value.length <= 128 && /^[A-Za-z0-9._:-]+$/.test(value); } function validOperationOrder(value) { return typeof value === "number" && Number.isSafeInteger(value) && value >= 0; } function createPendingWriteId() { const cryptoWithUuid = globalThis.crypto; if (typeof cryptoWithUuid?.randomUUID === "function") { return cryptoWithUuid.randomUUID(); } return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`; } var durableOperationSequence = 0; var lastDurableOperationOrder = 0; function createDurableOperation() { const now6 = Math.max(0, Math.floor(Date.now())); const requestedOrder = now6 * 1e3; const operationOrder = Math.min( Number.MAX_SAFE_INTEGER, Math.max(requestedOrder, lastDurableOperationOrder + 1) ); lastDurableOperationOrder = operationOrder; return { operationId: `${now6.toString(36)}-${(++durableOperationSequence).toString(36)}-${Math.random().toString(36).slice(2)}`, operationOrder }; } function normalizePendingWrite(write) { return { ...write }; } function addPendingWrite(pending, candidate) { const normalized = normalizePendingWrite(candidate); const existing = pending.get(normalized.key); if (!existing || comparePendingWrites(existing, normalized) <= 0) { pending.set(normalized.key, normalized); } } function comparePendingWrites(left, right) { const leftOperation = operationFromWrite(left); const rightOperation = operationFromWrite(right); if (!leftOperation && !rightOperation) return left.id.localeCompare(right.id); if (!leftOperation) return -1; if (!rightOperation) return 1; return compareDurableOperations(leftOperation, rightOperation); } function operationFromWrite(write) { if (!isDurableOperation({ operationId: write.operationId, operationOrder: write.operationOrder })) { return void 0; } return { operationId: write.operationId, operationOrder: write.operationOrder }; } function compareDurableOperations(left, right) { return left.operationOrder - right.operationOrder || left.operationId.localeCompare(right.operationId); } // src/features/library/cleanup-preview.ts function recordStoredBytes(record) { let total = 0; for (const entry of record.media ?? []) { if (entry.captureStatus !== "captured-bytes") continue; const bytes = entry.byteLength; if (typeof bytes === "number" && Number.isFinite(bytes) && bytes > 0) total += Math.round(bytes); } return total; } function previewCleanup(records, options = {}) { const whitelist = new Set((options.whitelistHandles ?? []).map((h) => h.toLowerCase())); const protectedIds = new Set(options.protectedTweetIds ?? []); const byBucket = { tweets: 0, retweets: 0, replies: 0, likes: 0, bookmarks: 0 }; let protectedCount = 0; const candidates2 = []; for (const record of records) { const bucket = classify(record, options.bucketHint); if (!bucket) continue; const handle = record.handle?.toLowerCase() ?? null; const isProtected = record.tweetId !== null && protectedIds.has(record.tweetId) || handle !== null && whitelist.has(handle); if (isProtected) { protectedCount += 1; } byBucket[bucket] += 1; candidates2.push({ bucket, tweetId: record.tweetId, handle: record.handle, text: record.text, permalink: record.permalink, reason: explain(bucket, record, wasInferred(bucket, record, options.bucketHint)), protected: isProtected, storedBytes: recordStoredBytes(record) }); } const storedBytes = candidates2.reduce((total, entry) => total + entry.storedBytes, 0); const freeableBytes = candidates2.filter((entry) => !entry.protected).reduce((total, entry) => total + entry.storedBytes, 0); const largest = [...candidates2].filter((entry) => entry.storedBytes > 0).sort((left, right) => right.storedBytes - left.storedBytes || (left.tweetId ?? "").localeCompare(right.tweetId ?? "")).slice(0, Math.max(0, options.largestCount ?? 10)); return { storedBytes, freeableBytes, largest, generatedAt: (/* @__PURE__ */ new Date()).toISOString(), candidates: candidates2, byBucket, protectedCount }; } function classify(record, hint) { if (hint) return hint; if (record.surface.includes("likes")) return "likes"; if (record.surface.includes("bookmarks")) return "bookmarks"; if (record.parentId != null && record.parentId !== "") return "replies"; if (record.text.startsWith("RT @") || record.text.startsWith("Reposted ")) return "retweets"; if (record.text.startsWith("@")) return "replies"; return "tweets"; } function wasInferred(bucket, record, hint) { if (hint) return false; if (record.surface.includes("likes") || record.surface.includes("bookmarks")) return false; if (bucket === "replies") return record.parentId == null || record.parentId === ""; return bucket === "retweets"; } function explain(bucket, record, inferred = false) { switch (bucket) { case "retweets": return inferred ? "Looks like reposted content, from how the text begins" : "Reposted content, author retains the original"; case "replies": return inferred ? "Looks like a reply, from how the text begins" : "Reply to another account"; case "likes": return "Imported from Likes archive"; case "bookmarks": return "Imported from Bookmarks archive"; case "tweets": default: return record.tweetId ? `Original post ${record.tweetId}` : "Original post"; } } // src/platform/network.ts var NETWORK_TIMEOUTS = { aria2: 15e3, ai: 3e4, semantic: 3e4, crosspost: 3e4, mediaProbe: 5e3, mediaTransfer: 6e4 }; var NetworkTimeoutError = class extends Error { timeoutMs; constructor(timeoutMs) { super(`Network request timed out after ${Math.ceil(timeoutMs / 1e3)} seconds`); this.name = "NetworkTimeoutError"; this.timeoutMs = timeoutMs; } }; async function withNetworkTimeout(operation, timeoutMs) { const deadline = Math.max(1, Math.trunc(timeoutMs)); const controller2 = new AbortController(); let timer2; let timedOut = false; const timeout = new Promise((_, reject) => { timer2 = setTimeout(() => { timedOut = true; controller2.abort(); reject(new NetworkTimeoutError(deadline)); }, deadline); }); const request = Promise.resolve().then(() => operation(controller2.signal)); try { return await Promise.race([request, timeout]); } catch (error) { if (timedOut) { throw new NetworkTimeoutError(deadline); } throw error; } finally { if (timer2 !== void 0) clearTimeout(timer2); if (timedOut) controller2.abort(); } } // src/features/integrations/network-policy.ts var NetworkPolicyNotInstalledError = class extends Error { constructor(what) { super( `${what} was blocked: Aviary's outbound network policy has not been installed yet. This is a startup fault in Aviary, not the Local-only mode setting.` ); this.name = "NetworkPolicyNotInstalledError"; } }; var LocalOnlyError = class extends Error { constructor(what) { super( `${what} was blocked: Aviary is in local-only mode. Turn off "Local-only mode" in Trust to let configured integrations reach the network.` ); this.name = "LocalOnlyError"; } }; var SHARED_POLICY_KEY = "__AVIARY_LOCAL_ONLY__"; var localOnly = null; function setLocalOnlyPolicy(predicate) { localOnly = predicate; globalThis[SHARED_POLICY_KEY] = predicate; } function localOnlyPolicyInstalled() { return localOnly !== null || typeof globalThis[SHARED_POLICY_KEY] === "function"; } function isLocalOnly() { const shared2 = globalThis[SHARED_POLICY_KEY]; if (shared2) return shared2(); return localOnly === null ? true : localOnly(); } function assertOutboundAllowed(what) { if (!localOnlyPolicyInstalled()) { throw new NetworkPolicyNotInstalledError(what); } if (isLocalOnly()) { throw new LocalOnlyError(what); } } // src/features/integrations/usage.ts var INTEGRATION_USAGE_KEY = "aviary.integration.usage.v1"; var INTEGRATION_USAGE_SCHEMA_VERSION = 1; var USAGE_HISTORY_DAYS = 31; var DEFAULT_AI_MAX_REQUEST_BYTES = 32e3; var DEFAULT_AI_DAILY_REQUEST_BYTES = 1e6; var DEFAULT_EMBEDDING_MAX_RECORD_BYTES = 2e4; var DEFAULT_EMBEDDING_DAILY_RECORD_BYTES = 2e6; var EMPTY = { schemaVersion: 1, days: [] }; var IntegrationUsageLedger = class { #storage; #state = { schemaVersion: 1, days: [] }; #loaded = false; #lastBlocked = null; constructor(storage) { this.#storage = storage; } async load() { if (this.#loaded) return; const stored = await this.#storage.get(INTEGRATION_USAGE_KEY, EMPTY); this.#state = normalizeState(stored); this.#loaded = true; } snapshot(now6 = /* @__PURE__ */ new Date()) { const day = localDay(now6); const current = this.#state.days.find((entry) => entry.day === day) ?? emptyDay(day); return { day, historyDays: this.#state.days.length, ai: { ...current.ai }, embedding: { ...current.embedding } }; } status(aiBudget, embeddingBudget, localOnly2) { const snapshot = this.snapshot(); return { day: snapshot.day, networkAllowed: !localOnly2, localOnly: localOnly2, lastBlocked: this.#lastBlocked ? { ...this.#lastBlocked } : null, ai: { ...snapshot.ai, dailyLimitBytes: aiBudget.dailyBytes }, embedding: { ...snapshot.embedding, dailyLimitBytes: embeddingBudget.dailyBytes } }; } async reserveAi(requestBytes, budget) { return this.#reserve("ai", requestBytes, 0, budget); } async reserveEmbedding(recordBytes, budget) { return this.#reserve("embedding", recordBytes, 1, budget); } async clear() { await this.load(); const before = this.#state; this.#state = { schemaVersion: 1, days: [] }; this.#lastBlocked = null; try { await replaceStored(this.#storage, INTEGRATION_USAGE_KEY, this.#state); } catch (error) { this.#state = before; throw error; } } /** * Check the budget and spend from it, atomically across tabs. * * The whole body runs inside one lock and re-reads the stored ledger at the top of it. Without * that the sequence is a textbook time-of-check-to-time-of-use race: two tabs each read the same * "bytes used today", each conclude there is room, and each write their own total -- so a daily * budget could be spent once per open tab. The budget is the only promise Aviary makes about * what a provider is allowed to cost, so it is the one counter that has to be exact. */ async #reserve(kind, requestBytes, records, budget) { await this.load(); return withStorageLock( INTEGRATION_USAGE_KEY, () => this.#reserveLocked(kind, requestBytes, records, budget) ); } async #reserveLocked(kind, requestBytes, records, budget) { this.#state = mergeHighest( this.#state, normalizeState(await this.#storage.get(INTEGRATION_USAGE_KEY, EMPTY)) ); const bytes = Math.max(0, Math.floor(Number.isFinite(requestBytes) ? requestBytes : 0)); const maxRequestBytes = finiteLimit(budget.maxRequestBytes); const dailyLimitBytes = finiteLimit(budget.dailyBytes); const current = this.snapshot(); const usedBytes = kind === "ai" ? current.ai.bytes : current.embedding.bytes; if (overBudget(maxRequestBytes, bytes)) { return this.blocked( kind, bytes, usedBytes, dailyLimitBytes, maxRequestBytes <= 0 ? `The ${kind} per-request budget is zero, so no provider request was made.` : `The ${kind} request is ${bytes} bytes, over the ${maxRequestBytes}-byte per-request budget.` ); } if (overBudget(dailyLimitBytes, usedBytes + bytes)) { return this.blocked( kind, bytes, usedBytes, dailyLimitBytes, dailyLimitBytes <= 0 ? `The ${kind} daily budget is zero, so no provider request was made.` : `The ${kind} daily budget has been reached; no provider request was made.` ); } const before = cloneState(this.#state); const day = this.#getOrCreateDay(current.day); if (kind === "ai") { day.ai.requests += 1; day.ai.bytes += bytes; } else { day.embedding.requests += 1; day.embedding.records += records; day.embedding.bytes += bytes; } this.#trimHistory(); try { await this.#storage.set(INTEGRATION_USAGE_KEY, this.#state); } catch { this.#state = before; return this.blocked( kind, bytes, usedBytes, dailyLimitBytes, "Usage could not be saved locally; the provider request was stopped." ); } this.#lastBlocked = null; return { allowed: true, kind, requestBytes: bytes, usedBytes: usedBytes + bytes, dailyLimitBytes }; } #getOrCreateDay(day) { let current = this.#state.days.find((entry) => entry.day === day); if (!current) { current = emptyDay(day); this.#state.days.push(current); this.#state.days.sort((a, b) => a.day.localeCompare(b.day)); } return current; } #trimHistory() { if (this.#state.days.length > USAGE_HISTORY_DAYS) { this.#state.days = this.#state.days.slice(-USAGE_HISTORY_DAYS); } } blocked(kind, requestBytes, usedBytes, dailyLimitBytes, reason) { this.#lastBlocked = { kind, reason }; return { allowed: false, kind, requestBytes, usedBytes, dailyLimitBytes, reason }; } }; function defaultAiBudget(config) { return { maxRequestBytes: config.maxRequestBytes ?? DEFAULT_AI_MAX_REQUEST_BYTES, dailyBytes: config.dailyRequestBytes ?? DEFAULT_AI_DAILY_REQUEST_BYTES }; } function defaultEmbeddingBudget(config) { return { maxRequestBytes: config.maxRecordBytes ?? DEFAULT_EMBEDDING_MAX_RECORD_BYTES, dailyBytes: config.dailyRecordBytes ?? DEFAULT_EMBEDDING_DAILY_RECORD_BYTES }; } function buildAiDisclosure(config, request, usage, networkAllowed) { const text = [request.systemPrompt ?? "", request.prompt].join("\n"); const budget = defaultAiBudget(config); const requestBytes = estimateAiRequestBytes(config, request); const budgetReason = overBudget(budget.maxRequestBytes, requestBytes) ? budget.maxRequestBytes <= 0 ? "The AI per-request budget is zero, so no provider request will be made." : `The AI request is ${requestBytes} bytes, over the ${budget.maxRequestBytes}-byte per-request budget.` : usage && overBudget(budget.dailyBytes, usage.ai.bytes + requestBytes) ? budget.dailyBytes <= 0 ? "The AI daily budget is zero, so no provider request will be made." : "The AI daily budget has been reached; no provider request was made." : null; return { provider: config.provider, endpoint: aiEndpoint(config), fields: ["model", ...request.systemPrompt ? ["system instruction"] : [], "user prompt"], characterCount: [...text].length, requestBytes, estimatedTokens: estimateTokens(text), retained: "Aviary stores usage counters only; the provider's retention follows its policy.", networkAllowed, budgetAllowed: budgetReason === null, budgetReason, dailyUsedBytes: usage?.ai.bytes ?? 0, dailyLimitBytes: budget.dailyBytes }; } function aiEndpoint(config) { if (config.endpoint) return config.endpoint; return config.provider === "anthropic" ? "https://api.anthropic.com/v1/messages" : "https://api.openai.com/v1/chat/completions"; } function estimateAiRequestBytes(config, request) { return utf8Bytes(JSON.stringify(aiRequestBody(config, request))); } function estimateTokens(text) { return Math.max(0, Math.ceil([...text].length / 4)); } function utf8Bytes(text) { return new TextEncoder().encode(text).byteLength; } function aiRequestBody(config, request) { if (config.provider === "anthropic") { return { model: config.model, max_tokens: request.maxTokens ?? 1024, ...request.systemPrompt ? { system: request.systemPrompt } : {}, messages: [{ role: "user", content: request.prompt }] }; } return { model: config.model, // OpenAI-compatible reasoning endpoints use the longer parameter name first. Estimating // that shape is conservative for the legacy fallback, whose `max_tokens` key is shorter. max_completion_tokens: request.maxTokens ?? 1024, messages: [ ...request.systemPrompt ? [{ role: "system", content: request.systemPrompt }] : [], { role: "user", content: request.prompt } ] }; } function finiteLimit(value) { if (value === void 0) return 0; return Number.isFinite(value) && value >= 0 ? Math.floor(value) : 0; } function overBudget(limit, bytes) { return limit <= 0 || bytes > limit; } function localDay(date) { const pad = (value) => String(value).padStart(2, "0"); return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`; } function emptyDay(day) { return { day, ai: { requests: 0, bytes: 0 }, embedding: { requests: 0, records: 0, bytes: 0 } }; } function normalizeState(value) { if (!isRecord4(value) || value.schemaVersion !== INTEGRATION_USAGE_SCHEMA_VERSION || !Array.isArray(value.days)) { return { schemaVersion: 1, days: [] }; } const days = value.days.map(normalizeDay).filter((day) => day !== null).sort((a, b) => a.day.localeCompare(b.day)); return { schemaVersion: 1, days: days.slice(-USAGE_HISTORY_DAYS) }; } function normalizeDay(value) { if (!isRecord4(value) || typeof value.day !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value.day)) { return null; } const ai = isRecord4(value.ai) ? value.ai : {}; const embedding = isRecord4(value.embedding) ? value.embedding : {}; return { day: value.day, ai: { requests: safeCount(ai.requests), bytes: safeCount(ai.bytes) }, embedding: { requests: safeCount(embedding.requests), records: safeCount(embedding.records), bytes: safeCount(embedding.bytes) } }; } function safeCount(value) { return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : 0; } function cloneState(state2) { return { schemaVersion: 1, days: state2.days.map((day) => ({ day: day.day, ai: { ...day.ai }, embedding: { ...day.embedding } })) }; } function isRecord4(value) { return typeof value === "object" && value !== null && !Array.isArray(value); } function mergeHighest(local, stored) { const byDay = /* @__PURE__ */ new Map(); for (const day of local.days) { byDay.set(day.day, day); } for (const day of stored.days) { const existing = byDay.get(day.day); byDay.set( day.day, existing ? { day: day.day, ai: { requests: Math.max(existing.ai.requests, day.ai.requests), bytes: Math.max(existing.ai.bytes, day.ai.bytes) }, embedding: { requests: Math.max(existing.embedding.requests, day.embedding.requests), records: Math.max(existing.embedding.records, day.embedding.records), bytes: Math.max(existing.embedding.bytes, day.embedding.bytes) } } : day ); } const days = [...byDay.values()].sort((a, b) => a.day.localeCompare(b.day)); return { schemaVersion: 1, days: days.slice(-USAGE_HISTORY_DAYS) }; } // src/features/integrations/semantic-search.ts var SEMANTIC_INDEX_KEY = "aviary.semanticIndex.v1"; var SEMANTIC_INDEX_LIMIT = 400; var SEMANTIC_INDEX_MAX_BYTES = 8 * 1024 * 1024; var MAX_VECTOR_DIMENSIONS = 4096; var VECTOR_PRECISION = 1e5; function roundVector(vector) { return vector.map((value) => Math.round(value * VECTOR_PRECISION) / VECTOR_PRECISION); } var EMPTY2 = { entries: [], model: "" }; var SemanticIndex = class { #storage; #usage; #state = EMPTY2; #loaded = false; constructor(storage, usage) { this.#storage = storage; this.#usage = usage; } async load() { if (this.#loaded) return; const stored = await this.#storage.get(SEMANTIC_INDEX_KEY, EMPTY2); this.#state = { entries: Array.isArray(stored?.entries) ? stored.entries.filter(isEntry).slice(-SEMANTIC_INDEX_LIMIT) : [], model: typeof stored?.model === "string" ? stored.model : "" }; this.#trimToBudget(); this.#loaded = true; } size() { return this.#state.entries.length; } model() { return this.#state.model; } list() { return this.#state.entries.map((entry) => ({ ...entry, vector: [...entry.vector] })); } async embedAndIndex(config, records) { if (!config.enabled || !config.endpoint || !config.apiKey || !config.model) { return { added: 0, skipped: records.length, errors: 0, dropped: 0, blocked: 0 }; } await this.load(); const before = cloneState2(this.#state); if (this.#state.model && this.#state.model !== config.model) { this.#state = { entries: [], model: config.model }; } else { this.#state.model = config.model; } const known = new Set(this.#state.entries.map((entry) => entry.id)); let added = 0; let skipped = 0; let errors = 0; let blocked = 0; for (let index = 0; index < records.length; index += 1) { const record = records[index]; const id = `${record.tweetId ?? "no-id"}:${(record.text || "").slice(0, 80)}`; if (known.has(id) || record.text.length === 0) { skipped += 1; continue; } if (this.#usage) { const decision = await this.#usage.reserveEmbedding( utf8Bytes(record.text), defaultEmbeddingBudget(config) ); if (!decision.allowed) { blocked = records.length - index; break; } } const expectedDimension = this.#state.entries[0]?.vector.length; const vector = await fetchEmbedding(config, record.text, expectedDimension); if (!vector) { errors += 1; continue; } this.#state.entries.push({ id, tweetId: record.tweetId, handle: record.handle, text: record.text, vector: roundVector(vector), embeddedAt: (/* @__PURE__ */ new Date()).toISOString() }); known.add(id); added += 1; } const dropped = this.#trimToBudget(); try { await this.#persist(); } catch (error) { this.#state = before; throw error; } return { added, skipped, errors, dropped, blocked }; } async search(config, query, limit = 10, options = {}) { if (!config.enabled || !config.endpoint || !config.apiKey || !config.model || query.trim().length === 0) { return []; } if (options.allowProviderRequest === false) return []; await this.load(); if (this.#state.entries.length === 0) return []; if (this.#usage) { const decision = await this.#usage.reserveEmbedding( utf8Bytes(query), defaultEmbeddingBudget(config) ); if (!decision.allowed) return []; } const queryVector = await fetchEmbedding(config, query, this.#state.entries[0]?.vector.length); if (!queryVector) return []; const hits = this.#state.entries.map((entry) => ({ entry, score: cosineSimilarity(queryVector, entry.vector) })).sort((a, b) => b.score - a.score).slice(0, limit); return hits; } async clear() { const before = cloneState2(this.#state); this.#state = { entries: [], model: this.#state.model }; this.#loaded = true; try { await this.#persist(); } catch (error) { this.#state = before; throw error; } } #trimToBudget() { const before = this.#state.entries.length; while (this.#state.entries.length > SEMANTIC_INDEX_LIMIT || serializedBytes(this.#state) > SEMANTIC_INDEX_MAX_BYTES) { if (this.#state.entries.length === 0) break; this.#state.entries.shift(); } return before - this.#state.entries.length; } /** * Written under the lock, and deliberately not merged. * * Every entry here is derived from a captured record and can be rebuilt on demand, and the index * is bounded by a serialized-byte ceiling that a union of two tabs' copies would blow straight * through. The lock keeps the byte accounting honest: two tabs trimming to the ceiling at once * would otherwise each write a list the other had already shortened. */ async #persist() { await replaceStored(this.#storage, SEMANTIC_INDEX_KEY, this.#state); } }; async function fetchEmbedding(config, text, expectedDimension) { assertOutboundAllowed("Embedding"); try { const payload = await withNetworkTimeout(async (signal) => { const response = await fetch(config.endpoint, { method: "POST", headers: { "content-type": "application/json", authorization: `Bearer ${config.apiKey}` }, body: JSON.stringify({ model: config.model, input: text }), signal }); if (!response.ok) return null; return await response.json(); }, NETWORK_TIMEOUTS.semantic); if (!payload) return null; if (Array.isArray(payload?.embedding)) { return validEmbedding(payload.embedding, expectedDimension) ? payload.embedding : null; } const vector = payload?.data?.[0]?.embedding; return Array.isArray(vector) && validEmbedding(vector, expectedDimension) ? vector : null; } catch { return null; } } function cosineSimilarity(a, b) { if (!validEmbedding(a) || !validEmbedding(b) || a.length !== b.length) return 0; const length = a.length; let dot = 0; let normA = 0; let normB = 0; for (let i = 0; i < length; i++) { const av = a[i]; const bv = b[i]; dot += av * bv; normA += av * av; normB += bv * bv; } if (normA === 0 || normB === 0) return 0; const score = dot / (Math.sqrt(normA) * Math.sqrt(normB)); return Number.isFinite(score) ? score : 0; } function isEntry(value) { if (typeof value !== "object" || value === null) return false; const candidate = value; return typeof candidate.id === "string" && (typeof candidate.tweetId === "string" || candidate.tweetId === null) && (typeof candidate.handle === "string" || candidate.handle === null) && typeof candidate.text === "string" && typeof candidate.embeddedAt === "string" && validEmbedding(candidate.vector); } function validEmbedding(value, expectedDimension) { if (!Array.isArray(value) || value.length === 0 || value.length > MAX_VECTOR_DIMENSIONS || expectedDimension !== void 0 && value.length !== expectedDimension) { return false; } return value.every((item) => typeof item === "number" && Number.isFinite(item)); } function serializedBytes(state2) { try { return new TextEncoder().encode(JSON.stringify(state2)).byteLength; } catch { return Number.POSITIVE_INFINITY; } } function cloneState2(state2) { return { model: state2.model, entries: state2.entries.map((entry) => ({ ...entry, vector: [...entry.vector] })) }; } // src/features/export/language.ts function normalizePostLanguage(value) { if (typeof value !== "string") return null; const candidate = value.trim(); if (candidate.length === 0 || candidate.length > 63 || candidate.includes("_")) return null; try { const canonical = Intl.getCanonicalLocales(candidate)[0]; return canonical && /^[A-Za-z]{1,8}(?:-[A-Za-z0-9]{1,8})*$/.test(canonical) ? canonical : null; } catch { return null; } } function languageAttribute(value) { const language = normalizePostLanguage(value); return language ? ` lang="${language}"` : ""; } // src/features/export/audience.ts var DEFAULT_EXPORT_AUDIENCE = { includeProtected: false, includeUnknown: false }; function normalizeAudience(value) { return value === "public" || value === "protected" || value === "unknown" ? value : "unknown"; } function normalizeAudienceSelection(value) { return { includeProtected: value?.includeProtected === true, includeUnknown: value?.includeUnknown === true }; } function audienceOf(record) { return normalizeAudience(record.audience); } function summarizeAudience(records, selection = DEFAULT_EXPORT_AUDIENCE) { const summary = { total: records.length, public: 0, protected: 0, unknown: 0, excludedProtected: 0, excludedUnknown: 0 }; for (const record of records) { const audience = audienceOf(record); summary[audience] += 1; if (audience === "protected" && !selection.includeProtected) summary.excludedProtected += 1; if (audience === "unknown" && !selection.includeUnknown) summary.excludedUnknown += 1; } return summary; } function filterShareRecords(records, selection = DEFAULT_EXPORT_AUDIENCE) { return records.filter((record) => { const audience = audienceOf(record); return audience === "public" || audience === "protected" && selection.includeProtected || audience === "unknown" && selection.includeUnknown; }); } function isShareOrientedFormat(format) { return format === "html" || format === "markdown"; } // src/features/export/assets.ts var PERCEPTUAL_HASH_WIDTH = 17; var PERCEPTUAL_HASH_HEIGHT = 16; var PERCEPTUAL_MATCH_DISTANCE = 12; function describeMediaCapture(media, fallbackCapturedAt = null) { const sourceUrl = cleanText(media.sourceUrl ?? media.url); const bytes = media.bytes instanceof Uint8Array ? media.bytes : null; const hasRemoteSource = /^https?:\/\//i.test(sourceUrl); const status = bytes ? "captured-bytes" : media.captureStatus === "missing" || !hasRemoteSource ? "missing" : "remote-reference"; const byteLength = bytes ? bytes.byteLength : finiteByteLength(media.byteLength); const sha256 = bytes ? cleanChecksum(media.sha256) ?? sha256Hex(bytes) : cleanChecksum(media.sha256); const capturedAt = cleanText(media.capturedAt ?? fallbackCapturedAt) || null; const error = cleanText(media.captureError); return { status, sourceUrl, capturedAt, byteLength, sha256, retryable: status !== "captured-bytes" && hasRemoteSource, ...status === "captured-bytes" && cleanText(media.assetPath) ? { packagePath: cleanText(media.assetPath) } : {}, ...error ? { error } : {} }; } function serializeExportMedia(media, fallbackCapturedAt = null) { const capture = describeMediaCapture(media, fallbackCapturedAt); const serialized = { kind: media.kind, url: media.url, capture }; if (media.width !== void 0) serialized.width = media.width; if (media.height !== void 0) serialized.height = media.height; if (media.bitrate !== void 0) serialized.bitrate = media.bitrate; if (media.type !== void 0) serialized.type = media.type; if (media.altText !== void 0) serialized.altText = media.altText; if (media.language !== void 0) serialized.language = media.language; if (media.label !== void 0) serialized.label = media.label; const httpStatus = media.httpStatus; if (typeof httpStatus === "number" && Number.isInteger(httpStatus) && httpStatus >= 100 && httpStatus <= 599) { serialized.httpStatus = httpStatus; } return serialized; } function serializeExportRecord(record) { return { ...record, language: normalizePostLanguage(record.language), audience: normalizeAudience(record.audience), media: mediaOf(record).map((media) => serializeExportMedia(media, record.capturedAt)) }; } function serializeExportRecords(records) { return records.map(serializeExportRecord); } function prepareExportPackage(records) { const assets = []; let assetNumber = 0; const prepared = records.map((record) => { const media = mediaOf(record).map((entry) => { if (!(entry.bytes instanceof Uint8Array)) { return { ...entry }; } const extension = mediaExtension(entry); const path = `media/${String(++assetNumber).padStart(6, "0")}-${entry.kind}.${extension}`; assets.push({ path, data: new Uint8Array(entry.bytes), contentType: mediaContentType(entry, extension) }); return { ...entry, assetPath: path }; }); return { ...record, media }; }); return { records: prepared, assets }; } function buildExportPackageManifest(records, files, packageRoot = "", generatedAt = (/* @__PURE__ */ new Date()).toISOString()) { const media = []; let capturedBytes = 0; let remoteReferences = 0; let missing = 0; let retryable = 0; records.forEach((record, recordIndex) => { mediaOf(record).forEach((entry) => { const capture = describeMediaCapture(entry, record.capturedAt); const packagePath2 = capture.packagePath ? joinPackagePath(packageRoot, capture.packagePath) : void 0; const normalizedCapture = packagePath2 ? { ...capture, packagePath: packagePath2 } : capture; media.push({ recordIndex, recordId: record.tweetId, kind: entry.kind, capture: normalizedCapture }); if (capture.status === "captured-bytes") { capturedBytes += capture.byteLength ?? 0; } else if (capture.status === "remote-reference") { remoteReferences += 1; } else { missing += 1; } if (capture.retryable) retryable += 1; }); }); return { schemaVersion: 1, generator: "Aviary", generatedAt, recordCount: records.length, files: files.map((file) => ({ ...file })), media, summary: { capturedBytes, remoteReferences, missing, retryable }, offlineReady: remoteReferences === 0 && missing === 0, networkRequiredToComplete: remoteReferences > 0 || retryable > 0 }; } function mediaOf(record) { return Array.isArray(record.media) ? record.media : []; } function sha256Hex(data) { const paddedLength = Math.ceil((data.length + 9) / 64) * 64; const padded = new Uint8Array(paddedLength); padded.set(data); padded[data.length] = 128; const view = new DataView(padded.buffer); const bitLength = data.length * 8; view.setUint32(paddedLength - 8, Math.floor(bitLength / 4294967296)); view.setUint32(paddedLength - 4, bitLength >>> 0); const hash = new Uint32Array([ 1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225 ]); const words = new Uint32Array(64); for (let block = 0; block < padded.length; block += 64) { for (let index = 0; index < 16; index += 1) { words[index] = view.getUint32(block + index * 4); } for (let index = 16; index < 64; index += 1) { const s0 = rotateRight(words[index - 15], 7) ^ rotateRight(words[index - 15], 18) ^ words[index - 15] >>> 3; const s1 = rotateRight(words[index - 2], 17) ^ rotateRight(words[index - 2], 19) ^ words[index - 2] >>> 10; words[index] = words[index - 16] + s0 + words[index - 7] + s1 >>> 0; } let a = hash[0]; let b = hash[1]; let c = hash[2]; let d = hash[3]; let e = hash[4]; let f = hash[5]; let g = hash[6]; let h = hash[7]; for (let index = 0; index < 64; index += 1) { const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25); const choice = e & f ^ ~e & g; const temp1 = h + s1 + choice + SHA256_K[index] + words[index] >>> 0; const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22); const majority = a & b ^ a & c ^ b & c; const temp2 = s0 + majority >>> 0; h = g; g = f; f = e; e = d + temp1 >>> 0; d = c; c = b; b = a; a = temp1 + temp2 >>> 0; } hash[0] = hash[0] + a >>> 0; hash[1] = hash[1] + b >>> 0; hash[2] = hash[2] + c >>> 0; hash[3] = hash[3] + d >>> 0; hash[4] = hash[4] + e >>> 0; hash[5] = hash[5] + f >>> 0; hash[6] = hash[6] + g >>> 0; hash[7] = hash[7] + h >>> 0; } return Array.from(hash, (word) => word.toString(16).padStart(8, "0")).join(""); } async function sha256HexAsync(data) { const subtle = globalThis.crypto?.subtle; if (!subtle) { throw new Error("Asynchronous SHA-256 is unavailable in this browser."); } const digest = await subtle.digest("SHA-256", data.slice().buffer); return Array.from(new Uint8Array(digest), (value) => value.toString(16).padStart(2, "0")).join(""); } function mediaIdentityHash(kind, sourceUrl, mediaId) { const identity = cleanText(mediaId) || mediaIdentityFromUrl(sourceUrl) || canonicalMediaUrl(sourceUrl); return sha256Hex(new TextEncoder().encode(`aviary-media:${kind}:${identity}`)); } function perceptualHashFromRgba(rgba, width = PERCEPTUAL_HASH_WIDTH, height = PERCEPTUAL_HASH_HEIGHT) { if (width !== PERCEPTUAL_HASH_WIDTH || height !== PERCEPTUAL_HASH_HEIGHT) { throw new RangeError(`Perceptual samples must be ${PERCEPTUAL_HASH_WIDTH} by ${PERCEPTUAL_HASH_HEIGHT}.`); } if (rgba.length !== width * height * 4) { throw new RangeError("Perceptual sample length does not match its dimensions."); } const bytes = new Uint8Array(32); let bit = 0; for (let y = 0; y < height; y += 1) { for (let x = 0; x < width - 1; x += 1) { const left = pixelLuma(rgba, (y * width + x) * 4); const right = pixelLuma(rgba, (y * width + x + 1) * 4); if (left > right) { bytes[Math.trunc(bit / 8)] |= 1 << 7 - bit % 8; } bit += 1; } } return Array.from(bytes, (value) => value.toString(16).padStart(2, "0")).join(""); } async function perceptualImageHash(bytes, contentType = "image/*") { if (typeof createImageBitmap !== "function") { return null; } const bitmap = await createImageBitmap(new Blob([bytes.slice().buffer], { type: contentType })); try { const canvas = createHashCanvas(); const context = canvas.getContext("2d", { willReadFrequently: true }); if (!context) { return null; } context.drawImage(bitmap, 0, 0, PERCEPTUAL_HASH_WIDTH, PERCEPTUAL_HASH_HEIGHT); const sample = context.getImageData( 0, 0, PERCEPTUAL_HASH_WIDTH, PERCEPTUAL_HASH_HEIGHT ); return perceptualHashFromRgba(sample.data); } finally { bitmap.close(); } } function hexadecimalHammingDistance(left, right) { if (!/^[0-9a-f]+$/i.test(left) || left.length !== right.length || !/^[0-9a-f]+$/i.test(right)) { return Number.POSITIVE_INFINITY; } let distance = 0; for (let index = 0; index < left.length; index += 1) { distance += NIBBLE_BITS[Number.parseInt(left[index], 16) ^ Number.parseInt(right[index], 16)]; } return distance; } function rotateRight(value, bits) { return value >>> bits | value << 32 - bits; } function pixelLuma(rgba, offset) { return rgba[offset] * 299 + rgba[offset + 1] * 587 + rgba[offset + 2] * 114; } function createHashCanvas() { if (typeof OffscreenCanvas === "function") { return new OffscreenCanvas(PERCEPTUAL_HASH_WIDTH, PERCEPTUAL_HASH_HEIGHT); } if (typeof document === "undefined") { throw new Error("No image canvas is available in this context."); } const canvas = document.createElement("canvas"); canvas.width = PERCEPTUAL_HASH_WIDTH; canvas.height = PERCEPTUAL_HASH_HEIGHT; return canvas; } function mediaIdentityFromUrl(sourceUrl) { try { const url = new URL(sourceUrl); if (url.hostname.toLowerCase() === "pbs.twimg.com") { return /^\/media\/([A-Za-z0-9_-]+)/i.exec(url.pathname)?.[1] ?? ""; } } catch { } return ""; } function canonicalMediaUrl(sourceUrl) { try { const url = new URL(sourceUrl); for (const key of ["name", "format", "width", "height", "tag"]) { url.searchParams.delete(key); } url.hash = ""; url.searchParams.sort(); return url.toString(); } catch { return cleanText(sourceUrl); } } function cleanText(value) { return typeof value === "string" ? value.trim() : ""; } function cleanChecksum(value) { const checksum = cleanText(value).toLowerCase(); return /^[0-9a-f]{64}$/.test(checksum) ? checksum : null; } function finiteByteLength(value) { return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : null; } function joinPackagePath(root, path) { return root ? `${root.replace(/\/+$/g, "")}/${path}` : path; } function mediaExtension(media) { const type = cleanText(media.type).toLowerCase(); const fromType = type.includes("/") ? type.split("/").at(-1) ?? "" : type; const fromUrl = /[.?](?:format=)?([a-z0-9]{2,5})(?:[?#]|$)/i.exec(media.url)?.[1]?.toLowerCase() ?? ""; const candidate = fromType || fromUrl || defaultMediaExtension(media.kind); if (candidate.includes("ttml") || candidate.includes("dfxp")) return "ttml"; if (candidate === "jpeg") return "jpg"; return /^[a-z0-9]{2,5}$/.test(candidate) ? candidate : defaultMediaExtension(media.kind); } function mediaContentType(media, extension) { const declared = cleanText(media.type); if (declared.includes("/")) return declared; if (extension === "jpg" || extension === "jpeg") return "image/jpeg"; if (extension === "png") return "image/png"; if (extension === "webp") return "image/webp"; if (extension === "mp4") return "video/mp4"; if (extension === "m4a") return "audio/mp4"; if (extension === "mp3") return "audio/mpeg"; if (extension === "ogg" || extension === "opus") return "audio/ogg"; if (extension === "vtt") return "text/vtt"; if (extension === "srt") return "text/srt"; if (extension === "ttml") return "application/ttml+xml"; return "application/octet-stream"; } function defaultMediaExtension(kind) { if (kind === "video") return "mp4"; if (kind === "audio") return "m4a"; if (kind === "subtitle") return "vtt"; return kind === "photo" || kind === "thumbnail" ? "jpg" : "bin"; } var SHA256_K = Uint32Array.from([ 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298 ]); var NIBBLE_BITS = Uint8Array.from([0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4]); // src/features/media/urls.ts var IMAGE_HOST = "pbs.twimg.com"; var FORMAT_PRIORITY = ["jpg", "png", "webp"]; function normalizeImageUrl(rawUrl, options = {}) { let parsed; try { parsed = new URL(rawUrl, "https://x.com"); } catch { return null; } if (parsed.hostname !== IMAGE_HOST) { return null; } if (!parsed.pathname.startsWith("/media/")) { return null; } const params = parsed.searchParams; const requestedFormat = (params.get("format") ?? "").toLowerCase(); const pathFormat = /\.([a-z0-9]+)$/i.exec(parsed.pathname)?.[1]?.toLowerCase() ?? ""; const validatedPathFormat = pathFormat === "jpeg" ? "jpg" : pathFormat; const format = FORMAT_PRIORITY.includes(requestedFormat) ? requestedFormat : FORMAT_PRIORITY.includes(validatedPathFormat) ? validatedPathFormat : "jpg"; params.set("format", format); const preferOriginal = options.preferOriginal ?? true; if (preferOriginal) { params.set("name", "orig"); } else if (!params.has("name")) { params.set("name", "large"); } const mediaId = mediaIdFromPath(parsed.pathname); const fallbackUrls = []; if (preferOriginal) { const fallbackParams = new URLSearchParams(params); fallbackParams.set("name", "4096x4096"); fallbackUrls.push(`${parsed.origin}${parsed.pathname}?${fallbackParams.toString()}`); } return { url: `${parsed.origin}${parsed.pathname}?${params.toString()}`, fallbackUrls, format, mediaId }; } function mediaIdFromPath(pathname) { const match = /\/media\/([A-Za-z0-9_-]{6,})(?:\.[A-Za-z0-9]+)?$/.exec(pathname); return match?.[1] ?? null; } function tweetIdFromHref(href) { if (!href) { return null; } const match = /\/status(?:es)?\/(\d{6,})/.exec(href); return match?.[1] ?? null; } // src/features/media/video-extract.ts var VIDEO_CONTAINER_SELECTOR = '[data-testid="videoPlayer"], [data-testid="videoComponent"]'; function videoContainers(root) { const candidates2 = Array.from( root.querySelectorAll(VIDEO_CONTAINER_SELECTOR) ); return candidates2.filter((container) => { const video = container.querySelector("video"); if (!video) { return false; } return !candidates2.some( (candidate) => candidate !== container && container.contains(candidate) && candidate.contains(video) ); }); } function extractVideo(container, metadata = {}) { const video = container.querySelector("video"); if (!video) { return null; } const variants = []; const seen = /* @__PURE__ */ new Set(); if (video.currentSrc) { pushVariant(variants, seen, video.currentSrc, video.dataset.contentType ?? "video/mp4"); if (typeof video.readyState === "number" && video.readyState >= 2) { markPlaybackObserved(variants, video.currentSrc); } } if (video.src) { pushVariant(variants, seen, video.src, "video/mp4"); } for (const source of Array.from(video.querySelectorAll("source"))) { pushVariant( variants, seen, source.src, source.type || "video/mp4", source.dataset.width, source.dataset.height, source.dataset.bitrate, source.dataset.codec, void 0, source.dataset.codec ? "source-element" : void 0 ); } for (const variant of metadata.variants ?? []) { pushVariantObject(variants, seen, variant); } const audioVariants = []; const seenAudio = /* @__PURE__ */ new Set(); for (const source of Array.from(video.querySelectorAll("source"))) { const markedAudio = typeof source.hasAttribute === "function" ? source.hasAttribute("data-av-audio") : source.dataset?.avAudio !== void 0; if (!/^audio\//i.test(source.type) && !markedAudio) continue; pushVariant( audioVariants, seenAudio, source.src, source.type || "audio/mp4", void 0, void 0, source.dataset.bitrate ); } for (const variant of metadata.audioVariants ?? []) { pushVariantObject(audioVariants, seenAudio, variant); } const subtitleTracks = [ ...Array.from(video.querySelectorAll("track")).map(readSubtitleTrack).filter((track) => track !== null), ...metadata.subtitleTracks ?? [] ].filter((track, index, all) => all.findIndex((candidate) => candidate.url === track.url) === index); const poster = video.poster || metadata.poster || null; if (variants.length === 0 && !poster) { return null; } const stableVariants = mergeVideoVariants([], variants); const stableAudioVariants = mergeVideoVariants([], audioVariants); const preferred = stableVariants.length > 0 ? pickPreferred(stableVariants) : null; const isGif = metadata.isGif === true || looksLikeGif(container, video, variants); return { container, poster, isGif, variants: stableVariants, preferred, audioVariants: stableAudioVariants, subtitleTracks }; } function readSubtitleTrack(track) { if (typeof track.getAttribute !== "function" && typeof track.kind !== "string") { return null; } const url = track.src || track.getAttribute("src") || ""; if (!/^https?:\/\//i.test(url)) return null; const kind = (track.kind || "").toLowerCase(); if (kind && kind !== "subtitles" && kind !== "captions") return null; return { url, type: track.getAttribute?.("type") || "text/vtt", language: track.srclang?.trim() || null, label: track.label?.trim() || null }; } function pushVariantObject(variants, seen, variant) { pushVariant( variants, seen, variant.url, variant.type, variant.width === null ? void 0 : String(variant.width), variant.height === null ? void 0 : String(variant.height), variant.bitrate === null ? void 0 : String(variant.bitrate), variant.codec ?? void 0, variant.provenance ?? void 0, variant.codecSource ?? (variant.codec ? "graphql-variant" : void 0) ); } function markPlaybackObserved(variants, url) { const index = variants.findIndex((variant) => variant.url === url); if (index >= 0) variants[index] = { ...variants[index], playbackObserved: true }; } function pushVariant(variants, seen, src, type, width, height, bitrate, codec, provenance, codecSource) { if (!src) { return; } const candidate = { url: src, type, width: parsePositiveInt(width), height: parsePositiveInt(height), bitrate: parsePositiveInt(bitrate) }; if (codec?.trim()) { candidate.codec = codec.trim(); if (codecSource) candidate.codecSource = codecSource; } if (provenance?.trim()) candidate.provenance = provenance.trim(); const existingIndex = variants.findIndex((variant) => variant.url === src); if (existingIndex >= 0) { variants[existingIndex] = mergeVideoVariant(variants[existingIndex], candidate); seen.add(src); return; } seen.add(src); variants.push(candidate); } function mergeVideoVariant(left, right) { if (left.url !== right.url) { return { ...left }; } const merged = { url: left.url, type: chooseVariantType(left.url, left.type, right.type), width: maxKnown(left.width, right.width), height: maxKnown(left.height, right.height), bitrate: maxKnown(left.bitrate, right.bitrate) }; if ("codec" in left || "codec" in right) { merged.codec = chooseKnownText(left.codec, right.codec); const source = merged.codec === left.codec ? left.codecSource : right.codecSource; merged.codecSource = merged.codec ? source ?? null : null; } if (left.playbackObserved || right.playbackObserved) { merged.playbackObserved = true; } if ("provenance" in left || "provenance" in right) { merged.provenance = mergeProvenance(left.provenance, right.provenance); } return merged; } function mergeVideoVariants(existing, incoming) { const merged = /* @__PURE__ */ new Map(); for (const variant of [...existing, ...incoming]) { const previous = merged.get(variant.url); merged.set( variant.url, previous ? mergeVideoVariant(previous, variant) : { ...variant } ); } return [...merged.values()].sort((left, right) => compareStable(left.url, right.url)); } function isSaveableVariantUrl(url, type = "") { if (!/^https?:\/\//i.test(url)) { return false; } if (/\.(?:m3u8|mpd|m4s)(?:[?#]|$)/i.test(url)) { return false; } return !/(?:mpegurl|dash\+xml)/i.test(type); } function compareVariantQuality(left, right) { const height = compareKnown(left.height, right.height); if (height !== 0) return height; const width = compareKnown(left.width, right.width); if (width !== 0) return width; if (left.bitrate !== null && right.bitrate !== null) { return left.bitrate - right.bitrate; } return 0; } function compareKnown(left, right) { if (left === right) return 0; if (left === null) return -1; if (right === null) return 1; return left - right; } function pickPreferred(variants) { const sorted = [...variants].sort((a, b) => { const saveableDiff = Number(isSaveableVariantUrl(b.url, b.type)) - Number(isSaveableVariantUrl(a.url, a.type)); if (saveableDiff !== 0) { return saveableDiff; } const mp4Diff = Number(isProgressiveMp4(b)) - Number(isProgressiveMp4(a)); if (mp4Diff !== 0) { return mp4Diff; } const qualityDiff = compareVariantQuality(b, a); if (qualityDiff !== 0) { return qualityDiff; } return compareStable(a.url, b.url); }); return sorted[0] ?? variants[0]; } function maxKnown(left, right) { if (left === null && right === null) return null; return Math.max(left ?? 0, right ?? 0) || null; } function chooseKnownText(left, right) { const values = [left, right].filter((value) => typeof value === "string" && value.trim().length > 0).map((value) => value.trim()); return [...new Set(values)].sort(compareStable)[0] ?? null; } function mergeProvenance(left, right) { const values = [left, right].flatMap((value) => typeof value === "string" ? value.split("|") : []).map((value) => value.trim()).filter(Boolean); return [...new Set(values)].sort(compareStable).join("|") || null; } function chooseVariantType(url, left, right) { const types = [...new Set([left, right].map((value) => value.trim()).filter(Boolean))]; if (types.length === 0) return "video/mp4"; return types.sort((a, b) => { const scoreDiff = variantTypeScore(url, b) - variantTypeScore(url, a); return scoreDiff !== 0 ? scoreDiff : compareStable(a, b); })[0]; } function variantTypeScore(url, type) { const lowerType = type.toLowerCase(); const lowerUrl = url.toLowerCase(); let score = 0; if (lowerType === "video/mp4") score += 40; else if (lowerType.startsWith("video/")) score += 30; else if (lowerType === "audio/mp4") score += 35; else if (lowerType.startsWith("audio/")) score += 25; if (/(?:mpegurl|dash\+xml)/i.test(lowerType)) score -= 100; for (const extension of ["mp4", "webm", "mov", "m4a", "mp3", "ogg", "opus", "wav"]) { if (new RegExp(`\\.${extension}(?:[?#]|$)`, "i").test(lowerUrl) && lowerType.includes(extension)) { score += 50; } } return score; } function compareStable(left, right) { return left < right ? -1 : left > right ? 1 : 0; } function isProgressiveMp4(variant) { return /video\/mp4/i.test(variant.type) || /\.mp4(?:[?#]|$)/i.test(variant.url); } function looksLikeGif(container, video, variants) { if (video.loop && video.muted) { return true; } const label = (container.getAttribute("aria-label") ?? "").toLowerCase(); if (label.includes("gif")) { return true; } return variants.some((variant) => variant.url.toLowerCase().includes("tweet_video")); } function parsePositiveInt(value) { if (!value) { return null; } const parsed = Number.parseInt(value, 10); return Number.isFinite(parsed) && parsed > 0 ? parsed : null; } // src/features/media/extract.ts var QUOTE_BOUNDARY_SELECTOR = '[data-testid="quoteTweet"], [aria-labelledby="quoted"], div[role="link"][tabindex="0"]'; var CARD_BOUNDARY_SELECTOR2 = '[data-testid="card.wrapper"]'; function quotedPost(article) { for (const candidate of Array.from(article.querySelectorAll(QUOTE_BOUNDARY_SELECTOR))) { if (isQuoteBoundary2(candidate)) { return candidate; } } return null; } function extractTweet(article, options = {}) { const tweetId = readTweetId(article); const handle = readHandle(article); const text = readText(article); const own = { scope: "post", tweetId, handle, text }; const media = []; const imageOptions = { preferOriginal: options.preferOriginalImages ?? true }; for (const img of Array.from( article.querySelectorAll('[data-testid="tweetPhoto"] img') )) { const normalized = normalizeImageUrl(img.src, imageOptions); if (normalized) { media.push({ kind: "photo", source: img, image: normalized, owner: ownerOf(article, img, own) }); } } for (const container of videoContainers(article)) { const localPoster = container.querySelector("video")?.poster || null; const owner = ownerOf(article, container, own); const captured = options.mediaMetadata?.({ // A quoted player's poster belongs to the quoted post, so filtering the lookup by the // outer post's id would rule out the only entry that can match it. tweetId: owner.scope === "post" ? tweetId : owner.tweetId, mediaId: mediaIdFromUrl(localPoster), poster: localPoster }); const video = extractVideo(container, captured ?? void 0); if (!video) { continue; } const resolved = owner.scope === "quote" && !owner.tweetId && captured?.tweetId ? { ...owner, tweetId: captured.tweetId } : owner; if (video.preferred) { media.push({ kind: "video", source: video.container, video, owner: resolved }); } const audio = preferredAudio(video.audioVariants); if (audio) { media.push({ kind: "audio", source: video.container, audio: { container: video.container, variants: video.audioVariants, preferred: audio }, owner: resolved }); } for (const track of video.subtitleTracks) { media.push({ kind: "subtitle", source: video.container, subtitle: { container: video.container, track }, owner: resolved }); } if (video.poster) { const normalized = normalizeImageUrl(video.poster, imageOptions); if (normalized) { media.push({ kind: "thumbnail", source: video.container, image: normalized, owner: resolved }); } } } for (const audio of Array.from(article.querySelectorAll("audio"))) { const owner = ownerOf(article, audio, own); const variants = readAudioVariants(audio); const preferred = preferredAudio(variants); if (preferred) { media.push({ kind: "audio", source: audio, audio: { container: audio, variants, preferred }, owner }); } for (const track of Array.from(audio.querySelectorAll("track"))) { const subtitle = readSubtitleTrack2(track); if (subtitle) { media.push({ kind: "subtitle", source: audio, subtitle: { container: audio, track: subtitle }, owner }); } } } return { article, tweetId, handle, text, media }; } function readAudioVariants(audio) { const variants = []; const seen = /* @__PURE__ */ new Set(); const push = (url, type, bitrate) => { if (!/^https?:\/\//i.test(url) || seen.has(url)) return; seen.add(url); variants.push({ url, type: type || "audio/mp4", width: null, height: null, bitrate: bitrate && Number.isFinite(Number(bitrate)) ? Number(bitrate) : null }); }; if (audio.currentSrc) push(audio.currentSrc, audio.dataset.contentType ?? "audio/mp4"); if (audio.src) push(audio.src, audio.dataset.contentType ?? "audio/mp4"); for (const source of Array.from(audio.querySelectorAll("source"))) { push(source.src, source.type || "audio/mp4", source.dataset.bitrate); } return variants; } function preferredAudio(variants) { return [...variants].sort((left, right) => (right.bitrate ?? 0) - (left.bitrate ?? 0))[0] ?? null; } function readSubtitleTrack2(track) { const url = track.src || track.getAttribute("src") || ""; if (!/^https?:\/\//i.test(url)) return null; const kind = (track.kind || "").toLowerCase(); if (kind && kind !== "subtitles" && kind !== "captions") return null; return { url, type: track.getAttribute("type") || "text/vtt", language: track.srclang?.trim() || null, label: track.label?.trim() || null }; } function mediaIdentity(tweet, media) { const owner = media.owner; if (owner.scope === "post") { return { handle: tweet.handle, tweetId: tweet.tweetId, text: tweet.text }; } return { handle: owner.handle ?? tweet.handle, tweetId: owner.tweetId ?? tweet.tweetId, text: owner.text }; } function isQuoteBoundary2(element2) { if (element2.matches('[data-testid="quoteTweet"], [aria-labelledby="quoted"]')) { return true; } return element2.matches('div[role="link"][tabindex="0"]') && element2.querySelector('[data-testid="User-Name"]') !== null; } function boundaryFor(article, node) { let found = null; let current = node; while (current && current !== article) { if (isQuoteBoundary2(current)) { found = { element: current, scope: "quote" }; } else if (!found && current.matches(CARD_BOUNDARY_SELECTOR2)) { found = { element: current, scope: "card" }; } current = current.parentElement; } return found; } function ownerOf(article, node, own) { const boundary = boundaryFor(article, node); if (!boundary) { return own; } if (boundary.scope === "card") { return { ...own, scope: "card" }; } return { scope: "quote", tweetId: readTweetId(boundary.element, false), handle: readHandle(boundary.element, false), text: readText(boundary.element, false) }; } function mediaIdFromUrl(url) { return /\/media\/([A-Za-z0-9_-]+)/i.exec(url ?? "")?.[1] ?? null; } function readTweetId(article, skipNested = true) { const links = article.querySelectorAll('a[href*="/status/"]'); for (const link of Array.from(links)) { if (skipNested && boundaryFor(article, link)) { continue; } const candidate = tweetIdFromHref(link.getAttribute("href")); if (candidate) { return candidate; } } return null; } function readHandle(article, skipNested = true) { const userNames = Array.from(article.querySelectorAll('[data-testid="User-Name"]')); for (const userName of userNames) { if (skipNested && boundaryFor(article, userName)) { continue; } for (const link of Array.from(userName.querySelectorAll('a[href^="/"]'))) { const href = link.getAttribute("href") ?? ""; const match = /^\/([A-Za-z0-9_]{1,15})(?:[/?#]|$)/.exec(href); const candidate = match?.[1]; if (candidate) { return candidate; } } } return null; } function readText(article, skipNested = true) { for (const node of Array.from(article.querySelectorAll('[data-testid="tweetText"]'))) { if (skipNested && boundaryFor(article, node)) { continue; } return node.textContent?.trim() ?? ""; } return ""; } // src/features/export/collector.ts function collectExportRecords(root, surface, options = {}) { const articles = root instanceof Element && root.matches('article[data-testid="tweet"]') ? [root] : Array.from(root.querySelectorAll('article[data-testid="tweet"]')); const seen = /* @__PURE__ */ new Set(); const records = []; const now6 = (/* @__PURE__ */ new Date()).toISOString(); for (const article of articles) { const tweet = extractTweet( article, options.mediaMetadata ? { mediaMetadata: options.mediaMetadata } : {} ); const key = `${tweet.tweetId ?? "noid"}:${tweet.handle ?? "noh"}:${(tweet.text || "").slice(0, 60)}`; if (seen.has(key)) { continue; } seen.add(key); const media = []; for (const item of tweet.media) { if (item.kind === "video" && item.video?.preferred) { const url = item.video.preferred.url; const entry = { kind: "video", url: isSaveableVariantUrl(url) ? url : "", type: item.video.preferred.type }; if (item.video.poster) entry.poster = item.video.poster; if (item.video.preferred.width !== null) entry.width = item.video.preferred.width; if (item.video.preferred.height !== null) entry.height = item.video.preferred.height; if (item.video.preferred.bitrate !== null) entry.bitrate = item.video.preferred.bitrate; media.push(entry); } else if (item.kind === "audio" && item.audio?.preferred) { const variant = item.audio.preferred; if (!isSaveableVariantUrl(variant.url, variant.type)) continue; media.push({ kind: "audio", url: variant.url, type: variant.type, ...variant.bitrate !== null ? { bitrate: variant.bitrate } : {} }); } else if (item.kind === "subtitle" && item.subtitle?.track) { const track = item.subtitle.track; if (!isSaveableVariantUrl(track.url, track.type)) continue; media.push({ kind: "subtitle", url: track.url, type: track.type, ...track.language ? { language: track.language } : {}, ...track.label ? { label: track.label } : {} }); } else if (item.image) { const entry = { kind: item.kind === "thumbnail" ? "thumbnail" : "photo", url: item.image.url, type: item.image.format }; if (item.source instanceof HTMLImageElement && item.source.alt) { entry.altText = item.source.alt; } media.push(entry); } else { continue; } const attributed = media.at(-1); if (attributed && item.owner.scope !== "post") { attributed.attribution = { scope: item.owner.scope, handle: item.owner.handle }; } } const displayName = readDisplayName(article); const permalink2 = readPermalink(article, tweet.handle, tweet.tweetId); const poll = readPoll(article); const quote = readQuote(article); const articleSummary = readArticle(article); const birdwatch = readBirdwatch(article); const record = { tweetId: tweet.tweetId, handle: tweet.handle, displayName, text: tweet.text, capturedAt: now6, surface, media, permalink: permalink2, language: readPostLanguage(article), audience: "unknown" }; for (const entry of record.media) { if (entry.attribution) entry.attribution = { ...entry.attribution, audience: record.audience ?? "unknown" }; } if (poll) record.poll = poll; if (quote) record.quote = quote; if (articleSummary) record.article = articleSummary; if (birdwatch) record.birdwatch = birdwatch; records.push(record); } return records; } function readPostLanguage(article) { const textNode = article.querySelector('[data-testid="tweetText"]'); return normalizePostLanguage( textNode?.getAttribute("lang") ?? textNode?.closest("[lang]")?.getAttribute("lang") ?? article.getAttribute("lang") ); } function readPoll(article) { const bars = Array.from(article.querySelectorAll('[data-testid$="-progress-bar"], [data-testid="cardPoll"] li')); if (bars.length === 0) { return null; } const choices = []; for (const bar of bars) { const label = readFirstText(bar); if (!label) continue; const percentMatch = /([0-9]+(?:\.[0-9]+)?)\s*%/.exec(bar.textContent ?? ""); const choice = { label }; if (percentMatch) { choice.percent = Number(percentMatch[1]); choice.voteShare = `${percentMatch[1]}%`; } choices.push(choice); } if (choices.length === 0) { return null; } const totals = article.querySelector('[data-testid="cardPoll"] span'); const totalText = totals?.textContent?.trim() ?? ""; const poll = { choices }; if (totalText.length > 0) { poll.totalVotes = totalText; } return poll; } function readQuote(article) { const quote = quotedPost(article); if (!quote) { return null; } const handleLink = quote.querySelector('a[href^="/"]'); const handle = handleLink ? /\/([A-Za-z0-9_]{1,15})/.exec(handleLink.getAttribute("href") ?? "")?.[1] ?? null : null; const text = quote.querySelector('[data-testid="tweetText"]')?.textContent?.trim() ?? ""; return { handle, text }; } function readArticle(article) { const card = article.querySelector('[data-testid="card.wrapper"], [data-testid="article"]'); if (!card) { return null; } const titleNode = card.querySelector('[data-testid="card.layoutLarge.detail"] span, [data-testid="article-title"], h2'); const link = card.querySelector("a[href]"); return { title: titleNode?.textContent?.trim() ?? null, url: link?.href ?? link?.getAttribute("href") ?? null }; } function readBirdwatch(article) { const pivot = article.querySelector('[data-testid="birdwatch-pivot"]'); if (!pivot) return void 0; return pivot.textContent?.trim() || void 0; } function readFirstText(node) { if (!node) return null; const text = node.textContent?.trim() ?? ""; return text.length > 0 ? text : null; } function readDisplayName(article) { const userName = article.querySelector('[data-testid="User-Name"]'); if (!userName) { return null; } const spans = Array.from(userName.querySelectorAll("span")); for (const span of spans) { const text = span.textContent?.trim() ?? ""; if (text.length > 0 && !text.startsWith("@") && !text.startsWith("\xB7")) { return text; } } return null; } function readPermalink(article, handle, tweetId) { if (handle && tweetId) { return `https://x.com/${handle}/status/${tweetId}`; } const link = article.querySelector('a[href*="/status/"]'); const href = link?.getAttribute("href") ?? null; if (href && tweetIdFromHref(href)) { return new URL(href, "https://x.com").toString(); } return null; } // src/features/integrations/aria2.ts var ARIA2_HISTORY_KEY = "aviary.aria2.history.v1"; var ARIA2_HISTORY_LIMIT = 1e3; async function addUriToAria2(config, request) { assertOutboundAllowed("The Aria2 handoff"); if (!config.endpoint) { return { ok: false, error: "Aria2 endpoint not configured" }; } const token = config.secret ? `token:${config.secret}` : void 0; const params = token ? [token] : []; params.push([request.url]); params.push({ out: request.filename }); const body = JSON.stringify({ jsonrpc: "2.0", id: `aviary-${Date.now()}`, method: "aria2.addUri", params }); try { const networkResult = await withNetworkTimeout(async (signal) => { const response = await fetch(`${config.endpoint}/jsonrpc`, { method: "POST", headers: { "content-type": "application/json" }, body, signal }); if (!response.ok) return { status: response.status }; return { payload: await response.json() }; }, NETWORK_TIMEOUTS.aria2); if ("status" in networkResult) { return { ok: false, error: `Aria2 HTTP ${networkResult.status}` }; } const payload = networkResult.payload; if (payload?.error) { return { ok: false, error: payload.error.message ?? "Aria2 error" }; } const ariaResult = { ok: true }; if (typeof payload?.result === "string") ariaResult.gid = payload.result; return ariaResult; } catch (error) { return { ok: false, error: String(error?.message ?? error) }; } } function shouldHandoffToAria2(integration, estimatedBytes) { if (!integration.enabled || !integration.endpoint) return false; if (estimatedBytes === null) return true; return estimatedBytes >= integration.minBytes; } var Aria2History = class { #storage; #limit; #entries = []; #loaded = false; constructor(storage, limit = ARIA2_HISTORY_LIMIT) { this.#storage = storage; this.#limit = Math.max(50, Math.trunc(limit)); } async load() { if (this.#loaded) return; const fallback = { entries: [] }; const raw = await this.#storage.get(ARIA2_HISTORY_KEY, fallback); const entries = Array.isArray(raw?.entries) ? raw.entries : []; this.#entries = entries.filter(isHistoryEntry).slice(-this.#limit); this.#loaded = true; } hasUrl(url) { return this.#entries.some((entry) => entry.url === url); } snapshot() { return { entries: this.#entries.map((entry) => ({ ...entry })) }; } async rememberQueued(entry) { await this.load(); if (this.hasUrl(entry.url)) return; this.#entries.push({ ...entry, status: "queued", queuedAt: (/* @__PURE__ */ new Date()).toISOString() }); while (this.#entries.length > this.#limit) { this.#entries.shift(); } await this.#persist(); } async reconcile(config) { await this.load(); let completed = 0; let removed = 0; const retained = []; for (const entry of this.#entries) { if (entry.status !== "queued") { retained.push(entry); continue; } const status = await tellAria2Status(config, entry.gid); if (status === "complete") { retained.push({ ...entry, status: "complete", completedAt: (/* @__PURE__ */ new Date()).toISOString() }); completed += 1; } else if (status === "error" || status === "removed") { removed += 1; } else { retained.push(entry); } } this.#entries = retained; if (completed > 0 || removed > 0) { await this.#persist(); } return { completed, removed }; } async clear() { this.#entries = []; this.#loaded = true; await this.#persist(); } /** * Written under the lock, and deliberately *not* merged. * * The aria2 daemon is the authority on what it is holding, and `reconcile()` rebuilds this list * from it. Merging two tabs' copies would resurrect handoffs the daemon has already finished and * this tab has already reconciled away. The lock is still worth taking: it stops a second tab's * write landing in the middle of this one's read-modify-write. */ async #persist() { try { await replaceStored(this.#storage, ARIA2_HISTORY_KEY, this.snapshot()); } catch { } } }; async function pingAria2Version(config) { assertOutboundAllowed("The Aria2 connection test"); if (!config.endpoint) { return { ok: false, error: "Aria2 endpoint not configured" }; } try { const result = await withNetworkTimeout(async (signal) => { const response = await fetch(`${config.endpoint}/jsonrpc`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ jsonrpc: "2.0", id: `aviary-${Date.now()}`, method: "aria2.getVersion", params: config.secret ? [`token:${config.secret}`] : [] }), signal }); if (!response.ok) return { status: response.status }; return { payload: await response.json() }; }, NETWORK_TIMEOUTS.aria2); if ("status" in result) { return { ok: false, error: `Aria2 HTTP ${result.status}` }; } const payload = result.payload; if (payload?.error) { return { ok: false, error: payload.error.message ?? "Aria2 rejected the request" }; } return typeof payload?.result?.version === "string" ? { ok: true, gid: payload.result.version } : { ok: false, error: "Aria2 did not report a version" }; } catch (error) { return { ok: false, error: String(error?.message ?? error) }; } } async function tellActiveAria2(config) { assertOutboundAllowed("The Aria2 sweep"); const payload = await callAria2(config, "aria2.tellActive", []); if (!Array.isArray(payload)) return []; return payload.map((row) => ({ gid: typeof row.gid === "string" ? row.gid : "", status: typeof row.status === "string" ? row.status : "unknown", totalLength: Number(row.totalLength ?? 0), completedLength: Number(row.completedLength ?? 0), files: Array.isArray(row.files) ? row.files.map((file) => typeof file === "object" && file !== null ? file : {}).map((file) => ({ path: typeof file.path === "string" ? file.path : "" })) : [] })); } async function removeAria2Download(config, gid) { assertOutboundAllowed("The Aria2 cancel"); if (!gid) return { ok: false, error: "Missing GID" }; const payload = await callAria2(config, "aria2.remove", [gid]); if (typeof payload === "string") { return { ok: true, gid: payload }; } return { ok: false, error: "Aria2 did not return a GID" }; } async function tellAria2Status(config, gid) { if (!gid) return null; if (!config.endpoint) return null; try { assertOutboundAllowed("The Aria2 status check"); } catch { return null; } const token = config.secret ? `token:${config.secret}` : void 0; const params = token ? [token, gid] : [gid]; try { const payload = await withNetworkTimeout(async (signal) => { const response = await fetch(`${config.endpoint}/jsonrpc`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ jsonrpc: "2.0", id: `aviary-${Date.now()}`, method: "aria2.tellStatus", params }), signal }); if (!response.ok) return null; return await response.json(); }, NETWORK_TIMEOUTS.aria2); if (!payload) return null; if (payload.error) { return isUnknownGidError(payload.error) ? "removed" : null; } return typeof payload.result?.status === "string" ? payload.result.status : null; } catch { return null; } } async function callAria2(config, method, args) { if (!config.endpoint) return null; const token = config.secret ? `token:${config.secret}` : void 0; const params = token ? [token, ...args] : args; const body = JSON.stringify({ jsonrpc: "2.0", id: `aviary-${Date.now()}`, method, params }); try { const json = await withNetworkTimeout(async (signal) => { const response = await fetch(`${config.endpoint}/jsonrpc`, { method: "POST", headers: { "content-type": "application/json" }, body, signal }); if (!response.ok) return null; return await response.json(); }, NETWORK_TIMEOUTS.aria2); if (!json) return null; return json?.result ?? null; } catch { return null; } } function isUnknownGidError(error) { const message = typeof error.message === "string" ? error.message.toLowerCase() : ""; return /gid/.test(message) && /(not found|is not found|cannot be found)/.test(message); } function isHistoryEntry(value) { if (typeof value !== "object" || value === null) return false; const entry = value; return typeof entry.gid === "string" && typeof entry.url === "string" && typeof entry.filename === "string" && (entry.status === "queued" || entry.status === "complete") && typeof entry.queuedAt === "string" && (entry.completedAt === void 0 || typeof entry.completedAt === "string"); } // src/extension/download-state.ts var DOWNLOAD_STATE_MESSAGE = "AVIARY_DOWNLOAD_STATE"; var DOWNLOAD_QUERY_MESSAGE = "AVIARY_DOWNLOAD_QUERY"; function unknownDownloadQuality() { return { label: "quality-unknown", width: null, height: null, bitrate: null, mime: null, codec: null, codecSource: null, playbackProven: false }; } function normalizeDownloadQuality(value) { if (!value || typeof value !== "object") { return unknownDownloadQuality(); } const candidate = value; const label = candidate.label === "original" || candidate.label === "fallback" || candidate.label === "best-direct" || candidate.label === "adaptive-remux" || candidate.label === "quality-unknown" ? candidate.label : "quality-unknown"; const codecSource = candidate.codecSource === "graphql-variant" || candidate.codecSource === "source-element" ? candidate.codecSource : null; const codec = codecSource !== null && typeof candidate.codec === "string" && /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(candidate.codec.trim()) ? candidate.codec.trim().toLowerCase() : null; return { label, width: boundedPositive(candidate.width, 2e4), height: boundedPositive(candidate.height, 2e4), bitrate: boundedPositive(candidate.bitrate, 1e9), mime: typeof candidate.mime === "string" && /^[a-z][a-z0-9!#$&^_.+-]*\/[a-z0-9!#$&^_.+-]+$/i.test(candidate.mime) ? candidate.mime.slice(0, 120).toLowerCase() : null, codec: codec === null ? null : codec, codecSource: codec === null ? null : codecSource, playbackProven: candidate.playbackProven === true }; } function isDownloadQualityReceipt(value) { if (!value || typeof value !== "object" || Array.isArray(value)) return false; const normalized = normalizeDownloadQuality(value); for (const [key, provided] of Object.entries(value)) { if (!(key in normalized)) return false; if (provided !== normalized[key]) return false; } return true; } function boundedPositive(value, max) { const number = typeof value === "number" ? value : Number(value); return Number.isFinite(number) && number > 0 && number <= max ? Math.round(number) : null; } function isDownloadStateMessage(value) { if (typeof value !== "object" || value === null) { return false; } const candidate = value; return candidate.type === DOWNLOAD_STATE_MESSAGE && typeof candidate.id === "number" && (candidate.state === "complete" || candidate.state === "interrupted") && (candidate.error === void 0 || typeof candidate.error === "string") && (candidate.quality === void 0 || isDownloadQualityReceipt(candidate.quality)); } // src/features/media/downloader.ts var MEDIA_FINGERPRINT_TIMEOUT_MS = 1500; var DOWNLOAD_PERMISSION_CODE = "downloads-permission-missing"; async function captureMediaBytes(url, options = {}) { const sourceUrl = url.trim(); if (!/^https?:\/\//i.test(sourceUrl)) { throw new TypeError("Only HTTP(S) media URLs can be captured into an archive."); } const maxBytes = Math.max(1, Math.trunc(options.maxBytes ?? 50 * 1024 * 1024)); const captured = await withNetworkTimeout(async (signal) => { const response = await fetch(sourceUrl, { signal }); if (!response.ok) { throw new Error(`Media request failed with HTTP ${response.status}.`); } const declaredLength = Number(response.headers.get("content-length")); if (Number.isFinite(declaredLength) && declaredLength > maxBytes) { throw new RangeError(`Media response exceeds the ${maxBytes}-byte capture limit.`); } const bytes = new Uint8Array(await response.arrayBuffer()); if (bytes.byteLength > maxBytes) { throw new RangeError(`Media response exceeds the ${maxBytes}-byte capture limit.`); } await new Promise((resolve) => { setTimeout(resolve, 0); }); if (signal.aborted) { throw signal.reason; } const sha256 = await sha256HexAsync(bytes); return { bytes, contentType: response.headers.get("content-type")?.split(";", 1)[0]?.trim() || "application/octet-stream", httpStatus: response.status, httpHeaders: safeResponseHeaders(response.headers), sha256 }; }, options.timeoutMs ?? NETWORK_TIMEOUTS.mediaTransfer); return { sourceUrl, capturedAt: (/* @__PURE__ */ new Date()).toISOString(), bytes: captured.bytes, byteLength: captured.bytes.byteLength, sha256: captured.sha256, contentType: captured.contentType, httpStatus: captured.httpStatus, httpHeaders: captured.httpHeaders }; } async function fingerprintMediaDownload(request) { const identityHash = mediaIdentityHash(request.kind, request.url, request.mediaId); if (request.kind === "video") { return { identityHash }; } const timeoutMs = Math.max( 1, Math.min(MEDIA_FINGERPRINT_TIMEOUT_MS, Math.trunc(request.timeoutMs ?? MEDIA_FINGERPRINT_TIMEOUT_MS)) ); const deadline = Date.now() + timeoutMs; for (const url of downloadCandidates(request)) { const remaining = deadline - Date.now(); if (remaining <= 0) break; try { const captured = await captureMediaBytes(url, { timeoutMs: remaining }); let perceptualHash = null; if (request.includePerceptual && captured.contentType.startsWith("image/")) { const decodeBudget = deadline - Date.now(); if (decodeBudget <= 0) { return { identityHash, exactHash: captured.sha256 }; } try { perceptualHash = await withNetworkTimeout(async (signal) => { const hash = await perceptualImageHash(captured.bytes, captured.contentType); if (signal.aborted) throw signal.reason; return hash; }, decodeBudget); } catch { } } return { identityHash, exactHash: captured.sha256, ...perceptualHash ? { perceptualHash } : {} }; } catch { } } return { identityHash }; } async function captureExportRecordMedia(record, options = {}) { const media = await Promise.all(record.media.map(async (entry) => { const wantsPosterOnly = options.posterFrameOnly === true && entry.kind === "video"; const posterUrl = wantsPosterOnly ? (entry.poster ?? "").trim() : ""; const videoUrl = (entry.sourceUrl ?? entry.url).trim(); if (wantsPosterOnly && !posterUrl) { return { ...entry, sourceUrl: videoUrl, capturedAt: entry.capturedAt ?? (/* @__PURE__ */ new Date()).toISOString(), captureStatus: "remote-reference", captureError: "Poster frames only is on and this video has no poster, so nothing was stored.", reduction: { posterFrameOnly: true, posterMissing: true } }; } const posterOnly = wantsPosterOnly && Boolean(posterUrl); const sourceUrl = posterOnly ? posterUrl : videoUrl; try { const captured = await captureMediaBytes(sourceUrl, options); const reduced = await applyCaptureSize( captured, options, posterOnly, posterOnly ? typeof entry.byteLength === "number" ? entry.byteLength : null : null ); const { reduction: _previousReduction, ...base } = entry; return { ...base, // A poster is a photo. Leaving `kind: "video"` on it made the ZIP write a still under a // video name and let any consumer keying off `kind` or `url` read it as the video. ...posterOnly ? { kind: "thumbnail", url: posterUrl } : {}, sourceUrl: captured.sourceUrl, capturedAt: captured.capturedAt, byteLength: reduced.bytes.byteLength, sha256: reduced.sha256, bytes: reduced.bytes, httpStatus: captured.httpStatus, httpHeaders: captured.httpHeaders, // Only a re-encode changes the type. Otherwise the DOM-observed type wins over the response // header, which matters because `captureMediaBytes` defaults a missing `Content-Type` to // `application/octet-stream` -- and that value goes straight into the ZIP entry and the // WARC record. The exception is a poster capture: the entry's declared type describes the // video that was left out, and the bytes on disk are a still. type: reduced.reencodedType ?? (posterOnly || !entry.type?.includes("/") ? captured.contentType : entry.type), captureStatus: "captured-bytes", ...reduced.reduction ? { reduction: reduced.reduction } : {} }; } catch (error) { return { ...entry, sourceUrl, capturedAt: entry.capturedAt ?? (/* @__PURE__ */ new Date()).toISOString(), captureStatus: /^https?:\/\//i.test(sourceUrl) ? "remote-reference" : "missing", captureError: error instanceof Error ? error.message : String(error) }; } })); return { ...record, media }; } async function applyCaptureSize(captured, options, posterFrameOnly, replacedByteLength) { const scale = options.imageScale ?? 1; const isImage = captured.contentType.startsWith("image/"); const wantsScale = isImage && Number.isFinite(scale) && scale > 0 && scale < 1; const reduction = {}; if (posterFrameOnly) { reduction.posterFrameOnly = true; if (replacedByteLength !== null) reduction.replacedByteLength = replacedByteLength; } if (!wantsScale) { return { bytes: captured.bytes, sha256: captured.sha256, ...posterFrameOnly ? { reduction } : {} }; } const rescaled = await downscaleImageBytes(captured.bytes, captured.contentType, scale); if (!rescaled) { return { bytes: captured.bytes, sha256: captured.sha256, ...posterFrameOnly ? { reduction } : {} }; } return { bytes: rescaled.bytes, sha256: await sha256HexAsync(rescaled.bytes), reencodedType: rescaled.contentType, reduction: { ...reduction, imageScale: scale, originalByteLength: captured.byteLength } }; } async function downscaleImageBytes(bytes, contentType, scale) { const decode = globalThis.createImageBitmap; const Canvas = globalThis.OffscreenCanvas; if (typeof decode !== "function" || typeof Canvas !== "function") return null; try { const source = new Blob([new Uint8Array(bytes)], { type: contentType }); const bitmap = await decode(source); const width = Math.max(1, Math.round(bitmap.width * scale)); const height = Math.max(1, Math.round(bitmap.height * scale)); const canvas = new Canvas(width, height); const context = canvas.getContext("2d"); if (!context) { bitmap.close?.(); return null; } context.drawImage(bitmap, 0, 0, width, height); bitmap.close?.(); const type = contentType === "image/png" ? "image/png" : "image/jpeg"; const blob = await canvas.convertToBlob({ type, quality: 0.92 }); return { bytes: new Uint8Array(await blob.arrayBuffer()), contentType: type }; } catch { return null; } } function safeResponseHeaders(headers) { const output = {}; headers.forEach((value, name) => { const normalized = name.toLowerCase(); if (/^(?:accept-ranges|cache-control|content-disposition|content-range|content-type|etag|expires|last-modified)$/.test(normalized)) { output[normalized] = value; } }); return output; } var DownloadPermissionError = class extends Error { code = DOWNLOAD_PERMISSION_CODE; constructor(message = "Aviary needs the browser download permission to save this file.") { super(message); this.name = "DownloadPermissionError"; } }; async function queryExtensionDownload(id) { if (!Number.isSafeInteger(id) || id < 0) { return void 0; } const runtime = globalThis.chrome?.runtime; if (!runtime?.sendMessage) { return void 0; } try { const response = await runtime.sendMessage({ type: DOWNLOAD_QUERY_MESSAGE, id }); if (response?.ok !== true || response.id !== id || !isDownloadQueryState(response.state)) { return void 0; } return { ok: true, id, state: response.state, ...typeof response.error === "string" ? { error: response.error } : {}, ...response.quality ? { quality: normalizeDownloadQuality(response.quality) } : {} }; } catch { return void 0; } } function createDownloader(options = {}) { return async (request) => { if (options.integrations) { const aria = options.integrations.aria2; if (options.aria2History?.hasUrl(request.url)) { return { ok: true, via: "aria2", deduplicated: true }; } const estimatedBytes = request.estimatedBytes ?? (aria.enabled && aria.endpoint ? await estimateBytes(request.url) : null); if (shouldHandoffToAria2(aria, estimatedBytes)) { const result = await addUriToAria2( { endpoint: aria.endpoint, secret: aria.secret }, { url: request.url, filename: request.filename } ); if (result.ok) { if (result.gid && options.aria2History) { await options.aria2History.rememberQueued({ gid: result.gid, url: request.url, filename: request.filename }); } return { ok: true, via: "aria2", ...result.gid ? { gid: result.gid } : {} }; } options.onWarn?.("Aria2 refused the handoff, saving through the browser instead", { error: result.error ?? "unknown", filename: request.filename }); } } const gmResult = await tryGmDownload(request); if (gmResult) { return { ok: true, via: "gm", ...gmResult.quality ? { quality: gmResult.quality } : {} }; } const extResult = await tryExtensionDownload(request); if (extResult.status === "ok") { return { ok: true, via: "extension", ...extResult.pending && extResult.id !== void 0 ? { pending: true, downloadId: extResult.id } : {} }; } if (extResult.status === "needs-permission") { throw new DownloadPermissionError(); } if (extResult.status === "failed") { throw new Error(extResult.error); } triggerAnchor(request); return isCrossOrigin(request.url) ? { ok: true, via: "anchor", degraded: true } : { ok: true, via: "anchor" }; }; } function isCrossOrigin(url) { if (/^(blob|data):/i.test(url)) { return false; } const base = typeof location === "undefined" ? void 0 : location.href; try { const parsed = new URL(url, base); return base === void 0 ? true : parsed.origin !== new URL(base).origin; } catch { return false; } } async function estimateBytes(url) { if (typeof fetch !== "function") { return null; } try { const response = await withNetworkTimeout( (signal) => fetch(url, { method: "HEAD", signal }), NETWORK_TIMEOUTS.mediaProbe ); if (!response.ok) { return null; } const length = Number(response.headers.get("content-length")); return Number.isFinite(length) && length > 0 ? length : null; } catch { return null; } } async function tryGmDownload(request) { const globals = globalThis; if (typeof globals.GM_download !== "function") { return void 0; } const candidates2 = [ { url: request.url, quality: request.quality }, ...(request.fallbackUrls ?? []).map((url, index) => ({ url, quality: request.fallbackQualities?.[index] })) ].filter( (candidate, index, all) => /^https?:\/\//i.test(candidate.url) && all.findIndex((entry) => entry.url === candidate.url) === index ).slice(0, 4); for (let index = 0; index < candidates2.length; index += 1) { const candidate = candidates2[index]; const saved = await new Promise((resolve) => { try { globals.GM_download?.({ url: candidate.url, name: request.filename, onload: () => resolve(true), onerror: () => resolve(false), ontimeout: () => resolve(false) }); } catch { resolve(false); } }); if (saved) { return candidate.quality ? { quality: candidate.quality } : {}; } } return void 0; } async function tryExtensionDownload(request) { const runtime = globalThis.chrome?.runtime; if (!runtime?.sendMessage) { return { status: "unavailable" }; } try { const response = await runtime.sendMessage({ type: "AVIARY_DOWNLOAD", url: request.url, ...request.fallbackUrls ? { fallbackUrls: request.fallbackUrls } : {}, ...request.quality ? { quality: request.quality } : {}, ...request.fallbackQualities ? { fallbackQualities: request.fallbackQualities } : {}, filename: request.filename }); if (response?.ok === true) { return { status: "ok", ...typeof response.id === "number" ? { id: response.id } : {}, ...response.pending === true ? { pending: true } : {} }; } if (response?.code === DOWNLOAD_PERMISSION_CODE) { return { status: "needs-permission" }; } if (response === void 0) { return { status: "unavailable" }; } return { status: "failed", error: response.error ?? "download failed" }; } catch { return { status: "unavailable" }; } } function downloadCandidates(request) { return [request.url, ...request.fallbackUrls ?? []].filter((url, index, all) => /^https?:\/\//i.test(url) && all.indexOf(url) === index).slice(0, 4); } function isDownloadQueryState(value) { return value === "in_progress" || value === "complete" || value === "interrupted" || value === "missing"; } async function requestDownloadPermissionSurface() { const runtime = globalThis.chrome?.runtime; if (!runtime?.sendMessage) { return false; } try { const response = await runtime.sendMessage({ type: "AVIARY_OPEN_OPTIONS" }); return response?.ok === true; } catch { return false; } } function triggerAnchor(request) { if (typeof document === "undefined") { return; } const anchor = document.createElement("a"); anchor.href = request.url; anchor.download = request.filename; anchor.rel = "noopener noreferrer"; anchor.target = "_blank"; anchor.style.display = "none"; document.body.append(anchor); anchor.click(); anchor.remove(); } // src/extension/native-i18n.ts var NATIVE_I18N_COPY = { extensionName: "Aviary for X", extensionDescription: "Local-first X/Twitter enhancer with reversible controls and privacy-first defaults.", actionTitle: "Aviary", contextDownloadMedia: "Download media with Aviary" }; // src/extension/media-context-menu.ts var MEDIA_CONTEXT_MENU_TITLE = NATIVE_I18N_COPY.contextDownloadMedia; var MEDIA_CONTEXT_DOWNLOAD_MESSAGE = "AVIARY_DOWNLOAD_CONTEXT_MEDIA"; var MEDIA_CONTEXT_PERMISSION_DENIED_MESSAGE = "AVIARY_CONTEXT_DOWNLOAD_PERMISSION_DENIED"; function isMediaContextDownloadMessage(message, sender) { return isContextMessage(message, MEDIA_CONTEXT_DOWNLOAD_MESSAGE, sender); } function isMediaContextPermissionDeniedMessage(message, sender) { return isContextMessage(message, MEDIA_CONTEXT_PERMISSION_DENIED_MESSAGE, sender); } function isSupportedXDocumentUrl(value) { if (typeof value !== "string" || value.length === 0 || value.length > 4096) { return false; } try { const url = new URL(value); return url.protocol === "https:" && !url.username && !url.password && ["x.com", "www.x.com", "twitter.com", "www.twitter.com", "pro.x.com"].includes(url.hostname); } catch { return false; } } function isContextMessage(message, type, sender) { return typeof message === "object" && message !== null && Object.keys(message).length === 2 && Object.prototype.hasOwnProperty.call(message, "type") && Object.prototype.hasOwnProperty.call(message, "documentUrl") && message.type === type && isSupportedXDocumentUrl(message.documentUrl) && isTrustedExtensionSender(sender); } function isTrustedExtensionSender(sender) { const extensionId = globalThis.chrome?.runtime?.id; return typeof extensionId === "string" && extensionId.length > 0 && typeof sender === "object" && sender !== null && sender.id === extensionId; } // src/features/media/media-metadata.ts function extractMediaMetadata(payload) { const body = readBody(payload); if (!body || body.length === 0 || body.length > MAX_BODY_CHARS) { return []; } let parsed; try { parsed = JSON.parse(body); } catch { return []; } const found = []; const state2 = { nodes: 0 }; collectMetadata(parsed, null, 0, state2, found); return found.map(cloneMetadata); } var MAX_BODY_CHARS = 15e5; var MAX_ENTRIES = 256; var MAX_NODES = 5e4; var MAX_DEPTH = 32; var MEDIA_URL_PATTERN = /\/media\/([A-Za-z0-9_-]+)/i; var MediaMetadataCache = class { #entries = /* @__PURE__ */ new Map(); #version = 0; get version() { return this.#version; } get size() { return this.#entries.size; } ingest(payload) { return this.ingestMetadata(extractMediaMetadata(payload)); } ingestMetadata(found) { let changed = 0; for (const metadata of found) { if (upsert(this.#entries, metadata)) { changed += 1; this.#version += 1; } } while (this.#entries.size > MAX_ENTRIES) { const oldest = this.#entries.keys().next().value; if (!oldest) { break; } this.#entries.delete(oldest); } return changed; } find(tweetId, mediaId = null, poster = null) { const wantedTweet = cleanId(tweetId); const wantedMedia = cleanId(mediaId) ?? mediaIdFromUrl2(poster); const wantedPoster = cleanUrl(poster); let winner = null; let winnerScore = 0; let tied = false; for (const entry of this.#entries.values()) { let score = 0; if (wantedTweet && entry.tweetId === wantedTweet) { score += 4; } else if (wantedTweet && entry.tweetId) { continue; } if (wantedMedia) { const mediaMatches = entry.mediaId === wantedMedia || mediaIdFromUrl2(entry.poster) === wantedMedia; if (!mediaMatches && (!wantedPoster || cleanUrl(entry.poster) !== wantedPoster)) { continue; } if (mediaMatches) { score += 8; } } if (wantedPoster && cleanUrl(entry.poster) === wantedPoster) { score += 6; } else if (wantedMedia && mediaIdFromUrl2(entry.poster) === wantedMedia) { score += 3; } if (score === 0 || score < winnerScore) { continue; } if (score === winnerScore) { tied = true; continue; } winner = entry; winnerScore = score; tied = false; } return winner && !tied ? cloneMetadata(winner) : null; } clear() { this.#entries.clear(); this.#version += 1; } }; function mediaMetadataIdentity(metadata) { const identity = [ metadata.tweetId, metadata.mediaId, mediaIdFromUrl2(metadata.poster), metadata.poster ].filter(Boolean); if (identity.length === 0) { identity.push(metadata.variants[0]?.url ?? metadata.audioVariants[0]?.url ?? "unknown"); } return JSON.stringify(identity); } function mergeMediaMetadata(existing, incoming) { return mergeMetadata(existing, incoming); } function mediaIdFromUrl2(url) { if (!url) { return null; } return MEDIA_URL_PATTERN.exec(url)?.[1] ?? null; } function readBody(payload) { if (typeof payload === "string") { return payload; } if (!payload || typeof payload !== "object") { return null; } const body = payload.body; return typeof body === "string" ? body : null; } function collectMetadata(value, inheritedTweetId, depth, state2, found) { if (depth > MAX_DEPTH || state2.nodes >= MAX_NODES || !value || typeof value !== "object") { return; } state2.nodes += 1; if (Array.isArray(value)) { for (const child of value) { collectMetadata(child, inheritedTweetId, depth + 1, state2, found); if (state2.nodes >= MAX_NODES) { return; } } return; } const record = value; const tweetId = isMediaRecord(record) ? inheritedTweetId : readTweetId2(record) ?? inheritedTweetId; if (isMediaRecord(record)) { const metadata = readMediaMetadata(record, tweetId); if (metadata) { found.push(metadata); } } for (const child of Object.values(record)) { collectMetadata(child, tweetId, depth + 1, state2, found); if (state2.nodes >= MAX_NODES) { return; } } } function readTweetId2(record) { const restId = cleanId(record.rest_id); if (restId && looksLikeTweet(record)) { return restId; } const id = cleanId(record.id_str); return id && looksLikeTweet(record) ? id : null; } function looksLikeTweet(record) { return "legacy" in record || "core" in record || "conversation_id_str" in record || "full_text" in record || "note_tweet" in record || "quoted_status_result" in record; } function isMediaRecord(record) { const type = typeof record.type === "string" ? record.type.toLowerCase() : ""; return type === "video" || type === "animated_gif" || isRecord5(record.video_info) || Boolean(record.preview_image_url || record.preview_image_url_https) && (type.includes("video") || type.includes("gif")); } function readMediaMetadata(record, tweetId) { const videoInfo = isRecord5(record.video_info) ? record.video_info : {}; const allVariants = readVariants(videoInfo.variants); const audioVariants = allVariants.filter(isAudioVariant); const variants = allVariants.filter((variant) => !isAudioVariant(variant)); const subtitleTracks = readSubtitleTracks(record, videoInfo); const poster = firstUrl( record.preview_image_url_https, record.preview_image_url, record.media_url_https, record.media_url ); const mediaId = (poster ? mediaIdFromUrl2(poster) : null) ?? cleanId(record.media_key) ?? cleanId(record.media_id_string) ?? cleanId(record.media_id); const isGif = record.type === "animated_gif" || record.is_gif === true || variants.some((variant) => variant.url.toLowerCase().includes("tweet_video")); if (!poster && variants.length === 0 && audioVariants.length === 0 && subtitleTracks.length === 0) { return null; } return { tweetId, mediaId, poster, variants, audioVariants, subtitleTracks, isGif }; } function readVariants(value) { if (!Array.isArray(value)) { return []; } const variants = []; for (const entry of value) { if (!isRecord5(entry)) { continue; } const url = httpUrl(entry.url); if (!url) { continue; } const candidate = { url, type: typeof entry.content_type === "string" ? entry.content_type : "video/mp4", width: positiveNumber(entry.width) ?? dimensionsFromUrl(url)?.width ?? null, height: positiveNumber(entry.height) ?? dimensionsFromUrl(url)?.height ?? null, bitrate: positiveNumber(entry.bitrate) ?? positiveNumber(entry.bit_rate) ?? null }; if (typeof entry.codec === "string" && entry.codec.trim()) { candidate.codec = entry.codec.trim(); candidate.codecSource = "graphql-variant"; } if (typeof entry.provenance === "string" && entry.provenance.trim()) { candidate.provenance = entry.provenance.trim(); } const existingIndex = variants.findIndex((variant) => variant.url === url); if (existingIndex < 0) { variants.push(candidate); } else { variants[existingIndex] = mergeVideoVariant(variants[existingIndex], candidate); } } return mergeVideoVariants([], variants); } function isAudioVariant(variant) { return /^audio\//i.test(variant.type) || /\.(?:aac|m4a|mp3|ogg|opus|wav)(?:[?#]|$)/i.test(variant.url); } function readSubtitleTracks(...values) { const found = /* @__PURE__ */ new Map(); const seen = /* @__PURE__ */ new Set(); const visit = (value, depth) => { if (depth > 6 || !value || typeof value !== "object" || seen.has(value)) return; seen.add(value); if (Array.isArray(value)) { for (const child of value) visit(child, depth + 1); return; } const record = value; const type = typeof record.type === "string" ? record.type : ""; const url = firstUrl(record.url, record.src, record.source_url, record.href); if (url && isSubtitleUrl(url, type)) { found.set(url, { url, type: type.includes("/") ? type : subtitleType(url), language: cleanOptional(record.language ?? record.lang ?? record.srclang), label: cleanOptional(record.label ?? record.name ?? record.title) }); } for (const child of Object.values(record)) visit(child, depth + 1); }; for (const value of values) visit(value, 0); return [...found.values()].slice(0, 8); } function isSubtitleUrl(url, type) { return /(?:text\/vtt|text\/srt|application\/ttml|caption|subtitle)/i.test(type) || /\.(?:vtt|srt|ttml|dfxp)(?:[?#]|$)/i.test(url); } function subtitleType(url) { if (/\.(?:srt)(?:[?#]|$)/i.test(url)) return "text/srt"; if (/\.(?:ttml|dfxp)(?:[?#]|$)/i.test(url)) return "application/ttml+xml"; return "text/vtt"; } function cleanOptional(value) { return typeof value === "string" && value.trim().length > 0 ? value.trim().slice(0, 80) : null; } function upsert(entries, incoming) { const existingKey = findExistingKey(entries, incoming); if (!existingKey) { entries.set(metadataKey(incoming), cloneMetadata(incoming)); return true; } const existing = entries.get(existingKey); const merged = mergeMetadata(existing, incoming); if (!metadataEqual(existing, merged)) { entries.delete(existingKey); entries.set(metadataKey(merged), merged); return true; } entries.delete(existingKey); entries.set(existingKey, existing); return false; } function findExistingKey(entries, incoming) { const incomingPosterId = mediaIdFromUrl2(incoming.poster); for (const [key, entry] of entries) { if (incoming.mediaId && entry.mediaId === incoming.mediaId) { return key; } if (incomingPosterId && mediaIdFromUrl2(entry.poster) === incomingPosterId) { return key; } if (incoming.tweetId && entry.tweetId === incoming.tweetId && incoming.poster && entry.poster === incoming.poster) { return key; } } return null; } function mergeMetadata(existing, incoming) { const variants = mergeVideoVariants(existing.variants, incoming.variants); const audioVariants = mergeVideoVariants(existing.audioVariants, incoming.audioVariants); const subtitleTracks = [...existing.subtitleTracks]; const seenTracks = new Set(subtitleTracks.map((track) => track.url)); for (const track of incoming.subtitleTracks) { if (!seenTracks.has(track.url)) { subtitleTracks.push(track); seenTracks.add(track.url); } } return { tweetId: existing.tweetId ?? incoming.tweetId, mediaId: existing.mediaId ?? incoming.mediaId, poster: existing.poster ?? incoming.poster, variants, audioVariants, subtitleTracks, isGif: existing.isGif || incoming.isGif }; } function metadataEqual(a, b) { return a.tweetId === b.tweetId && a.mediaId === b.mediaId && a.poster === b.poster && a.isGif === b.isGif && a.variants.length === b.variants.length && a.variants.every((variant, index) => { const other = b.variants[index]; return other !== void 0 && videoVariantEqual(variant, other); }) && a.audioVariants.length === b.audioVariants.length && a.audioVariants.every((variant, index) => { const other = b.audioVariants[index]; return other !== void 0 && videoVariantEqual(variant, other); }) && a.subtitleTracks.length === b.subtitleTracks.length && a.subtitleTracks.every((track, index) => { const other = b.subtitleTracks[index]; return track.url === other?.url && track.type === other.type && track.language === other.language && track.label === other.label; }); } function videoVariantEqual(left, right) { return left.url === right.url && left.type === right.type && left.width === right.width && left.height === right.height && left.bitrate === right.bitrate && left.codec === right.codec && left.codecSource === right.codecSource && left.provenance === right.provenance; } function metadataKey(metadata) { return [ metadata.tweetId, metadata.mediaId, mediaIdFromUrl2(metadata.poster), metadata.poster, metadata.variants[0]?.url ].filter(Boolean).join(":") || "unknown"; } function cloneMetadata(metadata) { return { ...metadata, variants: metadata.variants.map((variant) => ({ ...variant })), audioVariants: metadata.audioVariants.map((variant) => ({ ...variant })), subtitleTracks: metadata.subtitleTracks.map((track) => ({ ...track })) }; } function firstUrl(...values) { for (const value of values) { const url = httpUrl(value); if (url) { return url; } } return null; } function httpUrl(value) { if (typeof value !== "string" || !/^https?:\/\//i.test(value)) { return null; } return value; } function cleanId(value) { if (typeof value !== "string" && typeof value !== "number") { return null; } const result = String(value).trim(); return result.length > 0 ? result : null; } function cleanUrl(value) { return httpUrl(value); } function positiveNumber(value) { const parsed = typeof value === "number" ? value : Number(value); return Number.isFinite(parsed) && parsed > 0 ? Math.round(parsed) : null; } function dimensionsFromUrl(url) { const match = /\/(\d{2,5})x(\d{2,5})\//.exec(url); if (!match) { return null; } return { width: Number(match[1]), height: Number(match[2]) }; } function isRecord5(value) { return typeof value === "object" && value !== null && !Array.isArray(value); } // src/features/media/download-watch.ts var DOWNLOAD_TERMINAL_TIMEOUT_MS = 3e5; var MAX_BUFFERED = 64; var DownloadWatcher = class { #waiting = /* @__PURE__ */ new Map(); #settled = /* @__PURE__ */ new Map(); #quality = /* @__PURE__ */ new Map(); #listener; start() { if (this.#listener) { return; } const runtime = globalThis.chrome?.runtime; if (!runtime?.onMessage?.addListener) { return; } this.#listener = (message) => { if (isDownloadStateMessage(message)) { this.settle(message.id, message.state, message.quality); } }; runtime.onMessage.addListener(this.#listener); } stop() { const runtime = globalThis.chrome?.runtime; if (this.#listener && runtime?.onMessage?.removeListener) { runtime.onMessage.removeListener(this.#listener); } this.#listener = void 0; for (const waiter of this.#waiting.values()) { waiter.resolve("pending"); } this.#waiting.clear(); this.#settled.clear(); this.#quality.clear(); } /** Also the entry point the background's message takes; exposed so tests can drive it. */ settle(id, state2, quality) { if (this.#settled.has(id)) { return; } if (quality) this.#quality.set(id, { ...quality }); const waiter = this.#waiting.get(id); if (waiter) { this.#waiting.delete(id); this.#rememberSettled(id, state2); waiter.resolve(state2); return; } this.#rememberSettled(id, state2); } /** * Drops a terminal result after the caller has finished all work derived from it. * * Most callers can leave the bounded replay buffer alone. This hook is useful for long-lived * pages that explicitly know a download's queue, history, and UI consumers have all settled. */ forget(id) { this.#settled.delete(id); this.#quality.delete(id); } /** Quality is available only after a terminal message has proved which candidate completed. */ receipt(id) { const quality = this.#quality.get(id); return quality ? { ...quality } : void 0; } #rememberSettled(id, state2) { if (this.#settled.size >= MAX_BUFFERED) { const oldest = this.#settled.keys().next().value; if (oldest !== void 0) { this.#settled.delete(oldest); } } this.#settled.set(id, state2); } wait(id, timeoutMs = DOWNLOAD_TERMINAL_TIMEOUT_MS) { const terminal = this.terminal(id); return new Promise((resolve) => { const timer2 = setTimeout(() => resolve("pending"), timeoutMs); void terminal.then((outcome) => { clearTimeout(timer2); resolve(outcome); }); }); } /** * Keeps listening until the browser reports a terminal result or the feature is destroyed. * Unlike `wait`, this promise does not disappear when the UI switches from busy to Started. */ terminal(id) { const already = this.#settled.get(id); if (already) { return Promise.resolve(already); } const existing = this.#waiting.get(id); if (existing) { return existing.promise; } let settle; const promise = new Promise((resolve) => { settle = resolve; }); this.#waiting.set(id, { promise, resolve: settle }); return promise; } }; var shared; function sharedDownloadWatcher() { shared ??= new DownloadWatcher(); return shared; } // src/features/media/yt-dlp-transport.ts var YTDLP_PROXY_MESSAGE = "AVIARY_YTDLP_PROXY"; var YTDLP_DEFAULT_ENDPOINT = "http://127.0.0.1:8787"; function normalizeYtDlpEndpoint(endpoint) { try { const parsed = new URL(endpoint || YTDLP_DEFAULT_ENDPOINT); if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return null; const host = parsed.hostname.replace(/^\[|\]$/g, "").toLowerCase(); if (host !== "localhost" && host !== "::1" && !host.endsWith(".localhost") && !/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(host)) { return null; } parsed.username = ""; parsed.password = ""; parsed.search = ""; parsed.hash = ""; return parsed.toString().replace(/\/$/, ""); } catch { return null; } } async function performYtDlpCall(call) { const response = await fetch(call.url, { method: call.method, headers: { authorization: `Bearer ${call.secret}`, ...call.body === void 0 ? {} : { "content-type": "application/json" } }, ...call.body === void 0 ? {} : { body: call.body } }); let payload = null; try { payload = await response.json(); } catch { payload = null; } return { status: response.status, payload }; } async function sendYtDlpCall(call) { assertOutboundAllowed("The local yt-dlp helper call"); const runtime = globalThis.chrome?.runtime; if (runtime?.id && typeof runtime.sendMessage === "function") { const response = await runtime.sendMessage({ type: YTDLP_PROXY_MESSAGE, call }); if (response?.ok === true && typeof response.status === "number") { return { status: response.status, payload: response.payload ?? null }; } if (response?.ok === false) { throw new Error(typeof response.error === "string" ? response.error : "The extension background refused the helper call."); } } return performYtDlpCall(call); } // src/features/media/yt-dlp-helper.ts var YTDLP_FORMAT_POLICY = "bv*+ba/b"; var YTDLP_MERGE_POLICY = "mp4/mkv"; function isObservedAdaptiveManifest(variant) { let parsed; try { parsed = new URL(variant.url); } catch { return false; } if (parsed.protocol !== "https:" || parsed.hostname.toLowerCase() !== "video.twimg.com") { return false; } return /\.(?:m3u8|mpd)$/i.test(parsed.pathname) || /(?:mpegurl|dash\+xml)/i.test(variant.type); } function observedAdaptiveCandidates(variants) { return variants.filter(isObservedAdaptiveManifest).map((variant) => ({ manifestUrl: variant.url, variant })).sort((left, right) => { const quality = compareVariantQuality(right.variant, left.variant); return quality !== 0 ? quality : left.manifestUrl.localeCompare(right.manifestUrl); }); } function bestObservedAdaptive(variants) { return observedAdaptiveCandidates(variants)[0] ?? null; } function shouldOfferAdaptiveHelper(direct, variants) { const adaptive = bestObservedAdaptive(variants); return adaptive !== null && (direct === null || compareVariantQuality(adaptive.variant, direct) > 0); } function buildYtDlpCommand(request) { return [ "yt-dlp", "--no-playlist", "--format", quotePowerShell(request.formatPolicy), "--merge-output-format", quotePowerShell(YTDLP_MERGE_POLICY), "--output", quotePowerShell(request.filename), quotePowerShell(request.manifestUrl) ].join(" "); } async function handoffToYtDlp(settings, request) { if (!settings.enabled || !settings.secret) { return { state: "refused", error: "Enable the local yt-dlp helper and set its shared secret." }; } const endpoint = normalizeYtDlpEndpoint(settings.endpoint); if (!endpoint) { return { state: "refused", error: "The yt-dlp helper endpoint must be on this machine." }; } if (!isObservedAdaptiveManifest({ url: request.manifestUrl, type: "application/x-mpegURL" })) { return { state: "refused", error: "Only an observed X adaptive manifest can be handed off." }; } assertOutboundAllowed("The local yt-dlp handoff"); try { const { status, payload } = await sendYtDlpCall({ method: "POST", url: `${endpoint}/v1/jobs`, secret: settings.secret, body: JSON.stringify({ manifestUrl: request.manifestUrl, filename: request.filename, formatPolicy: request.formatPolicy }) }); if (status === 401 || status === 403) { return { state: "refused", error: textError(payload, "The local yt-dlp helper refused authorization.") }; } if (status < 200 || status > 299) { return { state: "failed", error: textError(payload, `The local yt-dlp helper returned HTTP ${status}.`) }; } return normalizeJobStatus(payload, "The local yt-dlp helper returned an invalid job."); } catch (error) { return { state: "failed", error: error instanceof Error ? error.message : String(error) }; } } async function readYtDlpJob(settings, jobId) { if (!settings.enabled || !settings.secret) return { state: "refused", error: "The local yt-dlp helper is not configured." }; const endpoint = normalizeYtDlpEndpoint(settings.endpoint); if (!endpoint || !/^[A-Za-z0-9_-]{8,80}$/.test(jobId)) return { state: "missing" }; assertOutboundAllowed("The local yt-dlp status check"); try { const { status, payload } = await sendYtDlpCall({ method: "GET", url: `${endpoint}/v1/jobs/${encodeURIComponent(jobId)}`, secret: settings.secret }); if (status === 401 || status === 403) { return { state: "refused", error: textError(payload, "The local yt-dlp helper refused authorization.") }; } if (status === 404) return { state: "missing" }; if (status < 200 || status > 299) return { state: "failed", error: textError(payload, `The local yt-dlp helper returned HTTP ${status}.`) }; return normalizeJobStatus(payload, "The local yt-dlp helper returned an invalid status."); } catch (error) { return { state: "failed", error: error instanceof Error ? error.message : String(error) }; } } function normalizeJobStatus(value, fallback) { if (!value || typeof value !== "object") return { state: "failed", error: fallback }; const record = value; const state2 = record.state; if (state2 !== "missing" && state2 !== "refused" && state2 !== "running" && state2 !== "completed" && state2 !== "failed") { return { state: "failed", error: fallback }; } return { ...typeof record.jobId === "string" ? { jobId: record.jobId } : {}, state: state2, ...typeof record.error === "string" ? { error: record.error } : {} }; } function textError(value, fallback) { const error = value && typeof value === "object" ? value.error : void 0; if (typeof error === "string") { return error; } return fallback; } function quotePowerShell(value) { return `'${value.replace(/['‘’‚‛]/g, "$&$&")}'`; } // src/features/media/history.ts var MEDIA_HISTORY_KEY = "aviary.media.history.v1"; var MEDIA_HISTORY_LIMIT = 1500; var MEDIA_HISTORY_RESERVATION_TTL_MS = 10 * 60 * 1e3; var MEDIA_HISTORY_RESERVATION_LIMIT = 128; var MEDIA_HISTORY_SCHEMA_VERSION = 5; function buildMediaHistoryExportArtifacts(snapshot, options = {}) { const range = normalizeHistoryRange(options); const entries = snapshot.entries.filter((entry) => { const at = Date.parse(entry.at); return Number.isFinite(at) && at >= range.fromMs && at <= range.toMs; }).sort((left, right) => left.at.localeCompare(right.at)); const rangeLabel = `${range.fromLabel ?? "all"}-to-${range.toLabel ?? "all"}`; const payload = { schemaVersion: 1, exportedAt: (/* @__PURE__ */ new Date()).toISOString(), range: { from: range.fromLabel, to: range.toLabel }, count: entries.length, matches: { ...snapshot.matches }, lastMatch: snapshot.lastMatch ? { ...snapshot.lastMatch } : null, entries: entries.map((entry) => ({ ...entry, quality: entry.quality ?? unknownDownloadQuality() })) }; const csv = [ "identity_hash,exact_hash,perceptual_hash,quality,width,height,bitrate,mime,codec,codec_source,playback_proven,downloaded_at", ...entries.map((entry) => { const quality = entry.quality ?? unknownDownloadQuality(); return [ entry.identityHash, entry.exactHash ?? "", entry.perceptualHash ?? "", quality.label, quality.width === null ? "" : String(quality.width), quality.height === null ? "" : String(quality.height), quality.bitrate === null ? "" : String(quality.bitrate), quality.mime ?? "", quality.codec ?? "", quality.codecSource ?? "", quality.playbackProven ? "yes" : "no", entry.at ].map(csvCell).join(","); }) ].join("\n") + "\n"; return [ { filename: `aviary-media-history-${rangeLabel}.json`, contentType: "application/json", data: new TextEncoder().encode(`${JSON.stringify(payload, null, 2)} `) }, { filename: `aviary-media-history-${rangeLabel}.csv`, contentType: "text/csv", data: new TextEncoder().encode(csv) } ]; } var MediaHistory = class { #storage; #limit; #onPersistError; #entries = []; #reservations = []; #matches = emptyMatches(); #lastMatch = null; #loaded = false; #loading; constructor(storage, limit = MEDIA_HISTORY_LIMIT, onPersistError) { this.#storage = storage; this.#limit = Math.max(50, limit); this.#onPersistError = onPersistError; } async load() { if (this.#loaded) { return; } if (!this.#loading) { this.#loading = this.#hydrate(); } await this.#loading; } has(key) { return this.findMatch({ identityHash: legacyIdentityHash(key) }, false) !== null; } findMatch(fingerprint2, allowPerceptual = false) { const candidate = normalizeFingerprint(fingerprint2); return findFingerprintMatch( this.#entries, activeReservations(this.#reservations), candidate, allowPerceptual ); } /** Completed history only. In-flight claims must not paint a media item as already saved. */ wasDownloaded(fingerprint2, allowPerceptual = false) { const candidate = normalizeFingerprint(fingerprint2); return findFingerprintMatch(this.#entries, [], candidate, allowPerceptual) !== null; } async record(fingerprintOrLegacyKey, quality) { await this.load(); const fingerprint2 = typeof fingerprintOrLegacyKey === "string" ? { identityHash: legacyIdentityHash(fingerprintOrLegacyKey) } : normalizeFingerprint(fingerprintOrLegacyKey); const entry = { ...fingerprint2, quality: normalizeDownloadQuality(quality), at: (/* @__PURE__ */ new Date()).toISOString() }; return await this.#persist({ added: [entry] }) > 0; } /** Returns the bounded quality receipt for a previously downloaded identity. */ findQuality(fingerprint2, allowPerceptual = false) { const candidate = normalizeFingerprint(fingerprint2); const entry = findEntry(this.#entries, candidate, allowPerceptual); return entry ? { ...entry.quality } : null; } /** Atomically claims a fingerprint so two tabs cannot start the same transfer. */ async reserve(fingerprint2, allowPerceptual = false) { await this.load(); const candidate = normalizeFingerprint(fingerprint2); const now6 = Date.now(); const reservation = { ...candidate, token: reservationToken(candidate, now6), at: new Date(now6).toISOString(), expiresAt: now6 + MEDIA_HISTORY_RESERVATION_TTL_MS }; let result = { match: null, token: reservation.token }; try { const merged = await mutateStored( this.#storage, MEDIA_HISTORY_KEY, emptySnapshot2(), (stored) => { const entries = readEntries(stored); const reservations = readReservations(stored, now6); const match = findFingerprintMatch(entries, reservations, candidate, allowPerceptual); if (match) { result = { match, token: null }; } else { reservations.push(reservation); } return snapshotFrom(stored, entries, reservations, this.#limit); } ); this.#adopt(merged); return result; } catch (error) { this.#onPersistError?.(error); const match = this.findMatch(candidate, allowPerceptual); if (match) return { match, token: null }; this.#reservations.push(reservation); this.#reservations = activeReservations(this.#reservations).slice(-MEDIA_HISTORY_RESERVATION_LIMIT); return result; } } /** Turns a successful in-flight claim into durable completed history. */ async commit(token, fingerprint2, quality) { await this.load(); if (!validToken(token)) return false; const candidate = normalizeFingerprint(fingerprint2); const entry = { ...candidate, quality: normalizeDownloadQuality(quality), at: (/* @__PURE__ */ new Date()).toISOString() }; let added = false; try { const merged = await mutateStored( this.#storage, MEDIA_HISTORY_KEY, emptySnapshot2(), (stored) => { const entries = readEntries(stored); const reservations = readReservations(stored).filter((item) => item.token !== token); const existing = findEntry(entries, candidate, false); if (existing) { const before = JSON.stringify(existing.quality); mergeEntry(entries, entry); added = JSON.stringify(existing.quality) !== before; } else { mergeEntry(entries, entry); added = true; } return snapshotFrom(stored, entries, reservations, this.#limit); } ); this.#adopt(merged); return added; } catch (error) { this.#onPersistError?.(error); this.#reservations = this.#reservations.filter((item) => item.token !== token); const existing = findEntry(this.#entries, candidate, false); if (existing) { const before = JSON.stringify(existing.quality); mergeEntry(this.#entries, entry); return JSON.stringify(existing.quality) !== before; } mergeEntry(this.#entries, entry); return true; } } /** Releases a failed transfer claim so a retry can start immediately. */ async release(token) { await this.load(); if (!validToken(token)) return; try { const merged = await mutateStored( this.#storage, MEDIA_HISTORY_KEY, emptySnapshot2(), (stored) => snapshotFrom( stored, readEntries(stored), readReservations(stored).filter((item) => item.token !== token), this.#limit ) ); this.#adopt(merged); } catch (error) { this.#onPersistError?.(error); this.#reservations = this.#reservations.filter((item) => item.token !== token); } } async noteMatch(kind) { await this.load(); const match = { kind, at: (/* @__PURE__ */ new Date()).toISOString() }; await this.#persist({ matched: match }); } async clear() { this.#entries = []; this.#reservations = []; this.#matches = emptyMatches(); this.#lastMatch = null; this.#loaded = true; try { await replaceStored(this.#storage, MEDIA_HISTORY_KEY, emptySnapshot2()); } catch (error) { this.#onPersistError?.(error); } } size() { return this.#entries.length; } snapshot() { return { schemaVersion: MEDIA_HISTORY_SCHEMA_VERSION, entries: this.#entries.map((entry) => ({ ...entry })), reservations: activeReservations(this.#reservations).map((entry) => ({ ...entry })), matches: { ...this.#matches }, lastMatch: this.#lastMatch ? { ...this.#lastMatch } : null }; } async #hydrate() { const stored = await this.#storage.get( MEDIA_HISTORY_KEY, emptySnapshot2() ); this.#entries = readEntries(stored).slice(-this.#limit); this.#reservations = readReservations(stored); this.#matches = readMatches(stored); this.#lastMatch = readLastMatch(stored); this.#loaded = true; if (!isCurrentSnapshot(stored)) { await this.#persist({}); } } /** * Folds this tab's entries into what is stored, under a cross-tab lock. * * Overwriting cost real work: two tabs saving media each wrote their own list, so the loser's * dedup keys disappeared and the same files were offered again as new. `added` is what this call * recorded -- never the whole local list -- then the same cap the in-memory list applies. */ async #persist(delta) { let added = 0; try { const merged = await mutateStored( this.#storage, MEDIA_HISTORY_KEY, emptySnapshot2(), (stored) => { const entries = readEntries(stored); const reservations = readReservations(stored); for (const entry of delta.added ?? []) { const existing = findEntry(entries, entry, false); if (existing) { const before = JSON.stringify(existing.quality); mergeEntry(entries, entry); if (JSON.stringify(existing.quality) !== before) added += 1; continue; } mergeEntry(entries, entry); added += 1; } const ordered = entries.sort( (left, right) => left.at < right.at ? -1 : left.at > right.at ? 1 : 0 ); const matches2 = readMatches(stored); if (delta.matched) { matches2[delta.matched.kind] += 1; } const storedLastMatch = readLastMatch(stored); const lastMatch = delta.matched && (!storedLastMatch || storedLastMatch.at <= delta.matched.at) ? delta.matched : storedLastMatch; return { schemaVersion: MEDIA_HISTORY_SCHEMA_VERSION, entries: ordered.slice(-this.#limit), reservations: reservations.slice(-MEDIA_HISTORY_RESERVATION_LIMIT), matches: matches2, lastMatch }; } ); this.#adopt(merged); } catch (error) { this.#onPersistError?.(error); } return added; } #adopt(snapshot) { this.#entries = readEntries(snapshot).slice(-this.#limit); this.#reservations = readReservations(snapshot); this.#matches = readMatches(snapshot); this.#lastMatch = readLastMatch(snapshot); } }; function readEntries(stored) { const entries = Array.isArray(stored?.entries) ? stored.entries : []; const normalized = []; for (const candidate of entries) { if (!candidate || typeof candidate !== "object" || typeof candidate.at !== "string") continue; if ("identityHash" in candidate && validHash(candidate.identityHash)) { const exactHash = validHash(candidate.exactHash) ? candidate.exactHash.toLowerCase() : void 0; const perceptualHash = validHash(candidate.perceptualHash) ? candidate.perceptualHash.toLowerCase() : void 0; mergeEntry(normalized, { identityHash: candidate.identityHash.toLowerCase(), ...exactHash ? { exactHash } : {}, ...perceptualHash ? { perceptualHash } : {}, quality: normalizeDownloadQuality("quality" in candidate ? candidate.quality : void 0), at: candidate.at }); continue; } if ("key" in candidate && typeof candidate.key === "string") { mergeEntry(normalized, { identityHash: legacyIdentityHash(candidate.key), quality: normalizeDownloadQuality(void 0), at: candidate.at }); } } return normalized; } function emptySnapshot2() { return { schemaVersion: MEDIA_HISTORY_SCHEMA_VERSION, entries: [], reservations: [], matches: emptyMatches(), lastMatch: null }; } function normalizeHistoryRange(options) { const from = normalizeDateInput(options.from, false); const to = normalizeDateInput(options.to, true); if (from && to && from.ms > to.ms) { throw new RangeError("The history start date must be on or before the end date."); } return { fromMs: from?.ms ?? Number.NEGATIVE_INFINITY, toMs: to?.ms ?? Number.POSITIVE_INFINITY, fromLabel: from?.label ?? null, toLabel: to?.label ?? null }; } function normalizeDateInput(value, endOfDay) { if (value === null || value === void 0 || value.trim() === "") return null; const trimmed = value.trim(); const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(trimmed); if (!match) throw new RangeError("History dates must use YYYY-MM-DD."); const date = /* @__PURE__ */ new Date(`${trimmed}T${endOfDay ? "23:59:59.999" : "00:00:00.000"}Z`); if (!Number.isFinite(date.getTime())) throw new RangeError("History date is invalid."); if (date.getUTCFullYear() !== Number(match[1]) || date.getUTCMonth() + 1 !== Number(match[2]) || date.getUTCDate() !== Number(match[3])) { throw new RangeError("History date is invalid."); } return { ms: date.getTime(), label: trimmed.replaceAll("-", "") }; } function csvCell(value) { const safe = value.replaceAll('"', '""'); return /[",\n\r]/.test(safe) ? `"${safe}"` : safe; } function readReservations(stored, now6 = Date.now()) { const candidates2 = Array.isArray(stored?.reservations) ? stored.reservations : []; const reservations = []; for (const candidate of candidates2) { if (!candidate || typeof candidate !== "object") continue; const value = candidate; if (!validToken(value.token) || !validHash(value.identityHash) || typeof value.at !== "string" || typeof value.expiresAt !== "number" || !Number.isFinite(value.expiresAt) || value.expiresAt <= now6) { continue; } reservations.push({ token: value.token, identityHash: value.identityHash.toLowerCase(), ...validHash(value.exactHash) ? { exactHash: value.exactHash.toLowerCase() } : {}, ...validHash(value.perceptualHash) ? { perceptualHash: value.perceptualHash.toLowerCase() } : {}, at: value.at, expiresAt: Math.trunc(value.expiresAt) }); } return reservations.slice(-MEDIA_HISTORY_RESERVATION_LIMIT); } function activeReservations(reservations, now6 = Date.now()) { return reservations.filter((entry) => entry.expiresAt > now6); } function snapshotFrom(stored, entries, reservations, limit) { return { schemaVersion: MEDIA_HISTORY_SCHEMA_VERSION, entries: entries.sort((left, right) => left.at < right.at ? -1 : left.at > right.at ? 1 : 0).slice(-limit), reservations: activeReservations(reservations).slice(-MEDIA_HISTORY_RESERVATION_LIMIT), matches: readMatches(stored), lastMatch: readLastMatch(stored) }; } function emptyMatches() { return { identity: 0, exact: 0, perceptual: 0 }; } function readMatches(stored) { const candidate = stored?.matches; return { identity: validCount(candidate?.identity), exact: validCount(candidate?.exact), perceptual: validCount(candidate?.perceptual) }; } function readLastMatch(stored) { const candidate = stored?.lastMatch; return candidate && isMatchKind(candidate.kind) && typeof candidate.at === "string" ? { kind: candidate.kind, at: candidate.at } : null; } function mergeEntry(entries, incoming) { const existing = entries.find( (entry) => entry.identityHash === incoming.identityHash || Boolean(entry.exactHash && incoming.exactHash && entry.exactHash === incoming.exactHash) ); if (!existing) { entries.push({ ...incoming }); return; } if (!existing.exactHash && incoming.exactHash) existing.exactHash = incoming.exactHash; if (!existing.perceptualHash && incoming.perceptualHash) { existing.perceptualHash = incoming.perceptualHash; } existing.quality = mergeQuality(existing.quality, incoming.quality); if (existing.at < incoming.at) existing.at = incoming.at; } function normalizeFingerprint(fingerprint2) { const identityHash = validHash(fingerprint2.identityHash) ? fingerprint2.identityHash.toLowerCase() : sha256Hex(new TextEncoder().encode(String(fingerprint2.identityHash))); const exactHash = validHash(fingerprint2.exactHash) ? fingerprint2.exactHash.toLowerCase() : void 0; const perceptualHash = validHash(fingerprint2.perceptualHash) ? fingerprint2.perceptualHash.toLowerCase() : void 0; return { identityHash, ...exactHash ? { exactHash } : {}, ...perceptualHash ? { perceptualHash } : {} }; } function legacyIdentityHash(key) { const parts = key.split(":"); const kind = parts.at(-1); const index = parts.at(-2); if (isMediaKind(kind) && /^\d+$/.test(index ?? "") && parts.length >= 4) { const source = parts.slice(1, -2).join(":"); return mediaIdentityHash(kind, source, /^https?:\/\//i.test(source) ? null : source); } return sha256Hex(new TextEncoder().encode(`aviary-media-legacy:${key}`)); } function isCurrentSnapshot(stored) { const now6 = Date.now(); return stored.schemaVersion === MEDIA_HISTORY_SCHEMA_VERSION && Array.isArray(stored.entries) && Array.isArray(stored.reservations) && stored.entries.every( (entry) => typeof entry === "object" && entry !== null && "identityHash" in entry && validHash(entry.identityHash) && !("key" in entry) && "quality" in entry && isDownloadQualityReceipt(entry.quality) ) && stored.reservations.every((entry) => isActiveStoredReservation(entry, now6)); } function findEntry(entries, fingerprint2, allowPerceptual) { const exact = fingerprint2.exactHash && entries.find((entry) => entry.exactHash === fingerprint2.exactHash); if (exact) return exact; const identity = entries.find((entry) => entry.identityHash === fingerprint2.identityHash); if (identity) return identity; if (allowPerceptual && fingerprint2.perceptualHash) { return entries.find( (entry) => entry.perceptualHash && hexadecimalHammingDistance(entry.perceptualHash, fingerprint2.perceptualHash) <= PERCEPTUAL_MATCH_DISTANCE ) ?? null; } return null; } function qualityRank(value) { return value.label === "original" ? 5 : value.label === "adaptive-remux" ? 4 : value.label === "best-direct" ? 3 : value.label === "fallback" ? 2 : 1; } function mergeQuality(existing, incoming) { const existingRank = qualityRank(existing); const incomingRank = qualityRank(incoming); if (incomingRank > existingRank) return { ...incoming }; if (incomingRank < existingRank) return { ...existing }; return { ...existing, width: incoming.width ?? existing.width, height: incoming.height ?? existing.height, bitrate: incoming.bitrate ?? existing.bitrate, mime: incoming.mime ?? existing.mime, // Codec evidence only ever arrives with its source, so the pair moves together or not at all. ...incoming.codec !== null ? { codec: incoming.codec, codecSource: incoming.codecSource } : {}, // Playback is one-way: a later observation that did not play does not unprove an earlier one. playbackProven: existing.playbackProven || incoming.playbackProven }; } function isActiveStoredReservation(value, now6) { if (!value || typeof value !== "object") return false; const entry = value; return validToken(entry.token) && validHash(entry.identityHash) && (entry.exactHash === void 0 || validHash(entry.exactHash)) && (entry.perceptualHash === void 0 || validHash(entry.perceptualHash)) && typeof entry.at === "string" && typeof entry.expiresAt === "number" && Number.isFinite(entry.expiresAt) && entry.expiresAt > now6; } function findFingerprintMatch(entries, reservations, fingerprint2, allowPerceptual) { const candidates2 = [...entries, ...reservations]; if (fingerprint2.exactHash && candidates2.some((entry) => entry.exactHash === fingerprint2.exactHash)) { return "exact"; } if (candidates2.some((entry) => entry.identityHash === fingerprint2.identityHash)) { return "identity"; } if (allowPerceptual && fingerprint2.perceptualHash) { for (const entry of candidates2) { if (entry.perceptualHash && hexadecimalHammingDistance(entry.perceptualHash, fingerprint2.perceptualHash) <= PERCEPTUAL_MATCH_DISTANCE) { return "perceptual"; } } } return null; } var reservationSequence = 0; function reservationToken(fingerprint2, now6) { reservationSequence += 1; return sha256Hex(new TextEncoder().encode( `${fingerprint2.exactHash ?? fingerprint2.identityHash}:${now6}:${reservationSequence}:${Math.random()}` )); } function validToken(value) { return typeof value === "string" && /^[0-9a-f]{64}$/i.test(value); } function validHash(value) { return typeof value === "string" && /^[0-9a-f]{64}$/i.test(value); } function validCount(value) { return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : 0; } function isMatchKind(value) { return value === "identity" || value === "exact" || value === "perceptual"; } function isMediaKind(value) { return value === "photo" || value === "video" || value === "thumbnail" || value === "audio" || value === "subtitle"; } // src/features/media/last-download.ts var LAST_DOWNLOAD_KEY = "aviary.media.last-download.v1"; async function rememberLastDownload(storage, input) { if (!isHttpUrl(input.url) || input.filename.trim().length === 0) return; try { await replaceStored(storage, LAST_DOWNLOAD_KEY, { ...input, filename: input.filename.slice(0, 240), downloadedAt: (/* @__PURE__ */ new Date()).toISOString() }); } catch { } } async function getLastDownload(storage) { const stored = await storage.get(LAST_DOWNLOAD_KEY, null); return isLastDownload(stored) ? stored : null; } function isLastDownload(value) { if (typeof value !== "object" || value === null) return false; const candidate = value; return typeof candidate.url === "string" && isHttpUrl(candidate.url) && typeof candidate.filename === "string" && candidate.filename.length > 0 && (candidate.kind === "photo" || candidate.kind === "video" || candidate.kind === "thumbnail" || candidate.kind === "audio" || candidate.kind === "subtitle") && typeof candidate.downloadedAt === "string"; } function isHttpUrl(value) { try { const parsed = new URL(value); return parsed.protocol === "http:" || parsed.protocol === "https:"; } catch { return false; } } // src/features/media/sidecar.ts var MAX_SIDECAR_TEXT = 1e4; function buildMediaSidecar(format, input) { if (format === "off") return null; const normalized = normalizeMediaSidecarInput(input); const extension = format === "json" ? "json" : "txt"; const filename = replaceExtension(normalized.mediaFilename, extension); if (format === "json") { const payload = { schemaVersion: 1, savedAt: normalized.savedAt, post: { handle: normalized.handle, tweetId: normalized.tweetId, text: normalized.text, permalink: normalized.permalink }, media: { kind: normalized.kind, filename: normalized.mediaFilename } }; return { filename, contentType: "application/json", data: new TextEncoder().encode(`${JSON.stringify(payload, null, 2)} `) }; } const lines = [ `Saved: ${normalized.savedAt}`, `Account: ${normalized.handle ? `@${normalized.handle}` : "unknown"}`, `Post ID: ${normalized.tweetId ?? "unknown"}`, `Post: ${normalized.permalink ?? "unavailable"}`, `Media: ${normalized.kind} (${normalized.mediaFilename})`, "", normalized.text ]; return { filename, contentType: "text/plain", data: new TextEncoder().encode(`${lines.join("\n")} `) }; } function mediaSidecarRequest(format, input) { if (format === "off") return void 0; const normalized = normalizeMediaSidecarInput({ ...input, savedAt: input.queuedAt ?? (/* @__PURE__ */ new Date()).toISOString() }); const { savedAt: queuedAt, ...metadata } = normalized; return { format, ...metadata, queuedAt }; } function normalizeMediaSidecarRequest(value) { if (!value || typeof value !== "object") return void 0; const record = value; if (record.format !== "json" && record.format !== "text") return void 0; if (typeof record.mediaFilename !== "string" || record.kind !== "photo" && record.kind !== "video" && record.kind !== "thumbnail" && record.kind !== "audio" && record.kind !== "subtitle") { return void 0; } const normalized = normalizeMediaSidecarInput({ mediaFilename: record.mediaFilename, kind: record.kind, handle: typeof record.handle === "string" ? record.handle : null, tweetId: typeof record.tweetId === "string" ? record.tweetId : null, text: typeof record.text === "string" ? record.text : "", permalink: typeof record.permalink === "string" ? record.permalink : null, savedAt: typeof record.queuedAt === "string" ? record.queuedAt : typeof record.savedAt === "string" ? record.savedAt : (/* @__PURE__ */ new Date()).toISOString() }); const { savedAt: queuedAt, ...metadata } = normalized; return { format: record.format, ...metadata, queuedAt }; } function saveMediaSidecar(request, savedAt = (/* @__PURE__ */ new Date()).toISOString()) { if (!request || typeof document === "undefined") return false; const artifact = buildMediaSidecar(request.format, { ...request, savedAt }); if (!artifact) return false; let url = null; try { const blob = new Blob([new Uint8Array(artifact.data)], { type: artifact.contentType }); url = URL.createObjectURL(blob); const anchor = document.createElement("a"); anchor.href = url; anchor.download = artifact.filename; anchor.rel = "noopener noreferrer"; document.body.append(anchor); anchor.click(); anchor.remove(); const handed = url; url = null; setTimeout(() => URL.revokeObjectURL(handed), 4e3); return true; } catch { return false; } finally { if (url !== null) URL.revokeObjectURL(url); } } function normalizeMediaSidecarInput(input) { return { mediaFilename: bounded(input.mediaFilename, 240) || "media", kind: input.kind, handle: nullable(input.handle, 80), tweetId: nullable(input.tweetId, 80), text: bounded(input.text, MAX_SIDECAR_TEXT), permalink: safePermalink(input.permalink), savedAt: validInstant(input.savedAt) ? input.savedAt : (/* @__PURE__ */ new Date()).toISOString() }; } function replaceExtension(filename, extension) { const slash = Math.max(filename.lastIndexOf("/"), filename.lastIndexOf("\\")); const dot = filename.lastIndexOf("."); const base = dot > slash ? filename.slice(0, dot) : filename; return `${base || "media"}.${extension}`; } function safePermalink(value) { if (!value || value.length > 2048) return null; try { const url = new URL(value); return url.protocol === "https:" || url.protocol === "http:" ? url.href : null; } catch { return null; } } function bounded(value, max) { return String(value ?? "").normalize("NFC").slice(0, max); } function nullable(value, max) { const normalized = value === null ? "" : bounded(value, max).trim(); return normalized || null; } function validInstant(value) { return typeof value === "string" && Number.isFinite(Date.parse(value)); } // src/features/media/queue.ts var MEDIA_QUEUE_KEY = "aviary.media.queue.v1"; var RECENT_LIMIT = 40; var QUEUE_LIMIT = 5e3; var DownloadQueue = class { #jobs = []; #listeners = /* @__PURE__ */ new Set(); #storage; #onPersistError; #seq = 0; #loaded = false; #persistTail = Promise.resolve(); #changeSequence = 0; #pendingChanges = []; #lastPersistFailure; constructor(storage, onPersistError) { this.#storage = storage; this.#onPersistError = onPersistError; } async load() { if (this.#loaded) return; this.#loaded = true; if (!this.#storage) return; try { const raw = await this.#storage.get(MEDIA_QUEUE_KEY, { sequence: 0, jobs: [] }); const jobs = Array.isArray(raw?.jobs) ? raw.jobs.filter(isDownloadJob).map(normalizeJob) : []; for (const job of jobs) { if (job.status === "running") { job.status = "paused"; job.resumeOnBoot = true; job.error = "Interrupted before completion; resume when ready."; } } this.#jobs.push(...jobs.slice(-QUEUE_LIMIT)); this.#seq = Math.max( Number.isFinite(raw?.sequence) ? Math.trunc(raw.sequence) : 0, ...this.#jobs.map((job) => sequenceFromId(job.id)) ); const interrupted = jobs.filter((job) => job.status === "paused" && job.resumeOnBoot).map((job) => ({ id: job.id, set: { status: "paused", resumeOnBoot: true, ...job.error ? { error: job.error } : {} } })); if (interrupted.length > 0) { this.#persist({ kind: "updates", updates: interrupted }); } this.#notify(); } catch (error) { this.#onPersistError?.(error); } } async flush() { await this.#persistTail; } /** Persists every queued item before a batch starts its first external handoff. */ async checkpoint() { const through = this.#changeSequence; await this.#persistTail; const failure = this.#lastPersistFailure; if (failure && failure.token <= through) { this.#lastPersistFailure = void 0; throw failure.error; } } enqueue(job) { const entry = { id: `job-${++this.#seq}-${randomSuffix()}`, status: "queued", resumeOnBoot: true, ...job }; this.#jobs.push(entry); this.#trim(); this.#persist({ kind: "add", job: cloneJob(entry), sequence: this.#seq }); this.#notify(); return entry; } /** Refreshes a queued target after a late metadata observation improves its direct URL. */ updateTarget(jobId, target) { const job = this.#jobs.find((entry) => entry.id === jobId); if (!job || job.status !== "queued" && job.status !== "paused") return false; job.url = target.url; if (target.fallbackUrls === void 0) delete job.fallbackUrls; else job.fallbackUrls = [...target.fallbackUrls]; if (target.fallbackQualities === void 0) delete job.fallbackQualities; else job.fallbackQualities = target.fallbackQualities.map((quality) => ({ ...quality })); if (target.quality === void 0) delete job.quality; else job.quality = { ...target.quality }; if (target.mediaId === void 0) delete job.mediaId; else job.mediaId = target.mediaId; const remove = []; if (target.fallbackUrls === void 0) remove.push("fallbackUrls"); if (target.fallbackQualities === void 0) remove.push("fallbackQualities"); if (target.quality === void 0) remove.push("quality"); if (target.mediaId === void 0) remove.push("mediaId"); this.#persist({ kind: "update", id: jobId, set: { url: target.url, ...target.fallbackUrls === void 0 ? {} : { fallbackUrls: [...target.fallbackUrls] }, ...target.fallbackQualities === void 0 ? {} : { fallbackQualities: target.fallbackQualities.map((quality) => ({ ...quality })) }, ...target.quality === void 0 ? {} : { quality: { ...target.quality } }, ...target.mediaId === void 0 ? {} : { mediaId: target.mediaId } }, ...remove.length > 0 ? { remove } : {} }); this.#notify(); return true; } mark(jobId, status, error) { const job = this.#jobs.find((entry) => entry.id === jobId); if (!job) { return; } if (status === "running" && !job.startedAt) { job.startedAt = (/* @__PURE__ */ new Date()).toISOString(); } if (status === "completed" || status === "failed" || status === "opened" || status === "duplicate") { job.finishedAt = (/* @__PURE__ */ new Date()).toISOString(); job.resumeOnBoot = false; delete job.downloadId; } if (status === "cancelled") { job.finishedAt = (/* @__PURE__ */ new Date()).toISOString(); job.resumeOnBoot = false; delete job.downloadId; } job.status = status; if (error) { job.error = error; } else if (status !== "failed") { delete job.error; } const set = { status }; const remove = []; if (status === "running" && job.startedAt) set.startedAt = job.startedAt; if (status === "completed" || status === "failed" || status === "opened" || status === "duplicate" || status === "cancelled") { if (job.finishedAt) set.finishedAt = job.finishedAt; set.resumeOnBoot = false; remove.push("downloadId"); } if (error) set.error = error; else if (status !== "failed") remove.push("error"); this.#persist({ kind: "update", id: jobId, set, remove }); this.#notify(); } trackDownload(jobId, downloadId) { const job = this.#jobs.find((entry) => entry.id === jobId); if (!job || !Number.isSafeInteger(downloadId) || downloadId < 0) return; job.downloadId = downloadId; this.#persist({ kind: "update", id: jobId, set: { downloadId } }); this.#notify(); } setQuality(jobId, quality) { const job = this.#jobs.find((entry) => entry.id === jobId); if (!job) return false; job.quality = { ...quality }; this.#persist({ kind: "update", id: jobId, set: { quality: { ...quality } } }); this.#notify(); return true; } /** Clears a retained browser id after reconciliation says the transfer is gone or failed. */ forgetDownload(jobId) { const job = this.#jobs.find((entry) => entry.id === jobId); if (!job || job.downloadId === void 0) return false; delete job.downloadId; this.#persist({ kind: "update", id: jobId, set: {}, remove: ["downloadId"] }); this.#notify(); return true; } pause(jobId) { const job = this.#jobs.find((entry) => entry.id === jobId); if (!job || job.status === "completed" || job.status === "failed" || job.status === "opened" || job.status === "duplicate" || job.status === "cancelled") return false; job.status = "paused"; job.resumeOnBoot = false; job.error = "Paused by user."; this.#persist({ kind: "update", id: jobId, set: { status: "paused", resumeOnBoot: false, error: "Paused by user." } }); this.#notify(); return true; } resume(jobId) { const job = this.#jobs.find((entry) => entry.id === jobId); if (!job || job.status !== "paused" && job.status !== "queued") return false; job.status = "queued"; job.resumeOnBoot = false; delete job.error; this.#persist({ kind: "update", id: jobId, set: { status: "queued", resumeOnBoot: false }, remove: ["error"] }); this.#notify(); return true; } cancel(jobId) { const job = this.#jobs.find((entry) => entry.id === jobId); if (!job || job.status === "completed" || job.status === "failed" || job.status === "opened" || job.status === "duplicate" || job.status === "cancelled") return false; job.status = "cancelled"; job.resumeOnBoot = false; job.finishedAt = (/* @__PURE__ */ new Date()).toISOString(); this.#persist({ kind: "update", id: jobId, set: { status: "cancelled", resumeOnBoot: false, finishedAt: job.finishedAt } }); this.#notify(); return true; } retryFailed() { const retryable = this.#jobs.filter( (job) => job.status === "failed" || job.status === "cancelled" ); for (const job of retryable) { job.status = "queued"; job.resumeOnBoot = true; delete job.error; delete job.finishedAt; } if (retryable.length > 0) { this.#persist({ kind: "updates", updates: retryable.map((job) => ({ id: job.id, set: { status: "queued", resumeOnBoot: true }, remove: ["error", "finishedAt"] })) }); this.#notify(); } return retryable.map((job) => ({ ...job })); } pending(resumeOnBoot = false) { return this.#jobs.filter((job) => (job.status === "queued" || job.status === "paused") && (!resumeOnBoot || job.resumeOnBoot === true)).map((job) => ({ ...job })); } snapshot() { const counts = { queued: 0, running: 0, completed: 0, failed: 0, opened: 0, duplicate: 0, paused: 0, cancelled: 0 }; for (const job of this.#jobs) { counts[job.status] += 1; } return { total: this.#jobs.length, queued: counts.queued, running: counts.running, completed: counts.completed, failed: counts.failed, opened: counts.opened, duplicate: counts.duplicate, paused: counts.paused, cancelled: counts.cancelled, recent: this.#jobs.slice(-RECENT_LIMIT) }; } subscribe(listener) { this.#listeners.add(listener); listener(this.snapshot()); return () => { this.#listeners.delete(listener); }; } clear() { this.#jobs.length = 0; this.#persist({ kind: "clear", sequence: this.#seq }); this.#notify(); } remove(jobId) { const index = this.#jobs.findIndex((job) => job.id === jobId); if (index < 0) return false; this.#jobs.splice(index, 1); this.#persist({ kind: "remove", id: jobId }); this.#notify(); return true; } #trim() { while (this.#jobs.length > QUEUE_LIMIT) { this.#jobs.shift(); } } #notify() { const snapshot = this.snapshot(); for (const listener of this.#listeners) { try { listener(snapshot); } catch { } } } #persist(change) { void this.#queuePersist(change).catch(() => void 0); } #queuePersist(change) { if (!this.#storage) return Promise.resolve(); const token = ++this.#changeSequence; this.#pendingChanges.push({ token, change }); const write = this.#persistTail.then( () => mutateStored( this.#storage, MEDIA_QUEUE_KEY, { sequence: 0, jobs: [] }, (stored) => applyQueueChange(stored, change) ) ).then((next) => { this.#pendingChanges = this.#pendingChanges.filter((entry) => entry.token !== token); this.#adopt(next, change); for (const pending of this.#pendingChanges) { this.#adopt(applyQueueChange(this.#currentState(), pending.change)); } }); this.#persistTail = write.catch((error) => { this.#pendingChanges = this.#pendingChanges.filter((entry) => entry.token !== token); this.#lastPersistFailure = { token, error }; this.#onPersistError?.(error); }); return write; } #currentState() { return { sequence: this.#seq, jobs: this.#jobs.map(cloneJob) }; } #adopt(next, change) { const normalized = normalizeQueueState(next); const preserveMissing = change?.kind === "update" || change?.kind === "updates"; const existing = preserveMissing ? new Map(this.#jobs.map((job) => [job.id, cloneJob(job)])) : void 0; if (existing) { for (const job of normalized.jobs) existing.set(job.id, cloneJob(job)); for (const job of existing.values()) { if (!normalized.jobs.some((entry) => entry.id === job.id)) normalized.jobs.push(job); } } this.#jobs.length = 0; this.#jobs.push(...normalized.jobs.map(cloneJob)); this.#seq = Math.max(normalized.sequence, ...this.#jobs.map((job) => sequenceFromId(job.id))); } }; function isDownloadJob(value) { if (!value || typeof value !== "object") return false; const record = value; return typeof record.id === "string" && typeof record.url === "string" && typeof record.filename === "string"; } function normalizeJob(value) { const valid = value.status === "queued" || value.status === "running" || value.status === "completed" || value.status === "failed" || value.status === "opened" || value.status === "duplicate" || value.status === "paused" || value.status === "cancelled"; const sidecar = normalizeMediaSidecarRequest(value.sidecar); return { id: value.id, url: value.url, ...Array.isArray(value.fallbackUrls) ? { fallbackUrls: value.fallbackUrls.filter((url) => typeof url === "string" && /^https?:\/\//i.test(url)).slice(0, 8) } : {}, ...Array.isArray(value.fallbackQualities) ? { fallbackQualities: value.fallbackQualities.map(normalizeQuality) } : {}, filename: value.filename, ...value.kind === "photo" || value.kind === "video" || value.kind === "thumbnail" || value.kind === "audio" || value.kind === "subtitle" ? { kind: value.kind } : {}, ...typeof value.mediaId === "string" ? { mediaId: value.mediaId.slice(0, 160) } : value.mediaId === null ? { mediaId: null } : {}, ...value.quality ? { quality: normalizeQuality(value.quality) } : {}, ...sidecar ? { sidecar } : {}, ...typeof value.downloadId === "number" && Number.isSafeInteger(value.downloadId) && value.downloadId >= 0 ? { downloadId: value.downloadId } : {}, status: valid ? value.status : "failed", ...typeof value.error === "string" ? { error: value.error } : {}, ...typeof value.startedAt === "string" ? { startedAt: value.startedAt } : {}, ...typeof value.finishedAt === "string" ? { finishedAt: value.finishedAt } : {}, resumeOnBoot: value.resumeOnBoot === true }; } function sequenceFromId(id) { const match = /^job-(\d+)/.exec(id); return match ? Number.parseInt(match[1], 10) : 0; } function randomSuffix() { const uuid = globalThis.crypto?.randomUUID?.(); if (uuid) return uuid.replaceAll("-", "").slice(0, 12); return Math.random().toString(36).slice(2, 14); } function cloneJob(job) { return { ...job, ...job.fallbackUrls ? { fallbackUrls: [...job.fallbackUrls] } : {}, ...job.fallbackQualities ? { fallbackQualities: job.fallbackQualities.map((quality) => ({ ...quality })) } : {}, ...job.sidecar ? { sidecar: { ...job.sidecar } } : {}, ...job.quality ? { quality: { ...job.quality } } : {} }; } function normalizeQuality(value) { return normalizeDownloadQuality(value); } function normalizeQueueState(value) { if (!value || typeof value !== "object") return { sequence: 0, jobs: [] }; const raw = value; const jobs = Array.isArray(raw.jobs) ? raw.jobs.filter(isDownloadJob).map(normalizeJob).slice(-QUEUE_LIMIT) : []; const sequence = Math.max( Number.isFinite(raw.sequence) ? Math.trunc(raw.sequence) : 0, ...jobs.map((job) => sequenceFromId(job.id)) ); return { sequence, jobs }; } function applyQueueChange(value, change) { const state2 = normalizeQueueState(value); if (change.kind === "clear") { return { sequence: Math.max(state2.sequence, change.sequence), jobs: [] }; } const byId = new Map(state2.jobs.map((job) => [job.id, cloneJob(job)])); if (change.kind === "add") { byId.set(change.job.id, cloneJob(change.job)); } else if (change.kind === "remove") { byId.delete(change.id); } else { const updates = change.kind === "update" ? [change] : change.updates; for (const update of updates) { const current = byId.get(update.id); if (!current) continue; const next = { ...current, ...update.set }; for (const field2 of update.remove ?? []) delete next[field2]; byId.set(update.id, next); } } return { sequence: Math.max(state2.sequence, change.kind === "add" ? change.sequence : 0), jobs: [...byId.values()].slice(-QUEUE_LIMIT) }; } // src/features/media/template.ts var FORBIDDEN = /[<>:"/\\|?*\u0000-\u001f]/g; var COLLAPSING_WHITESPACE = /\s+/g; function renderFilename(template, fields) { const datePart = formatDate(fields.date); const safeHandle = sanitizeSegment(fields.handle ?? "unknown"); const safeText = sanitizeSegment(fields.text).slice(0, 60); const tweetId = sanitizeSegment(fields.tweetId ?? "0"); const mediaId = sanitizeSegment(fields.mediaId ?? tweetId); const indexLabel = String(fields.index + 1).padStart(2, "0"); const totalLabel = String(Math.max(fields.total, 1)).padStart(2, "0"); const substitutions = { handle: safeHandle, account: safeHandle, tweetId, mediaId, index: indexLabel, total: totalLabel, date: datePart, text: safeText, ext: fields.ext.toLowerCase() }; let name = template.replace(/\{(\w+)\}/g, (match, key) => { const value = substitutions[key]; return value === void 0 ? match : value; }).replace(/[\\/]+/g, "/").trim(); if (name.length === 0) { name = `${safeHandle}_${tweetId}_${indexLabel}`; } if (!name.toLowerCase().endsWith(`.${fields.ext.toLowerCase()}`)) { name = `${name}.${fields.ext.toLowerCase()}`; } return name; } function sanitizeSegment(value) { return value.replace(FORBIDDEN, "").replace(COLLAPSING_WHITESPACE, " ").trim(); } function formatDate(date) { const y = date.getUTCFullYear(); const m = String(date.getUTCMonth() + 1).padStart(2, "0"); const d = String(date.getUTCDate()).padStart(2, "0"); return `${y}-${m}-${d}`; } // src/features/media/media-buttons.ts var STYLE_ID4 = "av-media-buttons"; var BUTTON_ATTR = "data-av-media-button"; var ACTION_ATTR = "data-av-media-action"; var COPY_ACTION_ATTR = "data-av-media-copy"; var ACTION_SLOT_ATTR = "data-av-media-action-slot"; var HELPER_SLOT_ATTR = "data-av-media-helper-slot"; var HELPER_ACTION_ATTR = "data-av-media-helper-action"; var PROCESSED_ATTR = "data-av-media-processed"; var DOWNLOADED_ATTR = "data-av-downloaded"; var MEDIA_HOST_SELECTOR = '[data-testid="tweetPhoto"], [data-testid="videoPlayer"], [data-testid="videoComponent"], audio'; var MEDIA_MUTATION_SELECTOR = '[data-testid="tweetPhoto"], [data-testid="tweetPhoto"] img, [data-testid="videoPlayer"], [data-testid="videoComponent"], video, source, audio, track, [role="group"], [data-testid="reply"]'; var CONTEXT_TARGET_MAX_AGE_MS = 3e4; var downloader; var downloadWatcher = sharedDownloadWatcher(); var history; var aria2History; var queue; var appliedPreferOriginalImages; var appliedCopyMediaLinks; var appliedMetadataVersion; var mediaMetadataCache = new MediaMetadataCache(); var subscribedBridge2; var permissionSurfaceOpened = false; var pendingContextTarget; var contextMenuListener; var extensionMessageListener; var buttonResetTimers = /* @__PURE__ */ new WeakMap(); var mediaButtonsFeature = { id: "media.buttons", title: "One-click media", category: "media", async init(ctx) { if (ctx.settings.media.buttons) { subscribeToMediaMetadata(ctx); } downloadWatcher.start(); if (ctx.settings.media.buttons) { ensureMediaStyle(); } aria2History = new Aria2History(ctx.storage); await aria2History.load(); if (ctx.settings.integrations.aria2.enabled && ctx.settings.integrations.aria2.endpoint) { try { await aria2History.reconcile({ endpoint: ctx.settings.integrations.aria2.endpoint, secret: ctx.settings.integrations.aria2.secret }); } catch (error) { ctx.diagnostics.warn("Aria2 history reconcile skipped", errorDetails2(error)); } } downloader = createDownloader({ integrations: ctx.settings.integrations, aria2History, onWarn: (message, details) => ctx.diagnostics.warn(message, details) }); queue = new DownloadQueue(ctx.storage, (error) => { ctx.diagnostics.error("Media queue failed to save", errorDetails2(error)); }); await queue.load(); history = new MediaHistory(ctx.storage, void 0, (error) => { ctx.diagnostics.error("Media history failed to save", errorDetails2(error)); }); try { await history.load(); } catch (error) { ctx.diagnostics.warn("Media history failed to load", errorDetails2(error)); } installContextDownload(ctx); applyToggleClass(ctx); appliedPreferOriginalImages = ctx.settings.media.preferOriginalImages; appliedCopyMediaLinks = ctx.settings.media.copyMediaLinks; appliedMetadataVersion = mediaMetadataCache.version; scanArticles(document, ctx); ctx.diagnostics.info("Media buttons initialized", { history: history.size() }); }, apply(ctx, root, addedNodes) { applyToggleClass(ctx); if (!ctx.settings.media.buttons) { unsubscribeFromMediaMetadata(); clearDecorations(); pendingContextTarget = void 0; appliedPreferOriginalImages = void 0; appliedCopyMediaLinks = void 0; appliedMetadataVersion = void 0; return; } subscribeToMediaMetadata(ctx); if (appliedPreferOriginalImages !== void 0 && appliedPreferOriginalImages !== ctx.settings.media.preferOriginalImages) { clearDecorations(); } if (appliedCopyMediaLinks !== void 0 && appliedCopyMediaLinks !== ctx.settings.media.copyMediaLinks) { clearDecorations(); } if (appliedMetadataVersion !== void 0 && appliedMetadataVersion !== mediaMetadataCache.version) { clearDecorations(); } appliedPreferOriginalImages = ctx.settings.media.preferOriginalImages; appliedCopyMediaLinks = ctx.settings.media.copyMediaLinks; appliedMetadataVersion = mediaMetadataCache.version; ensureMediaStyle(); if (!addedNodes || addedNodes.length === 0) { scanArticles(root, ctx); return; } for (const node of addedNodes) { if (node.hasAttribute(BUTTON_ATTR) || node.hasAttribute(COPY_ACTION_ATTR) || node.hasAttribute(ACTION_SLOT_ATTR) || node.hasAttribute(HELPER_SLOT_ATTR) || node.hasAttribute(HELPER_ACTION_ATTR)) { continue; } if (needsMutationReconcile(node)) { scanArticles(node, ctx, true); } } }, async destroy(ctx) { uninstallContextDownload(); downloadWatcher.stop(); clearDecorations(); downloader = void 0; history = void 0; aria2History = void 0; await queue?.flush(); queue = void 0; appliedPreferOriginalImages = void 0; appliedCopyMediaLinks = void 0; appliedMetadataVersion = void 0; mediaMetadataCache.clear(); removeFeatureToast(); unsubscribeFromMediaMetadata(); subscribedBridge2 = void 0; ctx.diagnostics.info("Media buttons destroyed"); }, getStatus() { if (!queue) { return { ok: true, message: "Media buttons idle" }; } const snapshot = queue.snapshot(); return { ok: snapshot.failed === 0, message: `Downloads: ${snapshot.completed} ok / ${snapshot.duplicate} dup / ${snapshot.failed} fail`, details: { ...snapshot } }; } }; function getMediaQueue() { return queue; } function getMediaHistory() { return history; } function refreshMediaDownloadMarkers(ctx) { clearDecorations(); if (!ctx.settings.media.buttons) return; ensureMediaStyle(); scanArticles(document, ctx); } function getCapturedMediaMetadata(args) { return mediaMetadataCache.find(args.tweetId, args.mediaId, args.poster); } var graphqlHandler; var mediaMetadataHandler; function subscribeToMediaMetadata(ctx) { const bridge = ctx.pageBridge; if (!bridge || subscribedBridge2 === bridge) { return; } unsubscribeFromMediaMetadata(); subscribedBridge2 = bridge; const onMediaMetadata = bridge.onMediaMetadata; const ingest = (payload) => { const changed = onMediaMetadata ? mediaMetadataCache.ingestMetadata([payload]) : mediaMetadataCache.ingest(payload); if (changed > 0 && ctx.settings.media.buttons) { ctx.requestApply(); } }; if (typeof onMediaMetadata === "function") { mediaMetadataHandler = ingest; onMediaMetadata.call(bridge, mediaMetadataHandler); } else { graphqlHandler = ingest; bridge.on("graphql", graphqlHandler); } } function unsubscribeFromMediaMetadata() { if (graphqlHandler) subscribedBridge2?.off("graphql", graphqlHandler); if (mediaMetadataHandler) subscribedBridge2?.offMediaMetadata(mediaMetadataHandler); graphqlHandler = void 0; mediaMetadataHandler = void 0; } function applyToggleClass(ctx) { document.documentElement.classList.toggle( "av-media-buttons-enabled", ctx.settings.media.buttons ); } function clearDecorations() { document.getElementById(STYLE_ID4)?.remove(); document.documentElement.classList.remove("av-media-buttons-enabled"); for (const article of Array.from(document.querySelectorAll(`[${PROCESSED_ATTR}]`))) { article.removeAttribute(PROCESSED_ATTR); } for (const button3 of Array.from(document.querySelectorAll(`[${BUTTON_ATTR}]`))) { button3.remove(); } for (const slot of Array.from(document.querySelectorAll(`[${ACTION_SLOT_ATTR}]`))) { slot.remove(); } for (const slot of Array.from(document.querySelectorAll(`[${HELPER_SLOT_ATTR}]`))) { slot.remove(); } } function installContextDownload(ctx) { const runtime = globalThis.chrome?.runtime; if (!runtime?.id || !runtime.onMessage || contextMenuListener || extensionMessageListener) { return; } contextMenuListener = (event) => { pendingContextTarget = ctx.settings.media.buttons ? contextTarget(event.target) : void 0; }; document.addEventListener("contextmenu", contextMenuListener, true); extensionMessageListener = (message, sender, sendResponse) => { if (isMediaContextPermissionDeniedMessage(message, sender)) { showFeatureToast( ft(ctx, "Download access was not granted. Open Aviary Options to enable browser downloads."), { tone: "error", ctx } ); sendResponse({ ok: false, reason: "permission-denied" }); return false; } if (!isMediaContextDownloadMessage(message, sender)) { return false; } void downloadContextTarget(ctx).then( (ok) => sendResponse({ ok }), (error) => { ctx.diagnostics.error("Context media download failed", errorDetails2(error)); showFeatureToast(ft(ctx, "Media download failed. Try the on-post button again."), { tone: "error", ctx }); sendResponse({ ok: false, error: error instanceof Error ? error.message : String(error) }); } ); return true; }; runtime.onMessage.addListener(extensionMessageListener); } function uninstallContextDownload() { if (contextMenuListener) { document.removeEventListener("contextmenu", contextMenuListener, true); contextMenuListener = void 0; } const onMessage = globalThis.chrome?.runtime?.onMessage; if (extensionMessageListener && onMessage?.removeListener) { onMessage.removeListener(extensionMessageListener); } extensionMessageListener = void 0; pendingContextTarget = void 0; } function contextTarget(rawTarget) { if (!(rawTarget instanceof Element)) { return void 0; } const host = rawTarget.closest(VIDEO_CONTAINER_SELECTOR) ?? rawTarget.closest('[data-testid="tweetPhoto"]'); const article = host?.closest('article[data-testid="tweet"]'); if (!host || !article) { return void 0; } return { article, host, capturedAt: Date.now() }; } async function downloadContextTarget(ctx) { const pending = pendingContextTarget; pendingContextTarget = void 0; if (!ctx.settings.media.buttons || !pending || !pending.article.isConnected || !pending.host.isConnected || Date.now() - pending.capturedAt > CONTEXT_TARGET_MAX_AGE_MS) { showFeatureToast(ft(ctx, "Right-click an image or video first, then choose Aviary download."), { tone: "error", ctx }); return false; } const tweet = extractTweetForContext(pending.article, ctx); const wantsVideo = pending.host.matches(VIDEO_CONTAINER_SELECTOR); const index = tweet.media.findIndex((media2) => { const target = resolveTarget(media2); if (wantsVideo) { return media2.kind === "video" && media2.video?.container === pending.host && target !== null && target.helperOnly !== true; } return media2.kind === "photo" && media2.source.closest('[data-testid="tweetPhoto"]') === pending.host && target !== null && target.helperOnly !== true; }); const media = tweet.media[index]; if (!media) { showFeatureToast( ft( ctx, wantsVideo ? "The direct video is still loading. Try again in a moment." : "This image is not available to download." ), { tone: "error", ctx } ); return false; } const container = resolveContainer(media); if (!container) { return false; } let button3 = container.querySelector( `[${BUTTON_ATTR}="${media.kind}"]` ); if (!button3) { button3 = buildButton(media, index, tweet, ctx); container.append(button3); positionButton(button3, container); } await handleDownload(media, index, tweet, ctx, button3); return true; } function extractTweetForContext(article, ctx) { return extractTweet(article, { preferOriginalImages: ctx.settings.media.preferOriginalImages, mediaMetadata: ({ tweetId, mediaId, poster }) => mediaMetadataCache.find(tweetId, mediaId, poster) }); } function scanArticles(root, ctx, force = false) { if (!ctx.settings.media.buttons) { return; } const articles = collectArticles(root); for (const article of articles) { if (!force && article.getAttribute(PROCESSED_ATTR) === "1") { if (article.querySelector(`[${BUTTON_ATTR}]`) && (article.querySelector(`[${ACTION_ATTR}]`) || !findActionGroup(article)) || !article.querySelector(MEDIA_HOST_SELECTOR)) { continue; } } const tweet = extractTweetForContext(article, ctx); if (tweet.media.length === 0) { article.setAttribute(PROCESSED_ATTR, "1"); continue; } decorateArticle(tweet, ctx); article.setAttribute(PROCESSED_ATTR, "1"); } } function needsMutationReconcile(node) { const closestArticle = node.closest('article[data-testid="tweet"]'); if (closestArticle && closestArticle.getAttribute(PROCESSED_ATTR) !== "1") { return true; } if (node.matches('article[data-testid="tweet"]')) { return node.getAttribute(PROCESSED_ATTR) !== "1" || (!node.querySelector(`[${BUTTON_ATTR}]`) || findActionGroup(node) !== null && !node.querySelector(`[${ACTION_ATTR}]`)) && node.querySelector(MEDIA_HOST_SELECTOR) !== null; } return node.matches(MEDIA_MUTATION_SELECTOR) || node.querySelector(MEDIA_MUTATION_SELECTOR) !== null; } function collectArticles(root) { const found = /* @__PURE__ */ new Set(); if (root instanceof Element) { const article = root.matches('article[data-testid="tweet"]') ? root : root.closest('article[data-testid="tweet"]'); if (article) { found.add(article); } } if ("querySelectorAll" in root) { for (const article of Array.from( root.querySelectorAll('article[data-testid="tweet"]') )) { found.add(article); } } return [...found]; } function decorateArticle(tweet, ctx) { decoratePostAction(tweet, ctx); tweet.media.forEach((media, index) => { const container = resolveContainer(media); if (!container || hasOwnButton(container, media.kind)) { return; } const target = resolveTarget(media); if (!target || target.helperOnly) { return; } const button3 = buildButton(media, index, tweet, ctx); container.append(button3); positionButton(button3, container); }); } function decoratePostAction(tweet, ctx) { const group = findActionGroup(tweet.article); if (group?.querySelector(`[${ACTION_ATTR}], [${HELPER_ACTION_ATTR}]`)) { return; } if (!group) return; const assets = primaryDownloadAssets(tweet); const adaptiveAssets = primaryAdaptiveAssets(tweet); const hasPendingVideo = tweet.media.some((media) => media.kind === "video" && resolveTarget(media) === null) || tweet.article.querySelector(VIDEO_CONTAINER_SELECTOR) !== null && !tweet.media.some((media) => media.kind === "video"); if (assets.length === 0 && adaptiveAssets.length === 0 && !hasPendingVideo) { return; } if (assets.length > 0 || hasPendingVideo) { const slot = document.createElement("div"); slot.className = "av-media-action-slot"; slot.setAttribute(ACTION_SLOT_ATTR, "1"); const button3 = buildPostAction(tweet, hasPendingVideo ? [] : assets, ctx); slot.append(button3); if (ctx.settings.media.copyMediaLinks && !hasPendingVideo && assets.length > 0) { slot.append(buildCopyMediaAction(assets, ctx)); } group.append(slot); } for (const asset of adaptiveAssets) { group.append(buildYtDlpSlot(tweet, asset, ctx)); } } function findActionGroup(article) { const reply = article.querySelector('[data-testid="reply"]'); const group = reply?.closest('[role="group"]') ?? null; return group && article.contains(group) ? group : null; } function primaryDownloadAssets(tweet) { const assets = []; tweet.media.forEach((media, index) => { if (media.kind !== "photo" && media.kind !== "video" && media.kind !== "audio" && media.kind !== "subtitle") { return; } if (media.owner.scope !== "post") { return; } const target = resolveTarget(media); if (target && !target.helperOnly) { assets.push({ media, index, target }); } }); return assets; } function primaryAdaptiveAssets(tweet) { const assets = []; tweet.media.forEach((media, index) => { if (media.kind !== "video" || media.owner.scope !== "post" || !media.video) return; const direct = media.video.variants.filter((variant) => isSaveableVariantUrl(variant.url, variant.type)).sort((left, right) => compareVariantQuality(right, left))[0] ?? null; const candidate = bestObservedAdaptive(media.video.variants); if (candidate && shouldOfferAdaptiveHelper(direct, media.video.variants)) { assets.push({ media, index, candidate }); } }); return assets; } function buildPostAction(tweet, assets, ctx) { const button3 = document.createElement("button"); button3.type = "button"; button3.className = "av-media-action"; button3.setAttribute(ACTION_ATTR, "1"); const idleLabel = primaryAdaptiveAssets(tweet).length > 0 ? ft(ctx, "Download \xB7 Best direct MP4") : ft(ctx, "Download"); const accessibleLabel = tweet.media.some((media) => media.owner.scope !== "post") ? ft(ctx, "Download this post's own media. Quoted and card media has its own Download button.") : ft(ctx, "Download all media in this post"); button3.dataset.idleLabel = idleLabel; button3.dataset.idleIcon = "\u2193"; button3.dataset.baseIdleAriaLabel = accessibleLabel; button3.dataset.idleAriaLabel = accessibleLabel; button3.setAttribute("aria-label", accessibleLabel); button3.setAttribute("aria-live", "polite"); button3.setAttribute("aria-busy", "false"); const icon = document.createElement("span"); icon.className = "av-media-action-icon"; icon.setAttribute("aria-hidden", "true"); icon.textContent = "\u2193 "; const label = document.createElement("span"); label.className = "av-media-action-label"; label.textContent = idleLabel; button3.append(icon, label); if (assets.length > 0) { setDownloadedMarker( button3, assets.every((asset) => wasDownloaded(asset.media.kind, asset.target)), ctx ); } if (assets.length === 0) { button3.dataset.pendingVideo = "true"; button3.setAttribute( "aria-label", ft(ctx, "The direct video is still loading. Try again in a moment.") ); button3.addEventListener("click", (event) => { event.stopPropagation(); event.preventDefault(); void handlePendingPostDownload(tweet.article, ctx, button3); }); return button3; } const completed = /* @__PURE__ */ new Set(); button3.addEventListener("click", (event) => { event.stopPropagation(); event.preventDefault(); void handlePostDownload(tweet, assets, completed, ctx, button3); }); return button3; } function buildCopyMediaAction(assets, ctx) { const button3 = document.createElement("button"); button3.type = "button"; button3.className = "av-media-action av-media-copy-action"; button3.setAttribute(ACTION_ATTR, "copy"); button3.setAttribute(COPY_ACTION_ATTR, "1"); const idleLabel = ft(ctx, "Copy links"); const accessibleLabel = ft(ctx, "Copy this post's best direct media links"); button3.dataset.idleLabel = idleLabel; button3.dataset.idleIcon = "\u29C9"; button3.dataset.baseIdleAriaLabel = accessibleLabel; button3.dataset.idleAriaLabel = accessibleLabel; button3.setAttribute("aria-label", accessibleLabel); button3.setAttribute("aria-live", "polite"); button3.setAttribute("aria-busy", "false"); const icon = document.createElement("span"); icon.className = "av-media-action-icon"; icon.setAttribute("aria-hidden", "true"); icon.textContent = "\u29C9 "; const label = document.createElement("span"); label.className = "av-media-action-label"; label.textContent = idleLabel; button3.append(icon, label); const urls = [...new Set(assets.map((asset) => asset.target.url))]; button3.addEventListener("click", (event) => { event.stopPropagation(); event.preventDefault(); void copyMediaLinks(urls, button3, ctx); }); return button3; } async function copyMediaLinks(urls, button3, ctx) { try { const clipboard = globalThis.navigator?.clipboard; if (!clipboard?.writeText) throw new Error("This browser exposes no clipboard write."); await clipboard.writeText(urls.join("\n")); setButtonFeedback(button3, { label: ft(ctx, "Copied"), icon: "\u2713", className: "is-success" }); void ctx.auditLog.record("media.links.copied", { count: urls.length }); } catch (error) { setButtonFeedback(button3, { label: ft(ctx, "Failed"), icon: "!", className: "is-error" }); ctx.diagnostics.warn("Media links could not be copied", errorDetails2(error)); showFeatureToast(ft(ctx, "The clipboard refused this copy."), { tone: "error", ctx }); } scheduleButtonRestore(button3); } function buildYtDlpSlot(tweet, asset, ctx) { const slot = document.createElement("div"); slot.className = "av-media-helper-slot"; slot.setAttribute(HELPER_SLOT_ATTR, "1"); const height = asset.candidate.variant.height; const quality = height ? `${height}p` : ft(ctx, "adaptive"); const request = helperRequest(tweet, asset, ctx); const send = document.createElement("button"); send.type = "button"; send.className = "av-media-helper-button av-media-helper-send"; send.setAttribute(HELPER_ACTION_ATTR, "send"); send.textContent = ft(ctx, "Send to yt-dlp"); send.setAttribute("aria-label", ft(ctx, "Send the observed adaptive video to local yt-dlp")); send.dataset.idleLabel = send.textContent; send.addEventListener("click", (event) => { event.stopPropagation(); event.preventDefault(); void sendYtDlp(request, send, ctx); }); const copy2 = document.createElement("button"); copy2.type = "button"; copy2.className = "av-media-helper-button av-media-helper-copy"; copy2.setAttribute(HELPER_ACTION_ATTR, "copy"); copy2.textContent = ft(ctx, "Copy yt-dlp command"); copy2.setAttribute("aria-label", ft(ctx, "Copy the yt-dlp command for the observed adaptive video")); copy2.addEventListener("click", (event) => { event.stopPropagation(); event.preventDefault(); void copyYtDlpCommand(request, copy2, ctx); }); slot.append(send, copy2); slot.setAttribute("aria-label", ft(ctx, "Higher quality adaptive video") + ` \xB7 ${quality}`); return slot; } function helperRequest(tweet, asset, ctx) { const identity = mediaIdentity(tweet, asset.media); const baseFilename = renderFilename(ctx.settings.media.filenameTemplate, { handle: identity.handle, tweetId: identity.tweetId, index: asset.index, total: tweet.media.length, date: /* @__PURE__ */ new Date(), ext: "mp4", text: identity.text, mediaId: asset.candidate.variant.url.match(/\/([A-Za-z0-9_-]{6,})\.(?:m3u8|mpd)(?:[?#]|$)/i)?.[1] ?? null }).replace(/\.mp4$/i, ".%(ext)s"); return { manifestUrl: asset.candidate.manifestUrl, filename: baseFilename, formatPolicy: YTDLP_FORMAT_POLICY }; } async function sendYtDlp(request, button3, ctx) { setHelperFeedback(button3, ft(ctx, "Sending\u2026"), true, "running"); try { const result = await handoffToYtDlp(ctx.settings.integrations.ytDlp, request); if (result.state === "refused") { setHelperFeedback(button3, ft(ctx, "Refused"), false, "refused"); showFeatureToast(result.error ?? ft(ctx, "The local yt-dlp helper refused this job."), { tone: "error", ctx }); return; } if (result.state === "failed" || !result.jobId) { setHelperFeedback(button3, ft(ctx, "Failed"), false, "failed"); showFeatureToast(result.error ?? ft(ctx, "The local yt-dlp helper failed."), { tone: "error", ctx }); return; } const terminal = await waitForYtDlp(ctx.settings.integrations.ytDlp, result.jobId); if (terminal.state === "completed") { setHelperFeedback(button3, ft(ctx, "Saved"), false, "completed"); showFeatureToast(ft(ctx, "Adaptive video saved by yt-dlp."), { tone: "info", ctx }); } else if (terminal.state === "missing") { setHelperFeedback(button3, ft(ctx, "Missing"), false, "missing"); showFeatureToast(ft(ctx, "The yt-dlp job is no longer available. Copy the command to retry."), { tone: "error", ctx }); } else if (terminal.state === "refused") { setHelperFeedback(button3, ft(ctx, "Refused"), false, "refused"); showFeatureToast(terminal.error ?? ft(ctx, "The local yt-dlp helper refused this job."), { tone: "error", ctx }); } else { setHelperFeedback(button3, ft(ctx, "Failed"), false, "failed"); showFeatureToast(terminal.error ?? ft(ctx, "The local yt-dlp helper failed."), { tone: "error", ctx }); } } catch (error) { setHelperFeedback(button3, ft(ctx, "Failed"), false, "failed"); ctx.diagnostics.warn("yt-dlp handoff failed", errorDetails2(error)); showFeatureToast(ft(ctx, "The local yt-dlp helper could not be reached."), { tone: "error", ctx }); } } async function waitForYtDlp(settings, jobId) { const deadline = Date.now() + 12e4; let current = await readYtDlpJob(settings, jobId); while (current.state === "running" && Date.now() < deadline) { await new Promise((resolve) => { setTimeout(resolve, 500); }); current = await readYtDlpJob(settings, jobId); } return current; } async function copyYtDlpCommand(request, button3, ctx) { try { const clipboard = globalThis.navigator?.clipboard; if (!clipboard?.writeText) throw new Error("Clipboard unavailable"); await clipboard.writeText(buildYtDlpCommand(request)); setHelperFeedback(button3, ft(ctx, "Copied"), false, "copied"); showFeatureToast(ft(ctx, "yt-dlp command copied."), { tone: "info", ctx }); setTimeout(() => { if (button3.isConnected) setHelperFeedback(button3, ft(ctx, "Copy yt-dlp command"), false, "idle"); }, 2200); } catch (error) { ctx.diagnostics.warn("yt-dlp command copy failed", errorDetails2(error)); showFeatureToast(ft(ctx, "The yt-dlp command could not be copied."), { tone: "error", ctx }); } } function setHelperFeedback(button3, label, disabled, state2) { button3.textContent = label; button3.disabled = disabled; button3.dataset.state = state2; button3.setAttribute("aria-busy", String(disabled)); } async function handlePendingPostDownload(article, ctx, button3) { setButtonFeedback(button3, { label: ft(ctx, "Downloading\u2026"), icon: "\u21BB", className: "is-active", disabled: true, busy: true }); for (let attempt = 0; attempt < 8; attempt += 1) { const refreshed = extractTweetForContext(article, ctx); const assets = primaryDownloadAssets(refreshed); const stillWaiting = refreshed.media.some((media) => media.kind === "video" && resolveTarget(media) === null) || article.querySelector(VIDEO_CONTAINER_SELECTOR) !== null && !refreshed.media.some((media) => media.kind === "video"); if (assets.length > 0 && !stillWaiting) { delete button3.dataset.pendingVideo; await handlePostDownload(refreshed, assets, /* @__PURE__ */ new Set(), ctx, button3); return; } await new Promise((resolve) => { setTimeout(resolve, 250); }); } setButtonFeedback(button3, { label: ft(ctx, "Retry"), icon: "\u21BB", className: "is-error" }); button3.setAttribute( "aria-label", ft(ctx, "The direct video is still loading. Try again in a moment.") ); } function positionButton(button3, container) { const anchor = positionedAncestor(container); const media = container.getBoundingClientRect(); const base = anchor?.getBoundingClientRect(); const siblings = Array.from(container.querySelectorAll(`[${BUTTON_ATTR}]`)); const slot = Math.max(0, siblings.indexOf(button3)); const topOffset = 8 + slot * 40; if (!anchor || !base || media.width === 0 || media.height === 0) { button3.style.top = `${topOffset}px`; button3.style.right = "8px"; return; } button3.style.top = `${Math.round(media.top - base.top + topOffset)}px`; button3.style.right = `${Math.round(base.right - media.right + 8)}px`; } function positionedAncestor(node) { let current = node; while (current && current !== document.body) { if (getComputedStyle(current).position !== "static") { return current; } current = current.parentElement; } return null; } function resolveContainer(media) { if (media.kind === "video" && media.video) { return media.video.container; } if (media.kind === "thumbnail" && (media.source.matches?.('[data-testid="videoPlayer"], [data-testid="videoComponent"]') ?? false)) { return media.source; } if (media.kind === "audio" && media.audio) { return media.audio.container; } if (media.kind === "subtitle" && media.subtitle) { return media.subtitle.container; } return media.source.closest('[data-testid="tweetPhoto"]') ?? media.source.parentElement; } function hasOwnButton(container, kind) { return container.querySelector(`[${BUTTON_ATTR}="${kind}"]`) !== null; } function buildButton(media, index, tweet, ctx) { const button3 = document.createElement("button"); button3.type = "button"; button3.className = "av-media-button"; button3.setAttribute(BUTTON_ATTR, media.kind); button3.dataset.kind = media.kind; const accessibleLabel = ft(ctx, buttonAriaLabel(media)); const idleLabel = ft(ctx, buttonLabel(media)); button3.setAttribute("aria-label", accessibleLabel); button3.setAttribute("aria-live", "polite"); button3.setAttribute("aria-busy", "false"); button3.dataset.idleLabel = idleLabel; button3.dataset.idleIcon = "\u2193"; button3.dataset.baseIdleAriaLabel = accessibleLabel; button3.dataset.idleAriaLabel = accessibleLabel; button3.textContent = `\u2193 ${ft(ctx, buttonLabel(media))}`; const icon = document.createElement("span"); icon.className = "av-media-button-icon"; icon.setAttribute("aria-hidden", "true"); icon.textContent = "\u2193 "; const label = document.createElement("span"); label.className = "av-media-button-label"; label.textContent = idleLabel; button3.replaceChildren(icon, label); const target = resolveTarget(media); if (target) { const receipt = downloadReceipt(media.kind, target); setDownloadedMarker(button3, receipt !== null, ctx, receipt); updateOriginalRetryState(button3, media, target, receipt, ctx); } button3.addEventListener("click", (event) => { event.stopPropagation(); event.preventDefault(); void handleDownload(media, index, tweet, ctx, button3); }); return button3; } function buttonLabel(media) { if (media.kind === "thumbnail") { return "Thumb"; } if (media.kind === "video") { return media.video?.isGif ? "GIF" : "Video"; } if (media.kind === "audio") return "Audio"; if (media.kind === "subtitle") return "Captions"; return "Download"; } function buttonAriaLabel(media) { if (media.kind === "thumbnail") { return "Download thumbnail"; } if (media.kind === "video") { return media.video?.isGif ? "Download GIF" : "Download video"; } if (media.kind === "audio") return "Download audio"; if (media.kind === "subtitle") return "Download captions"; return "Download image"; } async function handleDownload(media, index, tweet, ctx, button3) { if (!downloader || !queue || !history) { return; } const target = resolveTarget(media); if (!target) { setButtonFeedback(button3, { label: ft(ctx, "Unavailable"), icon: "!", className: "is-error", disabled: true }); ctx.diagnostics.warn("Media target unavailable", { kind: media.kind }); return; } setButtonFeedback(button3, { label: ft(ctx, "Downloading\u2026"), icon: "\u21BB", className: "is-active", disabled: true, busy: true }); try { const outcome = await performMediaDownload( media, index, tweet, target, ctx, () => { setButtonFeedback(button3, { label: ft(ctx, "Started"), icon: "\u2193", className: "is-active", disabled: true, busy: true }); }, button3.dataset.retryOriginal === "true" ); setButtonFeedback(button3, { label: ft( ctx, outcome.degraded ? "Opened" : outcome.status === "aria2-duplicate" ? "Queued" : outcome.status === "started" ? "Started" : successLabel(media) ), icon: outcome.degraded ? "\u2197" : outcome.status === "started" ? "\u2193" : "\u2713", className: outcome.status === "completed" ? "is-success" : outcome.status === "opened" ? "is-opened" : "is-duplicate" }); if (outcome.status === "started") { button3.setAttribute( "aria-label", ft(ctx, "The browser is still transferring this file. Check your downloads for the result.") ); } if (outcome.matchKind) { button3.setAttribute("aria-label", duplicateMatchTitle(outcome.matchKind, ctx)); } if (outcome.status === "completed" || outcome.status === "history-duplicate") { const receipt = downloadReceipt(media.kind, target); setDownloadedMarker(button3, true, ctx, receipt); updateOriginalRetryState(button3, media, target, receipt, ctx); } if (outcome.degraded) { button3.setAttribute( "aria-label", ft( ctx, "Your browser opened this file instead of saving it. Grant Aviary the download permission for a real save." ) ); } scheduleButtonRestore(button3); } catch (error) { showDownloadError(button3, error, ctx); } } async function handlePostDownload(tweet, assets, completed, ctx, button3) { if (!downloader || !queue || !history) { return; } setButtonFeedback(button3, { label: ft(ctx, "Downloading\u2026"), icon: "\u21BB", className: "is-active", disabled: true, busy: true }); const outcomes = []; let firstError; for (const asset of assets) { const key = primaryAssetKey(asset); if (completed.has(key)) { continue; } try { outcomes.push( await performMediaDownload(asset.media, asset.index, tweet, asset.target, ctx, () => { setButtonFeedback(button3, { label: ft(ctx, "Started"), icon: "\u2193", className: "is-active", disabled: true, busy: true }); }) ); completed.add(key); } catch (error) { firstError ??= error; if (error instanceof DownloadPermissionError) { break; } } } if (firstError) { showDownloadError(button3, firstError, ctx); return; } completed.clear(); const degraded = outcomes.some((outcome) => outcome.degraded); const aria2Duplicate = outcomes.length > 0 && outcomes.every((outcome) => outcome.status === "aria2-duplicate"); const anyStarted = outcomes.some((outcome) => outcome.status === "started"); const allDuplicate = outcomes.length > 0 && outcomes.every((outcome) => outcome.status !== "completed"); setButtonFeedback(button3, { label: ft( ctx, degraded ? "Opened" : aria2Duplicate ? "Queued" : anyStarted ? "Started" : "Saved" ), icon: degraded ? "\u2197" : anyStarted ? "\u2193" : "\u2713", className: allDuplicate ? "is-duplicate" : "is-success" }); if (degraded) { button3.setAttribute( "aria-label", ft( ctx, "Your browser opened this file instead of saving it. Grant Aviary the download permission for a real save." ) ); } if (outcomes.length > 0 && outcomes.every( (outcome) => outcome.status === "completed" || outcome.status === "history-duplicate" )) { setDownloadedMarker(button3, true, ctx); } scheduleButtonRestore(button3); } function primaryAssetKey(asset) { return `${asset.index}:${asset.media.kind}:${asset.target.mediaId ?? asset.target.url}`; } async function performMediaDownload(media, index, tweet, target, ctx, onStarted, allowQualityUpgrade = false) { if (!downloader || !queue || !history) { throw new Error("Media downloader is not ready."); } const identity = mediaIdentity(tweet, media); const filename = renderFilename(ctx.settings.media.filenameTemplate, { handle: identity.handle, tweetId: identity.tweetId, index, total: tweet.media.length, date: /* @__PURE__ */ new Date(), ext: target.ext, text: identity.text, mediaId: target.mediaId }); const sidecar = mediaSidecarRequest(ctx.settings.media.sidecarFormat, { mediaFilename: filename, kind: media.kind, handle: identity.handle, tweetId: identity.tweetId, text: identity.text, permalink: identity.tweetId ? `https://x.com/${identity.handle ?? "i"}/status/${identity.tweetId}` : null, queuedAt: (/* @__PURE__ */ new Date()).toISOString() }); let fingerprint2 = { identityHash: mediaIdentityHash(media.kind, target.url, target.mediaId) }; let historyMatch = null; let reservationToken2 = null; if (ctx.settings.media.downloadHistory && !allowQualityUpgrade) { historyMatch = history.findMatch(fingerprint2, false); if (historyMatch) { const reservation = await history.reserve(fingerprint2, false); historyMatch = reservation.match; reservationToken2 = reservation.token; } else { fingerprint2 = await fingerprintMediaDownload({ kind: media.kind, url: target.url, ...target.fallbackUrls ? { fallbackUrls: target.fallbackUrls } : {}, mediaId: target.mediaId, includePerceptual: ctx.settings.media.perceptualDedup }); const reservation = await history.reserve( fingerprint2, ctx.settings.media.perceptualDedup ); historyMatch = reservation.match; reservationToken2 = reservation.token; } } if (historyMatch) { await history.noteMatch(historyMatch); const duplicate = queue.enqueue({ url: target.url, ...target.fallbackUrls ? { fallbackUrls: target.fallbackUrls } : {}, quality: target.quality, filename, kind: media.kind, mediaId: target.mediaId }); queue.mark(duplicate.id, "duplicate"); ctx.diagnostics.info("Media skipped because its fingerprint is already in history", { matchKind: historyMatch }); void ctx.auditLog.record("media.download.duplicate", { matchKind: historyMatch }); return { status: "history-duplicate", degraded: false, matchKind: historyMatch }; } const job = queue.enqueue({ url: target.url, ...target.fallbackUrls ? { fallbackUrls: target.fallbackUrls } : {}, quality: target.quality, filename, kind: media.kind, mediaId: target.mediaId, ...sidecar ? { sidecar } : {} }); queue.mark(job.id, "running"); const completeConfirmedSave = async (via, quality = target.quality) => { queue.mark(job.id, "completed"); queue.setQuality(job.id, quality); await rememberLastDownload(ctx.storage, { url: target.url, filename, kind: media.kind }); if (ctx.settings.media.downloadHistory) { if (reservationToken2) { await history.commit(reservationToken2, fingerprint2, quality); reservationToken2 = null; } else { await history.record(fingerprint2, quality); } } saveSidecarOrWarn(ctx, sidecar, filename); ctx.diagnostics.info("Media saved", { filename, kind: media.kind }); void ctx.auditLog.record("media.download", { filename, kind: media.kind, via }); }; const failInterruptedSave = async () => { if (reservationToken2) { await history.release(reservationToken2); reservationToken2 = null; } queue.mark(job.id, "failed", "the browser interrupted this transfer"); ctx.diagnostics.warn("Media transfer was interrupted", { filename, kind: media.kind }); void ctx.auditLog.record("media.download.failed", { filename, kind: media.kind }); }; try { const result = await downloader({ url: target.url, ...target.fallbackUrls ? { fallbackUrls: target.fallbackUrls } : {}, quality: target.quality, ...target.fallbackQualities ? { fallbackQualities: target.fallbackQualities } : {}, filename }); if (result.deduplicated) { if (reservationToken2) await history.release(reservationToken2); queue.mark(job.id, "duplicate"); ctx.diagnostics.info("Media skipped: already queued in Aria2 history", { url: target.url }); void ctx.auditLog.record("media.download.duplicate", { source: "aria2-history" }); return { status: "aria2-duplicate", degraded: false }; } if (result.degraded) { if (reservationToken2) { await history.release(reservationToken2); reservationToken2 = null; } queue.mark(job.id, "opened", "the browser opened this URL; a saved file was not confirmed"); ctx.diagnostics.info("Media opened without a confirmed save", { filename, kind: media.kind, via: result.via }); void ctx.auditLog.record("media.download.opened", { filename, kind: media.kind, via: result.via }); return { status: "opened", degraded: true }; } if (result.pending && result.downloadId !== void 0) { const downloadId = result.downloadId; queue.trackDownload(job.id, downloadId); onStarted?.(); const terminalResult = downloadWatcher.terminal(downloadId); const terminal = await downloadWatcher.wait(downloadId); if (terminal === "interrupted") { await failInterruptedSave(); throw new Error("The browser interrupted this transfer before it finished."); } if (terminal === "pending") { void terminalResult.then(async (eventual) => { if (eventual === "complete") { await completeConfirmedSave(result.via, downloadWatcher.receipt(downloadId) ?? target.quality); } else if (eventual === "interrupted") { await failInterruptedSave(); } }).catch((error) => { ctx.diagnostics.warn("Could not reconcile media transfer", errorDetails2(error)); }); ctx.diagnostics.info("Media transfer still running", { filename, kind: media.kind }); return { status: "started", degraded: false }; } } await completeConfirmedSave(result.via, result.quality ?? target.quality); return { status: "completed", degraded: false }; } catch (error) { if (reservationToken2) { await history.release(reservationToken2); reservationToken2 = null; } const needsPermission = error instanceof DownloadPermissionError; queue.mark(job.id, "failed", String(error?.message ?? error)); ctx.diagnostics.error("Media download failed", errorDetails2(error)); void ctx.auditLog.record("media.download.failed", { filename, kind: media.kind, ...needsPermission ? { reason: "downloads-permission-missing" } : {} }); throw error; } } function duplicateMatchTitle(kind, ctx) { if (kind === "exact") { return ft(ctx, "Skipped because the downloaded bytes match an item in history."); } if (kind === "perceptual") { return ft(ctx, "Skipped because the image looks like an item in history."); } return ft(ctx, "Skipped because this is the same X media asset at another size."); } function showDownloadError(button3, error, ctx) { const needsPermission = error instanceof DownloadPermissionError; setButtonFeedback(button3, { label: ft(ctx, needsPermission ? "Allow" : "Retry"), icon: needsPermission ? "\u2197" : "!", className: "is-error" }); if (needsPermission) { button3.setAttribute( "aria-label", ft(ctx, "Aviary needs the browser download permission. Opening its options page.") ); if (!permissionSurfaceOpened) { permissionSurfaceOpened = true; void requestDownloadPermissionSurface(); } } } function setButtonFeedback(button3, feedback) { clearButtonRestore(button3); button3.classList.remove("is-active", "is-success", "is-opened", "is-duplicate", "is-error"); button3.classList.add(feedback.className); button3.dataset.state = feedback.className.slice(3); button3.disabled = feedback.disabled === true; button3.setAttribute("aria-busy", String(feedback.busy === true)); const icon = button3.querySelector( ".av-media-button-icon, .av-media-action-icon" ); const label = button3.querySelector( ".av-media-button-label, .av-media-action-label" ); if (icon) icon.textContent = `${feedback.icon} `; if (label) label.textContent = feedback.label; button3.setAttribute("aria-label", feedback.label); button3.removeAttribute("title"); } function scheduleButtonRestore(button3) { clearButtonRestore(button3); const timer2 = setTimeout(() => { buttonResetTimers.delete(button3); if (button3.isConnected) { restoreIdleButton(button3); } }, 2200); buttonResetTimers.set(button3, timer2); } function clearButtonRestore(button3) { const timer2 = buttonResetTimers.get(button3); if (timer2 !== void 0) { clearTimeout(timer2); buttonResetTimers.delete(button3); } } function restoreIdleButton(button3) { button3.classList.remove("is-active", "is-success", "is-opened", "is-duplicate", "is-error"); delete button3.dataset.state; button3.disabled = false; button3.setAttribute("aria-busy", "false"); const icon = button3.querySelector( ".av-media-button-icon, .av-media-action-icon" ); const label = button3.querySelector( ".av-media-button-label, .av-media-action-label" ); if (icon) icon.textContent = `${button3.dataset.idleIcon ?? "\u2193"} `; if (label) label.textContent = button3.dataset.idleLabel ?? ""; const accessibleLabel = button3.dataset.idleAriaLabel ?? button3.dataset.idleLabel ?? ""; button3.setAttribute("aria-label", accessibleLabel); button3.removeAttribute("title"); } function wasDownloaded(kind, target) { return downloadReceipt(kind, target) !== null; } function updateOriginalRetryState(button3, media, target, receipt, ctx) { if (media.kind === "photo" && target.quality.label === "original" && receipt?.label === "fallback") { button3.dataset.retryOriginal = "true"; button3.dataset.idleLabel = ft(ctx, "Original"); button3.dataset.idleAriaLabel = ft(ctx, "Retry original image"); const label = button3.querySelector(".av-media-button-label, .av-media-action-label"); if (label && !button3.dataset.state) label.textContent = button3.dataset.idleLabel; if (!button3.dataset.state) button3.setAttribute("aria-label", button3.dataset.idleAriaLabel); return; } delete button3.dataset.retryOriginal; } function downloadReceipt(kind, target) { return history?.findQuality({ identityHash: mediaIdentityHash(kind, target.url, target.mediaId) }) ?? null; } function setDownloadedMarker(button3, downloaded, ctx, receipt = null) { if (downloaded) { button3.setAttribute(DOWNLOADED_ATTR, "true"); } else { button3.removeAttribute(DOWNLOADED_ATTR); } const base = button3.dataset.baseIdleAriaLabel ?? button3.dataset.idleAriaLabel ?? ""; const qualityLabel = receipt ? qualityReceiptLabel(receipt, ctx) : null; const accessibleLabel = downloaded ? `${base}. ${ft(ctx, "Previously downloaded")}${qualityLabel ? `. ${qualityLabel}` : ""}.` : base; button3.dataset.idleAriaLabel = accessibleLabel; if (!button3.dataset.state) { button3.setAttribute("aria-label", accessibleLabel); button3.removeAttribute("title"); } } function qualityReceiptLabel(receipt, ctx) { if (receipt.label === "original") return ft(ctx, "Original quality"); if (receipt.label === "fallback") return ft(ctx, "Fallback quality. Click to retry original"); if (receipt.label === "best-direct") return ft(ctx, "Best direct quality"); return ft(ctx, "Quality unknown"); } function saveSidecarOrWarn(ctx, request, mediaFilename) { if (!request || saveMediaSidecar(request)) return; ctx.diagnostics.warn("Media sidecar could not be saved", { mediaFilename }); } function resolveTarget(media) { if (media.kind === "video" && media.video?.preferred) { const direct = media.video.variants.filter((variant2) => isSaveableVariantUrl(variant2.url, variant2.type)).sort((left, right) => compareVariantQuality(right, left))[0] ?? null; const adaptive = bestObservedAdaptive(media.video.variants); if (!direct && adaptive) { return { url: adaptive.manifestUrl, quality: qualityForVariant(adaptive.variant, "adaptive-remux"), mediaId: mediaIdFromVideo(adaptive.manifestUrl), ext: "mp4", helperOnly: true, adaptive }; } if (!direct) return null; const url = direct.url; const variant = direct; return { url, quality: qualityForVariant(variant, "best-direct"), mediaId: mediaIdFromVideo(url), ext: extensionForVideo(variant.type, url), ...adaptive && shouldOfferAdaptiveHelper(direct, media.video.variants) ? { adaptive } : {} }; } if (media.kind === "audio" && media.audio?.preferred) { const variant = media.audio.preferred; if (!isSaveableVariantUrl(variant.url, variant.type)) return null; return { url: variant.url, quality: qualityForVariant(variant, "best-direct"), mediaId: mediaIdFromVideo(variant.url), ext: extensionForAudio(variant.type, variant.url) }; } if (media.kind === "subtitle" && media.subtitle?.track) { const track = media.subtitle.track; if (!isSaveableVariantUrl(track.url, track.type)) return null; return { url: track.url, quality: qualityForMime(track.type, "quality-unknown"), mediaId: mediaIdFromVideo(track.url), ext: extensionForSubtitle(track.type, track.url) }; } if (media.image) { const fallbackQualities = media.image.fallbackUrls.map((url) => qualityForImageUrl(url, "fallback")); return { url: media.image.url, fallbackUrls: media.image.fallbackUrls, quality: qualityForImageUrl(media.image.url, "original"), ...fallbackQualities.length > 0 ? { fallbackQualities } : {}, mediaId: media.image.mediaId, ext: media.image.format }; } return null; } function qualityForVariant(variant, label) { return normalizeDownloadQuality({ label, width: variant.width, height: variant.height, bitrate: variant.bitrate, mime: variant.type, codec: variant.codec ?? null, codecSource: variant.codecSource ?? null, playbackProven: variant.playbackObserved === true }); } function qualityForMime(mime, label) { return normalizeDownloadQuality({ label, mime }); } function qualityForImageUrl(url, label) { const size = /(?:^|[?&])name=(\d{2,5})x(\d{2,5})(?:&|$)/i.exec(url); const format = /(?:^|[?&])format=([a-z0-9]+)/i.exec(url)?.[1]?.toLowerCase() ?? (/\.([a-z0-9]+)(?:\?|$)/i.exec(url)?.[1]?.toLowerCase() ?? "jpg"); const mime = format === "png" ? "image/png" : format === "webp" ? "image/webp" : "image/jpeg"; return normalizeDownloadQuality({ label, width: size ? Number(size[1]) : null, height: size ? Number(size[2]) : null, mime }); } function mediaIdFromVideo(url) { const match = /\/([A-Za-z0-9_-]{6,})\.(mp4|m4s|m3u8|webm|mov|m4a|mp3|ogg|opus|wav|vtt|srt|ttml|dfxp)(?:[?#]|$)/i.exec(url); return match?.[1] ?? null; } function extensionForVideo(mime, url) { if (/mp4/i.test(mime) || /\.mp4(?:[?#]|$)/i.test(url)) return "mp4"; if (/webm/i.test(mime) || /\.webm(?:[?#]|$)/i.test(url)) return "webm"; if (/m3u8/i.test(mime) || /\.m3u8(?:[?#]|$)/i.test(url)) return "m3u8"; if (/mov/i.test(mime) || /\.mov(?:[?#]|$)/i.test(url)) return "mov"; return "mp4"; } function extensionForAudio(mime, url) { if (/mpeg|mp3/i.test(mime) || /\.mp3(?:[?#]|$)/i.test(url)) return "mp3"; if (/ogg|opus/i.test(mime) || /\.(?:ogg|opus)(?:[?#]|$)/i.test(url)) return "ogg"; if (/wav/i.test(mime) || /\.wav(?:[?#]|$)/i.test(url)) return "wav"; return "m4a"; } function extensionForSubtitle(mime, url) { if (/srt/i.test(mime) || /\.srt(?:[?#]|$)/i.test(url)) return "srt"; if (/ttml|dfxp/i.test(mime) || /\.(?:ttml|dfxp)(?:[?#]|$)/i.test(url)) return "ttml"; return "vtt"; } function successLabel(media) { if (media.kind === "thumbnail") return "Got it"; if (media.kind === "video") return media.video?.isGif ? "GIF saved" : "Saved"; if (media.kind === "audio") return "Audio saved"; if (media.kind === "subtitle") return "Captions saved"; return "Saved"; } function errorDetails2(error) { if (error instanceof Error) { return { name: error.name, message: error.message }; } return { message: String(error) }; } function ensureMediaStyle() { if (document.getElementById(STYLE_ID4)) { return; } const style = document.createElement("style"); style.id = STYLE_ID4; style.textContent = MEDIA_CSS; (document.head ?? document.documentElement).append(style); } var MEDIA_CSS = ` html:not(.av-media-buttons-enabled) [${BUTTON_ATTR}], html:not(.av-media-buttons-enabled) [${ACTION_SLOT_ATTR}] { display: none !important; } [${ACTION_SLOT_ATTR}] { display: flex; flex: 0 0 auto; align-items: center; justify-content: flex-end; gap: 5px; min-width: 112px; margin-inline-start: 4px; } [${HELPER_SLOT_ATTR}] { display: inline-flex; flex: 0 0 auto; align-items: center; gap: 4px; margin-inline-start: 4px; } [${HELPER_ACTION_ATTR}] { appearance: none; min-height: 40px; padding: 6px 10px; border: 1px solid color-mix(in srgb, var(--av-accent, rgb(29, 155, 240)) 48%, transparent); border-radius: 999px; background: transparent; color: var(--av-accent, rgb(29, 155, 240)); cursor: pointer; font: 700 12px/1.1 TwitterChirp, Inter, ui-sans-serif, system-ui, sans-serif; white-space: nowrap; transition: background-color 140ms ease, color 140ms ease, border-color 140ms ease; } [${HELPER_ACTION_ATTR}]:hover:not(:disabled) { border-color: var(--av-accent, rgb(29, 155, 240)); background: color-mix(in srgb, var(--av-accent, rgb(29, 155, 240)) 12%, transparent); } [${HELPER_ACTION_ATTR}]:focus-visible { outline: 2px solid var(--av-accent, rgb(29, 155, 240)); outline-offset: 2px; } [${HELPER_ACTION_ATTR}][data-state="completed"], [${HELPER_ACTION_ATTR}][data-state="copied"] { border-color: var(--av-media-success, rgb(120, 200, 130)); color: var(--av-media-success-text, rgb(206, 240, 210)); } [${HELPER_ACTION_ATTR}][data-state="failed"], [${HELPER_ACTION_ATTR}][data-state="refused"], [${HELPER_ACTION_ATTR}][data-state="missing"] { border-color: var(--av-media-error, rgb(220, 110, 110)); color: var(--av-media-error-text, rgb(248, 200, 200)); } [${HELPER_ACTION_ATTR}]:disabled { cursor: progress; opacity: 0.72; } [${ACTION_ATTR}] { appearance: none; display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-width: 108px; min-height: 40px; padding: 7px 12px; border: 0; border-radius: 8px; background: var(--av-accent, rgb(29, 155, 240)); color: rgb(3, 20, 24); cursor: pointer; font: 750 13px/1.1 TwitterChirp, Inter, ui-sans-serif, system-ui, sans-serif; white-space: nowrap; transition: transform 140ms ease, background-color 140ms ease, color 140ms ease; } [${ACTION_ATTR}][${DOWNLOADED_ATTR}], [${BUTTON_ATTR}][${DOWNLOADED_ATTR}] { position: relative; } [${ACTION_ATTR}][${DOWNLOADED_ATTR}]::after, [${BUTTON_ATTR}][${DOWNLOADED_ATTR}]::after { content: ""; flex: 0 0 auto; width: 7px; height: 7px; border-radius: 2px; background: var(--av-media-success, rgb(120, 200, 130)); box-shadow: 0 0 0 2px color-mix(in srgb, var(--av-media-success, rgb(120, 200, 130)) 20%, transparent); } [${ACTION_ATTR}] .av-media-action-icon { display: inline-grid; place-items: center; width: 16px; height: 16px; font-size: 17px; line-height: 1; } [${ACTION_ATTR}]:hover:not(:disabled) { background: color-mix(in srgb, var(--av-accent, rgb(29, 155, 240)) 86%, white); transform: translateY(-1px); } [${ACTION_ATTR}]:focus-visible { outline: 2px solid var(--av-accent, rgb(29, 155, 240)); outline-offset: 2px; } [${COPY_ACTION_ATTR}] { min-width: 88px; border: 1px solid color-mix(in srgb, var(--av-accent, rgb(29, 155, 240)) 48%, transparent); background: transparent; color: var(--av-accent, rgb(29, 155, 240)); } [${COPY_ACTION_ATTR}]:hover:not(:disabled) { border-color: var(--av-accent, rgb(29, 155, 240)); background: color-mix(in srgb, var(--av-accent, rgb(29, 155, 240)) 12%, transparent); color: var(--av-accent, rgb(29, 155, 240)); } [${ACTION_ATTR}].is-success { color: rgb(3, 20, 24); background: var(--av-media-success, rgb(120, 200, 130)); } [${ACTION_ATTR}].is-opened, [${ACTION_ATTR}].is-duplicate { color: var(--av-text, rgb(239, 243, 244)); background: color-mix(in srgb, var(--av-muted, rgb(132, 139, 145)) 46%, transparent); } [${ACTION_ATTR}].is-error { color: rgb(28, 8, 8); background: var(--av-media-error, rgb(220, 110, 110)); } [${ACTION_ATTR}].is-active { cursor: progress; } [${ACTION_ATTR}].is-active .av-media-action-icon { animation: av-media-spin 700ms linear infinite; } [${ACTION_ATTR}]:disabled { cursor: wait; opacity: 0.84; transform: none; } [${BUTTON_ATTR}] { position: absolute; z-index: 12; display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-width: 72px; min-height: 38px; padding: 6px 11px; border: 0; border-radius: 8px; background: color-mix(in srgb, var(--av-surface-raised, rgb(15, 20, 25)) 90%, black); color: var(--av-text, rgb(239, 243, 244)); box-shadow: 0 2px 10px rgba(0, 0, 0, 0.38); cursor: pointer; font: 700 12.5px/1.1 TwitterChirp, Inter, ui-sans-serif, system-ui, sans-serif; opacity: 1; transition: transform 140ms ease, border-color 140ms ease, background-color 140ms ease, color 140ms ease; } [${BUTTON_ATTR}] .av-media-button-icon { display: inline-grid; place-items: center; width: 14px; height: 14px; font-size: 15px; line-height: 1; } [${BUTTON_ATTR}] .av-media-button-label { min-width: 0; } /* Aviary no longer makes X's media containers the positioning context. Forcing position:relative onto [data-testid="tweetPhoto"] made a box X keeps at zero height -- it is a flex container whose two children are both position:absolute inset:0, with the real height carried by an ancestor -- into the containing block for those children. They collapsed to zero height, so the photo vanished the moment the Save button was switched on and came back the moment it was switched off. positionButton() measures against whatever ancestor X has already positioned, which is the same box the photo itself resolves against. */ [${BUTTON_ATTR}]:hover { background: color-mix(in srgb, var(--av-surface-raised, rgb(15, 20, 25)) 86%, var(--av-accent, rgb(29, 155, 240))); transform: translateY(-1px); } [${BUTTON_ATTR}]:focus-visible { outline: 2px solid var(--av-accent, rgb(29, 155, 240)); outline-offset: 2px; } [${BUTTON_ATTR}].is-success { color: var(--av-media-success-text, rgb(206, 240, 210)); } [${BUTTON_ATTR}].is-opened, [${BUTTON_ATTR}].is-duplicate { color: var(--av-muted, rgb(132, 139, 145)); } [${BUTTON_ATTR}].is-error { color: var(--av-media-error-text, rgb(248, 200, 200)); } [${BUTTON_ATTR}].is-active { cursor: progress; } [${BUTTON_ATTR}].is-active .av-media-button-icon { animation: av-media-spin 700ms linear infinite; } [${BUTTON_ATTR}]:disabled { transform: none; } [${BUTTON_ATTR}]:disabled:not(.is-active) { cursor: default; opacity: 0.68; } @keyframes av-media-spin { to { transform: rotate(360deg); } } @media (pointer: coarse) { [${ACTION_ATTR}] { min-height: 44px; } } @media (max-width: 520px) { article[data-testid="tweet"] [role="group"]:has(> [${ACTION_SLOT_ATTR}]) { flex-wrap: wrap; row-gap: 8px; } [${ACTION_SLOT_ATTR}] { flex: 1 0 100%; width: 100%; min-width: 0; margin: 4px 0 0; } [${HELPER_SLOT_ATTR}] { flex: 1 0 100%; width: 100%; margin: 4px 0 0; } [${HELPER_ACTION_ATTR}] { flex: 1 1 0; min-height: 46px; } [${ACTION_ATTR}] { flex: 1 1 0; width: auto; min-width: 0; min-height: 46px; padding-inline: 14px; } [${ACTION_ATTR}] .av-media-action-label { display: inline; } [${BUTTON_ATTR}] { min-width: 44px; width: 44px; min-height: 44px; padding: 8px; color: var(--av-accent, rgb(29, 155, 240)); } [${BUTTON_ATTR}] .av-media-button-label { display: none; } } @media (prefers-reduced-motion: reduce) { [${BUTTON_ATTR}], [${ACTION_ATTR}] { transition: none; } [${BUTTON_ATTR}].is-active .av-media-button-icon, [${ACTION_ATTR}].is-active .av-media-action-icon { animation: none; } } `; // src/features/export/jobs.ts var CHECKPOINT_KEY = "aviary.export.checkpoints.v1"; var RETENTION_KEYS = { maxJobs: "aviary.retention.maxJobs", maxRecordsPerJob: "aviary.retention.maxRecordsPerJob", maxAgeDays: "aviary.retention.maxAgeDays" }; var DEFAULT_RETENTION_POLICY = { maxJobs: 0, maxRecordsPerJob: 0, maxAgeDays: 0 }; var EMPTY3 = { jobs: {}, records: {} }; var CheckpointStore = class { #storage; #state = EMPTY3; #policy = DEFAULT_RETENTION_POLICY; #loaded = false; constructor(storage) { this.#storage = storage; } async load() { if (this.#loaded) return emptySweep(this.#policy, Object.keys(this.#state.jobs).length); const raw = await this.#storage.get(CHECKPOINT_KEY, EMPTY3); this.#state = { jobs: normalizeJobs(raw?.jobs), records: normalizeRecords(raw?.records) }; this.#policy = await loadRetentionPolicy(this.#storage); this.#loaded = true; const interrupted = Object.entries(raw?.jobs ?? {}).filter(([, value]) => Boolean(value && typeof value === "object" && value.status === "running")).map(([jobId]) => ({ jobId, set: { status: "paused", done: false, resumeOnBoot: true, error: "Interrupted before completion; resume when ready." } })); if (interrupted.length > 0) { await this.#persistMany(interrupted); } return this.sweep(); } get retentionPolicy() { return { ...this.#policy }; } list() { return Object.values(this.#state.jobs); } records(jobId) { return this.#state.records[jobId] ?? []; } async start(jobId, surface, formats, preserveRawPayloads) { await this.load(); this.#state.jobs[jobId] = { jobId, startedAt: (/* @__PURE__ */ new Date()).toISOString(), surface, recordCount: 0, done: false, formats, preserveRawPayloads, status: "running", progress: { completed: 0, total: null }, updatedAt: (/* @__PURE__ */ new Date()).toISOString(), resumeOnBoot: false }; this.#state.records[jobId] = []; await this.#persist({ kind: "start", job: cloneJob2(this.#state.jobs[jobId]) }); await this.sweep(); } async append(jobId, batch) { await this.load(); const job = this.#state.jobs[jobId]; if (!job || isTerminal(job.status)) return; const seen = new Set(this.#state.records[jobId]?.map((entry) => recordKey(entry)) ?? []); const records = this.#state.records[jobId] ?? []; for (const record of batch) { const key = recordKey(record); if (!seen.has(key)) { seen.add(key); records.push(record); } } const retained = this.#policy.maxRecordsPerJob > 0 ? records.slice(-this.#policy.maxRecordsPerJob) : records; this.#state.records[jobId] = retained; job.recordCount = retained.length; job.progress = { completed: retained.length, total: job.progress.total }; job.updatedAt = (/* @__PURE__ */ new Date()).toISOString(); await this.#persist({ kind: "append", jobId, records: batch.map(cloneRecord), total: job.progress.total, updatedAt: job.updatedAt }); } async finish(jobId) { await this.load(); const job = this.#state.jobs[jobId]; if (job) { job.done = true; job.status = "completed"; job.progress = { completed: job.recordCount, total: job.progress.total ?? job.recordCount }; job.resumeOnBoot = false; job.updatedAt = (/* @__PURE__ */ new Date()).toISOString(); delete job.error; await this.#persist({ kind: "update", jobId, set: { done: true, status: "completed", progress: { ...job.progress }, resumeOnBoot: false, updatedAt: job.updatedAt }, remove: ["error"] }); } } async pause(jobId) { await this.load(); const job = this.#state.jobs[jobId]; if (!job || isTerminal(job.status)) return false; job.status = "paused"; job.done = false; job.resumeOnBoot = false; job.updatedAt = (/* @__PURE__ */ new Date()).toISOString(); await this.#persist({ kind: "update", jobId, set: { status: "paused", done: false, resumeOnBoot: false, updatedAt: job.updatedAt } }); return true; } async resume(jobId) { await this.load(); const job = this.#state.jobs[jobId]; if (!job || job.status !== "paused" && job.status !== "queued") return false; job.status = "running"; job.done = false; job.resumeOnBoot = false; job.updatedAt = (/* @__PURE__ */ new Date()).toISOString(); delete job.error; await this.#persist({ kind: "update", jobId, set: { status: "running", done: false, resumeOnBoot: false, updatedAt: job.updatedAt }, remove: ["error"] }); return true; } async cancel(jobId) { await this.load(); const job = this.#state.jobs[jobId]; if (!job || isTerminal(job.status)) return false; job.status = "cancelled"; job.done = true; job.resumeOnBoot = false; job.updatedAt = (/* @__PURE__ */ new Date()).toISOString(); await this.#persist({ kind: "update", jobId, set: { status: "cancelled", done: true, resumeOnBoot: false, updatedAt: job.updatedAt } }); return true; } async fail(jobId, error) { await this.load(); const job = this.#state.jobs[jobId]; if (!job || isTerminal(job.status)) return false; job.status = "failed"; job.done = true; job.resumeOnBoot = false; job.updatedAt = (/* @__PURE__ */ new Date()).toISOString(); job.error = error instanceof Error ? error.message : String(error); await this.#persist({ kind: "update", jobId, set: { status: "failed", done: true, resumeOnBoot: false, updatedAt: job.updatedAt, error: job.error } }); return true; } async updateProgress(jobId, progress) { await this.load(); const job = this.#state.jobs[jobId]; if (!job || isTerminal(job.status)) return false; job.progress = { completed: nonNegativeInteger(progress.completed, job.progress.completed), total: progress.total === null ? null : nonNegativeInteger(progress.total, job.progress.total ?? 0) }; job.updatedAt = (/* @__PURE__ */ new Date()).toISOString(); await this.#persist({ kind: "update", jobId, set: { progress: { ...job.progress }, updatedAt: job.updatedAt } }); return true; } listResumable() { return this.list().filter((job) => job.status === "paused" && job.resumeOnBoot).sort(compareJobs); } async remove(jobId) { await this.load(); delete this.#state.jobs[jobId]; delete this.#state.records[jobId]; await this.#persist({ kind: "remove", jobId }); } async sweep(policy) { await this.load(); if (policy) { this.#policy = normalizeRetentionPolicy(policy); } let result = emptySweep(this.#policy, Object.keys(this.#state.jobs).length); await this.#persist({ kind: "sweep", policy: this.#policy }, (nextResult) => { result = nextResult; }); return result; } async #persist(change, onResult) { try { const next = await mutateStored( this.#storage, CHECKPOINT_KEY, EMPTY3, (stored) => { const applied = applyCheckpointChange(stored, change, this.#policy); onResult?.(applied.result); return applied.state; } ); this.#state = normalizeCheckpointState(next); } catch { } } async #persistMany(updates) { await this.#persist({ kind: "updates", updates }); } }; function normalizeCheckpointState(value) { if (!value || typeof value !== "object") return { jobs: {}, records: {} }; const raw = value; return { jobs: normalizeJobs(raw.jobs, false), records: normalizeRecords(raw.records) }; } function cloneJob2(job) { return { ...job, formats: [...job.formats], progress: { ...job.progress } }; } function cloneRecord(record) { return { ...record }; } function applyCheckpointChange(value, change, policy) { const state2 = normalizeCheckpointState(value); let result = emptySweep(policy, Object.keys(state2.jobs).length); if (change.kind === "start") { state2.jobs[change.job.jobId] = cloneJob2(change.job); state2.records[change.job.jobId] = []; } else if (change.kind === "append") { const job = state2.jobs[change.jobId]; if (job && !isTerminal(job.status)) { const records = state2.records[change.jobId] ?? []; const seen = new Set(records.map((entry) => recordKey(entry))); for (const record of change.records) { const key = recordKey(record); if (!seen.has(key)) { seen.add(key); records.push(cloneRecord(record)); } } const retained = policy.maxRecordsPerJob > 0 ? records.slice(-policy.maxRecordsPerJob) : records; state2.records[change.jobId] = retained; job.recordCount = retained.length; job.progress = { completed: retained.length, total: job.progress.total ?? change.total }; job.updatedAt = change.updatedAt; } } else if (change.kind === "update") { applyCheckpointUpdate(state2, change.jobId, change.set, change.remove); } else if (change.kind === "updates") { for (const update of change.updates) { applyCheckpointUpdate(state2, update.jobId, update.set, update.remove); } } else if (change.kind === "remove") { delete state2.jobs[change.jobId]; delete state2.records[change.jobId]; } else { const swept = sweepCheckpointState(state2, policy); result = swept.result; return { state: swept.state, result }; } return { state: state2, result }; } function applyCheckpointUpdate(state2, jobId, set, remove) { const job = state2.jobs[jobId]; if (!job) return; state2.jobs[jobId] = { ...job, ...set, progress: set.progress ? { ...set.progress } : { ...job.progress } }; for (const field2 of remove ?? []) delete state2.jobs[jobId][field2]; } function sweepCheckpointState(input, policy) { const state2 = normalizeCheckpointState(input); const beforeJobs = Object.keys(state2.jobs).length; const beforeRecords = Object.values(state2.records).reduce((total, records) => total + records.length, 0); const removeIds = /* @__PURE__ */ new Set(); if (policy.maxAgeDays > 0) { const cutoff = Date.now() - policy.maxAgeDays * 24 * 60 * 60 * 1e3; for (const job of Object.values(state2.jobs)) { const startedAt = Date.parse(job.startedAt); if (Number.isFinite(startedAt) && startedAt < cutoff) removeIds.add(job.jobId); } } if (policy.maxJobs > 0) { const newest = Object.values(state2.jobs).filter((job) => !removeIds.has(job.jobId)).sort(compareJobs).slice(-policy.maxJobs).map((job) => job.jobId); const keepIds = new Set(newest); for (const job of Object.values(state2.jobs)) { if (!removeIds.has(job.jobId) && !keepIds.has(job.jobId)) removeIds.add(job.jobId); } } for (const jobId of removeIds) { delete state2.jobs[jobId]; delete state2.records[jobId]; } for (const job of Object.values(state2.jobs)) { const records = state2.records[job.jobId] ?? []; if (policy.maxRecordsPerJob > 0 && records.length > policy.maxRecordsPerJob) { state2.records[job.jobId] = records.slice(-policy.maxRecordsPerJob); } job.recordCount = state2.records[job.jobId]?.length ?? 0; } const afterRecords = Object.values(state2.records).reduce((total, records) => total + records.length, 0); return { state: state2, result: { removedJobs: beforeJobs - Object.keys(state2.jobs).length, removedRecords: beforeRecords - afterRecords, retainedJobs: Object.keys(state2.jobs).length, policy: { ...policy } } }; } function normalizeRetentionPolicy(input) { const record = input && typeof input === "object" ? input : {}; return { maxJobs: retentionNumber(record.maxJobs, DEFAULT_RETENTION_POLICY.maxJobs, 1e4), maxRecordsPerJob: retentionNumber( record.maxRecordsPerJob, DEFAULT_RETENTION_POLICY.maxRecordsPerJob, 1e5 ), maxAgeDays: retentionNumber(record.maxAgeDays, DEFAULT_RETENTION_POLICY.maxAgeDays, 3650) }; } async function loadRetentionPolicy(storage) { const [maxJobs, maxRecordsPerJob, maxAgeDays] = await Promise.all([ storage.get(RETENTION_KEYS.maxJobs, DEFAULT_RETENTION_POLICY.maxJobs), storage.get(RETENTION_KEYS.maxRecordsPerJob, DEFAULT_RETENTION_POLICY.maxRecordsPerJob), storage.get(RETENTION_KEYS.maxAgeDays, DEFAULT_RETENTION_POLICY.maxAgeDays) ]); return normalizeRetentionPolicy({ maxJobs, maxRecordsPerJob, maxAgeDays }); } async function saveRetentionPolicy(storage, input) { const policy = normalizeRetentionPolicy(input); await Promise.all([ replaceStored(storage, RETENTION_KEYS.maxJobs, policy.maxJobs), replaceStored(storage, RETENTION_KEYS.maxRecordsPerJob, policy.maxRecordsPerJob), replaceStored(storage, RETENTION_KEYS.maxAgeDays, policy.maxAgeDays) ]); return policy; } function retentionNumber(value, fallback, max) { if (typeof value !== "number" || !Number.isFinite(value)) return fallback; return Math.max(0, Math.min(max, Math.trunc(value))); } function compareJobs(left, right) { const leftAt = Date.parse(left.startedAt); const rightAt = Date.parse(right.startedAt); if (leftAt !== rightAt) return leftAt - rightAt; return left.jobId.localeCompare(right.jobId); } function emptySweep(policy, retainedJobs) { return { removedJobs: 0, removedRecords: 0, retainedJobs, policy: { ...policy } }; } function recordKey(record) { const identity = record.tweetId ? `tweet:${record.tweetId}` : `source:${record.permalink ?? ""}|${record.surface}|${record.handle ?? ""}`; return `${identity}|${record.text.length}|${hashRecordText(record.text)}`; } function normalizeJobs(input, recoverRunning = true) { if (!input || typeof input !== "object") return {}; const result = {}; for (const [jobId, value] of Object.entries(input)) { const job = normalizeJob2(value, jobId, recoverRunning); if (job) result[job.jobId] = job; } return result; } function normalizeRecords(input) { if (!input || typeof input !== "object") return {}; const result = {}; for (const [jobId, records] of Object.entries(input)) { if (Array.isArray(records)) result[jobId] = records; } return result; } function normalizeJob2(value, fallbackId, recoverRunning = true) { if (!value || typeof value !== "object") return null; const raw = value; const jobId = typeof raw.jobId === "string" && raw.jobId.length > 0 ? raw.jobId : fallbackId; const startedAt = typeof raw.startedAt === "string" ? raw.startedAt : (/* @__PURE__ */ new Date(0)).toISOString(); const recordCount = nonNegativeInteger(raw.recordCount, 0); const persistedStatus = validStatus(raw.status) ? raw.status : raw.done === true ? "completed" : "paused"; const status = recoverRunning && persistedStatus === "running" ? "paused" : persistedStatus; const progress = normalizeProgress(raw.progress, recordCount); return { jobId, startedAt, surface: typeof raw.surface === "string" ? raw.surface : "unknown", recordCount, done: status === "completed" || status === "cancelled" || status === "failed", formats: Array.isArray(raw.formats) ? raw.formats.filter(isExportFormat) : ["json"], preserveRawPayloads: raw.preserveRawPayloads === true, status, progress, updatedAt: typeof raw.updatedAt === "string" ? raw.updatedAt : startedAt, resumeOnBoot: status === "paused" && (persistedStatus === "running" || raw.resumeOnBoot !== false), ...typeof raw.error === "string" && raw.error.length > 0 ? { error: raw.error } : {} }; } function normalizeProgress(value, fallback) { if (!value || typeof value !== "object") return { completed: fallback, total: null }; const raw = value; return { completed: nonNegativeInteger(raw.completed, fallback), total: raw.total === null ? null : nonNegativeInteger(raw.total, fallback) }; } function validStatus(value) { return value === "queued" || value === "running" || value === "paused" || value === "cancelled" || value === "failed" || value === "completed"; } function isExportFormat(value) { return value === "json" || value === "csv" || value === "html" || value === "markdown" || value === "xlsx"; } function isTerminal(status) { return status === "cancelled" || status === "failed" || status === "completed"; } function nonNegativeInteger(value, fallback) { return typeof value === "number" && Number.isFinite(value) ? Math.max(0, Math.trunc(value)) : fallback; } function hashRecordText(value) { let hash = 2166136261; for (let index = 0; index < value.length; index += 1) { hash ^= value.charCodeAt(index); hash = Math.imul(hash, 16777619) >>> 0; } return hash.toString(36); } // src/features/export/text-safety.ts function safeExternalHref(value) { if (typeof value !== "string" || value.trim().length === 0) return ""; try { const parsed = new URL(value, "https://x.com"); return parsed.protocol === "http:" || parsed.protocol === "https:" ? parsed.toString() : ""; } catch { return ""; } } function safeRelativePath(value) { if (!/^(?:[A-Za-z0-9._-]+\/)*[A-Za-z0-9._-]+$/.test(value)) return ""; const segments = value.split("/"); if (segments.some((segment) => segment === "." || segment === ".." || isReservedFileName(segment))) return ""; return value; } var RESERVED_FILE_NAMES = /^(?:CON|PRN|AUX|NUL|CLOCK\$|COM[1-9²³¹]|LPT[1-9²³¹])(?:\.|$)/i; function isReservedFileName(value) { return RESERVED_FILE_NAMES.test(value.trim()); } function safeFileSlug(value) { const slug = value.replace(/[^A-Za-z0-9_-]/g, "-").replace(/^-+|-+$/g, ""); if (slug.length === 0) return "post"; return isReservedFileName(slug) ? `${slug}-post` : slug; } function stripInvalidXmlChars(value) { let output = ""; for (const char of value) { const code = char.codePointAt(0) ?? 0; const allowed = code === 9 || code === 10 || code === 13 || code >= 32 && code <= 55295 || code >= 57344 && code <= 65533 || code >= 65536 && code <= 1114111; if (allowed) output += char; } return output; } function escapeXmlText(value) { return stripInvalidXmlChars(value).replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'"); } function parseExportDate(raw) { if (typeof raw !== "string" || raw.trim().length === 0) return null; const value = raw.trim(); const offsetless = /^\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?$/.test(value); const parsed = new Date(offsetless ? `${value.replace(" ", "T")}Z` : value); return Number.isNaN(parsed.getTime()) ? null : parsed; } function compareRecordIds(left, right) { const a = left ?? ""; const b = right ?? ""; const numericA = /^\d+$/.test(a); const numericB = /^\d+$/.test(b); if (numericA && numericB) { const trimmedA = a.replace(/^0+(?=\d)/, ""); const trimmedB = b.replace(/^0+(?=\d)/, ""); if (trimmedA.length !== trimmedB.length) return trimmedA.length - trimmedB.length; return trimmedA < trimmedB ? -1 : trimmedA > trimmedB ? 1 : compareCodeUnits(a, b); } if (numericA !== numericB) return numericA ? -1 : 1; return compareCodeUnits(a, b); } function compareCodeUnits(left, right) { return left < right ? -1 : left > right ? 1 : 0; } // src/features/export/thread-reconstruction.ts function reconstructThreads(records) { const nodes = dedupeNodes(records); if (nodes.length === 0) return []; const union = new UnionFind(nodes.length); const byTweetId = /* @__PURE__ */ new Map(); const contextBuckets = /* @__PURE__ */ new Map(); nodes.forEach((node, index) => { if (node.tweetId) byTweetId.set(node.tweetId, index); const context = node.conversationId ?? node.rootId ?? node.threadId; if (context) { const bucket = contextBuckets.get(context) ?? []; bucket.push(index); contextBuckets.set(context, bucket); } }); for (const bucket of contextBuckets.values()) { for (let index = 1; index < bucket.length; index += 1) union.join(bucket[0], bucket[index]); } nodes.forEach((node, index) => { const parent = node.parentId ? byTweetId.get(node.parentId) : void 0; if (parent !== void 0) union.join(index, parent); }); const components = /* @__PURE__ */ new Map(); nodes.forEach((node, index) => { const root = union.find(index); const component = components.get(root) ?? []; component.push(node); components.set(root, component); }); return [...components.values()].sort(compareComponents).map((component) => buildThread(component, byNodeId(component))); } function reconstructExportOrder(records) { const threads = reconstructThreads(records); const ordered = []; const seen = /* @__PURE__ */ new Set(); for (const thread of threads) { for (const item of thread.items) { if (item.kind !== "post") continue; const key = threadRecordKey(item.record); if (seen.has(key)) continue; seen.add(key); ordered.push(item.record); } } for (const record of records) { const key = threadRecordKey(record); if (!seen.has(key)) { seen.add(key); ordered.push(record); } } return ordered; } function threadRecordKey(record) { if (record.tweetId) return `tweet:${record.tweetId}`; return [ "record", record.surface, record.permalink ?? "", record.capturedAt, record.text.slice(0, 160) ].join("|"); } function dedupeNodes(records) { const nodes = []; const byKey = /* @__PURE__ */ new Map(); records.forEach((record, index) => { const key = threadRecordKey(record); const previous = byKey.get(key); if (previous !== void 0) { nodes[previous] = mergeNode(nodes[previous], record); return; } const node = { record, key, index, tweetId: cleanId2(record.tweetId), conversationId: cleanId2(record.conversationId), rootId: cleanId2(record.rootId), parentId: cleanId2(record.parentId), threadId: cleanId2(record.threadId), authorId: cleanId2(record.authorId), handle: cleanHandle(record.handle), displayName: cleanText2(record.displayName), timestamp: timestampOf(record.createdAt ?? record.capturedAt) }; byKey.set(key, nodes.length); nodes.push(node); }); return nodes; } function mergeNode(existing, incoming) { const merged = { ...existing.record }; const stringFields = [ "tweetId", "handle", "displayName", "capturedAt", "surface", "permalink", "conversationId", "parentId", "rootId", "authorId", "createdAt", "threadId", "birdwatch", "language" ]; for (const field2 of stringFields) { const value = incoming[field2]; if (typeof value !== "string" || value.trim().length === 0) continue; if (field2 === "capturedAt" && existing.record.capturedAt) continue; if (field2 === "surface" && existing.record.surface) continue; merged[field2] = value; } if (incoming.text.trim().length > existing.record.text.trim().length) merged.text = incoming.text; if (incoming.media.length > existing.record.media.length) merged.media = incoming.media; const incomingParticipants = incoming.participants; if (incomingParticipants && incomingParticipants.length > (existing.record.participants?.length ?? 0)) { merged.participants = incomingParticipants; } const incomingExpandedUrls = incoming.expandedUrls; if (incomingExpandedUrls && incomingExpandedUrls.length > (existing.record.expandedUrls?.length ?? 0)) { merged.expandedUrls = incomingExpandedUrls; } if (incoming.poll && !existing.record.poll) merged.poll = incoming.poll; if (incoming.quote && !existing.record.quote) merged.quote = incoming.quote; if (incoming.article && !existing.record.article) merged.article = incoming.article; return { ...existing, record: merged, conversationId: cleanId2(merged.conversationId) ?? existing.conversationId, rootId: cleanId2(merged.rootId) ?? existing.rootId, parentId: cleanId2(merged.parentId) ?? existing.parentId, threadId: cleanId2(merged.threadId) ?? existing.threadId, authorId: cleanId2(merged.authorId) ?? existing.authorId, handle: cleanHandle(merged.handle) ?? existing.handle, displayName: cleanText2(merged.displayName) ?? existing.displayName, timestamp: timestampOf(merged.createdAt ?? merged.capturedAt) || existing.timestamp }; } function byNodeId(component) { const result = /* @__PURE__ */ new Map(); for (const node of component) { if (node.tweetId) result.set(node.tweetId, node); } return result; } function buildThread(component, byTweetId) { const orderedNodes = [...component].sort(compareNodes); const rootId = firstNonEmpty(orderedNodes.map((node) => node.rootId ?? node.conversationId)); const id = rootId ?? orderedNodes[0]?.tweetId ?? `context:${orderedNodes[0]?.handle ?? orderedNodes[0]?.key}`; const children = /* @__PURE__ */ new Map(); for (const node of orderedNodes) { if (!node.parentId || !byTweetId.has(node.parentId)) continue; const list = children.get(node.parentId) ?? []; list.push(node); children.set(node.parentId, list); } for (const list of children.values()) list.sort(compareNodes); const items = []; const visited = /* @__PURE__ */ new Set(); const emittedGaps = /* @__PURE__ */ new Set(); const firstNode = orderedNodes.find((node) => node.tweetId === rootId); if (rootId && !firstNode && !orderedNodes.some((node) => node.parentId === rootId)) { emitGap(items, emittedGaps, rootId, null, 0); } const emit2 = (node, depth) => { const key = node.key; if (visited.has(key)) return; if (node.parentId && !byTweetId.has(node.parentId)) { emitGap(items, emittedGaps, node.parentId, null, Math.max(0, depth - 1)); } visited.add(key); items.push({ kind: "post", record: node.record, depth, parentId: node.parentId, differentAuthor: false }); for (const child of children.get(node.tweetId ?? "") ?? []) emit2(child, depth + 1); }; const roots = orderedNodes.filter((node) => !node.parentId || !byTweetId.has(node.parentId)); for (const node of roots) emit2(node, node.parentId && !byTweetId.has(node.parentId) ? 1 : 0); for (const node of orderedNodes) { if (!visited.has(node.key)) emit2(node, node.parentId ? 1 : 0); } const firstAuthor = items.find((item) => item.kind === "post"); const firstIdentity = firstAuthor ? authorIdentity(firstAuthor.record) : ""; for (const item of items) { if (item.kind !== "post") continue; item.differentAuthor = firstIdentity !== "" && authorIdentity(item.record) !== firstIdentity; } const records = items.filter((item) => item.kind === "post").map((item) => item.record); const participants = participantList(records); const authorRuns = collapseAuthorRuns(items); return { id, rootId, kind: participants.length > 1 ? "conversation" : "thread", items, records, gaps: items.filter((item) => item.kind === "gap"), participants, authorRuns }; } function collapseAuthorRuns(items) { const runs = []; let current = null; items.forEach((item, index) => { if (item.kind === "gap") { current = null; return; } const identity = authorIdentity(item.record); if (!current || authorIdentityFromRun(current) !== identity) { current = { authorId: cleanId2(item.record.authorId), handle: cleanHandle(item.record.handle), displayName: cleanText2(item.record.displayName), start: index, count: 0, postIds: [] }; runs.push(current); } current.count += 1; current.postIds.push(item.record.tweetId ?? threadRecordKey(item.record)); }); return runs; } function authorIdentityFromRun(run) { return run.authorId ?? run.handle ?? run.displayName ?? "unknown"; } function participantList(records) { const seen = /* @__PURE__ */ new Set(); const result = []; for (const record of records) { const participant = { authorId: cleanId2(record.authorId), handle: cleanHandle(record.handle), displayName: cleanText2(record.displayName) }; const key = authorIdentity(record); if (seen.has(key)) continue; seen.add(key); result.push(participant); } return result; } function emitGap(items, emitted, missingId, parentId, depth) { if (emitted.has(missingId)) return; emitted.add(missingId); items.push({ kind: "gap", missingId, parentId, depth }); } function compareComponents(left, right) { return compareNodes(left[0], right[0]); } function compareNodes(left, right) { return left.timestamp - right.timestamp || left.index - right.index || left.key.localeCompare(right.key); } function authorIdentity(record) { return cleanId2(record.authorId) ?? cleanHandle(record.handle) ?? cleanText2(record.displayName) ?? "unknown"; } function cleanId2(value) { if (typeof value !== "string") return null; const cleaned = value.trim(); return cleaned.length > 0 ? cleaned.slice(0, 128) : null; } function cleanHandle(value) { if (typeof value !== "string") return null; const cleaned = value.replace(/^@/, "").trim().toLowerCase(); return cleaned.length > 0 ? cleaned.slice(0, 64) : null; } function cleanText2(value) { if (typeof value !== "string") return null; const cleaned = value.trim(); return cleaned.length > 0 ? cleaned.slice(0, 256) : null; } function firstNonEmpty(values) { return values.find((value) => Boolean(value)) ?? null; } function timestampOf(value) { if (!value) return 0; const parsed = Date.parse(value); return Number.isFinite(parsed) ? parsed : 0; } var UnionFind = class { #parents; #ranks; constructor(size) { this.#parents = Array.from({ length: size }, (_, index) => index); this.#ranks = Array.from({ length: size }, () => 0); } find(value) { let current = value; while (this.#parents[current] !== current) current = this.#parents[current]; while (this.#parents[value] !== value) { const next = this.#parents[value]; this.#parents[value] = current; value = next; } return current; } join(left, right) { const leftRoot = this.find(left); const rightRoot = this.find(right); if (leftRoot === rightRoot) return; if (this.#ranks[leftRoot] < this.#ranks[rightRoot]) { this.#parents[leftRoot] = rightRoot; } else if (this.#ranks[leftRoot] > this.#ranks[rightRoot]) { this.#parents[rightRoot] = leftRoot; } else { this.#parents[rightRoot] = leftRoot; this.#ranks[leftRoot] += 1; } } }; // src/features/export/zip-store.ts var CRC32_TABLE = (() => { const table = new Uint32Array(256); for (let i = 0; i < 256; i++) { let c = i; for (let j = 0; j < 8; j++) { c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1; } table[i] = c >>> 0; } return table; })(); function crc32(data) { let c = 4294967295; for (let i = 0; i < data.length; i++) { c = (CRC32_TABLE[(c ^ data[i]) & 255] ^ c >>> 8) >>> 0; } return (c ^ 4294967295) >>> 0; } var FLAG_UTF8_NAMES = 2048; var MAX_UINT16 = 65535; var MAX_UINT32 = 4294967295; var METHOD_STORE = 0; var METHOD_DEFLATE = 8; async function deflateRaw(data) { const Compression = globalThis.CompressionStream; if (typeof Compression !== "function") { return null; } try { const stream = new Blob([data]).stream().pipeThrough(new Compression("deflate-raw")); const chunks = []; let total = 0; const reader = stream.getReader(); for (; ; ) { const next = await reader.read(); if (next.done) break; const chunk = next.value; chunks.push(chunk); total += chunk.length; } const output = new Uint8Array(total); let at = 0; for (const chunk of chunks) { output.set(chunk, at); at += chunk.length; } return output; } catch { return null; } } async function buildZip(entries) { const compressed = []; const methods = []; for (const entry of entries) { const deflated = entry.data.length > 0 ? await deflateRaw(entry.data) : null; if (deflated && deflated.length < entry.data.length) { compressed.push({ ...entry, data: deflated }); methods.push(METHOD_DEFLATE); } else { compressed.push(entry); methods.push(METHOD_STORE); } } return writeZip(compressed, methods, entries.map((entry) => entry.data)); } function buildStoreZip(entries) { return writeZip(entries, entries.map(() => METHOD_STORE), entries.map((entry) => entry.data)); } function writeZip(entries, methods, originals) { const encoder = new TextEncoder(); const localBlocks = []; const centralBlocks = []; let offset = 0; if (entries.length > MAX_UINT16) { throw new RangeError( `A zip holds at most ${MAX_UINT16} entries without ZIP64; got ${entries.length}.` ); } for (const [index, entry] of entries.entries()) { const method = methods[index] ?? METHOD_STORE; const original = originals[index] ?? entry.data; if (original.length > MAX_UINT32) { throw new RangeError( `"${entry.filename}" is ${entry.data.length} bytes; a zip entry cannot exceed ${MAX_UINT32} without ZIP64.` ); } const nameBytes = encoder.encode(entry.filename); if (nameBytes.length > MAX_UINT16) { throw new RangeError(`"${entry.filename}" has a name longer than ${MAX_UINT16} bytes.`); } const crc = crc32(original); const size = original.length; const stored = entry.data.length; const date = entry.date ?? /* @__PURE__ */ new Date(); const dosDate = toDosDate(date); const dosTime = toDosTime(date); const localHeader = new ArrayBuffer(30 + nameBytes.length); const lhView = new DataView(localHeader); lhView.setUint32(0, 67324752, true); lhView.setUint16(4, 20, true); lhView.setUint16(6, FLAG_UTF8_NAMES, true); lhView.setUint16(8, method, true); lhView.setUint16(10, dosTime, true); lhView.setUint16(12, dosDate, true); lhView.setUint32(14, crc, true); lhView.setUint32(18, stored, true); lhView.setUint32(22, size, true); lhView.setUint16(26, nameBytes.length, true); lhView.setUint16(28, 0, true); const localHeaderBytes = new Uint8Array(localHeader); localHeaderBytes.set(nameBytes, 30); localBlocks.push(localHeaderBytes); localBlocks.push(entry.data); const centralHeader = new ArrayBuffer(46 + nameBytes.length); const chView = new DataView(centralHeader); chView.setUint32(0, 33639248, true); chView.setUint16(4, 20, true); chView.setUint16(6, 20, true); chView.setUint16(8, FLAG_UTF8_NAMES, true); chView.setUint16(10, method, true); chView.setUint16(12, dosTime, true); chView.setUint16(14, dosDate, true); chView.setUint32(16, crc, true); chView.setUint32(20, stored, true); chView.setUint32(24, size, true); chView.setUint16(28, nameBytes.length, true); chView.setUint16(30, 0, true); chView.setUint16(32, 0, true); chView.setUint16(34, 0, true); chView.setUint16(36, 0, true); chView.setUint32(38, 0, true); chView.setUint32(42, offset, true); const centralBytes = new Uint8Array(centralHeader); centralBytes.set(nameBytes, 46); centralBlocks.push(centralBytes); offset += localHeaderBytes.length + entry.data.length; } const centralStart = offset; let centralSize = 0; for (const block of centralBlocks) { centralSize += block.length; } if (centralStart > MAX_UINT32 || centralSize > MAX_UINT32) { throw new RangeError( `The archive is too large for a non-ZIP64 zip (central directory at ${centralStart}, size ${centralSize}).` ); } const endRecord = new Uint8Array(22); const erView = new DataView(endRecord.buffer); erView.setUint32(0, 101010256, true); erView.setUint16(4, 0, true); erView.setUint16(6, 0, true); erView.setUint16(8, entries.length, true); erView.setUint16(10, entries.length, true); erView.setUint32(12, centralSize, true); erView.setUint32(16, centralStart, true); erView.setUint16(20, 0, true); const total = offset + centralSize + endRecord.length; const output = new Uint8Array(total); let cursor = 0; for (const block of localBlocks) { output.set(block, cursor); cursor += block.length; } for (const block of centralBlocks) { output.set(block, cursor); cursor += block.length; } output.set(endRecord, cursor); return output; } function toDosDate(date) { const year = Math.max(date.getUTCFullYear() - 1980, 0); return (year & 127) << 9 | (date.getUTCMonth() + 1 & 15) << 5 | date.getUTCDate() & 31; } function toDosTime(date) { return (date.getUTCHours() & 31) << 11 | (date.getUTCMinutes() & 63) << 5 | Math.floor(date.getUTCSeconds() / 2) & 31; } // src/features/export/xlsx.ts var ENCODER = new TextEncoder(); function formatXlsx(records) { const sheetRows = [ [ "tweetId", "handle", "displayName", "capturedAt", "surface", "permalink", "language", "text", "mediaUrls", "mediaStatus", "mediaManifest" ] ]; for (const record of records) { const captures = record.media.map((media) => describeMediaCapture(media, record.capturedAt)); sheetRows.push([ record.tweetId ?? "", record.handle ?? "", record.displayName ?? "", record.capturedAt, record.surface, record.permalink ?? "", normalizePostLanguage(record.language) ?? "", record.text, captures.map((media) => media.sourceUrl).filter(Boolean).join("|"), captures.map((media) => media.status).join("|"), JSON.stringify(captures) ]); } const sheetXml = buildSheetXml(sheetRows); const workbookXml = ` `; const workbookRelsXml = ` `; const rootRelsXml = ` `; const contentTypesXml = ` `; const archive = buildStoreZip([ { filename: "[Content_Types].xml", data: ENCODER.encode(contentTypesXml) }, { filename: "_rels/.rels", data: ENCODER.encode(rootRelsXml) }, { filename: "xl/_rels/workbook.xml.rels", data: ENCODER.encode(workbookRelsXml) }, { filename: "xl/workbook.xml", data: ENCODER.encode(workbookXml) }, { filename: "xl/worksheets/sheet1.xml", data: ENCODER.encode(sheetXml) } ]); return { filename: "tweets.xlsx", contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", data: archive }; } function buildSheetXml(rows) { const xmlRows = []; for (let r = 0; r < rows.length; r++) { const row = rows[r]; const cells = []; for (let c = 0; c < row.length; c++) { const value = row[c] ?? ""; const cellRef = `${columnLetter(c)}${r + 1}`; cells.push(`${escapeXml(value)}`); } xmlRows.push(`${cells.join("")}`); } return ` ${xmlRows.join("")}`; } function columnLetter(index) { let label = ""; let n = index; while (n >= 0) { label = String.fromCharCode(n % 26 + 65) + label; n = Math.floor(n / 26) - 1; } return label; } function escapeXml(value) { return stripInvalidXmlChars(value).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); } // src/features/export/formatters.ts var TEXT_ENCODER = new TextEncoder(); function formatExport(format, records) { switch (format) { case "json": return jsonArtifact(records); case "csv": return csvArtifact(records); case "html": return htmlArtifact(records); case "markdown": return markdownArtifact(records); case "xlsx": return formatXlsx(records); default: return jsonArtifact(records); } } function jsonArtifact(records) { const json = JSON.stringify( { generator: "Aviary", generatedAt: (/* @__PURE__ */ new Date()).toISOString(), count: records.length, records: serializeExportRecords(records), threads: reconstructThreads(records).map((thread) => ({ id: thread.id, rootId: thread.rootId, kind: thread.kind, postIds: thread.records.map((record) => record.tweetId ?? null), gaps: thread.gaps.map((gap) => ({ missingId: gap.missingId, parentId: gap.parentId })), authorRuns: thread.authorRuns })) }, null, 2 ); return { filename: "tweets.json", contentType: "application/json", data: TEXT_ENCODER.encode(json) }; } function csvArtifact(records) { const headers = [ "tweetId", "handle", "displayName", "capturedAt", "surface", "permalink", "language", "audience", "text", "mediaUrls", "mediaStatus", "mediaManifest" ]; const lines = [headers.join(",")]; for (const record of records) { const captures = record.media.map((media) => describeMediaCapture(media, record.capturedAt)); const mediaUrls = captures.map((media) => media.sourceUrl).filter(Boolean).join("|"); const mediaStatus = captures.map((media) => media.status).join("|"); lines.push( [ record.tweetId ?? "", record.handle ?? "", record.displayName ?? "", record.capturedAt, record.surface, record.permalink ?? "", normalizePostLanguage(record.language) ?? "", normalizeAudience(record.audience), record.text, mediaUrls, mediaStatus, JSON.stringify(captures) ].map(csvCell2).join(",") ); } return { filename: "tweets.csv", contentType: "text/csv", data: TEXT_ENCODER.encode(`${lines.join("\n")} `) }; } function neutralizeFormula(value) { return /^[=+\-@\t\r]/.test(value) ? `'${value}` : value; } function csvCell2(value) { if (value === void 0 || value === null) { return ""; } const safe = neutralizeFormula(value); const needsQuotes = /[,"\r\n]/.test(safe); const escaped = safe.replace(/"/g, '""'); return needsQuotes ? `"${escaped}"` : escaped; } function htmlArtifact(records) { const rows = records.map((record) => { const media = record.media.map((entry) => { const capture = describeMediaCapture(entry, record.capturedAt); const href = capture.packagePath ? safeRelativeHref(capture.packagePath) : safeExternalHref(capture.sourceUrl); const label = `${entry.kind} \xB7 ${capture.status}`; const link = href ? `${escapeHtml(label)}` : escapeHtml(label); const details = [ capture.capturedAt ? `captured ${capture.capturedAt}` : "capture time unknown", capture.byteLength === null ? "bytes unknown" : `${capture.byteLength} bytes`, capture.sha256 ? `sha256 ${capture.sha256}` : "checksum unknown" ].join(" \xB7 "); const source = capture.sourceUrl && capture.status !== "captured-bytes" ? ` source: ${escapeHtml(capture.sourceUrl)}` : ""; return `
  • ${link} ${escapeHtml(details)}${source}
  • `; }).join(""); const permalinkHref = record.permalink ? safeExternalHref(record.permalink) : ""; const permalink2 = permalinkHref ? `${escapeHtml(permalinkHref)}` : ""; return `
    ${escapeHtml(record.displayName ?? record.handle ?? "Unknown")} @${escapeHtml(record.handle ?? "")}
    ${escapeHtml(record.text).replace(/\n/g, "
    ")}

      ${media}
    ${permalink2}
    `; }).join("\n"); const html = ` Aviary export

    Aviary export

    ${records.length} records, generated ${(/* @__PURE__ */ new Date()).toISOString()}.

    Media status is explicit: captured bytes use package-relative links; remote references are not fetched until a link is activated.

    ${rows} `; return { filename: "tweets.html", contentType: "text/html", data: TEXT_ENCODER.encode(html) }; } function markdownArtifact(records) { const sections = records.map((record) => { const header = `## ${record.displayName ?? record.handle ?? "Unknown"} (@${record.handle ?? "anon"}) \xB7 ${record.capturedAt}`; const language = normalizePostLanguage(record.language); const frontmatter = `--- language: ${language ?? "null"} ---`; const body = record.text.split("\n").map((line) => `> ${line}`).join("\n"); const media = record.media.length === 0 ? "" : ` ${record.media.map((entry) => { const capture = describeMediaCapture(entry, record.capturedAt); const target = capture.packagePath ?? capture.sourceUrl; const label = `${entry.kind} \xB7 ${capture.status}`; const link = target ? `[${label}](${escapeMarkdownUrl(target)})` : label; const details = `captured ${capture.capturedAt ?? "unknown"}; bytes ${capture.byteLength ?? "unknown"}; sha256 ${capture.sha256 ?? "unknown"}`; return `- ${link} (${details})`; }).join("\n")}`; const permalink2 = record.permalink ? ` ${record.permalink}` : ""; return `${frontmatter} ${header} Audience: ${normalizeAudience(record.audience)} ${body}${media}${permalink2}`; }); const md = `# Aviary export Generated ${(/* @__PURE__ */ new Date()).toISOString()} \xB7 ${records.length} records. Media links marked remote-reference are not fetched automatically. ${sections.join("\n\n---\n\n")} `; return { filename: "tweets.md", contentType: "text/markdown", data: TEXT_ENCODER.encode(md) }; } function escapeHtml(value) { return value.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); } function safeRelativeHref(value) { return safeRelativePath(value); } function escapeMarkdownUrl(value) { return value.replace(/\\/g, "%5C").replace(/\)/g, "%29").replace(/\s/g, "%20"); } // src/features/export/query-discovery.ts var QUERY_REGISTRY_KEY = "aviary.queryIds.v1"; var QUERY_REGEX = /\/i\/api\/graphql\/([A-Za-z0-9_-]{6,})\/([A-Za-z0-9_]{2,80})/g; var MAX_INLINE_SCRIPT_BYTES = 256e3; async function discoverQueryIds(storage) { const fallback = { queries: {}, observedAt: null }; const existing = await storage.get(QUERY_REGISTRY_KEY, fallback); const queries = { ...existing.queries }; if (typeof document !== "undefined") { const scripts = Array.from(document.querySelectorAll("script")); for (const script of scripts) { const src = script.getAttribute("src"); if (src) { mergeFromString(queries, src); } else if (script.textContent && script.textContent.length <= MAX_INLINE_SCRIPT_BYTES) { mergeFromString(queries, script.textContent); } } } const result = { queries, observedAt: (/* @__PURE__ */ new Date()).toISOString() }; try { await replaceStored(storage, QUERY_REGISTRY_KEY, result); } catch { } return result; } function mergeFromString(target, source) { QUERY_REGEX.lastIndex = 0; let match; while ((match = QUERY_REGEX.exec(source)) !== null) { const [, id, operation] = match; if (id && operation) { target[operation] = id; } } } // src/features/export/viewer.ts var VIEWER_COPY = { title: "Aviary archive", subtitle: "Local archive viewer. Remote references are never fetched automatically.", language: "Language", search: "Search records", status: "Media status", all: "All media", captured: "Captured bytes", remote: "Remote reference", missing: "Missing", sort: "Sort", newest: "Newest first", oldest: "Oldest first", handle: "Handle", thread: "Thread view", media: "Media", records: "records", shown: "shown", noResults: "No matching records.", source: "source", bytes: "bytes", checksum: "SHA-256", openSource: "Open source URL", threadPosts: "posts", offline: "offline-ready", network: "network may be required", gap: "Missing captured post", gapDetail: "This parent was not captured locally.", conversation: "Conversation", authorRun: "{count} posts by {author}" }; function buildViewerLabels() { const table = {}; for (const locale of supportedLocales()) { const entry = { name: locale.label }; for (const [key, english] of Object.entries(VIEWER_COPY)) { entry[key] = translateText(locale.code, english); } table[locale.code] = entry; } return table; } var LOCALE_ORDER = supportedLocales().map((locale) => locale.code); var RTL_CODES = supportedLocales().filter((locale) => locale.direction === "rtl").map((locale) => locale.code); function buildExportViewer(records, options = {}) { const visibleRecords = filterShareRecords(records, normalizeAudienceSelection(options.audience)); const data = safeJson(serializeExportRecords(visibleRecords)); const threads = safeJson(serializeThreads(reconstructThreads(visibleRecords))); const labels = safeJson(buildViewerLabels()); const script = viewerScript(labels, LOCALE_ORDER, RTL_CODES); const html = ` Aviary archive

    Aviary archive