.2a4vobxnfx.jpg)
逆向API实现AI chat自由
注意以下api以及ai模型和api技术仅适用于学习,如需api服务的可直接在留言板或页面底部留言窗口留言,部分模型完全免费。使用AI请遵守国家法律法规,详情请前往清朗·整治AI技术滥用了解一、sophnetapi 源 https://www.sophnet.com/#/playground/chat 正在维护 ✅ 当前版本 .. Beta Demo https://warm-squirrel-.deno.dev 语言 TypeScript 框架 Deno Models Qwen千问全系列 https://if.be-a.dev/ Features ;v 下的 OpenAI 兼容 API, 支持聊天补全与模型获取. -Search 后缀模型是带有联网搜索 -Full-Context 后缀模型是绕过了 条上下文限制 、部署前往Deno创建XXX.ts sophnetapi.ts import &#; serve &#; from "https://deno.land/std@../http/server.ts";// 定义常量const SOPHNET_BASE_URL = "https://www.sophnet.com/api";const PROJECT_UUID = "ArPWUQUAhjJOjaorHs";const PORT = ;const TOKEN_KEY = "sophnet_anonymous_token";const MAX_RETRIES = ; // 增加最大重试次数const INITIAL_RETRY_DELAY_MS = ; // 初始重试延迟(毫秒)const MAX_RETRY_DELAY_MS = ; // 最大重试延迟(毫秒)// 初始化Deno KVconst kv = await Deno.openKv();// 定义接口interface AnonymousTokenResponse &#; status: number; message: string; result: &#; anonymousToken: string; expires: string; &#;; timestamp: number;&#;interface SophNetModel &#; id: number; serviceUuid: string | null; projectUuid: string; displayName: string; modelFamily: string; available: boolean; isBaseModel: boolean; features: any; supportedStream: boolean; supportedImageInputs: boolean; schema: Array<&#; name: string; displayName: string; des: string; type: string; range: number[]; defaultValue: number; required: boolean; &#;>;&#;interface ModelsResponse &#; status: number; message: string; result: SophNetModel[]; timestamp: number;&#;interface TokenInfo &#; token: string; expires: string;&#;interface Message &#; role: string; content: string;&#;interface Reference &#; content: string; id: string; index: number; title: string; type: string; url: string;&#;// 随机生成一个用户代理字符串function getRandomUserAgent(): string &#; const userAgents = [ "Mozilla/. (Windows NT .; Win; x) AppleWebKit/. (KHTML, like Gecko) Chrome/... Safari/.", "Mozilla/. (Macintosh; Intel Mac OS X __) AppleWebKit/.. (KHTML, like Gecko) Version/. Safari/..", "Mozilla/. (Windows NT .; Win; x) AppleWebKit/. (KHTML, like Gecko) Chrome/... Safari/. Edg/...", "Mozilla/. (Windows NT .; Win; x) AppleWebKit/. (KHTML, like Gecko) Chrome/... Safari/.", "Mozilla/. (Macintosh; Intel Mac OS X __) AppleWebKit/. (KHTML, like Gecko) Chrome/... Safari/.", "Mozilla/. (X; Linux x_) AppleWebKit/. (KHTML, like Gecko) Chrome/... Safari/.", "Mozilla/. (Windows NT .; Win; x; rv:.) Gecko/ Firefox/.", "Mozilla/. (Macintosh; Intel Mac OS X .; rv:.) Gecko/ Firefox/.", "Mozilla/. (X; Ubuntu; Linux x_; rv:.) Gecko/ Firefox/.", ]; return userAgents[Math.floor(Math.random() * userAgents.length)];&#;// 计算指数退避延迟function getExponentialBackoffDelay(retryCount: number): number &#; const delay = INITIAL_RETRY_DELAY_MS * Math.pow(, retryCount); const jitter = Math.random() * INITIAL_RETRY_DELAY_MS; // 添加随机抖动 return Math.min(delay + jitter, MAX_RETRY_DELAY_MS);&#;// 延迟函数function sleep(ms: number): Promise<void> &#; return new Promise(resolve => setTimeout(resolve, ms));&#;// 从KV获取tokenasync function getTokenFromKV(): Promise<TokenInfo | null> &#; const tokenEntry = await kv.get<TokenInfo>([TOKEN_KEY]); return tokenEntry.value;&#;// 存储token到KVasync function storeTokenToKV(token: string, expires: string): Promise<void> &#; await kv.set([TOKEN_KEY], &#; token, expires &#;);&#;// 获取匿名tokenasync function getAnonymousToken(retryCount = ): Promise<string> &#; try &#; const response = await fetch(`$&#;SOPHNET_BASE_URL&#;/sys/login/anonymous`, &#; method: "GET", headers: &#; "Accept": "application/json", "User-Agent": getRandomUserAgent(), // 使用随机UA &#;, &#;); // 如果是 或 错误,进行重试 if ((response.status === || response.status >= ) && retryCount < MAX_RETRIES) &#; const delay = getExponentialBackoffDelay(retryCount); console.warn(`Get token failed with status $&#;response.status&#;. Retrying in $&#;delay&#;ms... ($&#;retryCount + &#;/$&#;MAX_RETRIES&#;)`); await sleep(delay); return getAnonymousToken(retryCount + ); &#; if (!response.ok) &#; throw new Error(`Failed to get token: $&#;response.status&#;`); &#; const data = await response.json() as AnonymousTokenResponse; await storeTokenToKV(data.result.anonymousToken, data.result.expires); return data.result.anonymousToken; &#; catch (error) &#; console.error("Error getting anonymous token:", error); throw error; &#;&#;// 获取有效tokenasync function getValidToken(): Promise<string> &#; // 先尝试从KV获取 const tokenInfo = await getTokenFromKV(); // 如果KV中有token且未过期,则使用该token if (tokenInfo && new Date(tokenInfo.expires) > new Date()) &#; return tokenInfo.token; &#; // 否则获取新token return await getAnonymousToken();&#;// 获取模型列表async function getModels(token: string, retryCount = ): Promise<SophNetModel[]> &#; try &#; const response = await fetch( `$&#;SOPHNET_BASE_URL&#;/public/playground/models?projectUuid=$&#;PROJECT_UUID&#;`, &#; method: "GET", headers: &#; "Accept": "application/json", "User-Agent": getRandomUserAgent(), // 使用随机UA "Authorization": `Bearer anon-$&#;token&#;`, &#;, &#;, ); // 如果是或错误,尝试刷新token并重试 if ((response.status === || response.status === ) && retryCount < MAX_RETRIES) &#; console.log(`Token expired, refreshing and retrying models request ($&#;retryCount + &#;/$&#;MAX_RETRIES&#;)...`); const newToken = await getAnonymousToken(); return await getModels(newToken, retryCount + ); &#; // 如果是 或 错误,进行重试 if ((response.status === || response.status >= ) && retryCount < MAX_RETRIES) &#; const delay = getExponentialBackoffDelay(retryCount); console.warn(`Get models failed with status $&#;response.status&#;. Retrying in $&#;delay&#;ms... ($&#;retryCount + &#;/$&#;MAX_RETRIES&#;)`); await sleep(delay); return getModels(token, retryCount + ); // 使用当前token重试,如果失败会在上面的逻辑中刷新 &#; if (!response.ok) &#; throw new Error(`Failed to get models: $&#;response.status&#;`); &#; const data = await response.json() as ModelsResponse; // 请求成功后获取新token并存储 (后台刷新) getAnonymousToken().catch(err => console.error("Background token refresh failed:", err)); return data.result; &#; catch (error) &#; console.error("Error getting models:", error); throw error; &#;&#;// 将SophNet模型转换为OpenAI格式function transformModelsToOpenAIFormat(models: SophNetModel[]) &#; const transformedModels = []; // 为每个模型创建标准版本、搜索版本和全上下文版本 for (const model of models) &#; // 添加标准模型 transformedModels.push(&#; id: model.modelFamily, object: "model", created: Date.now(), owned_by: "sophnet", permission: [&#; id: `modelperm-$&#;model.id&#;`, object: "model_permission", created: Date.now(), allow_create_engine: false, allow_sampling: true, allow_logprobs: false, allow_search_indices: false, allow_view: true, allow_fine_tuning: false, organization: "*", group: null, is_blocking: false, &#;], root: model.modelFamily, parent: null, &#;); // 添加搜索版本模型 transformedModels.push(&#; id: `$&#;model.modelFamily&#;-Search`, object: "model", created: Date.now(), owned_by: "sophnet", permission: [&#; id: `modelperm-$&#;model.id&#;-Search`, object: "model_permission", created: Date.now(), allow_create_engine: false, allow_sampling: true, allow_logprobs: false, allow_search_indices: true, allow_view: true, allow_fine_tuning: false, organization: "*", group: null, is_blocking: false, &#;], root: model.modelFamily, parent: null, &#;); // 添加全上下文版本模型 transformedModels.push(&#; id: `$&#;model.modelFamily&#;-Full-Context`, object: "model", created: Date.now(), owned_by: "sophnet", permission: [&#; id: `modelperm-$&#;model.id&#;-Full-Context`, object: "model_permission", created: Date.now(), allow_create_engine: false, allow_sampling: true, allow_logprobs: false, allow_search_indices: false, allow_view: true, allow_fine_tuning: false, organization: "*", group: null, is_blocking: false, &#;], root: model.modelFamily, parent: null, &#;); // 添加全上下文+搜索版本模型 transformedModels.push(&#; id: `$&#;model.modelFamily&#;-Full-Context-Search`, object: "model", created: Date.now(), owned_by: "sophnet", permission: [&#; id: `modelperm-$&#;model.id&#;-Full-Context-Search`, object: "model_permission", created: Date.now(), allow_create_engine: false, allow_sampling: true, allow_logprobs: false, allow_search_indices: true, allow_view: true, allow_fine_tuning: false, organization: "*", group: null, is_blocking: false, &#;], root: model.modelFamily, parent: null, &#;); &#; return &#; object: "list", data: transformedModels, &#;;&#;// 处理全上下文功能function processFullContext(messages: Message[]): Message[] &#; // 复制消息数组,避免修改原数组 const messagesCopy = [...messages]; // 提取系统消息(如果存在) const systemMessages = messagesCopy.filter(msg => msg.role === "system"); // 获取非系统消息 const nonSystemMessages = messagesCopy.filter(msg => msg.role !== "system"); // 如果消息总数少于或等于对(条消息),则不需要处理 if (nonSystemMessages.length <= ) &#; return messages; &#; // 提取最后轮对话(最多条消息) const recentMessages = nonSystemMessages.slice(-); // 提取需要合并的历史消息 const historyMessages = nonSystemMessages.slice(, -); // 创建历史消息的摘要 const historySummary = &#; role: "user", content: `这里是此前的对话上下文: $&#;JSON.stringify(historyMessages)&#;` &#;; // 组合新的消息数组:系统消息 + 历史摘要 + 最近消息 return [...systemMessages, historySummary, ...recentMessages];&#;// 将数字转换为上标形式function convertToSuperscript(num: number): string &#; const normalDigits = ;;; const superscriptDigits = ;⁰¹²³⁴⁵⁶⁷⁸⁹;; return num.toString() .split(;;) .map(char => &#; const index = normalDigits.indexOf(char); return index !== - ? superscriptDigits[index] : char; &#;) .join(;;);&#;// 处理聊天完成请求async function handleChatCompletions( token: string, requestBody: any, stream: boolean, retryCount = ,): Promise<Response> &#; // 检查模型名称的后缀 const modelId = requestBody.model; const webSearchEnable = modelId.includes("-Search"); const fullContextEnable = modelId.includes("-Full-Context"); // 根据后缀确定实际模型ID let actualModelId = modelId; if (webSearchEnable) actualModelId = actualModelId.replace("-Search", ""); if (fullContextEnable) actualModelId = actualModelId.replace("-Full-Context", ""); // 处理消息 let processedMessages = requestBody.messages; if (fullContextEnable) &#; processedMessages = processFullContext(requestBody.messages); &#; const sophNetBody = &#; temperature: requestBody.temperature || ., top_p: requestBody.top_p || ., frequency_penalty: requestBody.frequency_penalty || , presence_penalty: requestBody.presence_penalty || , max_tokens: requestBody.max_tokens || , webSearchEnable: webSearchEnable, stop: requestBody.stop || [], stream: stream.toString(), model_id: actualModelId, messages: processedMessages, &#;; try &#; const response = await fetch( `$&#;SOPHNET_BASE_URL&#;/open-apis/projects/$&#;PROJECT_UUID&#;/chat/completions`, &#; method: "POST", headers: &#; "Content-Type": "application/json", "Authorization": `Bearer anon-$&#;token&#;`, "Accept": stream ? "text/event-stream" : "application/json", "User-Agent": getRandomUserAgent(), // 使用随机UA &#;, body: JSON.stringify(sophNetBody), &#;, ); // 如果是或错误,尝试刷新token并重试 if ((response.status === || response.status === ) && retryCount < MAX_RETRIES) &#; console.log(`Chat completion token expired, refreshing and retrying ($&#;retryCount + &#;/$&#;MAX_RETRIES&#;)...`); const newToken = await getAnonymousToken(); // 使用指数退避等待 const delay = getExponentialBackoffDelay(retryCount); await sleep(delay); return await handleChatCompletions(newToken, requestBody, stream, retryCount + ); &#; // 如果是 或 错误,进行指数退避重试 if ((response.status === || response.status >= ) && retryCount < MAX_RETRIES) &#; const delay = getExponentialBackoffDelay(retryCount); console.warn(`Chat completion failed with status $&#;response.status&#;. Retrying in $&#;delay&#;ms... ($&#;retryCount + &#;/$&#;MAX_RETRIES&#;)`); await sleep(delay); return handleChatCompletions(token, requestBody, stream, retryCount + ); // 使用当前token重试,如果失败会在上面的逻辑中刷新 &#; if (!response.ok) &#; throw new Error(`Chat completion failed: $&#;response.status&#;`); &#; // 请求成功后获取新token并存储 (后台刷新) getAnonymousToken().catch(err => console.error("Background token refresh failed:", err)); return response; &#; catch (error) &#; console.error("Error during chat completion fetch:", error); // 如果是网络错误或其他非HTTP错误,也进行指数退避重试 if (retryCount < MAX_RETRIES) &#; const delay = getExponentialBackoffDelay(retryCount); console.warn(`Chat completion network error. Retrying in $&#;delay&#;ms... ($&#;retryCount + &#;/$&#;MAX_RETRIES&#;)`); await sleep(delay); return handleChatCompletions(token, requestBody, stream, retryCount + ); &#; throw error; // 达到最大重试次数后抛出错误 &#;&#;// 转换流式响应async function* transformStreamResponse( readableStream: ReadableStream<UintArray>,) &#; const reader = readableStream.getReader(); const decoder = new TextDecoder(); let buffer = ""; // 用于存储所有引用,以便在结束时生成参考资料部分 const references: Reference[] = []; let referencesEmitted = false; // 标记是否已经发送过参考资料部分 try &#; while (true) &#; const &#; done, value &#; = await reader.read(); if (done) &#; // 如果有引用但尚未发送,在结束前发送参考资料部分 if (references.length > && !referencesEmitted) &#; const referencesSection = generateReferencesSection(references); yield `data: $&#;JSON.stringify(&#; id: `chatcmpl-$&#;Date.now()&#;`, // 生成一个唯一的ID object: "chat.completion.chunk", created: Math.floor(Date.now() / ), model: "sophnet-model", // 可以使用 SophNet 返回的模型名,或者固定一个 choices: [ &#; index: , delta: &#; content: `\n\n$&#;referencesSection&#;`, &#;, finish_reason: null, // 在发送参考资料时,finish_reason通常为null &#;, ], &#;)&#;\n\n`; referencesEmitted = true; &#; break; &#; buffer += decoder.decode(value, &#; stream: true &#;); const lines = buffer.split("\n"); buffer = lines.pop() || ""; for (const line of lines) &#; if (line.trim() === "" || !line.startsWith("data:")) continue; const data = line.substring().trim(); if (data === "[DONE]") &#; // 如果有引用但尚未发送,在结束前发送参考资料部分 if (references.length > && !referencesEmitted) &#; const referencesSection = generateReferencesSection(references); yield `data: $&#;JSON.stringify(&#; id: `chatcmpl-$&#;Date.now()&#;`, // 生成一个唯一的ID object: "chat.completion.chunk", created: Math.floor(Date.now() / ), model: "sophnet-model", // 可以使用 SophNet 返回的模型名,或者固定一个 choices: [ &#; index: , delta: &#; content: `\n\n$&#;referencesSection&#;`, &#;, finish_reason: null, // 在发送参考资料时,finish_reason通常为null &#;, ], &#;)&#;\n\n`; referencesEmitted = true; &#; yield "data: [DONE]\n\n"; continue; &#; try &#; const sophNetEvent = JSON.parse(data); // 检查是否包含引用 if (sophNetEvent.choices?.[]?.refs && sophNetEvent.choices[].refs.length > ) &#; // 处理引用 for (const ref of sophNetEvent.choices[].refs) &#; // 检查是否已经存在相同URL的引用 const existingRefIndex = references.findIndex(r => r.url === ref.url); if (existingRefIndex === -) &#; // 添加新引用 references.push(ref); // 生成引用标记,使用上标数字 const refIndex = references.length; const superscriptIndex = `⁽$&#;convertToSuperscript(refIndex)&#;⁾`; // 创建带引用标记的事件 yield `data: $&#;JSON.stringify(&#; id: sophNetEvent.id || `chatcmpl-$&#;Date.now()&#;`, // 使用SophNet ID或生成新ID object: "chat.completion.chunk", created: Math.floor(Date.now() / ), model: sophNetEvent.model || "sophnet-model", // 使用SophNet模型名或固定 choices: [ &#; index: , delta: &#; // SophNet的引用信息通常不在content中,我们需要手动添加 content: `[$&#;superscriptIndex&#;]($&#;ref.url&#;)`, &#;, finish_reason: null, // 引用事件通常没有finish_reason &#;, ], &#;)&#;\n\n`; &#; &#; &#; else &#; // 转换为OpenAI格式的事件 const openAIEvent = &#; id: sophNetEvent.id || `chatcmpl-$&#;Date.now()&#;`, // 使用SophNet ID或生成新ID object: "chat.completion.chunk", created: Math.floor(Date.now() / ), model: sophNetEvent.model || "sophnet-model", // 使用SophNet模型名或固定 choices: [ &#; index: , delta: &#; // OpenAI通常将内容放在delta.content reasoning_content: sophNetEvent.choices?.[]?.delta?.reasoning_content || "", content: sophNetEvent.choices?.[]?.delta?.content || "", &#;, finish_reason: sophNetEvent.choices?.[]?.finish_reason || null, &#;, ], &#;; yield `data: $&#;JSON.stringify(openAIEvent)&#;\n\n`; &#; &#; catch (e) &#; console.error("Error parsing event:", e, "Line:", line); // 可以选择在这里发送一个错误事件给客户端 &#; &#; &#; &#; finally &#; reader.releaseLock(); &#;&#;// 生成参考资料部分function generateReferencesSection(references: Reference[]): string &#; if (references.length === ) return ""; let section = "## 参考资料\n\n"; references.forEach((ref, index) => &#; section += `$&#;index + &#;. [$&#;ref.title&#;]($&#;ref.url&#;)\n`; &#;); return section;&#;// 转换非流式响应async function transformNonStreamResponse(response: Response) &#; const sophNetResponse = await response.json(); // 处理引用 let content = sophNetResponse.choices?.[]?.message?.content || ""; const references: Reference[] = []; // 收集所有引用 if (sophNetResponse.choices?.[]?.message?.refs && sophNetResponse.choices[].message.refs.length > ) &#; for (const ref of sophNetResponse.choices[].message.refs) &#; references.push(ref); &#; // 为每个引用添加上标标记 references.forEach((ref, index) => &#; const refIndex = index + ; const superscriptIndex = `⁽$&#;convertToSuperscript(refIndex)&#;⁾`; // 在内容末尾添加引用标记 content += ` [$&#;superscriptIndex&#;]($&#;ref.url&#;)`; &#;); // 添加参考资料部分 if (references.length > ) &#; content += "\n\n" + generateReferencesSection(references); &#; &#; return &#; id: sophNetResponse.id || `chatcmpl-$&#;Date.now()&#;`, // 使用SophNet ID或生成新ID object: "chat.completion", created: Math.floor(Date.now() / ), model: sophNetResponse.model || "sophnet-model", // 使用SophNet模型名或固定 choices: [ &#; index: , message: &#; role: "assistant", reasoning_content: sophNetResponse.choices?.[]?.message?.reasoning_content || "", content: content, &#;, finish_reason: sophNetResponse.choices?.[]?.finish_reason || "stop", &#;, ], usage: sophNetResponse.usage || &#; prompt_tokens: , completion_tokens: , total_tokens: , &#;, &#;;&#;// 主处理函数async function handler(req: Request): Promise<Response> &#; const url = new URL(req.url); const path = url.pathname; // CORS预检请求处理 if (req.method === "OPTIONS") &#; return new Response(null, &#; status: , headers: &#; "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET, POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type, Authorization", "Access-Control-Max-Age": "", &#;, &#;); &#; // 获取有效token let token; try &#; token = await getValidToken(); &#; catch (error) &#; console.error("Failed to get token in handler:", error); return new Response( JSON.stringify(&#; error: "Failed to get token", details: error.message &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", &#;, &#;, ); &#; try &#; // 模型列表接口 if (path === "/v/models" && req.method === "GET") &#; const models = await getModels(token); const openAIModels = transformModelsToOpenAIFormat(models); return new Response(JSON.stringify(openAIModels), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", &#;, &#;); &#; // 聊天完成接口 else if (path === "/v/chat/completions" && req.method === "POST") &#; const requestBody = await req.json(); const stream = requestBody.stream === true; const sophNetResponse = await handleChatCompletions(token, requestBody, stream); if (stream) &#; const transformedStream = new ReadableStream(&#; async start(controller) &#; try &#; for await (const chunk of transformStreamResponse(sophNetResponse.body!)) &#; controller.enqueue(new TextEncoder().encode(chunk)); &#; controller.close(); &#; catch (error) &#; console.error("Stream transformation error:", error); // 在流中发送错误信息 const errorData = JSON.stringify(&#; error: &#; message: `Stream processing error: $&#;error.message&#;`, type: "stream_error", code: null, &#; &#;); controller.enqueue(new TextEncoder().encode(`data: $&#;errorData&#;\n\n`)); controller.enqueue(new TextEncoder().encode("data: [DONE]\n\n")); controller.close(); &#; &#;, &#;); return new Response(transformedStream, &#; headers: &#; "Content-Type": "text/event-stream", "Cache-Control": "no-cache", "Connection": "keep-alive", "Access-Control-Allow-Origin": "*", &#;, &#;); &#; else &#; const transformedResponse = await transformNonStreamResponse(sophNetResponse); return new Response(JSON.stringify(transformedResponse), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", &#;, &#;); &#; &#; // 未找到路由 else &#; return new Response( JSON.stringify(&#; error: "Not found", message: "Endpoint not supported" &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", &#;, &#;, ); &#; &#; catch (error) &#; console.error("Request handling error:", error); // 返回统一的错误响应格式 return new Response( JSON.stringify(&#; error: &#; message: error.message, type: "api_error", // 或者更具体的错误类型 code: error.status || null, // 如果是HTTP错误,包含状态码 &#; &#;), &#; status: error.status || , // 使用错误状态码或默认 headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", &#;, &#;, ); &#;&#;// 启动服务器console.log(`Starting server on port $&#;PORT&#;...`);serve(handler, &#; port: PORT &#;); 图中 projectuuid 即为需要的数据。 、调用、此时我们打开deno分配的链接,返回json说明部署成功。、通过使用OpenWebui,NextChat,酒馆等api调用项目可以看到刷出多个模型实现ai自由。-search为联网搜索版本,这里使用的是最新的千问。 二、sciraapi 源 https://mcp.scira.ai/ 正在维护 ✅ 当前版本 .. Alpha Demo https://lazy-bear-.deno.dev 语言 TypeScript 框架 Deno Models Claude . Sonnet Gemini . Flash GPT . Mini Qwen QwQ Features ;v 下的 OpenAI 兼容 API, 支持聊天补全与模型获取. 、部署前往Deno创建XXX.ts sciraapi.ts import &#; serve &#; from "https://deno.land/std@../http/server.ts";// 定义常量 搜索https://mcp.scira.ai/api/chat获取变量const API_URL = "https://mcp.scira.ai/api/chat";const FIXED_USER_ID = "siufoijroijoifjdhdhd";const FIXED_CHAT_ID = "YinaxWNiuRASlf";const DEFAULT_MODEL = "claude---sonnet";const PORT = ;// 定义接口interface Message &#; role: string; content: string; parts?: Array<&#; type: string; text: string; &#;>;&#;interface SciraPayload &#; id: string; messages: Message[]; selectedModel: string; mcpServers: any[]; chatId: string; userId: string;&#;interface OpenAIModel &#; id: string; created: number; object: string;&#;// 可用模型列表const AVAILABLE_MODELS: OpenAIModel[] = [ &#; id: "qwen-qwq", created: Date.now(), object: "model", &#;, &#; id: "gemini-.-flash", created: Date.now(), object: "model", &#;, &#; id: "gpt-.-mini", created: Date.now(), object: "model", &#;, &#; id: "claude---sonnet", created: Date.now(), object: "model", &#;,];// 格式化消息为Scira格式function formatMessagesForScira(messages: Message[]): Message[] &#; return messages.map(msg => (&#; role: msg.role, content: msg.content, parts: [&#; type: "text", text: msg.content &#;] &#;));&#;// 构建Scira请求负载function buildSciraPayload(messages: Message[], model = DEFAULT_MODEL): SciraPayload &#; const formattedMessages = formatMessagesForScira(messages); return &#; id: FIXED_CHAT_ID, messages: formattedMessages, selectedModel: model, mcpServers: [], chatId: FIXED_CHAT_ID, userId: FIXED_USER_ID &#;;&#;// 处理模型列表请求async function handleModelsRequest(): Promise<Response> &#; const response = &#; object: "list", data: AVAILABLE_MODELS, &#;; return new Response(JSON.stringify(response), &#; headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" &#;, &#;);&#;// 处理聊天补全请求async function handleChatCompletionsRequest(req: Request): Promise<Response> &#; const requestData = await req.json(); const &#; messages, model = DEFAULT_MODEL, stream = false &#; = requestData; const sciraPayload = buildSciraPayload(messages, model); const response = await fetch(API_URL, &#; method: "POST", headers: &#; "Content-Type": "application/json", "User-Agent": "Mozilla/. (X; Linux x_; rv:.) Gecko/ Firefox/.", "Accept": "*/*", "Referer": `https://mcp.scira.ai/chat/$&#;FIXED_CHAT_ID&#;`, "Origin": "https://mcp.scira.ai", &#;, body: JSON.stringify(sciraPayload), &#;); if (stream) &#; return handleStreamResponse(response, model); &#; else &#; return handleRegularResponse(response, model); &#;&#;// 处理流式响应async function handleStreamResponse(response: Response, model: string): Promise<Response> &#; const reader = response.body!.getReader(); const encoder = new TextEncoder(); const decoder = new TextDecoder(); const id = `chatcmpl-$&#;Date.now().toString()&#;$&#;Math.random().toString().substring(, )&#;`; const createdTime = Math.floor(Date.now() / ); const systemFingerprint = `fp_$&#;Math.random().toString().substring(, )&#;`; const stream = new ReadableStream(&#; async start(controller) &#; // 发送流式头部 const headerEvent = &#; id: id, object: "chat.completion.chunk", created: createdTime, model: model, system_fingerprint: systemFingerprint, choices: [&#; index: , delta: &#; role: "assistant" &#;, logprobs: null, finish_reason: null &#;] &#;; controller.enqueue(encoder.encode(`data: $&#;JSON.stringify(headerEvent)&#;\n\n`)); try &#; let buffer = ""; while (true) &#; const &#; done, value &#; = await reader.read(); if (done) break; // 解码当前数据块并添加到缓冲区 buffer += decoder.decode(value, &#; stream: true &#;); // 处理完整的行 const lines = buffer.split(;\n;); // 保留最后一个可能不完整的行 buffer = lines.pop() || ""; // 处理并立即发送每一行 for (const line of lines) &#; if (!line.trim()) continue; if (line.startsWith(;g:;)) &#; // 对于g开头的行,输出reasoning_content let content = line.slice().replace(/^"/, "").replace(/"$/, ""); content = content.replace(/\\n/g, "\n"); const event = &#; id: id, object: "chat.completion.chunk", created: createdTime, model: model, system_fingerprint: systemFingerprint, choices: [&#; index: , delta: &#; reasoning_content: content &#;, logprobs: null, finish_reason: null &#;] &#;; controller.enqueue(encoder.encode(`data: $&#;JSON.stringify(event)&#;\n\n`)); &#; else if (line.startsWith(;:;)) &#; // 对于开头的行,输出content let content = line.slice().replace(/^"/, "").replace(/"$/, ""); content = content.replace(/\\n/g, "\n"); const event = &#; id: id, object: "chat.completion.chunk", created: createdTime, model: model, system_fingerprint: systemFingerprint, choices: [&#; index: , delta: &#; content: content &#;, logprobs: null, finish_reason: null &#;] &#;; controller.enqueue(encoder.encode(`data: $&#;JSON.stringify(event)&#;\n\n`)); &#; else if (line.startsWith(;e:;)) &#; // 完成消息 try &#; const finishData = JSON.parse(line.slice()); const event = &#; id: id, object: "chat.completion.chunk", created: createdTime, model: model, system_fingerprint: systemFingerprint, choices: [&#; index: , delta: &#;&#;, logprobs: null, finish_reason: finishData.finishReason || "stop" &#;] &#;; controller.enqueue(encoder.encode(`data: $&#;JSON.stringify(event)&#;\n\n`)); &#; catch (error) &#; console.error("Error parsing finish data:", error); &#; &#; &#; &#; // 处理缓冲区中剩余的内容(如果有的话) if (buffer.trim()) &#; const line = buffer.trim(); if (line.startsWith(;g:;)) &#; let content = line.slice().replace(/^"/, "").replace(/"$/, ""); content = content.replace(/\\n/g, "\n"); const event = &#; id: id, object: "chat.completion.chunk", created: createdTime, model: model, system_fingerprint: systemFingerprint, choices: [&#; index: , delta: &#; reasoning_content: content &#;, logprobs: null, finish_reason: null &#;] &#;; controller.enqueue(encoder.encode(`data: $&#;JSON.stringify(event)&#;\n\n`)); &#; else if (line.startsWith(;:;)) &#; let content = line.slice().replace(/^"/, "").replace(/"$/, ""); content = content.replace(/\\n/g, "\n"); const event = &#; id: id, object: "chat.completion.chunk", created: createdTime, model: model, system_fingerprint: systemFingerprint, choices: [&#; index: , delta: &#; content: content &#;, logprobs: null, finish_reason: null &#;] &#;; controller.enqueue(encoder.encode(`data: $&#;JSON.stringify(event)&#;\n\n`)); &#; &#; &#; catch (error) &#; console.error("Stream error:", error); &#; finally &#; // 确保发送 "data: [DONE]" controller.enqueue(encoder.encode("data: [DONE]\n\n")); controller.close(); &#; &#; &#;); return new Response(stream, &#; headers: &#; "Content-Type": "text/event-stream", "Cache-Control": "no-cache", "Connection": "keep-alive", "Access-Control-Allow-Origin": "*", &#;, &#;);&#;// 处理非流式响应async function handleRegularResponse(response: Response, model: string): Promise<Response> &#; const text = await response.text(); const lines = text.split(;\n;); let content = ""; let reasoning_content = ""; let usage = &#; prompt_tokens: , completion_tokens: , total_tokens: &#;; let finish_reason = "stop"; for (const line of lines) &#; if (!line.trim()) continue; if (line.startsWith(;:;)) &#; // 常规内容 - 处理转义的换行符 let lineContent = line.slice().replace(/^"/, "").replace(/"$/, ""); lineContent = lineContent.replace(/\\n/g, "\n"); content += lineContent; &#; else if (line.startsWith(;g:;)) &#; // 推理内容 - 处理转义的换行符 let lineContent = line.slice().replace(/^"/, "").replace(/"$/, ""); lineContent = lineContent.replace(/\\n/g, "\n"); reasoning_content += lineContent; &#; else if (line.startsWith(;e:;)) &#; try &#; const finishData = JSON.parse(line.slice()); if (finishData.finishReason) &#; finish_reason = finishData.finishReason; &#; &#; catch (error) &#; console.error("Error parsing finish data:", error); &#; &#; else if (line.startsWith(;d:;)) &#; try &#; const finishData = JSON.parse(line.slice()); if (finishData.usage) &#; usage.prompt_tokens = finishData.usage.promptTokens || ; usage.completion_tokens = finishData.usage.completionTokens || ; usage.total_tokens = usage.prompt_tokens + usage.completion_tokens; &#; &#; catch (error) &#; console.error("Error parsing usage data:", error); &#; &#; &#; const systemFingerprint = `fp_$&#;Math.random().toString().substring(, )&#;`; const id = `chatcmpl-$&#;Date.now().toString()&#;$&#;Math.random().toString().substring(, )&#;`; const openAIResponse = &#; id: id, object: "chat.completion", created: Math.floor(Date.now() / ), model: model, system_fingerprint: systemFingerprint, choices: [&#; index: , message: &#; role: "assistant", content: content &#;, logprobs: null, finish_reason: finish_reason &#;], usage: usage &#;; // 如果存在推理内容,添加到消息中 if (reasoning_content.trim()) &#; openAIResponse.choices[].message.reasoning_content = reasoning_content; &#; return new Response(JSON.stringify(openAIResponse), &#; headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" &#;, &#;);&#;// 主请求处理函数async function handler(req: Request): Promise<Response> &#; const url = new URL(req.url); // 设置CORS头 const headers = &#; "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET, POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type, Authorization", &#;; // 处理OPTIONS请求(CORS预检) if (req.method === "OPTIONS") &#; return new Response(null, &#; headers, status: &#;); &#; try &#; // 处理模型列表接口 if (url.pathname === "/v/models") &#; return handleModelsRequest(); &#; // 处理聊天补全接口 if (url.pathname === "/v/chat/completions") &#; return handleChatCompletionsRequest(req); &#; // 未找到的路由 return new Response( JSON.stringify(&#; error: "Not found" &#;), &#; status: , headers: &#; "Content-Type": "application/json", ...headers &#;, &#; ); &#; catch (error) &#; console.error("Error processing request:", error); return new Response( JSON.stringify(&#; error: error.message || "Internal server error" &#;), &#; status: , headers: &#; "Content-Type": "application/json", ...headers &#;, &#; ); &#;&#;// 启动服务器console.log(`Starting server on port $&#;PORT&#;...`);serve(handler, &#; port: PORT &#;); 在对应位置找到 userId chatId 并修改对应参数。 和前文相同的是:、打开deno的链接会返回json。、通过api调用可以搜索到四个模型(注意:cloud .的模型名字为claude---sonnet)可以畅用cloud .和gemini. 三、sciraapi 源 https://assistant.on.adaptive.ai/ 正在维护 ✅ 当前版本 .. Alpha Demo https://skykchatgpto.deno.dev 语言 TypeScript 框架 Deno Models gpt-o Features 需要鉴权,所以无法直接粘贴代码,请自行手动部署 Chatgpt-o Omni全能多模态大模型直接自由了 直接点我的demo链接是无效的,自行部署 、部署前往Deno创建XXX.ts sciraapi.ts import &#; serve &#; from "https://deno.land/std@../http/server.ts";// --- 配置常量 ---const AUTH_KEY = Deno.env.get("AUTH_KEY") ?? "default_api_key_value"; //API密钥在Environment Variables中添加,否则默认是default_api_key_valueconst TARGET_URL = ;https://assistant.on.adaptive.ai/api/sendMessage;;const PROXY_MODEL_NAME = "gpt-o"; // 代理服务返回的模型名称const TARGET_HEADERS = &#; ;content-type;: ;application/json;, ;x-channel-id;: ""&#;;// --- 辅助函数:创建 SSE 数据块 ---function createSSEChunk(id: string, model: string, content: string | null, role: string | null, finish_reason: string | null): string &#; const now = Math.floor(Date.now() / ); const chunk: any = &#; id: id, object: "chat.completion.chunk", created: now, model: model, choices: [ &#; index: , delta: &#;&#;, finish_reason: finish_reason, logprobs: null, &#; ], // system_fingerprint: null, // 可选 &#;; if (role) &#; chunk.choices[].delta.role = role; &#; if (content) &#; chunk.choices[].delta.content = content; &#; // 如果 delta 为空且有 finish_reason,确保 delta 是空对象 if (!role && !content && finish_reason) &#; chunk.choices[].delta = &#;&#;; &#; return `data: $&#;JSON.stringify(chunk)&#;\n\n`;&#;/** * 向 Adaptive AI 发送创建新聊天的请求。 * 成功时返回新聊天的 ID (字符串)。 * 如果在过程中发生任何错误,则捕获错误并返。 * * @returns &#;Promise<string | >&#; 返回成功创建的聊天的 ID (string),或在失败时返回 。 */async function createChatAndGetId(): Promise<string> &#; const url = ;https://assistant.on.adaptive.ai/api/createChat;; // 定义请求头 (省略了 cookie 和 priority) const headers = &#; ;content-type;: ;application/json;, &#;; // 构建请求体,使用当前时间戳作为请求 ID const payload = &#; json: &#; jsonrpc: ".", id: Date.now(), // 使用动态 ID method: "createChat", params: [] &#; &#;; console.log("正在发送创建聊天请求..."); try &#; const response = await fetch(url, &#; method: ;POST;, headers: headers, body: JSON.stringify(payload) // 将 payload 对象转换为 JSON 字符串 &#;); // 检查 HTTP 响应状态码是否表示成功 if (!response.ok) &#; let errorBody = "无法读取响应体"; try &#; errorBody = await response.text(); // 尝试读取错误响应体 &#; catch (readError) &#; console.warn("读取错误响应体失败:", readError); &#; throw new Error(`创建聊天请求失败,HTTP 状态码: $&#;response.status&#;. 响应: $&#;errorBody&#;`); &#; // 解析 JSON 响应体 let responseData: any; try &#; responseData = await response.json(); &#; catch (parseError) &#; // 如果响应不是有效的 JSON,则抛出错误 console.error("解析创建聊天响应 JSON 时出错:", parseError); throw new Error(`无法将响应解析为 JSON: $&#;parseError.message&#;`); &#; // 提取并验证 ID // ID 预期在 responseData.json.result.id // 使用可选链操作符 (?.) 来安全地访问嵌套属性,防止因中间属性不存在而报错 const chatId = responseData?.json?.result?.id; // 检查提取到的 ID 是否是一个有效的、非空的字符串 if (typeof chatId === ;string; && chatId.length > ) &#; console.log(`成功创建聊天,获取到 ID: $&#;chatId&#;`); return chatId; // 返回提取到的 ID &#; else &#; // 如果 ID 不存在或格式不正确,则抛出错误 console.error("从响应中未能提取有效的聊天 ID。响应数据:", JSON.stringify(responseData)); throw new Error("创建聊天的响应格式无效或缺少 ;json.result.id; 字段。"); &#; &#; catch (error) &#; // 捕获 try 块中抛出的任何错误,或 fetch 本身的网络错误 const errorMessage = error instanceof Error ? error.message : String(error); console.error("执行 createChatAndGetId 时发生错误:", errorMessage); // 记录详细错误信息 // 创建并返回一个 Response 对象 // 状态码为 (Internal Server Error) // 响应体为 JSON 格式,包含错误信息 return new Response( JSON.stringify(&#; error: `创建聊天会话失败: $&#;errorMessage&#;` &#;), // 将错误信息包装在 JSON 对象中 &#; status: , // 设置 HTTP 状态码为 headers: &#; "Content-Type": "application/json", // 设置响应内容类型为 JSON "Access-Control-Allow-Origin": "*" // 如果需要跨域,添加此头 &#; &#; ); &#;&#;// --- 主处理函数 ---async function handler(req: Request): Promise<Response> &#; const url = new URL(req.url); // --- CORS 预检请求处理 --- if (req.method === "OPTIONS") &#; return new Response(null, &#; status: , headers: &#; "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type, Authorization", "Access-Control-Max-Age": "", &#;, &#;); &#; // 模型列表接口 if (url.pathname === "/v/models" && req.method === "GET") &#; return new Response( JSON.stringify(&#; object: "list", data: [ &#; id: "gpt-o", object: "model", created: , owned_by: "unlimitedai", permission: [&#; id: "modelperm-gpt-o", object: "model_permission", created: , allow_create_engine: false, allow_sampling: true, allow_logprobs: false, allow_search_indices: false, allow_view: true, allow_fine_tuning: false, organization: "*", group: null, is_blocking: false, &#;], root: "gpt-o", parent: null, &#;, ], &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", &#;, &#; ); &#; // --- 路径和方法检查 --- if (url.pathname !== "/v/chat/completions" || req.method !== "POST") &#; return new Response(JSON.stringify(&#; error: "Not Found or Method Not Allowed" &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", &#;, &#;); &#; // --- 添加认证检查 --- const authHeader = req.headers.get("Authorization"); let providedKey = ""; // 检查 Authorization header 是否存在且格式正确 (Bearer <key>) if (!authHeader || !authHeader.toLowerCase().startsWith("bearer ")) &#; console.warn(`认证失败: 缺少或格式错误的 Authorization header`); return new Response(JSON.stringify(&#; error: &#; message: "Unauthorized: Missing or invalid Authorization header. Use ;Bearer <YOUR_API_KEY>; format.", type: "invalid_request_error", param: null, code: "missing_or_invalid_header" &#; &#;), &#; status: , // Unauthorized headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", "WWW-Authenticate": ;Bearer realm="API Access"; &#; &#;); &#; // 提取 key 部分 providedKey = authHeader.substring(); // "Bearer ".length is console.log("providedKey:" + providedKey); // 直接比较提供的 key 和硬编码的 key if (providedKey !== AUTH_KEY) &#; console.warn(`认证失败: 无效的 API Key 提供`); return new Response(JSON.stringify(&#; error: &#; message: "Unauthorized: Invalid API Key provided.", type: "invalid_request_error", param: null, code: "inAUTH_KEY" &#; &#;), &#; status: , // Unauthorized headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*", "WWW-Authenticate": ;Bearer realm="API Access"; &#; &#;); &#; // --- 处理 POST 请求 --- try &#; // . 解析入站请求体 let requestBody: any; try &#; requestBody = await req.json(); console.log(requestBody) &#; catch (e) &#; console.error("Failed to parse request JSON:", e); return new Response(JSON.stringify(&#; error: "Invalid JSON in request body" &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" &#;, &#;); &#; // . 检查是否请求流式响应 const isStream = requestBody.stream === true; // . 提取用户输入的内容 - 将 messages 数组转换为字符串 let userContent: string | undefined; if (Array.isArray(requestBody.messages) && requestBody.messages.length > ) &#; try &#; // 直接将整个 messages 数组转换为 JSON 字符串 userContent = JSON.stringify(requestBody.messages); &#; catch (e) &#; console.error("Failed to stringify ;messages; array:", e); // 如果 JSON.stringify 失败 (虽然对数组不太可能,但以防万一) return new Response(JSON.stringify(&#; error: "Failed to process ;messages; array." &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" &#;, &#;); &#; &#; // 检查 userContent 是否成功生成 // 如果 requestBody.messages 不存在、不是数组、为空,或者转换出错,userContent 会是 undefined if (!userContent) &#; console.error("Request body must contain a non-empty ;messages; array."); return new Response(JSON.stringify(&#; error: "Request body must contain a non-empty ;messages; array." &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" &#;, &#;); &#; // 现在 userContent 包含了整个对话历史的字符串表示 console.log("Formatted user content:", userContent); // 可以取消注释来调试输出 const CHAT_ID = await createChatAndGetId();//获取新的聊天ID // . 构建目标 API Payload const payload = &#; json: &#; jsonrpc: ".", id: Date.now(), method: "sendMessage", params: [&#; chatId: CHAT_ID, content: userContent, fileId: null, fileIds: [] &#;] &#;, meta: &#; values: &#; "params..fileId": ["undefined"] &#; &#; &#;; // . 发送请求到目标 API (无论是否流式,都需要先获取完整响应) console.log("Forwarding request to:", TARGET_URL); const targetResponse = await fetch(TARGET_URL, &#; method: ;POST;, headers: TARGET_HEADERS, body: JSON.stringify(payload), &#;); // . 处理目标 API 的响应 if (!targetResponse.ok) &#; const errorBody = await targetResponse.text(); console.error(`Target API Error ($&#;targetResponse.status&#;):`, errorBody); // 即使是流式请求失败,也返回 JSON 错误 return new Response(JSON.stringify(&#; error: `Upstream API request failed with status $&#;targetResponse.status&#;`, details: errorBody &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" &#;, &#;); &#; // . 解析目标 API 的 JSON 响应 let targetData: any; try &#; targetData = await targetResponse.json(); &#; catch (e) &#; console.error("Failed to parse target API response JSON:", e); // 即使是流式请求失败,也返回 JSON 错误 return new Response(JSON.stringify(&#; error: "Failed to parse upstream API response" &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" &#;, &#;); &#; // . 从目标响应中提取内容 const assistantContent = targetData?.json?.result?.content; if (typeof assistantContent !== ;string;) &#; console.error("Could not extract ;content; from target API response:", JSON.stringify(targetData)); // 即使是流式请求失败,也返回 JSON 错误 return new Response(JSON.stringify(&#; error: "Invalid response format from upstream API" &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" &#;, &#;); &#; // . 根据 isStream 决定返回格式 const chatCompletionId = `chatcmpl-$&#;crypto.randomUUID()&#;`; // 为本次交互生成唯一 ID const modelName = requestBody.model || PROXY_MODEL_NAME; // 确定模型名称 if (isStream) &#; // --- 返回模拟的流式响应 --- console.log("Simulating stream response..."); const encoder = new TextEncoder(); const stream = new ReadableStream(&#; async start(controller) &#; try &#; // 模拟发送块 // 块 : 发送角色信息 controller.enqueue(encoder.encode( createSSEChunk(chatCompletionId, modelName, null, "assistant", null) )); await new Promise(resolve => setTimeout(resolve, )); // 短暂延迟,模拟处理 // 块 : 发送完整内容 controller.enqueue(encoder.encode( createSSEChunk(chatCompletionId, modelName, assistantContent, null, null) )); await new Promise(resolve => setTimeout(resolve, )); // 短暂延迟 // 块 : 发送结束信号 controller.enqueue(encoder.encode( createSSEChunk(chatCompletionId, modelName, null, null, "stop") )); // 发送 [DONE] 标记 controller.enqueue(encoder.encode("data: [DONE]\n\n")); // 关闭流 controller.close(); &#; catch (error) &#; console.error("Error during stream simulation:", error); controller.error(error); // 通知流出错了 &#; &#; &#;); return new Response(stream, &#; status: , headers: &#; ;Content-Type;: ;text/event-stream;, ;Cache-Control;: ;no-cache;, ;Connection;: ;keep-alive;, // 建议 SSE 使用 ;Access-Control-Allow-Origin;: ;*; &#;, &#;); &#; else &#; // --- 返回完整的 JSON 响应 --- console.log("Returning non-stream response."); const finalResponse = &#; id: chatCompletionId, object: "chat.completion", created: Math.floor(Date.now() / ), model: modelName, choices: [ &#; index: , message: &#; role: "assistant", content: assistantContent, &#;, finish_reason: "stop", logprobs: null, &#; ], usage: &#; prompt_tokens: , completion_tokens: , total_tokens: &#;, &#;; return new Response(JSON.stringify(finalResponse), &#; status: , headers: &#; ;Content-Type;: ;application/json;, ;Access-Control-Allow-Origin;: ;*; &#;, &#;); &#; &#; catch (error) &#; // --- 全局错误处理 --- console.error("Unhandled error in handler:", error); // 即使请求流式,也返回 JSON 错误 return new Response(JSON.stringify(&#; error: "Internal Server Error" &#;), &#; status: , headers: &#; "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" &#;, &#;); &#;&#;serve(handler); 站点没有检测,所以我自己加了鉴权防止to。生图能力视频创造强大的模型能力。
.4uaq0yxlzg.jpg)
AI文章摘要
通用教程 | TianliGPT Excerpt文章摘要生成工具 通用教程 这个教程是教你如何让自己的网页适配TianliGPT。 将代码插入到网页 我们需要将下面的代码插入到网页的任何位置。 <link rel="stylesheet" href="https://ai.tianli.top/static/public/tianli_gpt.min.css"><script>let tianliGPT_postSelector = ;#post #article-container;;let tianliGPT_key = ;QmpqRKDkwTXGie;;</script><script src="https://ai.tianli.top/static/public/tianli_gpt.min.js"></script> 我们可以观察一下代码,里面有tianliGPT_postSelector和tianliGPT_key这两个变量,我们需要更改里面的值来适配不同的主题,并且配置更多内容。 获取tianliGPT_postSelector 打开你的文章界面,按下F键,打开开发者工具。 点击选择器按钮。 然后鼠标选中到博客的文章。通过滑动鼠标尽可能的让方块涵盖文章中的所有内容。例如: 我的鼠标大致在红色的位置。 然后点击一下。我们可以看到这一行变灰了,说明被选中了。 然后我们鼠标放在灰色部分,来检查选中的部分是否包含整个文章,但是不包含文章外的东西。 很显然,鼠标放在post行时,出现了下方的按钮被选中的情况。 我们观察一些页面结构,发现post里面有多个结构,我们选择符合我们的要求的div元素。 我们发现这一行正好符合我们的要求。 包含了整个文章 不包含文章外的内容 我们右键单击,然后复制这一行的选择器: 复制的内容就是我们的 tianliGPT_postSelector。 常见问题 在不应该出现摘要的界面出现了摘要 你可以再添加一个变量来实现只匹配文章url。这个是通过tianliGPT_postURL来实现。 你可以添加 let tianliGPT_postURL = ""; 其中双引号的内容为匹配的文章地址,支持通配符。例如在hexo博客中,文章的地址通常为: https://wxking.github.io/post/fa.html https://wxking.github.io/post/daa.html 所以我们可以填写通用格式:*/post/*.html 如果你用的是Butterfly主题可以在主题文件夹下的themes;butterfly;_config.yml文件中的inject属性中配置:inject: head: - <link rel="stylesheet" href="https://ai.tianli.top/static/public/tianli_gpt.min.css"> bottom: - let tianliGPT_postSelector = ;\#post \#article-container;;let tianliGPT_theme = ;yanzhi; ;let tianliGPT_blacklist = ;https://wxking.github.io/blacklist.json;; let tianliGPT_Title = ;来自kking的AI摘要;;let tianliGPT_wordLimit = ;let tianliGPT_key =;QmpqRKDXXXXXXX;;</script> - <script src="https://ai.tianli.top/static/public/tianli_gpt.min.js"></script> 注意:tianliGPT_key需要放在所有let属性的最后。
.3rb0q31s05.jpg)
道德经
cabfdccbafcffbaefeabafccdbceeefcfffddbbcbfdfbdabbaebebceedefcfbdecfcedeabcededdcecbfbdbfaaeaefdffcbeccdbdedecbfcaecdaddefcdcfbddaebebedecedeffbdbfcccacfeebeceeecebdacdaaaadbfccbcdedbcbfaecedcbbcbdffbbffebbedfeabfdabbbcfbcddcedbbdeeaeadacdbdcabadeaacacbbdbfdccafbacddfeddebaecadeceafcbbcdbfdddadaaaffcdbaceffdcfbfbaaececfebfccdbefffeeafeeaabfebbecacfcaaffeebcfaedddfdbbbbcbcadcaabbfbaeabbbbcfcbebccbfbedacaaeffaedbdebabfcfadefbeebdeaffeafdbddeffbceaacedbedecaedfcafbcbbadbcabbcfabfacbbefffefccaedcdceeaeffbcbacbefccbaedcaeccdcaeccdcfbbcabfdbbadebaabbefceaeeeacddaabfaaffdaeefccfffebcfabcfcafaebeafdddcadeaeedafbbefceffcaeddcbbfbccabafbafbeecacbfdbfabebcebceaebbdfffdfffbddafaaeecfddfccdaaaedebafcfbfffafadaefbafdaeadeedabaefceecbfcdccdcecefedebdfddcceccfdceefcaadbfcaeddfbcafeaccbbdacaedbcfdaaeaceeddadecdeccfcbbbafafcbcbddcbbbffbeccdccbbeaddbacefcfcffcccacfedaccbaaabaddefbcdeaddcdbeeeffecaaddcddceefdbcefccbefebbbbffacdccaebeacedaeaecfeafbbefabbdcdebcdbfeeeabfbedccadadcbdfaacdcbeaeedbaadabccefdfdbdaefbefaabeffeadedbbbfbeeabedacaafcaccaaebbdddabdcdaecaaabfdeaeebcdcbacffbcdceebffadcbcbfffebcdcabfcaafedfdceaeccbfddbddbeedaaacdcfaedcdaeefecffdeddbdefbfedcecbaceebabdfebbefecbefdafbdedbabedbbebffdfdedfffeedecbadebadadabbabcecceeebbeaebfdedfebbbdefcfdbfccdcbbdadedefdedcbcdbedddfccbdbcfacfdcebedcabfeeecfeefebcaddebaddbfafaeffafafcdfcedbfebeffadcdcffadddcdaeaebaeffeecfecaddecabcbbcecbdddacbbfdaeddaccffdabdcfefabcafaaffafabbbedbedcdedccfbedbeadaedcdbecccdeedbcbbaebdfbcfbffffdaffdcdacdaefdfabeefcdbabbebdeafddcbedbfadfbcfecdefcdabcfdbacabcfdfacfabdbedfaacadfaedfadcbbbfbdbcdbaedcaabbdfeafdfaefdbedafcaccbedcccaaebfbaeeaeecefbffabbdaadfeacacbdcceccdcadfdefeaacbdbaeedddffffbbcccecbaadeaaacbfbacdbfaceecdcaccabacfabafafcaffcbeffeefabfafcaabfccdecfbdcffaaaaffdadebcbbdacdfefffcebbdaabbaefbfeceaaccccafbbbcbcefcfdbccdadabddfcdffaedcfebcdeadbfefebfececdcedbcbcbcafbfeadcbdbaaeacdffffdebceccbbdedeebdccaeececccedddeadedcecbdadcdabafaccebfffbecffcebeffbcebbccdecbbbfebdbaecfdfaffccbffafadaadefedecafccbfedebeffecbfdbccdfecfcacdeddbfdfefcbdaabfcadeebacadcabfbbcddcafccdaffefcadeebdabaacdafeafabdbaceeedebcacdcaeedfbbddeedacfbeedbdbbaccabeeeffaeebaacfeaaeacdacffafeffcecbadbfaacdfebdfdfdcbabccdbbddbebcdeafbbccdebdbfccaededfdebbaddaddfcacdcfaabdcabbfdbbcbdbfdcbbfcceebcaaadcedabdfffaddedeaabbdeccbacfcbecbcdcebeaecaefcaebfcaaefcbcccbfceadadebcdcefbdaffdbbacfcebbdbfdacdfddbfeeadedbcbceadbccdbeefccbafaafacfacecbbfaeddcdaeefecdaadfbfaeecdccbbeeafbcfeadebabeafeffccfbddfabafddfdfcfcebeeccbecaaebcbcafdafeabceaccecaecddabfacaededcbaddbdbcbeafcfdcabebcfacaabeeecbaaabfcacadfcedcdcabdfafdeedfbaaabfcdebbcafeedabaeadabbacceafdeacfcbebcedfbeecadfaddcfadcfdffdcfcbcdccfaaeefeccdbaacdeeaeabdcbfdecfcbfbbcfbaceaccaffbbfaedaadfcddbddffbefdfcaacddddeecaafdeabfabbfbfccbfaacaeacbcdfeccdcfeaaccbcfdeadfbededfeaeafabebacededbfceacedfaabfbbaeabcadbdefabeefebaffeefabeebfbeffcbafaebdaebfceadebacabacafefdaeddcddeeaeaedadfdebdddffeacebbadfdbecafabbdbfeadfbffeaeddabbbaffdfdeccbbfadcefcbfdaeeeaecdbbbdcdfdebadeedcbfebbebfdeddebdbbdcfbbeaddeaabcafbecceadcedabeefabcddcddfafbedfeaacddcfeeebfcadaaafebdcaccecfeababcbceffedbbcafbefaccdfceffeccbeefeeffcbaaeccbeddadbebcaeffadddbddbcdabbedaddfbefeeecddafbefbddbaceeaacfedebccbbcfaccacdaefdfddcaffeadeefaabcabfbdcdeadfccbecddfccacfaaecdbefaedbbbbcdafaedbebbcdfdedebecdecbeadaddfdeedacdabfabdbffcdebfadadbadedabafbeeeefbbdbefcebaffbdeeceaecefcbaafccfbdfcabdcfecebbddfeaceccffafbcbfbdfeeecfbcdeffadedecfbcebffbababffefbcfbbbedcebacccafcabbaaceedbfceefaeafbbdefccdedfcfefebbcaccfbfcaddafcaefabbffadfaaaffcbedcadadbbefddbefabbaeaafadcefbfcbdcbabceddeefdddcdbadfaacececbfffbfbeaaabacedafeeebcaeadcfaebdbcfceffbffdbebcbeafadeaffcdacbfbebffddbeafbeefaffefdebccbcffbedeabdfffdadaaaecdecacdcaeebfabacebdbaaccbcdaddfecbbedeabbbbddbaeeccefdeffdbbfaecaaeecddacfbacfffebeeececabccbfbcdfdcaebecbececbdbfcceffecceffbabcdfcbabdfcfccbceeefafdfbacfaecefabedcfacedbdcecdeabfabcfeefbabbecaabcfceadcfeededdfdbddfdaabfaabdacfbdbecbaaaefbeeefdaaffcedbbabdbaeecbbbafefaeedbdabaaebcbacbbddfaafecacafbfefcbeecbcdaaaebcdfaecccbafedcbfcecbfaaeebccaafcfdcdadeddbdbcfcefbefceaddaeabcdbfbcbaabaabadcafcdadeebfbcfebbeffcbfdebefeeebfaaecaccdabbafbaabcfcdfddfcffaabcebdadbcaafeadfaccdbccbefbfafacfbabffccddddfedbbdbfbdbeebfcbbeddfdaccbaddfefbefbcedeadfbacbdbcdfefccecbebfcceebbfecfeafcfeaadcaefffceafeeffdccfebfbfedbfdcdfdccfaceedfebeddafccededbabdfbddebffcbedcfdfddbbefcaecdccaffdfbdebabeabbdfabbfdffcdcbdbebdedfbcaebbdafeecccdcbbbdafdefaaefdcdbdccbfbebbcdddcfbecffeeebfcfabafceffbceccdabfaabdbdeedfcecacccbfebcaddfeafbdeeedcdeeaccaaffdcbccefaeccdaeedcdebaafdeddedaaacfabeacafeeababeaebaebbbdabebbfceefaddbfcfadbdbafbcefaddfcafaccbecfbbaeafcdceeefaecdcefedddcfecaaafcecbfbdacaddfaaafefeabceefafeebafcdbfdcfcdfdefacacfcbdbdedcfbddfeacbaedbdecddccecdcecbdcecbcecbcffdbbeddcfacbcffdedfeaecfeefefefadcafabcbdddfaeabceddddbacceddbfffeadcdfbbceccedececfcedfaceeffcfdfdefefbfdbaafbdcdabdadfeebccabcfcacdfccfdceaadabaafbebfdaaabccdbeabcaccfdfaecbdbffdfcaebfeaffdcdebebbbbfcaccfdfdbcffbcacffeccbdcdefaaeeeadaecbbcfecdfcaaeebadedcffeaefaecdfddfacddbaaebbbcacfbebdfbcaefcfefccdebacfbaeedddabbfdecaadcdcccbefdcdacfaeecfdbefcccafdefffdfbefbafddacefbfbafdfbcefcefbaadafcccfdafacaeddaefdbdedfefefdbcbebbbceecececbabbadfffffbedeaaecaccefadcdedcdcacfcefebaeeecfcdabeaefdbdaffeedceffcafdaafbccbacefeddbdeebcadfaebfafbcdbfadfdafbbaebcedfffdcccddcdabdbeacabaefbabfaebdcedbdefefbdfabdadffedbcdfbdbdebbadbdceeeefabcdebdfafbbcedbbebacbbbdeeadccdecfadbfbdafedbfaafffbdbeaecadcfcceacabdcdaebdeafebfcfebdedbfeaefecfafabcaaaddeadbcaafaaeeeefdcecfeedbaaeeecaccfbdffcfafbadcdecbeedebecfdeebfacfecbfefecdeaeeedaffebdeaccdeffbbfaddcaacfcabbfbebdaccbdeaafdeeeaafefeebdaeddeecbabeddbbdadfadbdebefdeacceeecbdeabbdbeccafcddeadfbcddbdafcadefebbbbddacaaebcdafedcbbebfebedfcdebfaeceefdfbafabfdacbacfdbadfdbbbbcccecadebceddffbbdecafecdaddebedfeffceffebfedeacdbadeccefaeabffddfbabcfebafdccdabdaecaccbcddfcaeefadacfdfbcadabacadfcffbdebaeecbffaceebfdbacdaafafbadbfcdddfacfdceadfaccdbfffcaccacecbbeefbbfbbdecfafebadbaedcbaaaeccbdcafbddadefdebbcbbeadcdecefeaddafaffbfbdcdaeaccccedacebeababcefcdafbddcceabccebacdfafaeeedcbffbcabedffbaecafcaaeffcbbacafdcfcafaeafbaaadfcdebbfddfdebaddccecfecffcfdadaafcebdbfcfffcbbfcbedffcddaceefaceeaccfceffaabcacedcfbefecbeadffcccfdfdefecbfbfebebaeaaddedeccdeadfdeebeacbccefbebdcfeeffaebbdcaeeecafdfbebdedbdafdbdcfedcbbabfcebabfdecfaeccdeeeeabdaedbdffdbebffeffdcbeedcdfdfecdbddecdabeedccddedeccfcffdbabcfafbbbeffcfeececbadfeafdebdfafcdcbdbacaadadbfbffbaebcccaffdfaaceefeecbbfeafcecfaaaebbeeefbdebafaffcfdafcffacfaedefedbbcefeaafcefedbfeaeeadfccccbcaaedeabdaadfdbdeccbdbcadacadedebbefdefbbddecacccdcccefdeceecfeecfdffefcefefeecefbffdfcaeddecdbccedcaeaeeffdfbcedfcfcddddfefebbbcaddbdbefcbadffecfaabecaeeefacafdbdcccbbeccaaedbcacdacdeffdcfcabbdcfecdcdcacdcbceaddaaaafddbebfcdcabcefcfbcfafacccbffcfadabdfbcafdebfcddccdeccabddbdefececbaeecdeadfdeaedfcfeefbaccefbdadfcfaeeafefcfccceecebeefddbddaafffeeecbbaadcbaabfcbdebfaabddfdfbcabaabcdffaeddfaacedaeccabdcaecddccccedadeadacaadabeabaebfcbecabacbadefeecdfcfbaeedfadeaeeceadbaddfbacafdccfedbfbcfbafffcbefebaacfeabefefbabafdbbdaabbbfedeecdabacefedacbecddfbecbecefaeccfcbbecbccdbafeffcecaaaaeaefedfadbbabdedcbdbaaddcbfcfadfeabcdbcaeabfaafccdbaacbdbfdcefdcbfbdbefaefffcfbaefafaafaddbcadbeffacdabddebecbcdeccbdaebbaadefdbfbaabfabdafffdcdcebcfaaffeaedfaededdedbfcaefdbdfddbafedbfadbafceddfcbbaeddbabdeaccdafbbafcbcadacbddeacaaedbafeaccbdcfdcbacaebeefcafdbebbaaffefcccbabbbcacefeffacbffeddecfbefaeafcccbccaacdcfcabaaceebfafeecfcbbbcddadeceebdfedddedfbadeefdeacfdaecbedbfcfbecacaecfbacbeacfcbdaaccdfbdcedabfbfbffbeaecdcbfaadeffdefdfcdffbaeefeecebbafbabfbffabaedcabfedbcbabfbfdfdafabefbdbcadefabfaaeafbcebccffdabeaadfdacbeefdfafbfcbbbedcabfbbffcbfecccaadfacfedaebdeaacffbcfaccddefeaaefdecdfbdaeabcecaaebdfdeadccacaefbabeafadffedeacafbfdffaefdcdfcbcbbcabfdacfdbbfaeecebdfeafdbddaeafedcbdfcfabbbdcfcfcdafdefeedbfeabbecdcdabecfcdbbacdbfaafebdcffdbafcaadcaadbdbbdddefafeacebeadefffacfcfcdeaccdeaddffedcafdfebcfadcbbdccadfdefefedbdcfbadeccceadcffbcdbdcfedfedcabaaedebcaacdbbfbddbcdcabecdffbafccedbabbfbeabecfbdffdeaffbfcbaccaefacaeecbafbcfcfaafbdffabaefbdddaacbfacedfafacafaeedcbfecceaacacfaefeeefbbcaabbeedfcddbcfffaacdebfcaabfebbacbeaeeafafdcffdabcfaffecfcdcbbedaacefdfceddbecfdeaadefdbecaddffedaaebeddbaabbcebbeebdeccabddcaaedadfbecfadaaafebeabcbacfbbefbdccaffecefbacdfdcacadaacfdffdaeccebcbdaeabbceeeeeafdeadbedebdbfebdadbbfeafbfecdceadfcbbbefcffcbafbacfcfcbdcbcdcbdabbdafafaddbfedcaceacfeabceeffdafacbcdecfbfcdbbedeabacaccbabafcddaabadcaacfddbaaabaffeceaadbdadbdaedacaddeaedecfbccdbbccdfbbdadbcdfeedcecddbefddaecefbfbdfbfcadffbcabdfbedaafabbaebacdeeaeadecbcbbffcfdfccabdddbdcbebbeebefcbeeebfbffbfaedadfbcebdeedbceaccaacccdcbacdceddaacadbffefbfcaefccbbfbefaeadfabffbebbebdccfefaeeddeaaecfdabecebcacbbfebfcfddaddccbcfdbadabdceeafaabfacebaeedaadfecdbdfcaebddeaffbefbbbbabfbceeddfeedafcbedfffcdacebceefefddfdbdcfbeecabcaccfcbcfbacefdcabdebcfafbeeeafcfeebddbcfadefbadabfbccfaddacbabcbfcdfaedbeedcccfdceacbffcedaedecabecfacdfeffadcbefcbfbecbfeddaeeffcfacfdddfbfbcfeeeccafdcebcabccffabefabcbebdecfdbeefeededeedabeeacabbaafeffbbecdcceffceabcfeceefcbcdfbbfeefbfeaceaeeffdccabdadbffaabdadfbfdbafaaeeecdbbddfdefeeecfdbbcebfcdcbddcffcaddedcebaefddadfceeedbaceedbeddcebbfdfceafdedfdbaaeedaaecbfacbcbcdcbbdebcecbcbccfbefecffeafdccbccdfccafdfcefeefdcddbeaebccecdcbcafaabebfabdcbbebceedccaaadfcbcadceecebeacedfbdbddfccddbcacbaffcacdeafdcebfccfabafaddaafdaffcfdbfaedfebeecbcdadebfbeabfcdaefbfabcafcafdafbbfbecfcaaacbeadaeaddffbaaffeacfefaeaeffeafcebcfeeabdfbefdccdfdcadbaeccfabcdcacabefeabbfcaacddfcbdcccebadddfbeddabdbcdccbacbefdedadcfadefcfcbdccbcbaebeddcecefbcfacffcfdfdfbfcaeeccaaebfcffaeecaedddfedbdfdaaefaacabaddcedacbcffbadbebaebbfcabcdacaacdebcadbaabcffeeceafcbbdfcfeefdcdfcacffcefeedcadfdeafabccbcdebfcacaebaeedddbbefaaaddfcedbebcefdcebccdbeafefdcbafdbedeecfeacabecbebcceabecdffcdedbfbdcecfcacacbaaaefdbcbafbadcccdacadeecbeaffcdafcafaaaffbdaddcfddebdaecddfacaaddfeeedfccefdbafadceceaaccaefedaaeabfdfbbfaaaabdddcabeceeefafbcfdabcebcbfadaceffdcefbebecabaeadeaeddbcfbeafebbdadaabffcceeecabfecaecdaceefdebaaedbdafbccafbdbcbdfaecbbeaaacfdacdfbadafcecaabcafeadccacfefbaacabeddbdbeadffbefabeaebbcfacaadfacecbdafdbdfdcdbedafbbacbecffdcbbcbefdcbfefabbdfbccfabbafdbefbfdffebaebaaddbdddbbcadbaffceeabfcefceebddebdebabbcffcdecbfaacbfbbadccabdecedafedffedbdaecbebdbaddffbeecbbbfdcaeeebefdfecfacbffcecaecadaeadcafffbcdfddcecdcdcbcbbaefdaddebaacdccfddcecbffffcdfeecfcdcdefdfedbcaaddcadbebcfeaedffbadebdefbdbedadacbfcffeffadcccffacbcaedaaddebedcccccdedbadbbbfcdfbcbfecdcbbdcfbeabfeeaececbacbabdcafefbedbaffeabaaedbedabbaaabbfdccedaeffedbffdddacaffcdcdaddafcffabedbedbfaceaaeddaecaafffeffedbfebacebaaababeecccfccaceffbbbebcfbaeedddbccafdbcadbfebecfbfaeebcbbcbdfeedbaafecfbfcaeffdabebeefcebedbdcdcfaeffadabecefbfeebffacecbbaffbcdbdeaceceebdcdbbafabaebeecbecaeaaabbedeecebdaababbddfddebcaaeeedadceafbfffddbbefcebffcdebfeeecffebedbdbdeabeccaeffbeaaadacacaecbffceceedcecdbbfbeeaedbfdebbfdfddcadcabbdedbdafbbdfabfeadeafadcfcaecbafcdaafdbcaeeacbdaadebcdabefaebddbeccfaadeaccefbcddadadedbaecabcffeeacdbcefbdbffbaddebfbfddfcaededcadbaecefbaaedfabbaecfccbddcabddacacdeeefaeedabeecfacadeccbaacaebaedbdeccdfbdfeceaacadcaabdcedcddaceeefbaefcadafbbcaffbbddabeeaeceddfdaefbceadfdcdbaacbfebadcebaafedfafdacdafdcdacafbccfaedfdaebbaaedeccddebcabbbabecbbccceecdeacaeecbfceafafbafbdedceeaccafcdeeabbdcafbcbdcabfdaffdccaeaeaddbedbffceeaaabaeffaaddebfaaedeebdedbffcfdaaaccbbbcdffecbbccffcdfebabfccccacadfcfadccbdeaccddefddeaedbbecfeedcdfcacfecddadefdcabbeaeebccdbaeacbedabadebeceacdcbecefabccfbaaefbedbcedfbfebfeafefffcfbccfcffdbfbdfecfcdebcfccdaedaaabcabfacdeabdfcebfdfafbdfaaaccafecddeeecadaccbffdeebebbfcdaeabdefdfdbdcbefdbcdbfcdfeacecbdfdddcccddeecffdfebdcebeccdbcbccdfceefdadcacfbecfacccbadcafaeaafdcbcbececacbbababcbcbadccadbaaacdbbdbfbdfbfafedbbeaabdaffebbeeadbddfadadcacfcceeafadfefebebdacaceefecdbdeefabdbaeeffadefcbbecfeebfcceabeedccacfaadffccdeaaecbbcabcbccecaaabbeadacfdaeacedbfadfbaaeeddaeafaaacabcdfcffafddbccefecdbdeebccadfedcabbaffdcfeeababbfcceaafbfccafbcbcfbffbfdbbaadccbefcfaeefcfbdaabacdcbbdacedcacdedebfdadefccffdebfafdaebddfadfceeddbebfafbfaecdffbcbbdedcdbcedadfddbedfadeafbbfbdbdfaaaaabbdefcfbcfcbfdfebedccaccafacaaffdeedffddaeccfbedafedfdfafeeddcaeecbcccdefedfeaefffacfdabbdfdfeeeafabbbbccdaedcedfdafafdefeebcebaeabccbabeeccbceefddbeeaddebbbbecbeecfdfeaffafcfdbbddaaeebcbefaaffbcacaebedfcacdcdcbeaddafdabfdbceabefafcbaaebacabbdedcedffdcdbdbdfcbffadadbcaabedaddfeebadaccaaffbbcccbbbcddabadfeacbbdcbefaacdecfbabfbddcacbbdefbaaccfbfecfaffaffddffcfbbafbabdcdfeacebfcadbcbfaebbdcbefebaeeeeedcfdffacecdccabdadbfcfcaccdecaecabbcfedafdcfecfbfbafcafeafabfeabbaeacdadefaebebebcfccbcfbfffeebacadcbbaeabecacbecbdcbecdbaabaefcccaecdafeefacddefccdffacbdeabbbbcefdfbeeeeeabcbfbadddcbdabbefdbcdbbceafbebfaeeaccbeaaabffadbcbbbdafeeafaafbfbacffbadaaaebaadcaadbedaadadbffddaccdacbefbbdecbfdfaadecbaddfabdfabadfffbdccffbafdfbcbffaaecdebaafccfdcdfeadffadebdfcebefbdceceeaaaceaacdaebfefcfffbeeccaabdacdbfaddbccbbbbdefceafbbaeedccfddbbfbdbfdcfdcbbefddbcfcfefaebbbcdfaadfeffbcbbeceabfdfdeaaeddbcafafedddcacdabdfbfddbbaefbebfceddafeeedaefafafaaddeebfdbceecaebdbabcdebaaeffadcdbdefcbfbdccefcabeabaabcbfdaeddebdfebafddddcbeabedceafeaefdcfababcdedfdafcfdccbfefaaeaaddafceebefaecbbbfeedfdcadffecaedcabdccebbdfebbcceebefcecfaeeadfcaeeccbeedefbecaecfdefeddaedbcbabedffbbfcffbefebfdeaefdeddbebfdeeeddaaeceecadceefafcaaffbaffdeeabbfdeafefbcbdeacecfedebcabafddfcbdbbdcbdcccfebabbaefecaefcbfcaacffebcacdeebdeddeddecdffadeddcceeecfbefdeaffbcedadecaaafccfeaedddabddcccedffadfbffaadfdbccadcdccedbfedbbcfbdeecdfeacbefddafbddabcbabefdabcfecfcfcbfeeeccdeaadeacdfaacfabfdebcdefcfcdcebfcdfdafedcfcbfbbcdcddeddfdccadadbabcaaffbceecaaefedbacdeaeedeacfbecfdcfbbaabffecfeabbfdaddadaecdbcdcbfacccbdbdbeccbfbfeffcacdedadbbcdeefadfacbbbcdbfbcacefccfdcbcbfdaabcdcfcefcfbacfbbeacdcbdacbfeeebabbbaeabcedbdcbcebabffacbacfdacbcabedfbabeecaeffecbdebadaecbdaeebebfdfabbadfedadccafebdeeecadffbccbefacacfedfdadadfeedfdcbdedacfdadddbbeaffebdbaaddcbdfcfeecbafecdcafbeddaabebfbaadbdbcbbebcaaafcdbabaaafbceeccdeedbcafcbaeafdecaadcedbfcaaeeaafadefefccbabbbadbaaaffbdfcdbbdbbabcccccbceabdccfbeaaeedcddfceebebedaffcfdeecdedfaedccadfdacccbcacdeecabfcdcfbebfbbbbcbfacccbbdbacadcbacbfceebedcafecefedcdeefbeebcfbfafbaaaaacfeebaceedbbcbdecdedacafedfedbdbcefcbdfabcddcbcaacdfcbcbeaeffdedcfbacfcbefeabbdacddcacaedeffacbebfbfeaddefabdcddfcfdeebeabbccbbbbebefbdabfdccdfbbeffddbdffbeeafceeafabdeadeecdefbbddaedcbfcffdbdacaabecefbaaaffaceabeadcecafeccabdeedbdfbdfabedadaccdddbffffcceaecfbfebfdbcfdbeaadcbfaddcfcabaafafeeaaecfcddcaeffdadfdadfbadfabdfccbfeababadbadaeacdbdacfbfdfcfcfccdefbfcaeedacefadbbecdfffcbffdefddfdececbdbebcfaeffcffcffceafbbeeaaaedefcdfbffbfbdbebddccffeabccbccebdfebffeebbdfacbfddacabfddcccfeebffcbaebfbfdadfdbdfbbfcabefbebeaaffaeeffedacebafcddadcffcbaefcdfdbfccabedeccbebecbebecaffbdccffacabadecfddbbaecddcaccfabdddabbabafcaeebbaafedeaccffacdabdfbbcbdaeabbaafbaadcedaceacddedbfafdecaafecbcfadeaffbaedffcbbbbedfbffcbbfbbabadeccfaccaedbbabcbbdaaabeabddacabbecdcfdededaecdfefdebeabfbeaedcbfcededdbacacabffdbfbbffcddebabdcbceedcddecfddeedfeddecefbefbdecddebabcebaafdafdbcdfeabaefbeeefccbabadeeeccfaaddbddbcefaacbcebdcdfcbacdbfbebbefefbdebeeddfabdbabeabfaebaffaacaaabffcdbbecebcfceccdefddcfdccbfcbcedeaacecdccefbafddcbbbeddcfabebaebbffacdcecedeacadafaaedfbcdfdddbfbbeacaafdebbbfacfebcfeaceaacfbccdfbeeaaedebfcafeeeccecdefbddfdaaadbcfeebecbcdcdffdffedcbeafddcceccfbbfaabcdfeccdfbbedeabcacbfcdeadefedfbaaffffbfdacdcebadcadbdeadcedcccacdbbbddeaaebdbcfcbfabceeaedeccdaafaaebfaadeebdbccafccbfacdddabeedfeeeeecbbfaabdedadeffdafdfeaaccdcbbebdfecdcdffebaaeaefcfabbfdebeedcbfeeeaacfddecbcccfedeaedbdfbedeebbcddcaaaaddebfffcebfdaedbabbaefefeabfffefaabdfbbfeaabbdeacfdbbebcfaeeaffecbfcdaebcdfdcccbefeaefdaebdccfbbcffccbeecbecfcfdbfaffebaebbfcaababfbdacbccddaeccdabbcbdfdcecfbeabbcbeeaeddaccddbacbfacedbfdedddcbdeaecbdcebdcafeccebbecceefcafbdbcbfeeeebfddaffecbbaafaabfffeacefdcfdfaffedcefbceafebfadffeeffefaafbadadfeedddedeaddcfeaccadccddebdeafddabebfdbcedfdbbafcaeaffafdaefbafeefadbeccaccaefeccefabfeafeffbefcaaeccacdfccbddcfdafdceebacdfcedcbdcbefbdbffdbadeecbfcbbbbdbfaebaeeafaadbecbfaccdaacfadbefcfdffdfceedcdeacceefaedfccdfaccfeafdfccaabdfdafaedeafbcfccbeadecebfeeeeadcddabaaeeabdacaffaeafddedfbeeabfadddfdfabbcfcfceefafacafcbbaaccbdbdcdbfbdbeadedcbbfddffdbebfefbecfdefafdabbaccbdbaccccedceefafacfafeddfefedfffeabfccececbabafbddaebddedfcabadbdcdbbceeeecadbffdafebefcbcafaafcafdbbbfbaaeacfadcfacbdbfafdacdbcfddbbcfdafcdbdfdabdafadcacdedcecffecabfaaeadcddbbacfcdbbdfadfccdceabecbadddebddbceefbeaddcdaedebdecdaededabcdebbfcaebecebebdbbcfdedeeedfeeeeadaedfedfcfebfbbdaecdaafaeefcbfeabbeaaefebcebcffaeadcecdcaabbafbafbddcffefaaedefbaaceaddcbcebedbfadecedcffbcaacdabaaeacccdbaafcdebaccfccacfdafbfaddfaceeaaeedfbadeceefdabccccdbcfefcbbbbafeecdfddbbddddcaeeffcccedbfeecbbffcaedcbbbafdaaeaabbfddeedcfebeedcdebfaceadbaefeadddfeffdfacbebfdcefdfaebafdebfefbdfdbdbbfeeaedfaaadecdbdfefcbfbafefbafebbcdbefcfdbfbfeadefbdaabafbefabebbadcbfbfdbaacecebabaabbedffcfebbcfcdeecadbbdaacccaabdfeacafafebebbdbcfdfefddddfbadbdefbaacadeabafeccdfbaceecfdeacdcafdedbfbbfdbafdfceccaafcffdcfceadadcbedbfaadfbecfeccaababbcdcaabccbefafaeeedbaddeedfcbddeeeddfdfbcdcbaeabacdefcaafccdebccbdfdcefbcbdbcbdbdddbfdcbbeefacbdacabeeaffbcdfbaedffefddbedbacdafceccfaecbfedacffacdcfafefcbfabbdbafcebafdeefdebdaeacdfdaadcdafacaabfeeedbdfabcebdcdfdceddcdcdceeedfdfcebdacffcfefdfbdecddefbfdecaeabfeddeabdafeaefacceceebaeeecfbdfebafbddfbabceaddbaceddeffedefcbefcbefbbecefaabdffffeccfddbebedefbeabcbbdbdcdcebddaccadbcbaccebebaebaafdffdcbdabbfbfcbbeacaeeadfaceabdbfebfcaaabcbbefedaafbdafcfddefbdabefedaaefdddfcffbeddabdfceccebbabcaeaeffcfcdacafefbefffabbefcafaffbdeabcdecbfdaceacaabccfbdfbdcfafaaacacfccfeaefaaebbdccdfeffedfcafcabbbebbccaeffefbecaeaecbeefcccddceeaafaabefdcdadbfdacaedbefcabfdcbfebdbaaebffbdbebdeabeeedeedbdfdadaeffcbebebcfccddabddafabaacfcaacabbbbbcbeceeaccaafcfcbcecabbcdcedececeaeffcaacffbcdbdcbeedfccddfdcedbbbaaffcbbbccdcbcdbdddbebcabbacfdaabccdfdcbadacbcadfecabbffdeeaeeeecfaebeeeaebadfaebbffafcecaddaebdcaffbdceeecaffedafcddcfaacfeeeeafebdbdcbaedcabecabdebdbfdefbdbfbcbfafdfafdcdfbfdbeedccbdfefaeebfedfeddbabbdeacdbfdbcdeadcacfcbdcddaccedbeeebbeffcaddcacdbefbacaffffcddbbeeafcfeabbccccaacccfdffeacfcbcddbbbfdefddebcafaecbbdbaabdeadcfcbbaeaceadfcbfbbceedaaffeaebedbfddffdeefccfaacdaacaeccbadafcababeccebebcabcadcdcfebebcbdfccebadbcbbeffdfdaecdfddaceabfdcafffacfebdbeaefcdbaccbaeadecfdaecabfbbfedbabdcbeadfacdfeededdefcaddcebdcaedaeffdabdafbaceffbbbdcaeaddecedfcbadfcecfabedaaedaaccaebcdffcdeabcabbaaebeecbeddefdbfcbfcfeaebededeccdcddcffabbecfacaeceaebbddbaeacbcccdefbafaadaeedacedfedcfacaaffcefbaffaddfefbdeabdccacdeeefdccafdbaeafdbcecabaacbaeabecfdbcabcbedbbcbcdecfefcfbdcebafebbeecebbcfaaffacaeadffaecddbffcdddabafcafabbbbaadaefffaebedaaebcaacdeeaabbfcefbdaacccbdecfffcfcddfbbcceaafaadfaaabeedaafdefdaeacbedeaeefeaebbfaabbccdaedeebcaacddeeefffbdadaefeddfdbbcfdaefafeadeabdccfbacecaeffbdffddfeabeadddcdedbdaaefddcfeaabdfabddcadbbfcaeeecafccebcfcacdbbcccafebedadfefcebbdbbeadfcabacaafeefbeddcbdabceafdbcceebfcfbbecaebebfcddcecbaafbceeafdcbbeddfdbadcebcdafbbbaeafccfeacacefccebcefbbaefcbabdfbdadfcfacbbcebafefffefbdbbffecdbdfdffebabdffbcdebdeeaadaddaadbfbcdffeffdffeefafccabffecbaaafdadfdceddafbccddcababaddffaaedefeddbaabfbddbeedbfeeedbdddfececaccbeabdcaccffdffaddbfabcfccbafefecbcccedccdcdbfaffbeecfaebaecafeafddeeecbfcdfbfcfdbfdedccccfdbccecfecfecffffdddbaeeabcbdeeacbbaeacafcfcecadccefadfbacaacfecdcdfaedbacacfcdacfbaefceaceefddfdcbaaffedeadabaccedadaeacefffbdafdbcaccfdbdfbbadabfabfeaacbefdbafdacddcbeddedaebdedeabfbbfbafafcfeaffbbfcfddecdfdeccaffbfefbbeceeeebccaccbdcbddfecbbadfabccfcebabceedbbeecbbfdcceefbbcfafdbddbabeefababdfdfdcdbefbbfcdaaefacefadaadecafcfcaebbefbcbfedfabbdfbbbfdddbeecbafcbaaebcbbaebfceefbafbbbbfdfbbfbcdefddcefeabfdddfcaafdcebebffbcefaeecfcbaefcacdccbbfceedeeaebeddadbdcaececffddadeaebeeecfedcbdbcafcfeffabbbfceeebcdbfdddbcdacabacdbabfadfdedfcfebafceeefbbefebefbeacfecbdafcfcaaeceeaebcacffedefdfeecbbefebefeaffaaacdcdcceaeceecffdefbfafaeacfcaabacebedaafcfadacaebbaefaebcbedcdaccdacaeafbdadefddcafdfeefcddafccfaffedabebdbdedeebebefcdffccdafecfcaeaaeedddaaffbccdbfbeeafaadadbfdcdeabbaabafbfdfedacfffbbdaebeecdcfcfcbeccaadfadcceebbdefabeccacfbdecfdfbcaaeabcaeabfaebfaefbdcffebdaafeaacbdbccefbfcccfedfddbefabfaddffdeeebcacfdbaabfecbbdcbfdccbaededecadeddbdfeefceddadebdabeebfcdeffbbbededdbfbefbdafebdabcfaabcbaccfbeadfaaecddacfbdbfdecabdbaaceebfaddfdebddadbaabacebfdfefeeafecffedbdbfaebbcdbceaedeeccefeecaaedadcaacafdefccedcfdfcedacadddffcafdafabceadbeabbefecedcdfceafbfcfcecbefbcffdecacbdbeebacadabeefacadfbafeefacfeceaffeaefdecdfacbecabeaecfedceefefeebcdfdcbdefcfdfdbdfaaaebfecaabcfecafbcafdbfccacffeafbedfedbacfcaeccebffbefddaaaecdbffbfdbdccffddeeacfedcfcadeadcedefbcbacaaacaebbebcdbffedbeadbdabbfecadfdcffbdfefaedddfedbcfcafeeebaeccdbbcfecffbedabbdeecdfccfcafcefaeabfedcfcaebeeffdbfcadcbeefeadfabffcbfaccadbbaccdcadacaefddebdabfaccafadecbadbfccdbbdfcffcbcbedcdffdbcaacfbeadcbecfbccedeeecfcfddfbcceedcceecaefcacabcecebcdefaadbdddeddcdedbdacfeefccddbfadcebafcfecdaaccdcafaeefeecdaebbfcefdcebcbcebededcbdbcfaffdceebdbbaeefbbeebacfffbdbdcdbbaaaecefbafeffdbbeabedbdfeeaceaeffbeeeddfaeadeabebddbacfdceabcabfdfbbfacedfbaacebffabbcaabbdcbdfddbbadcffefacebdafadccbadecdfbaecbdaefdfdfbbaaafeaefceccfdceeafecadcfcdadabdcbffafccaeefeeaafdefaeceaffebdcffcbacbedfffaaafcedecddffffedebabcdabdbbaecbaffccedcacfddbbabcdfaadfaccafdbebedcbdcbbdccaccffdeeafddfcdcdcedfdbdeebaedfddfdaaffaaeeffdadffdcfbcfcbcabcfcaefabdffccfbfeececcafedbfbcfdcdcdfbdcedcfbcefdcbdceaeffcbfefebeacddccbdcfbaeadfbaccdbacafaeacacbbeebdcfcdbbeaebcabbcdcfcaffdaabfdbedcaabfeaafadaecacfbafccebcfdfcefadfeefcbbcefceebebaaadefaefdbbdcfcadcdddadacaaccffcfcbbfdeedecfcdeabefabdddceeabdfbafedbaaeadbcbbeadbabdbeaeddebdccbffdbaadfedefffdfeeebaeabbebaafdfcacbebbaedcfaeecfbaeabdfeebbcbffbfcbdfcdbaabdedccebbfceedcacdadafeccdcfcbfccbcacabacebfdddcdcedaababebdccfeeeadbaddcceaadaeddafafcfdbadebafdbfbeacdcdeffabfdededfedbfadaacffbbbdfafcdabefcbbdcdcbfdebccbfbdabefcafabcebedbeefbbfdbdafdacfdabaddffecbbeabdafbeeaadebadfeddcebefaaaeadacddefecdcdbeeffeeebbfbbcecaeecdfaaaafbacffebfcafedadffdcfbfeebeccdcdecfcaaeceafbedddecdaabbebcbcbfaaaeafbdfadcbdcaefaccbdcefdeeaddadcabecebbaabacbbdbceeacecddceaaeccfcaccbcedfedbefddaeabaacafdceadcbddecbcddeccabffcecbaebffbbebaeccbafaebdbebaececffccdfbfafabfeffaefcabdfcfaebcabaafbfdbebaeabdbeefccfbbdceaeecbacfdabaebfbbecedaffaaaefdacfcadfebcddaedbcbaffbdcdfdacdccabecdefdccfbcabfaaebadfcaefbcacdccdbffaedcfbeccaadaabebbdbbaccfaadcddceebdadaecaebdcdacfbbcaddeffbdbcacddaccfbeacccfcfcefadabbfeccbfccddeefbfddaadafbafecedbfaaabccbebbbbacafdacdaaabeaedcccefccfdffcfdeedafdfaecdddfacfdebacbaabbedbabbfdafedffdafeaaecaffacdeffffcbecbacffffaeaaaebcefafdfdacfdeedabbacbcaadffddadaeecccbadebcccdfdfcbaccfebfbeefadafcfffaccdbeeceeebdabaedfaeeadeaecaabfedfcfbaeacafedecbbfceeccdcaaefdddcfbaeecafabceabadccedbfdaabaebabaafefadfedfaafeccbeecdbeecefdaebaaffbbfeecbafcccddcbdbbaabdfeeaceeefbadcccdceaeeafdfeebdacedeacacfcfffcbbcaebfdcdeedbfbaaddcdddcddccaaacfaeaedeeccbbcdafdbeaeeadccaedfdbbcdffedfaabfdfdfbabcebdabafbdfefedeebdfbfcaeaffbeebaaedbfcddeaeaefecffededcbffdabaffcbccedbeafbaddddcfaecadcbbeecdaceafacbbfaeeabbbcddafffecfcdfdfcdbdcacfadeeaeedbecdaeacedebcaeeddadbbabdebfdebeabbddebdddaedcccaccffdaaacddcaeddffbbafdedcdbbaadabaefabdcdccafadeafecafbefdfcbccbcdfdcbbbcadacccedfdbabdcaceceeacfcddffcbbeaedffadcdffeadfdffdecbbecceafbdbcfececdcafbbedaaebeeacdfebdfabdffefdfdeefbcfeafdefbbaedcfdcbabcdbdabcafbeeeedebcebcaaebadfaacddabdfaaadadfefdafbeecefeaddcafcdbcebedbceafdeddfcdcdddaeffadffebefdcebfcacdefeecceadcddfafddefcdbeaccddbcccadcfcfccdaaebefedcfdeccfbbaedebbacaefafbfebffeedeecbcccdfdabafdeabbebfaebceeccaddaabefbdbfcfbeaccafcbfdbadfdbacdaceebebcebbeeccdeaeaecacefbdaddbfabfbdbdfcdcbbfebdbaabdcbfdaefcecdfddffaacdcfcafbfeadaccfdddcffedddaefcecbdbedcddcebebfdcbfeacffbebbdebbbedcfdaaacabafdcedefeffddcefeedbdbabbabddadeebeedefaccbdbfeddfbbfefcdffcecfeebaaffdbaaacbedeadfecafddeceebeacaafbbabeaebbbdbbedcbebaabffbfdccbffeeedaffbfeacbeeeffaadbeeeacdbaeaffacbdffeedeebdbadccfcbcfecbeadaebbdbddbfdcacadcbcecdefbfafacbccceaabcfdadebfaeeedfbbdadcbcedeaeabbefedeceafccedaafecddfedcadadbadcdeecdbebcbbfdbabdcbeeafeddcefdafbbddbfdbaadbdafdccbbddadbbfefdbdaaecffacbbebdcbbbaafcaebeffcecdffeababddbbccbbfdbaccacbcdeffccccbccfecbbdaeecdeeccacfefffbdbaebfddfcbaafbdeeabfbdffeacacffdcffbefcebbcddcdbddbccccdbdccfcceeeedeaedeaffbfadecccdfdcaedacadaacfebbdceafabefddfeedaabfdbaaeebfcbbfdbcfcbcdfbeeceaaccbccfeddeaecfcdccceafeffbcaaeeeaadbabddadedfbfddbfbbbabcfddfdaacddacfcdbbacaecdbeecafbaeeabbddcadedaebefdcbcaeccdaceedfecaacfacedbbabbeafccccfabccfcfeadaedfcabfadbdcebdbffdebeddfeafacfbcedcbaefaaedffebfdaedfabbbceafffbaefccdddfceafcbdeacfacaebcabadcbaeedaeccecadfdabcbdfddabaeccefeccdfcbbeeecbfeebdccafacfcbfdacaabbfcbfcdbfaafcdfbdbcadaaefdbadcdefbbafbaceecaafbddafbccdcacbdfbddbfebcdeadfcdbebfcffecfdafcadfbdecffbdbbecddeadefacaadceceacffbcbadcaafeacedfdffedbabbbbbdceecebbaddcbbadbaddbcfacbebccecdbdfcfcebbceebcaadddbbcdbfeebdcdabacbbcfdcfccaecfdafdfdfaaededcedfabbcaedcdddabcafadcecabffbaedfcfbdaccedfadbfdbfefadcfcfbebfdebdbacdefbecdfeabfddfeceeecaefbaddfdaffcbccbddfdcdfbacaceabcafdeffdfacdfffdebfaacbecfeaeecbaeadccfaafaedfbdefadcdcfdfcfabeadcdaeececadbdceeceabdcfeffbeedbdecfbfdfccbacbedfccbbfbdafbfacedcdfedabbeedadfcaefebacbadcdcefecbfbdafabbdceecddccddfacbbcaafaebaebecddefeeaaadfaeadfcfcddecbcddcebeadaebffefdddcacdecfcbecfecfbcedeaddeafddababbebddcfbcafbafaafebbaacdafccfcfaccdeafdcaabbbabecefbbdddadbeabebfaeadecdecaeacdeffcbadacfbfdaaaebfbecbacbbcceeecafeedfbedfaceaddaabeaebcbdeadaecbfefaffacbbecfeeffeedebeffbefbdccfffebefefeefeabeddbbacabcedceceaeccddddaefbbafdbddefadffeecedafcdbfeaebfefedebcccabcceeedaedbecdbafeadbdbcabfdbeabcbddeaceefbedfbadfebefabeeabbaecfbdcddfabadafefbeacbdbcdbcffedffbaabdeaacacbccbcecaffcfbddbdaeaebacedefaedbbcfbdabcdfbafafefecbdcdfbcfeeafadccbababfbfdafbbdcabdaacdabaacdeacafedbebcbeadbdefecdfadfbcbfbfdcaeafbdcdbdabdbcdbddbecfcccddadfecdccebeeccdfdeaecbfafebebceebddfcdecdcfacfacfddeafdecfbbebefdfdcfbbdaeebadcacccdcbffcfebcbcfcabcadddbeacbabaccbedceedecefafdbcbedffbefdadaacdbcbccffddacceddcacbbbdefeaceecfdfcdbcefebdecaffebffbabfdccebefaedaedaecfbcddadcbfceedfaaecedaeeacbededddacdfddfcfeaecdccfcabddcadbebaddafbddaacbaaeffadcccddebfdaeddbbcdedecdcecbaaecfcbddbeeefeeeadeeeeaacebafcacabfcdeceaaecedbbbfabdeeebafcffcbadeabbfedeadebefaaceabaffbcbbcadfafbfcbacdbaefebdabbabdcbdddcbaafddbdececdacefffbbfabcefcfdcacddecfeabbdbaabdadecebaaaffabbbbdcdbedcedafeddcceefadecdecccdcabebbedffcddeacbdeafcbadcccfccbbedbfabdbcadaaefbdbafdfecadfebcfdeebabbbdbbbcececefcbbbdbfffeffeabaaecdafcbbadcdcfccdefcdcbecabccbafefebdafffaaeddbceafebfaaeccdbddfdbedbfdebbfdadceaadaaddbeeacdbafaeabbfefeabdfcabbaafeababdfdbefdebffadabbeceedfebbdffdbaaaacbaccffbabcebbdfbcefedddcaeeceaffedbedddedaffcaddfbbeeafccdffedeecceededafcfbacffdebeabbbbcfdaaeddcdacaabbbafbaabdeedfcefddfabeaceddaebfcebcccabddeceffedfdfadeccffbeeaabfafdfcbaaefaeecbdaddaeeabbcebefcabfbfacabbacbfacdfcbcfccddfdffbfbebeecaafbeefbfdccbeadcfdfdfebbcbfbedfefdebeecfbfcdeddffefdeebeedffaedafdcbeacacafafaeddbdbbadaafcdfedfffbcdfdcdcfdccfcdbadafbcdeeedafddceddecaebdfedbdefbebcdfeefabfdeffdbbbfecebebabaedfbfdbadefcebdfafbaefdfcdedfadfbcdbaceddcfdbddfabbefedcaecbbacaccbfaecfebaddeedcacfefdbaeecafbadeecaeeeebcafebacebddcebefccacbbfafcbdcabecfbbbeccafbecbfdabccecabebcdececeddfaccddadeccebbbebebcbaeddaafcbaeddfaedbecfeaefecfbabcdabbbafdddcbdbdecffceecfeecbabcefeadedebbfdcaadcdebaaddbcfbddbbcecbeebeeafecaeeacdfffdccbebedccdbffbffbadfadbfcacabdcdeffeadcdccdfcceabfebeebceabbeefbbafdcaedcbcffbffcbefbadacadffbfbccbeddfabfffdeaefbdadfefdadaceaceebeeadabcfeadfbdebfcdefaafeafdccfdbffabebfddcadebdcbdcdcfcdefeaceffafcedbaedbdedfabcbaabbfbaafebcebfebadefcaabbeafdebcbabdfaabadbdeadbdeacdbcfabdffcbcdddfcebefdffbbdeabcdedfdbbfeffbfdeaaefefceabccbdceffcaddfebaeebdcededbdfdcaceecedfebceabbeddfaebeafaaafdfddccabefacdbfefaabaabbfcccaeffabecedaceaafedcfcadfdcffcfffaefddcffcfaffdaabafeffdcfddbdeebadfcfbdebcffdeebdceedfadedafbacabdfbbfaaabccabeddbadfbbfbedffddbbbbaafceaafabecebbabddbedeabdabceacdfbbdcedcbdacfafcbfffbbecdcbffcdcddcbcbdbcfbffbbeeeddcedbebbbacfeceeedabeedbafbebecbfaabafdabddeabaedefedcabffffdcddabebebedeabfffbfdedbfadacfadfeffbdbfeccfddbccafeccedaaafacafcafbacdcdddeaebdbbbfdacfddbbfafbbedecaaecbacbfafdbaccaafbbcbeffddbbbdfbdadddabaefffcbbbfbfeaecccdeeaccddefdfbbfeeceaadeacfafacaefbacabfbfbbefafababaafcebccbefbfadfdcadcbcacaabfcededbddeecefdfedacaedafdecfaffdadaabcfecdabdfcdfbfbaebcdbefdddbeeaebbfbabaaacfbdcceaaeeafadadfaaaadcfcefdffdccacaaecffabbbdacdccfaaebabecbcabeeaadacdecacdfdfbbcffefeddfcdbcfabeebeacbdcaabfcaeaeccfcacaffcaafcdcaaabecaecbfbfddadbccbfdbcbbaafcedcedfdcaffbdfeebadbbaabaaceebccbdacebbdaecbddbcbaedbbdfafcbfabbfdeeffaddbcaebddeabfcecbaddaeebaefeaaccdcafeabceafdedaefdfecaebafefaaffcaddafeaaeccfedaddcedfbddaeffbaaccedffdaeaacaecadecacabffdfaacacaddadfdbaaedebedaccabbdefadcdafbafcbedccdaecedbcacaedcbdbdfdfebcacbacaaaecafcfaaabefafbbabdcfbadebedcfabfadedbdfffeefbbceedabdebacfbfbbeadfdedfeedbcccacaffcdfbdabeadafaeeaaecddbcfcedeeafacebccddfeccdbdeaebbebcabaedefbafddeadbcafaffadedefeebcbfdaabfefdcabcedfadbaecdbefafbbcdfeddbfcbffabbfdcedbcbfaacdaffdcceffacceafedaaddcdecffbbcfedeaeaffdcaaffffacacaddcdacedfdffdabaccaefcfceaccedddaffeacebbcdaacffbbfcccedafaaabfefedeadabbaecedcebdbdeaedeaddddddacbdacedcefeaebddaffbfafadccdadaefdaeffbfbbeacfdbbdfcdbdcebcdddbadbffffaadccbaaeadaaddbeadcbceaeefdcdcebaeabeccfaefebbcdcbdcebbefddeadaceeddffccdabbdcbcdebbafbcabddacddaccbbddadeabbadfeefdcefccaeccfcfacabfcffeffdaddffafdddfbfcccaefdaabddacfafbcdbfbbdbfefdcbadecabfbdabfbbaddfaabddabfebcebcaabaebabdefcfbbeffdbdeeedbdcbeaccfccbbeebdcabdeabbdbafeefdffabfecdecbaefabcafbbbdddcabdcedbdceddeeefdebdabaffcfcabbfeacecdcaaafdedacfabacdeedbddfdeecbaacacfafdfbcebdabeaeedafecacccebeeadbbbfeffccbeccdbbcdaddcbcdcaaefeccbccdcafadfddbfdcceaccabfbecdfafdbeaefccccacdedabccecddfdbeabbfaffacafcdaadadfacdfdeaeabadebcbcabdceecfadcafacfeeaffbcacbaffecabaaffadeafdffbfbebfccaebcafeeababcefaedacedeceadaceecbecfbcafcfbbedbaaecffeccdfeaddeafcbccbaeebeefccedaeebddcfcdedfccfeccffbbdffebeeacccdabfccafcefccfdcacbbbcbaaaedecfffbcbabeafeefaabdbfcbecacbfbcfdaebabdcabbefaafbefbefdcbccbcdffbacadbcddaaefcffcbacbdedfbeefabdeaaacaddbadeccfecefddfbefdfbaedcdcfdbfacaeaceafedefcdbaadfadebdadabddcbceaaabbcfbbefcbebcafeedeccfbebedfabfdadaefbfabfaadafebaaeaebeefddccaccefbcdfeedecfbdbebbffdabebaeecbfcfeaeeefcefcabdbbbffccbaeecdaaaffbacccbcefcededaebedeebcdccebeafffedededcfdcbbbfcaeeefcdbddabefcbdeffaccaedacddfbfddbffbefbafdefedcedafabdeddacbddaacceeeddcadafbcaecaddedabbfeebeaaeebfecaafcfedaedcbdcfcafdbdddbacefbccdaecbbbcacbdfeedbbfcdecbeaeddbeccddebaabddddbecbddbdeebbadfceecdebbeebbacbbafcaadecaeafcdfdffcabcafbbfebacdfdeedebcbfbdbdfafbafedfafdfadeaabdedbdeabefbeadcabfdfcfbcdefcfdfabcfebedfcecefefbcffaddbbdfeaddaecabaeabbdfbafdadcefefbcbecbeedfadaabbfffcfbaabeacafefaffbcfccddeacaaccecabafcbabdfdadfaabddbedebaaabcfddcefbfcddecdcccadcdccfabebbccfbdbccaaeebddbcecebfffdbabedfeaccfaebfdcbfeddeaaffebcebaefcaeefebcacaadcbddecdbeefafccbdebcbefdaeeefcffeaeaaacdbfcebdcbbeabecdefcafcfcbabeabbecfdaacfcfccacdffbaadbdabbebddedfaeaabedbddccfcecdcafeeabbaafbbffbcbcaebdebccbdecdbddfacbddafdbfbdacdefbaaadecafdfbdaefacdedeffacefbffaaaffadeecbfdfbceddecaeeaddccedcecfaeecedfbdedafafcaceefdddbbafafcfdceffdbbedcfabacadfeddcadbddeceeabeeabeacefffeeecfddcccbddbecdafcdccdbbeeabadfaeadeaadfaadddfbddfabefcbcdaebbacabcdacfcfabbfeecbacddbcabecffbafbebafdacfecfdfaadbddeafbedbccbbbfbaffbafdbefbcdccabbbeadafcabffcbccbabedcbeeadddaeedbcacbbedfecbcfadbbcbceededeabdbafeabfceddcbcadfdabfeddcdbaddadfdddaffabedcfafbffecadcbaabcbacabacccdcbbafeebcadbebabaafcefcafcedacadbcfbeddcfcadafaaeccbeffbcfabecafedacbfdeefbcdbadeeaddcfafbbfbcdabdaafcdfcadbefdfaeceafacabfebfbbaccfcfeadefdbfefcddccdbefceebcfbfafbeceaaadffffbedcfafffabcbdaabefafdfbeddbddcdbeafbeabadacfbaacbcbedaaccfebfbccaeaddbfdefdbfdddbdfccafbdbbeebfbcbdcfdefdfedecaebdeadeafdfefedffabfccdbcedaeafefdeebdbcadeefcdcffbbfefdcdbfefebaaafcddaebefebebaefcdccececcaeaacadcccbecdabdffabdafdabedaedefffccbcfabefebfcbabfafccbdbadccdcafdbebdeeafecdbabcfaaecbdcdaeccdfaeebedcfeeaddaafadadcbbcacfabedebcafcaacfdbbcbcacecebecdaebdbaccaefccbaefcadedfbafbadbecadcadbecbbbbbccfebaadcbfbadbfcefefdaaaceadbefcdbbdeeedfaadfdcdecffdfabeddddbeadbcdffaffcfadbafeaedcbdcbcfacbbaececfbfadfbaaabacebfebdebceacbdeaaabedabfabccabbdafbdacffdcbdabcebccbeccebbbfdfccfeeaabffedfbfbaddcbdfabcceaaebedecaeadcfadcfeeccfdcefdfcaecbebcabbfdbdfddfccdbecaafbdfbfdcfddebaebafdeeffcecbfacebacbaadaeceeeabbcfeaebdfbfcbcfdabcebaabaefdfafbafbefaaaaeeafdbfbffbacffbeeeabffffddcdcabbaaefafcdeebbeacfeeeeaceffcdeeecdbcfafbfcecafccaddbcabdafaaecfddeaaacbfddecfccdacacecbebcbbcaddebbefbfcabbbacacbfebffefbbacedccacaddeddafbcdfaedfffacedabdbbdbbcfeecbdfbfddddfedeacbbccfcaebbadbabcabbcbcacddffcaddbbadfafebcbdaeecdfbeaeddbcdcffdfeebedadcdfffbffbfdcbadfcaeffebcbcbeacceadabdffbdcfbbcccceffcdcfaaaabfabaaebbdbefafdcdaedeedaedefaedfdfdceabbbcfdfbfeffbbbaccfacbbaacebcbfcabbedfecefadcfdecabdaddfbebaabdffcfefaebccacdeabdbcadfbedfeeadbadbfdbdfbcdebcbcfbebeccdeccacbacacfccbdcdbedeafaebbaafbdfbcaabcccbbceaacfbbfbaeababfbfefeeccebcedfcdeddcacadbbcdabbaceacccfadfebedacfdbfaefefeedaacedcfefdaffceefaccafebfebbbfcededdbabbeaaffcccaafecfbdeafcffaacdcbacbdcdcadbbadbeffcaeadfddacdddccecdbbdbcdfcebabefbabcfbfaddfdceecfecaededdbfafddcbcadcddddcbbdbaabbceabfeabedcddcaccfdebccdacafeabfafefcdcdfafdcecbfeefbecfbeeedbadabfdaaebfbfbeaeecdffeafadadcaabebcaccbdcadefeeecaafdffdfdfafbfccbdfdcbfbebcbecbfcffcecadbfdefcdbfefbfcbbbcfcebfffbfcdadcdedbbadafaafefdfebbdcedceacfdbfcccbfbefaddfdabecfbbaabeeeacccfcfadcaeccdaaebafddfdfaebcbffbbfdacdbeeffeffedadaafdaabbbdffebbdbcbdfcedfbbadabdacdcbfccacdeafdebabfcdbfeadcacfebbfbecedfaedfbbbddcadeaacecdecbffdadedccafcaeccfdadbeeebbdcaebfdcabebbebcadebecbcaeaaaadabacedccbaeeeffcbbacfcedaebaedbdcdadacbcedaeeccbcdcbbeaaeabaabcfeaefecefdcbaeccebccdafebddafafdbfaaecffbaeaccdebdcffdffeeadcbdcfccfdfcadddabfffeccbecfdbdacffdfdcabfbcdcccfacabacddfbcecdcfceacbdecfdadbbfbedcbcefdbbcbbbdcbcecfeccdcfabeafcdafbbeadbfdfefecadcbeadebedaffefbeacbaacdedbcbdaddebbbaaaacedbbbfffdebddadeafbbfacbfddbeadbcdcebecaaedddacbaedbbedcbfbbbcbfacbbfaffaeeebbdcaeaeacbffaaddcfdccbbacfdddecedfefeacdeaafdefdedbaebbbeeabdebedabeabbcacbbdaaedaaacaebadeaaedbbfffdeadfddcfbceabddfcecdceddbbcececacacaeffcdedbfcfbcedadfbbfddfeacdbecbbcbdcccecdeaccfcfbedcecaeaceaedaadbffeaececfecbfbdbbdbacccfadfacbdedadcebbccbdfbbfcdcfbaabfcddfbfaebeabbeffecffdabbfbbeccbccfaacbebcaabedbdcecccbedcafbabeaabfbaaccdfdcabfedbefaeebfecfcdbcfdcbcdeaaacbaedaccfebdbbaadfbfaecefdcbaeadccfbdaebeddfcbdeebbafabfcbdeabcddeadffbaceeeebccdbdeaadeeabecfcebacdfaaefeabebefefedcdeaeafdfeddaefeebdbacefbccbadfdcadaddeabbcebfefbbcdcbeccafbdfcacbdbcffcaecddcbcabaedebbaaaabfdaababedddaddcceafdcffaadedebdfdfcdcbcffdccbabccaeefbfedefadccfabeefbbadeacfaecbedfdffedccdeeddcfdbbbfebcbdcbfeaadefeafdceedbfcaebdccfafdfaefbaefcdcaffdecabcbcfbdaacceeccaaebbddcdfcbafaaabeedeaffbcadcceabeabadcfecccbeaaaaebcddcdbcabcecacfcbbfdfbfbacdadabbebcffdcfaebddfcddaadfeafabcbaacefcfedebaffbedbaefefddadefbfbfbdbeceebfdabfaeeadfeabfbbefbecaaedcdfcbcfbdccfaabcdddcdccefabeedbdefccedfacecfcffabfcbbadfdabbafaadaaeafcdbccceffbafebfcebddebfcdedbcacceadbafacaecaceabaaafafdeaebdefbbcaeecebadabbabadfbafbdcbbefcbfedffbcabcfffaffebebaaffbbedefdffafddfcaaefffadfffcbffdeafdafebdfadbadfaecbfdcccebabcacabcaaacccdcebbbfdadfedbcddcaeecbdcedcdedaacbcffadedbcccfebdbdeebfdafecbdaffcddabaebbdcecccedafdcadaadabeefdbfbefdeddabedbdcfeceaeaafebcbbffdaacdabfabaddebadcdeefeeadcdbefefabeaaacaacceeeacabaafeaefbdecccdcddafeffbfddbcdeeaaadfafabacdfacabaacffcaafebcffdebecfeeaeedebdcfeedfecaadcddfcccdfeabfebcccfabccafcfffafdecddaedaebcfeeacdfeafbfcbbecabddfdadeeffabaaceebdcaaaabfaaffdbdaabdeeafffbccaadabebaaeccbcfaeacfbabbbeaffaeeadbeceffcfedfddfbaacdfaefaffbdbadbffbcfceffddbcfaafbdbfacfcdaefcfaafcdefdbcabeaaadfaffdabbbcfcaeebaaadeebfbfacdcacbdfbadccbcefcedefbafeeaeddfabdfadffcdffaefaaeeebbccafdbfebdbcbacedefbcbddaaadeeeadcceecdeddafedaadcacefbedcdbcbadaccbcfacfceecdfffcbcaafedffecfdafcabdefbdcaeadbfecedafcfbabcedfacccffebabeaceefdaabddaabecbaafffaacabbeddaaabebecceacacbcdecfffddddedbaefffdadaafcffabdbcaaffffdbcbceabfeaeefbddfbbcdcccbdecdecdcaafdbcadabeadedccefaefedabcadbbaebafcaabeeccacebabedfadeddffeabefbeebadbbedaedfeeccaeeacafacfcadbacecacbadbcefdadbaadeafbfeadbbdadbddaabccefaeebcfabceffbfdcbafcafcaababbfedefbaffcadaafcbdaeedcbaeefbedfdacdfaeebfefbfbeecacaefbbaddfdbdaaaedbfdebfaebaaffcaddeacaffdfdeddcbfabcecdeebeafbcfaaecfbeccbeacbaaadbfdbdaadfcbdabdadefcdeabbafecefbafcadabaebbfdbaefbacdeaefabbcafaeabaceecbefaeaffcccabbbaeeadaaeebfccfefdafebaafbbceecaeeaaddaffbdcaaeaafbcceffadeaffedbecaeafcdccbdedeedccdfbedbdffbcaefddcdaedefebfccbffdebbfddedbdfccfeefbbddccdecddccfeedebdedcfafccefaecabcdecdcbcbabdbfbcfdabbffcecdcdfabfdcefedbecaaeebcfbbbcbabbbcaaccceecfccbdbcadfbbceaebadadddaeadcfeadcabbffbcbedeaaaffbacdcbdaaefbccdefbdafcbbabfbaedaafbddbdfbbfbfdcbfeadebcaeebdcfebcdaedfacfcdabddaccceecbacdcfafbfabafafcbdfbcdeeefceddbcfaafaffddebaccaadcdbaccaefcdefbfefaddaefabaceabfbeebffbbaeceefbbeaadedbbdfdaabafdeaffdeaaabdeecdcbceccddbdddabbdcaaaaabcedbcaecffdfebdbccccbeabfcfdafecdfadaacfbfefcccdcfddaddccabdebeeefddbfccbaaeaadefcefffebcebcbffaedeecafcbceffeafcdeffadabcfcdaaebbebaeeaabdbaacaafafdcdaafbfefccabbebebefbffbecdecdcbfaedabdbccdddafdcedfaeaeabdaaadfcaccdfdfddebebafccefbfdecefcedbadfeebedaaadaadceecebdaaceaddcbbaffbaaadbfcdffcfafcaedafcddabedeaccfeedecabeffedfefdfdaeacdabcffcebebbecfefadecbabaacdcbdfddadeedfdbfdedbdeebcaffeeafaaacafadeeacdadaddfdfdabdedbdeadbbbaedfddebeeedbddcbccaceeefefecbecdcdaecfcabbcacfdbacafbbdafdefecfdbfdecccdcfdeebcadfaecfdbeadbcfddefccaecdbdfaffbcebafcbdfbcfccbfbdaaddcafcfcfdabafffbedebdbddbedcdadbbefffecdfeaaaedbcbaefccbfcdafdadcacbcebfdffebaccccdefadbdeccdecabbfaadfccadebbfefaabbbbffadddaffbedbdddafedbccddeedafaeeebfdeadffdeafeafbbdecacccebcbeecdefbfdeffaceefdaaefdeaedafbedcbefcddfcffbeebabbbddddfbfffbfdbffacedcccbbfcdfdeaadfbddecebcccdcdbdfbccedfdedcaedcebcecdaeaecefddaeeaeadebfabbbecfabebdbbdabfcfcadfbefadcdcbafbffbdddfdceadbffdfdabdafdcddafffabcaaafcffdecbafcaebefefdbdccffbeafaddababffeafacbfdecfdafcdefaecfadffdfaeeacebabceaedfdbbbfdebdedcddbcfcffaafbdbaadbbdadccedecdbaebcabeebbecfcfdeccfdfdeaebfeebbcdacececbfbedfbbadcbfbcebcaaccfbddfbcbdcecaebaedabedbdbafecaebefecabadbabbbccacbbeceffcfabdacfaaecbbcbaabeffcaecfccebddabaddaafaafdaaccdcedacdabecfdeebaebedbbdfaadcbfdddddcdbedfdecdbcaaaacdeccefcadedbabebdedffdfbfefccfaccccabdeabebedaafabddaeaffecccfbcaffeffadcdfbfacdcdfdaacefdbdfbbfeabacebccedfddabfedecaeceafdbbddfdffccdabdefaccecefcdddaaadbbfccbfbeedaebbcbbfffecaefdccadbddefeaffeeabeaeedafcbbbefebcfbdacdefeaecadceaebdbabdabaaeddfdceadeecbabfecbeebfaceedabfdffbaccdaacbbbaeedfeedfaccddeafaddcadceabcfcaecebcbeceeeabcafbfdcbccaeddaabdacfefaffcdaeecdabdacacebfacaefebfdaaeedabeefcfafaaffabacfdababddfcfafbcebafcdaeabcacacddffaeccfaccfafcabefeabefafafefefeaffceeabdebdbcbbabcadbcdbaedaabaeabadcdcabbbffddddddcaccbbbcfaafcffdeabaccaacfabdecebcecdbedcfedaadefccfffbbfebdaaeefdbaaaabecefadccdbbcdeaeacbabdfbdbffeeabbdccbdfdbfbeccadadfaacceffcfafbfbdaabdbeceedcdfcecaddcbcdbeaeffddcdfadafdebfcadcedfeaddcbffaebbcafdabaeaccaccaeceadeeefbfacdefeddefdfacecccaabacafeddeeefeefeadbfbeaeebdbeaecdacaadedeefdfdabccacdffabbdfcbdeabffadddeebdcaffbacbabcadfcceceddacbcbdeaafaacdebbfdfebabddcedacffebabcfcacdfbafebedadeccbaccdbecaaebfeddfbfbaefdfafbeffedceeeafcacaeababccdfbcfbaceeedaefcdeefafacabadceedcbbefbffeefdaffeaaebebbbdcfbfbbdeebfbcaefbbbecabddcbeaedacdfcbceabddedcebffcbfddfcdeefafdbbcaffceadaccbdcaecffaefdaddfccdddeffebbccdfdadbbfdfcdedfaaebcdccbadaaeedcbdcaadaaffeeaecebcfdecfaadcccfbdfdefedeaccbabeeaffdebddcfeeebfdcbdeaececbdedcacffedebebdfdafdcfefcffdbdefcbcafaefcaebaddafacdecddaefbceecbddcdecaabccdaadaccdddacdecbaceddedfdbfcabdeebaaeaaeebbddfeebfcfaafbdbdbebfbbcdcecdddbbbacefbbbbdefbddadddebcdcdfcabfdbefffadbbecdacaefbfefbcfeadfbbcedadafdaecdefbeefadffebeddbceeadeedbcccdecffffefbfdeffbeaaceefaaceafddbdbccaecadcbcecdccaffdfeadefccbbaeecafeebdbfeaebacbaeebbddaceeddabaffbabcacdcaccaabaddabacacbdaabfafcabfdcffaadbeeacbbcdcfefbeaeedacadedbfdeaeefebcccfcffcbcddfaebeecffbfbbffdfbbdbdeaeefeaeffdeeadbeccaccdbfbbcdaddaadadcbbdfbbdfcaccddadeaeaffbeeaadbedebdbfaefaebcabefdeeeaacaedfadcebdacecdcffeecffedadcadcbccdecdebbdbafecacffaadebcdeffbededdbafbaaebbddeacfddbecfcffbbccafeabfbadaeeecaffdcdceaccfcfdcfbcffedcbccccbcbefceaaedceaeaddbbceddcfdbbffcbbafccdadadfbfcadfbdefedbdbeadeeebeecfeabcedfcacdfdcaaefbcaaceeafbdaafbcbbdeddfedceecbacdadbbfbbaaebabfdfebcbfaedddbacddeaeaeeafbceecbacababcecdefbbfebfddacecbeebdabacccfbbabaaeecaccefaebeeeecbeafdefcbecfddcfdfcffdaeabdbaddeccaccaedeeabdcdccbacaaaeadaebffffbebbdcadafbdeccfafdceffcecaccceceecddcfbcfdbffbefbaffacdcfbeaaeffdbebbbbbccfabdfebcbbecbaffdeabcabcddadadaabddacbafdeffdafdeecccaaaefbfeddebadbdcdfbfecbecabedccdcffdfebaacffaeaadaaeefcbcbfbbdafedcebfcdcbeefcaebadffeebdcfeefedbacddaecdeedddaedbbefbfcbadecdecaadfaffedeaacadbbcbcfccbcfddadcfbbbfdbaeeebecffbfabddebfdefcaaaafedfdfafafdfbcbfafdbbdabeeecaacbcbfabffcdadcdaaaddaccfeeeafbacedbcbebfeaacbbecdddcccfeaeffeceafffdeadadabeabddbdccdaefccdecbbfeacccdaccbbebcceebadbaaedbfeadbddcddbadbecbafabaeeacbabddeefcbdebeccceaadcaeabaffbaebaebfcdbaafabaeeaefacbfabbecabfcaceadadcafdbafecddbafeecfeafafdbfbcddeaaabbfddfbcefffbbafdcaeeaceffbbccaeeccfefddeaefeabbeccdafebebbbdbeaafcfccdbdafcdadcbdfecbddabccbccfdccbfbdcaafdceabaafbaaaeafafdfcceefbfccbaabebeeffdfaedcabcffedecfacdbaeedebbcbadfadcfecaacaffbeffededffaacbbcdfdeabcdcbfcadfedaccddfecacdfcafeeafdfdfbdabddfcbbcfdadacaeafccdababebbffeaaeacecfbbfdaeeeeecefabdbcbfccfdcecaeddaccfddaaccdfbcddaebfefebceeffcfeeffacfebafbedcbcacfbbebeaafdbbdeffecdabfdaedebccaeceddaaebbdfdaafacaebaebbcbbaacdcfdbacdcaaeafeeeeeccceabaebceddbabffbeffdfdadcbeedfdaacbdbfbfbbedcfbaaaaedfccbbcaeeabaeaecebdbfeffdedfdaafcfdcbcecdbfcfccceeabfeccfbfbdacceefcaffaceaebefafcdebdedbbddecfbacdfefafaaaedbddeefdfccfbceedabceffccacdbfdceeccdddfdaefcffeaaedeadaecceecbaebadeacfddbbcccaedfeaedaabdffeacadcfbcededaedccbbdacbceccfdbcaabdbfcddffecccabfbcdfdabeccdbccfaddebbfcdcfacecdacafcefefeafbfcffaafabefefdcecbefadeedbcabeaedbebdaefbbdbdffdcffadccfefedeaeddfddaeaeeebafadfbdfdcaafaebeccbfedeceebffdbdbefbcbeabbdbeabccdbdebdadadbacbdbedcceecbffabfecefdeecaeddbdeeefaeedcfedeaccdacbbbfabdfdfffefbaeaedfaebcadaaccfaafedcbbeabafefcbcaafecccfdefdafebddedebffabaafdbdeadeaeeeceadfaebddeeceeabddaedcbacaedcbbfcbcfcbdcfcbfefffabdabdeaddffdbeeefbacfebcfecdfcacdaafebeaadcadcacabfafdafbeaabcdfadbdefdecefabfbacffddffceabdcedbbaaebaeedcaddcbbccbaebfcbeeebfbcdcffbedfadffcaefdcdbffaccadbbabacfcfaafdeedbabecccbccabdacfacaeffedbbaeafaadfefbfcbbcfcdaabcbcffcafbffdbabffaabdadcdffddecdfbbfdafdacbebbfbeafeabafdeeaecebcdffefafbaceeefdfcbeacdecefcbffdebdfbfaafeecaabccabafcbbaddcccfdecbaceedcbceeffbedfefebeabefbcdbfcaaccafebaaacdccfadfccbadcececeecfcceefacebecaabfdcadaadfdfebbfebdcaadaaceabebcafbcffabdecbdbcdfabafdabfbbcdcbaadbecbfcfcfedaecdbefacadcecedfbdddcadfdedefcdabaaefbeaceafadcdcacfdfdfefbecebccabadefbeecebdffaeaebecbdfcadeedbefcfcbacdeabfedfaddcfabcfacbbabfcdbcaabdbddcefdedbaeadaeafaedbccecbdadfaaafefdeabeebabdcaeebdecfbfeabcbccafbfdabcbefcfbbefeffddcdbeefcacaedbdfbfbaedadbeafaddbfbcdafaeafcecdacebffbfceddcbaefbcbbcbbbfebafdedbafbfbabdcdbbcdaedeeeaabfbcdadabaafbeeffbacfcacddbadeafefcecdefbcedcebbcabceeebbdcaadeedacbccfabcbbbddccedcfbbfcbddfaddbbdecaebcddbdafdccbffbddcebbeedcaddceaabefccecaffefeecbebceeedcbdabfcaafaafbdcddacfdafcaefadffecaadfaaeeaeddedacecbdcdefbeffbbadecfbaaacacecefdcbfdfaacefafefeddaeabccafdfdbffdcafbfdccfdbebaddbabfdbbedeafeeeaffaafaaefadcbefbcdefbdcabbdadaeddbeafbbcdeefdbabdbddafecbddeefdeacbdbbeadaddafcfcfbdcafdcbdafeacffdafacdceeeefaffcaebafbedcfeebccdfaecbccbfcbefeebbfbbfaceecbcbfbdcaefafccaadccbffddedcbeedfdaadfbbefebcffdfccdeaceeecedfcbebddddecfdeddbbbacfbfcfccfecbcfdddfedbfcedddbabfdebefefedcdbfeefcbebfbaadfaddcdeefebdfceeaeaaafcbcbebecfeaeeacaccefcaefcacfbeceededbccbdfdcaaecddebddbdfcfddfbfcbecaaedbbcdcededcaebccadfbcbbdafdccdcdbfbbddbffccddabdeffacbeabdbedfbfeaaceeeceabfcfbcebdafaaecdeececabeafbffcbabbcbdabafdeccfefdfdaaffcbeacddcfadabcfcfccddbdfcdfdbbaaccabbebcbffbdfeeecddfaeadfcbcdfefffbaccdcdafcfaceeafabbccfeefeddaaefeaecbbffcbbfdeacddccdfaabbdfcdfaedfedbedadcafbadabedfbbcefbabaeaecaeeaeacbbddbcfebdecfeeeadfdcefaeecaefbbcdcdfebbadadbdbdffebebebfdcbfaaddeeaefbecaaaaeaabceacfefccabecbceccdafeefdebcabacacebdbbeadffebfadddaebcecfeeececcdceafcbefbdaacbadcefcfebdccabeefbeefceefeceecadaaeebbbfeccacdfaefbbfdabbedcceeecbbbdedcbefceeedafbdfbcdfbdfbbecffbedfaacbdecccaedbdcbbbcbdffcffeffedbaefacedccbabfcaceddedebadfbddcefabecacbfeabfdffceaccecbffddbbfdefddaceeedbebfccbfcdcaefabacebcbccccdaffbbebefdaadbbebcfdbeeabceafeaefbafcdafdaaeccdebaacfaabdeeeeedcbdecfbeeeebfcdffcaebeeaafddcaeabeefdecacbdbdfbedfebebdbcbfcaafdcfeaadecbaabeccddccefadeaadcdddaffdbccbcefadddbadbdacaddffdfbdfbfcabadfafedebfafbcafbfcffcfacfccaddcdebbeafadfaeabcabbcdaeeefedacfcecfbcaadbdbfefcaaecddfebfdbffacccaedddafbdbfdeccbdfecabdedcdbabcfdbefdccbebbaebeffdbebaffbdeeeeddcfabedccabeeefafadeeeabdebfeafdacfabeefcefaeeffbbcbfafacfaecdabdddaefbfaadcbbabeddacfedddedcfdeccafbdefaafceaacbebfdefbbcfbebbcbffeacbcbfffccfebcfbbdbffefcfebafccefcbaceffeadbcfedaebfacdeccfbfaffebcfeebdcbfabbbbffceebdcecbbfdaadaafeaefaaeddefadcbceeeaabaaceaadcbfcbbdfcdbcfbaddcbaebfabafcffcdbebcfdaeaacfcdabebbdcebaafddbadaddbaaedbccddbddeaacadabebdcedccceefbddfabbfeccdafefeecdcdefdeabffeebfaecbccfcbbfeafacfddeecdbaaeefdcfdfbecaebfebfcecebeabdbadaaeedcbeecfacfcdebccecbffbdbfadfbdddefbcfdfcdacceabfaebeefdbaeafdeffbffefcbfaabcddcbebedaadeceaabdcbaaefcfcfcaaedcedabdeaeaddaeabefabcaffadafdacbdfedcbcbecafcccfcffcbddbbdeeecaeecebeaceadbaeedbebcdebceccdacfeabedddcedcefaeeadffbcccbdebabdcfededaaabdebfcdcaedbbaeafacafbecbceddbbadfcccebfafceedbddbdebfdebcfadbffdfaffbfeacbdfadffdcdfbfdbdedecdbcededdadceaeedaedcfaceefaeeddebeccbeefcbedccebafdebffbfafedcfbefafdadceecdcfbecbaafccedbdefcffbafcfbbadfadfdfbedaccfdacbedacdebeadecbdaaabdedbcdcecebdaaffcdabfcaccadcebdbabddbcbdfbfbdffcffbbefeffdaaeffeeaeeaeceaaaceeaffdbfacbcdbaacaeeacbafafadcffffeefbcedbdafbfeeddabaaaacaffaaaaeebddcdcdddabfbceeaebfeaacaefcfefbefefcfececeeedebcfdeadfebdedeeaceefbbeacedeaeacadcaefcbfccbbcbdbffcdfceddcdaebceacbedccbefacadfcbcdcbbbdadacdcebeacdbcdcdeffadaffffddeddfdcadbcefbbddadcfbbbbddaabacdffbdddfcaddadeecbfbecfeadbecbbdcbfeabdbbeaeefeebedfacacfeddabedcceabccbccaaddeabafbefbccadbdcafeaceacfcbfbcbcfbaffcccbebecaceddefabfbfcbfcdcffbccebdbdbddccbbbadcbddccfeaedeeeacdeeffebfdeddcefeafffaaacebbaffcecfebdbbfbfcdaffcafffbccaaadfdecbbebacdfdedaddffbaccebeaebedcbcfdfbfeeabddeeddcfeffdbdcdbaadafecddfdaedeaeeeebbfecfeebddccbebefcbaadffdddebefeffbdaeebbadeddbfebadeebeebdbadfbbddeecceadbacdaacecfbefddedffefccafafeeccdbfcbcaeffbfabbafdcafdbcdecfafefcaabbdfdbbffadefbfbfdfcfffbbafacffccbccddceaacedcabdbbdfbbbbaaccfdbffbbbedeaecabdfbfefabcdddcdfffadcadfddcbceccedcebffdafaeeeadbaeedcbcbefdfbcadaccaffabcffdaecdbfbaffecdbafafbdcecbefffecdcffeccaacafccdafeaeeabfbafbcfcbfadaabceeffadddecaccfcdcacfcafdfedaebfceeacccbcabecbbcfdeffecabcaecaeeebddbfcacacbfecfabdedbdaeffbbeedaffeceaabadeabfebfbbeaaffdfdcaabebbadbdacfeedfadeecdbdcbbaaedfafcbdfbedafbdcbfeedbcbbaadceeeccfedabdceffdabcfbeddebffafbebdfcccdceacdceeeadbdfafcaadedfddcccdbdadedbdfaffbaeafdcfbdbdcdafcbdedfdcfdadfeaabbccbcdeeaddadbdfcfdbbcdabdeedcbbcddcccccfdebfafaddfadbbbcbbaaaaaceccdfdaaccbacabecfccebbcaebddadfabddecedafdfcbabccbdbdfafbcddaacceffcafaefdfaeccaebcdadcfceeaebaaafaabbcdeddceafccbdfbfebbcbaeafdceaccfcafbbdbfeeaadefdcdadebbeecfbdbfceefcecdadfbbbafefbcdfbacbeebbeedeafdcbdaccfcfabbcddceaadacfeafffdaeaadeffaecbccabeecddcffcfcfefcbbaeadcbcebdadcccceaacfbfbbcbddaacafabcbccccbbebdacfbeaeecaefadfdbcfcceaeaedfcdeeffbdabfabdfcacbcabdeadcfabafddfafbadaaaabecdfddceedcccdbbaffccdedfcdeacacbbcaebbdbfafadddaaafbeeebdefddcbffcdacfebadbfccdeafcaebacecbdfbdfedacbbbdaddcffcbdbacbfabfcecdeabdaffbeaabbaedabeaafbdfbdcddbfcfbfebcfdbdeaecdaefbdceccfbaccebeddfdadfedbdaaeffcfcccbefdaedadeeaddfdceefecedcaafbdbdaccfdabcdbcaddcfdafecfdfadebbafabdeaafedbfaecafeabdebfcbbaaaddadaeffdeadffbeeffdbafadadbfaedcbccecaadcabaafcbddfafebaeabdafcdceafedcfcaecfeadffeaaedfbcfaafabedcbbdcdddcbceccadfdcaddffffbdcabbdfebdcafaeebbacdadadbcaeaebcdededddefbfcbdfcadacabbbfdcabafcaaeceedffebfabaaeecafaeffbeeacabafebceffdbdbeeacbadbbcacbbbbfefbcabbbfffecdeeacadddbfdfdaeeeecacecedecbbdeecfefecffadbbaabbfbfbcdffecbebdafcbfbfbcecbdebdecdfdcfcaecdbfbabdfbceeceabacbcdccceabcabdeddfdbadaabcafdfaebebbfbeefacedadeabbfaecbcffdeffadfabcfbefbfdcceadcaccbaedddaefecaccbefcfeadfdfcafdcddffdcafdcaeddabacdefbacdfdacadcefeacfcfddfaaabdbdcfbeabaccdfceccfeaddabbaabdabfabacdaedefcacfbddecbadacdadefccabfbfbcefbaebafeeaffeaecabdbbfcafedeeaaddccacefaccbfcbacceccacafdcedfdcecfdaceafccfcfaafbefcafecddbeceaebbdcddcfbededbdfcafaccfeebfeceecaefadbbdceadadcdbbdfbbcbdacbbacaafbbbbacaabcbddaaecbeafdcedeffccdfafdaecddcacbddcecacefdddcbaaccfccbececdccbcfeaaecefcbdeabacaabbebfcffacbbacefebecdeacdecaebabcdffdaabbbebdccdddacdfbcdbbdbffbafcbadafebcaafdeebdbcdfcfefebfaebbbfbdaafcebfecabeaeaebfffefeeddeefbcfddbcaddffdfecedfdbfffefadaeffdeeefbbbceaeecdfedefacaacbcdfbdefcbcfefddeafabdcebbfddaebfabaffaaabdedbcdcedddbecaaeabbaeffaaafbfdbddaeefbbecaeacfbbbbcfbfcdfcceebcddedadeabdecbacaeeffebafacaafefbaeebeffcddcefdaeadbfbbccdebcbefdbeccfdbdbffedcccadebececedfbcfeaafafdcbcfbabafdfaefbbbacefdadecfdccbdaafaffecdcbddbbabbcbacdeeeefacabceadefdebabefdccadcfbeaaafbbdbbcecedfbcbdcedcbadababeaeacafeeffaedcdcffbdbdebeffccfdadabefebffaaeceafcfbceeaaccfdbddffafddaeefbdeeaeaffadcaeceaceceefebffecefefbdcdcacbabaaddbdfffbacecdbadfbbdfddfababceffdfdccdcfafafdbebdceefddbeddbfbbbccebfccbacadddaabedabdcafdcfddbcdceebdefdaeeeafbefecddabfcbaddcfdddfddddaddcfdbbfcedfccfeccdeacfddcafbedcebdcaccbdeaabadccfbeddceaaedfeffbfabfeabeedfacfcaadecdbebafebaecfbccccabcdeaddaabaceceaacafbbbdabacdfafacacbaeecccbefbbaceadbffeefeffccfaeccbbcccbaedaaabcefeaaaadeceadbcddbbfafafebecbdecfafffabacecdefffcccdebcbfbbadebcabafdccaeffdacfaeeaeffdaafffcffacfccbccfbddcfaafefdedfcefceefbdffbdbaceafccafbcbbdaacbaafcedefabfabdadbefefbbecacceddcfebfebadcebfbecdbfbbadfbbaeceaadcdecafafbabaadbeabbacaadddeecfcfbacddabcfbdecadfeffffadfcaaecbfeefbbfadabfdcdeabfccaebbafacacbeceafaeecfbeaeebfabddecfcdbbcdbabfaafddeedcfdfbbdbeedddffabeafaecbcdcdafcdaeedcaebccfdeafededdabafeaadefacfddaabcbefcaecbbfbdeebcfbeccefffbeeeefaedfbcfabaccfddcadbcceebefdbcbcbcceeffdfaacfcecbafcdcfeffffcccfaceffaedcaedebbdcbcacdadfecddaecfbfecbaeafcbbbcdaaeedebbaccdffcddadebdccccebfefcacaddefcabdaaefdbebfcfbeebacacbbeeefaccdacdabaaaacfeeecdbcfcaadbdbbdffbeffcbbcfbbbaedbdbcadcfcdabceabfcbcabcfcdaccefddbbbadeeddffbafeefccdcccbaccddfaccbbcdeeaecdfeedcbeaaacfeebbbafeefcfdaabfbfbfcaecafbccebaedefeaefbacaeafdbeebcbaabcdfcefbddbaacafdecccafebedefbfeaefbdddefcfcbeefebffedfddfefabeddcdfefdbdcdabdebccfffbefdedfccbfccbfcccabaffcfecfefffdaeaebbdfdedfbcbdedddbdefbcfcfafecfceafaabecaccbffcbbcbbbbcefcfbcfcbfddbccafdebbfecddfcfcebffceaceebccedcabadfcabdecfffeaefaacecacfadcaacbccfddcffbbfaefdefafdcabeddcdfafaacfffdafaabcbdeaffbddadcefacbfbdbdfeddfefcbeacfcbeadadbabcacaabebfbfdddcdaefdebefdddedcbfafcafbbedbddbdefdbdefadbebbeaccaafddafcaffafefaadfcacdaeeaebedebdcbcbbcddcecbbccfcdaefcbeadacdebfcbfaaffaaaacecfefbcddceefeacefdfbbffaafcccfacedefabeeeeedaabfeafdfdddadecfbaedbdceffcddbbdbbacadbdcffadebdbdadcadadaadafceacbfecbcdafdfabddeaeeddfeffafffdcdbfdeefbbffeacfdaefcffaadbafaafaeaefdebeaefaaecbfdbafbaeafabdeebbdaaafcbfafbdbccddabccdcfdddedeaecbfcdfdbfebbabeeaaeebacecbcfbbfededccdcaeaccaebeddbaeffaffcaeeffeccffbdcebdaecaedbdfcecffadedfdffccabeadcbbffacedaceadcebffaacfcccddbafafcdedfddfefdceddeefdefdfbcbcebfdaafdacebacababfcaefabafaddabeffbdebcafbebaaacbcbdafcaecebfabedcaddeaecbaaacabbcdaeffdfabcfcafcfcfecabcfdefdceaaebfcccbafcaddfbfeeadcfbbfaebdfebcedacaabfddceccfccbbddffbfeffefdcaaefcfeffeedbeabcfceecdddabfdecdcecbddcdbbfabacbedebeeeeacfdbcebaefbeffeafadeaacdabecadbebfebbfedddcdfeccafddbfeabfbbffabcfcafacdedefaaabfbfdbdceeeebcecfbaddefccadcafdefedbacbebfdaebcccfcdcdcfbefbbdacbebbabcaacccebaebaaedfbafbcffcbbacfcbbdeefbddbbadabddbecdaaebbebbeeedbfbfacdbebeffafeaddcdcbdcbdfedcffbddcddddfbdbdfedbbebdcfbcdcadafcaceffbfccedeacacaabedbfdbcdbbbbdecafadfebbbfbefefccbafcbbbfedaaffedbfebacccddbbbccbaeedbffdabcaabaeeeccaceccecbeedefbaaacddedfcddebebceafdbfecebdefdedcacacacdeafcbabbeeedebfcfebecfdcaedfccdebfffdbfcdcdffcedabdbdcafaceaebcbcdeadadecbefefdfbaadafabaaaedcbdefeaaddbbeaacaedacadfaeebdebebbfaaaaffccceabbccbefabeddecbafdeedaaaceabffdbbabbcdbceedffbaaaeffcaabdbcbcdfbedeeebccabceadeecdcadecfabdbafceaedbaabcfcccbcccbdfdfffeddccbddcbebedbfacfedfeabfdeeebafbdcfafdcfcfbaafdebecaefbeedeeeddaacbdaadcaeddaaffbfdddcffabccdcdacebaeabaffbcfdbcdebafaabcbfecbbfecafbbdaedbfedabacaaabbcadcebdbbaaffdeebfefcfabecddfaeecadeeeebaabcfafbdadcfccbfaffbcbbbeeefecfbbdeeaefcbdfaadefdefffccfbfebdacefbedcdeaabdebcffbdfeedcffcffdceefccbdfbdeefddbeaaadfcceaacfbedfdcecfebbadeeffbfddfcddafacefaeeabbeeefadfdadbfadaacefafcfbeaedaceafeaaedcadddfeacfbbdbbcbcbfecedaacbdfdbedacfcffdcbdccffadfeaefdbfefcabfadffcecabdebcdfbccceacacfeeadbdfcfdfbeadbeeeaffcdcbbedfecdbecdffeddbfabdadcbadeddaadbfedfeeaefcbeafeeefeedcfbceaaaebeadcfcbcfeccacdeaeddcdfffcafacdadeebacbfcebcedafcfedfcefdbfafddfabbdeefeeacbccbbbaafdddcbcbebfedcddcbcaecdaecabedcdacebfcfaccecbacacccedfcbcbacfdadedbbfbcbdddbeedbbcaedaeabbadcafcdfadebccedeecaabdcffbcaceacaeefbdaeaddecbceceeaabfebbabadbcbedbeddabbdfdafedafebfddbdccccdfeffaeaabecaafbecabadeccbedfcecbaaeeaebfdbecfbbfcbabebccdffbfcdfbedcaafbafcafdefbdfdecaaabcbceedfdcffdbaebcffbbbdccdedcdfabfdbdcfcfeecfefbefdafcdbacdbcdaeddfbaabafebffededeafadfbddecaaffcabccfaccffbbdcbaaaaaecfaffbaedffdfbbfefdbdfbafdeccabeabeaefdfcbeeccfefcbdacdffaecfdaebedaecbebdddefdfaacaababadafaaeeccbebfeeafaaaefecbdfaebdaecdedafbbdaeabffdadfafedcfeffdccaabdbdbbcbebaddffbffcaabefbfffbfdeeaaaeaddbceeebccabaaaefdefdadfcaffdecdcdcdbdcadeafcabdadeedcdfdbfccecfcdaceacbaaffcabbdccdfffcccbbedfbbbedafcdaaefcbbccddaebbdbbcfbeccbbacebccabbecfdecfbfddfaefaeecebedcdeddcbddabcccdbebccbafbefacadfabbeaaededdecbbbbbbffffccbeabbbedbeebbacdddaeeadfdecbfbbeaedfbfeaebfbddbfddadefddabebedefbaacedcebccacdbbbfbcfdbfaefafffeafeabdafacdcfccbdcbfbecdebabacebfeadafbaaffeedbabbdaddeeefccdfdacaacfcadccaefdcbdadeaadbeaacdadbaffabedccfcdfcdcdcfebadefcdbfefdbfeaffdcbaecdcfddbecfacedefadbdaecffabebcffafabadaeeafdffdedbabbfcfaedaecdacefbbcdacefffdbffeddcfbcabacebedecaecafedcabcebbbbdcfdafdaeddecccaecdafbbcadbeaedcbadebfcafcacfeefcaddbcfaceeebacffedbcfcbbffefbdcfecefbfcfeabbaabdafdbfebaeadfadbbdaccebdccdbdfafeaadefcfcadbcbdaacdefdfcdeccaceaebaecceedabfddbddcdbadbaecceeddcfbbddbffedddacbcbdcdcdbcecafafffbbcdecbceccbbbfedeafcbdaefddcdadcfaabadbdccacdedddddecbbdccabedbdbacedafbebbdcccccceeadecaaeadffbdacfebbdbfefffedefeefbafddfeeebdffdedaabfeddeedccaedcdcfbbcfecedeaeecbabbccafbbcaedbddeafaefafaedfafefebcbecdfcbecccbdfaaafcbecabbeceeddcecfdebffeafdfdffcfbecedfffabceaefbdfcbeecefeecfbabeacacaebacefeefabdbbadaffdcdeeaadbadbeddcffefbcffcdceecadffcddfcbadaddbccafdffbccddbfbbaeacdaddeccecadabfdaacccdbcfaaadedddddfaaababdcafebcfccffbcecbbacacafedaefccfffcaefdedbadbcebacfaffcdeadceccccffdfafdbaedebacafbeaaaafdcdaeffebafcabfcdcbaeffcaecbadefcdfccddbbeedfbeeefefdbecafecafefdbebcedebbdbdcefbcaefdaacbdddabecbeddececbaaefbdaaeacfbadadfbbadaeeffdeaabacddaeadafbecbbbcbffcbedefcccaabbfaefdfecddefdbcfbeebafceebbabbabcecdbbaeecdadaeeeebbcbfadcbffcfdbdafbadbbffffeceeafecbedaaadedebbcbbcadcabeefdfcfbabffbbbeddcadcdababcabaefadfeafeededbcadbfeadabfbbdcfdfebbacffeaafbeebfbedbbaffaadefaadeffecdbdeecadbdcdccaaafefffdfdecbcfbacbabcfcafafcfadffbcbdffacfbfbaccabafdbafcffbeceedcceffafdfddfefddfebfcaeadbeefacacebaddbebccfedacbebfedbccedaaaedfbadabdfceaffcbcabfcbdbfffcdfceefccfaecdacbedafaeedddfcbbabafbfacefafccfedaacefcadeccfafbbbbfebfabbddbeaaaafdcfbdcceefcefeffbeeaadabadcaedeeaeebebaccaeabeededfdacbefdcadabdadfeddefadacfaacfcbdcaaabaccbaedafabbdfaacbcababafbeebaebffdddbaaadebacbddcaecbaecabfcedcefabcbecbeaecbdfbcedeebfcbdfbaebdccbeeecabdbabfaedcfbdfcfcbdafdefabcfbcdbcfbedcfafddfaeaeaffeedaadaedcfdeaadcbababebbdcacaecdddfbfbbcaccfdceddfacedabecfdcebcdfcdafaedacffecefdebdcbbcfaddabbefaecfaaeeefcffbeaabdebaedbbeaedbeaefdfdadcbfddbaecefbcdffaefcfeeababdeccbceeddfafdbbccdbaedfcfabaeddecafedacbdbdacbdbdbadbacbcacdffaebcecebccebccbbbdebabedafbeebabadbceafbfacfdbfbeccbcbcbacbedffefdcfacddabaaecebadddfddfefcedeeccbffabfbfeffcfeadcffefedbfcafbfcfffcedfecccfdcadecfedadcbcfabf 您好, 这里需要密码.

hexo教程
cabfdceaeabffabcfceaeacaabffdcadfbacccdcfdeedaafbcbeadbbdcbedeeccdaeeadacffedebeefbbeaabdadebcadefabcaaebdbfecefbcdfbaedfcddbaaddebaccfdbeaadeafbebadceadfdfcbdccfffbabfaececbcfdccbdcdeccabbceabbbeedabcfbdcdfdeddeabdeaccfdfddfcedbceacceafdcfafffefebdbcadcbbbbbfaacaaebbfbbfcbedffbbaaaacadabaeffabdfcdabbecdefeccaaefacdcbabbeabedafeeecdbcdffcdebfbbbabeaeefdcbeefbdadefabfdfcabebcfdcbcfbadbdaabdbbfddfdcfabbdfaeeedaafbbbdaefebabecafeeebffdfabafcdcbdfcfbececbbbdeeefacbddfeeafcccffbebfdfeaecfcbcfbdcfdbbaefdcfdecbaddeceeebbaecdcafdcbecdadeadcfbbdddfdcbaefcdadabfadbefabbbedbedbccdeddbbedbadcdbccdeadddffebfbbffedfccbcbcfeabefbbbfbbfbacdfabcddedbabaeeeefecaaabdbfdbfeaefdcfcdddecedacebcbfbdfffebabcbfbdaccbcdccecabaadfafdbafbfadfadcbebeaaeddcadcabfebceddefeffaeafbbcadbbccfeeaaecccaeaafdbebcdaadbfacbaecddacbdeebfafdbefceeabfeecaccfcaddfadafdfbbbfeabeaedfaaacaeabadfbbceecdfedaaedcafbdfdfdadacfcfdcfcaaebbccaffafdadcabdfafaaccdfbafeafdecfadfbbbbeceddffaccfbedaebcacdefceccdfebdbbcebebacccbfcbebeddcbebfbceabeebacdcddbfddabcefcbbfaeaecbdbabbecdfecfcfbadaebafffaeefbddabaeabddebabbeedfdcbfbefdbecbbacfcfdaafebfcddaaacddcdbabffdcdcbeccbdcbedaacfffedbfefdeaebebfeddcedbeaddcfeddddaddfabdbbcffdeaffdeeeaaddaffbeaabdfabfacdbecccaffbbbaccccafeccaefccadcafefbfbcecceeedeadecbbebcdfeafefeeefedfffefdaedaafdfdcfdbccabdacceadcceafaaaddcecddeebbfbdcdcfdaffafcaedbddcbfcebbfbbaebebfaababcbabbecadcaccefccbeccbfbcdbbeafeaaadcafbdeadebffeabbafccecbeadeecaadfeebeeaefacbfedefadfbeffceeccbbebdabbbabebeabaadbabbffddddffbaaebdfbbcffbeacbeeffbececbfeedfdfccebaeaafdcbaceaecfcabafebcaacdffcbfeafeebffebaabadfcbebacdfffbfaaeeeeeadfdfaddadeeadecdbdbacfadfddcdceefefeacdbfcddccdabdeebfbaddcfdeaabfcbecdbfddeebfdacbccbbeebaccacbfdaaaacfaababdabeefbdaefabdfaebaaafbcefcbacdabcefeeebbaecabeccaaeabdbaaefdafeabaefddaebfdabdbecfdebcaeedcedebdfaacfbbcefceaedfeceecaedecdcaefafdebafcdeddafdbdbdeaedcceacfbfaadaeffbcbbecdfaedfdfbbcbdfecfcdcffaeaeadffdaacabdadeceebfccfdaafbbbceddabadeebdfcaaddadacbadaefffbfeafcdbbefadfccbdeddfeddeffadeeddadcedfcdeaaacbdbcaadcceedcebdeaaecabdceffeaaacaeebfdeeddcdfdbcbdceeffedafccabecddcfddddcddffeeafabdfeeadbccdddfdacbbabfddffabfffecddacabdfcdeaefcdbadcccdaefecaaaefceabaeebbadbcfefcfcaaddbccafefdcdaacdeceeeeedeedcfdcbdcddbeeebbafbfcbbacfabcfafedadfffdbadbebcabdedcdadeccbcbcacbfffaeaabebbbeffcaacacedeabcaabdbdbcddefbeeeeaaaadbedaafeceecefddabbebeffaeffddcebddacdbcfbffdcfdcacdfacaafaccbedadddbbaecafbfbdcaeccbcdccfdefcfcbffdcafbdebededabaabcafceabdfebffdecacaeaccaeddfffcccbeefbeadbbabfcfdafeafcbecacdacaadffdbfdccfabdbafdcedeabeefddacefcabfafacfdbfdecffedbffcdcdfddcdcdaaaebdcffacbbeebfecebaccffaafababdaaefabfeeefcaedbdcdbaaefbbfeaaebddbefbbcbdbcccbeeafddbfcaefcbfeeaffbdbebeffadeebabadeeccebdebafcfffbdadaeaccfcaddffededadefaadccbddcfaedbafefaeaababdbfcfabebfedddffebdabfdfffecbbbeacfdcdbafecfdbaeacdbdcaaddbfadaabfbecbcaddfbafcefafbfafeafaecfccdbbffcbffccddbeeeeeddabfadcbbddeedfaebdafeffbbcfcddfcfcbffdaeeddbdeeadfabcfdaebdedbebaceeedbdfdeffcbeabdafaeecfafaafeeecbacdabeefaeddbfafcdfedcbdbedbdffaaefebdfdebecafbacbcaacaedcddfbabceadcdcedffbcaffbdaaadeabfabdfdecbcddabccefeecefdcfdcfedffcfdaaecbfbbaecfcdabcafcbbcafccebcebeedababbafffefebeeffdbbeeaacfbfedbbeecbdeabbcebbeddaefabcdcffddafdacdbfefaecabbbfeecfdedecbaeaafdfffedeccbcbfcbefaeeaadaceddcaacebffefeceabadbefcddcffcfdadeaeecdcfddccedbdacbddaaaddfdfbddafaebddccadfdbdedbcafdabbdacbfcdedaedfdfefaaaccbcbedeeddfedceddedfcefebbbadceecabadefbedfabedfcdaddeaffafabaeceafacbcedcbbdddacadccbbaffaaccaaedebaafbbfecebaddcecceeacbadabcaeabccceabcbbbddbaebabaadbebaaacfedbbacdfaeebbcabbdfedbcbfefeadfcafdabafcdacececdccbffcaceddaadcddbeabcfebfbccdecbddccecbaadeffcfdacfceddedececefcadeeccadbeadaedadfabddeeebebfacfcdabeaefbcecdfbbccfdededbbfadcdeabaacbcddeacbfdfeaaacfaadfffadaeccaefefebfaafeacafcbcecbaedcebbcbafeaaaacbcbcbbbbeeafbbfafbdcfaabadabbbdccebddeaabaeedacfaddabeafcabafdbfacbeecdfbfffbdeccaceccfebdfccfbefdfdfbcefefbbbaacfadefdeffbeacdfedafcceebddabeeecbefcdaeefeffabfcedebdaedcafdebbeaadaafbebaefeceeedefffbfcbaedadebbeadcaccdcebbccdcedfedcddbceeeabfbdfaeadecffdcabfbcdcbceadcccaffdbdfaccfafbdddbcdedacdcdfadabfdfdaecbedbdecbddfceddebcecfebeafdadfedddaebdbcdfeecddecfefdcbdcdedbbcdcfaaebadbddbffcddcdaefabceaedcadbbabdeaeceeacfeeeeeaeebafffedfbdaefedabcccabffdefaaeaefccfbaaecffecebedafeebfedbedcffdeeedbbfbadbdeaaddfdebbfcbbbefffbbadaafebffccbfecabceecfdfbfbccabfabbabdbeffdbcffafeabdbcddfbddceaaabbeeeecbdacebfaccbdcadfcfafebbadfabbbbbddceceffedcfddbccecbdfdecfcdbaafbabccfceafdbcafafeffefccaafbbbfecbdbeabcdebfedfaecccfcfbebcbecbacaeffeececcbdfeecbfbdececdbeeeedaededcfedefdabdfbdcbdcfccfadefceaebeadcaeecfcaadacdaccebddacfeaeafadffdeefafabbcaaedbefacedfdadedadbfbdcaacebfbbbbeaeabbdfbccdcfefdccfaeeffecffecadfbaeebcefebebfdfdedcbfbfebcabadeadafccffddecdedcbedcefaddbedcbbccdcceeaacaaffbeedecbacacbcdabdcfcdeffcdcdcdfcbdcacedacddafecfebbdbaebbaadfbeccebcddbbbfcfdbdccdcdbddecbdcaffececabcabacdedebdebaafdeafeffeeeedbadfddeedffadfeafcdbcaeddfcfeccbaebcedecdadbabcfefacaadbedbcfbbefdddeeeedafbccbdfafcfdddcdaecececaceefebeecddadefbbdfacceffdfdffedfdcfedaedcaccfedfeefacaeffcbabaccbfacdceeabcfdecdbdcdffcbebaddcccefabeabfeefdbcedbfcfbfecefafdbaaafdebfeadfbefaccecfbdcaeedfedaafbbcdfffebeadcaaafabdeefbedeaafbebbdaabbcefadbcddfabdcdffbdeeeaefdeffabefcaaacbffdefbecbcaffaeacdabcffbecfdfabcadbdffdfedbedffdcaabcccabeebcaafafedecafedcbdecbceaeccbdafafcaafbbdbcccdddcfacdbedaeddfbfebfbffaededeedaddcaceceddfebfecbcbdafbafbeaabfcadaaafbafeadebfafeaeefddfabaebcccfaacfccfdbebcfcdcdebdcdbcfccddececbaacedcdcceaaabfbeecbadbbfebfbfdfddeacdfddacbdcaecaadccbfebbfcccbaedecbbcaacabbddcccbddafffaefffffbdfedafdeaeeeaedbaebafbbedfdcfafbbbbbcddadbcecfedaadacbffdfaccaeadebebbeebfdaabcbcddcffddefdebfbdcdabebbcfdbdadeeeecafddffecbcfcebddbebbdbbbdddaceddaafabdcdebdafbcbdbefccbceecbadecabdccbdcaafcaabefdbadabcacedababcadadcbbdaedcacdbefaededceadcdbeaedabcabdfccfdacbecdcdfddceccfaedcedcdfefaaccafccdefdacbdaecbaffdbbeeadddfecefebbabdebcdbeabdffebbabddfebbeeaefdeffbbccaceafafafffdbeffeffcdacaaddeedbdebfceaedaecfabeadfbfcdfeecebcbbcdcefffdeeebbacaafeeffedacaaffddfceecefbfcdfbefbedcfbddeebdebafecfdacbfabcdfedcdbdfdefdefccbeccaabbdbcfadceddadbebecfaccbafeaededbaddbfaacdebeeccbfdbebcbafffadceafecdeddbcdaaacacddddbdbcccafdadbcfbedacdcddeeafbafebccfaebefafebdcaedeafbaaecacfdcfbbbdaecfbeedcdacdecafcacfeadaeceaaafdbaededfafebdefcfceecceabfebadffefabefebddddfabecffaefbcdcbfbcefffbacdeadbefaabbafbecbcaaffffebeeefabdadfcceccccebbeaccdcaeaafddaebcfebefbcdfdaefdfabfabdeabbbbdabdbfeeeacfdaadbabcadbbcbfcbfdbddbbacfdfaeabcefeaabacedefefedaffdfdacecbdddadbcaafecbebedbbacabdcfafafebabfccddefdfbadcbecaffbcfdadffcbdefaabcabbacdebeaddcbacbcfeaeebeaecbebbcdcbdaadccacbbddeddbbefababbcdefeeedcffbedfdbabaabbbbccaffefdcefbcdfbfafedadedbaebebdeecfdcfcdbaedbecbfbfcfcdaabfefffbdbbbabeccfbfefdbbdcccddfcbbabbaabeeafaaadbcafdefcdbbeedbadfbeeabdeafedadefbadaadaabdedddafbbebcfcecfdecadabfbaabcacefbceeeeefdaaecccaddeffbecdedaacffffceadcccebedfdfddebecadcaafbeeedccaaadcfcdddbdfccbdaecccdabceebfefeabeeeefcaeabacebfdfabcafacfaefdeadefccacdaadecefcaebedcdfcefdedccebebeefdcafcddacaeaabafadfcccdadfcdeaadbfdfabaebbacaeffcfdfcfadddeefdfbbddbaccfabccacedddddabfdeefedabaaadfcfcbeefccbccbecbeacecbbfeceedebedacafadfcaedacebafcdbbeffddcaefccaadffaeacddabfbdabacdbbecafeedecaffefabbdfbcecdcdaaafadcdcbccdebfbabcddcebacaceccbddbfffcaaeebbcaaeafbebefffedcbfbaebcbfecafeaafdeafbfefbfeaaaafcdfeaadcbedbeaffecaeafecedffcddbeeefaeafabddededfffaabcacccaffefafabaaafdefacffafcdcacafecadccfcfeccdddffecffbaaeaeefffedbbfadfedacaadbbbabfcecbccbccbebafdedafbdfdbfdbbffdccabbaccccfbdbbebcfcafebdbadffcbdaceabdabeffecaaddcfeaeebebffdcaaebbbffdaefdfeaaababeefafecbccfbdaefedecffdcbbbaddbefeaadcedddcdecaebbedadcbdbbbcfcedafaaefaedddefacfcffdbabfbaffeaccdedefdccfefadfaeceaacaeddacecaaceedcbceabcfdadefbccddeaeacaceddaafaebbdebddaffddfbccabfadfdfcbaddcbdaaddaeebcafecbfdbeffebcbdedefacaffacdfbbcbcbaecfbffeccdbfcecdbecdaefaeeebfbcceabefeabcaccdaafcabcaecbbbdccdaffbeddcabebfcbaaeedeeabcdafffbeaeadefabbfcbadffabcbffabddcfadbdbddeddaabbedcfcdabdbdaebeeaaacdecebfadaefccecbbbaaefdbbeebaecbeebdfbefaecabeefdfdddadaebdfbaeeffecdcbbdecfbbadeabdadcbfcbcbdfebbdcdcfdebdbbdeadfdfbcdabdcfeaabeecadecaeebdcaaccfcfddfbddfdcacabfefbedacbbecdedaacecafcebeafdddafefabbfffcfebefcfbddcadbcfeacfbeabccfdedbfaefedafcebafdaeeeadfbfbdbfaefcebecebacedbfdefbbacebebabedbdbfcbbcbadedabaccdaefcceccbcfdaebdffedfdabffebcfffbcdccfcafceaccfefaeedcdfeaecedabdffccceececaceafdbebebfdaecbeceecfdedcbbcccbfbfdacddabffeadadbaeabffaeaeabdbaeaadefabfaccdadbadbeafbfacfabfffefaffbbacdedfcaabffbebbafafecdddbbfaffecfabbcdbadaafddcabaaaacedaabfdeefddcaecbcfbacacdbbeebfdcbdedfeadebffbbbddeccfaadebbdedfedbfebcbeecabadbffefffaedccaabbafbdeebdabaaebabdfcabfeaddeffdadaccadebeaabaedceaeadaafadadbeecafccfcfcbcdfbafccfaeaabfcfcfaccfedfabcadeeaafcbfcaedbffabccbececfafbcaafacdacfacffdedcbdebdcaaafcabecbeffccacaaccfbeeedabaeadaecdeddbddeafaabaccedeeceefeaadebceebefedcebacbadecceedbdfcfadbaacdbdceacaefcecacbcefabfbddfeefeecafbaffaeeccbfdbaddededfbbdfccdadeaaeacfdffecacffefccffcffcfecfddbeaeddcaecbaaedddcfaefeabaedaafdbdeeccdeaecebddcaacebfeaafccbbebfcbccfbdacaaecacbcfcbfddcffcbdcdbeedadadceefdbfeceecebacefddeefabcddbbfaddfdfafafdfecbcccdedecfcecaddacbaccdaafcffdbdbbaabfffbdfcdbdeabcedfbdcadccfbfecdcfcdccefafbadddacdfdccdefdcacafefbbafaecfcbfceebfcddcbcecbafbbabbfbbafacdbacfabfeabbeafadefacfaafcfafcebdceffbaaaeefbaaecdeadbbeefdbbbefbcbbdfccfbcbfdabcbbdfeefedffdfabfeebdcdfddefbfcdfddbbafecdcfdfcadcbceeaeeeffabecfbcdfccaefcdfecefebffadbfcfececacbefcbfcedeeaedefecfcdecfdcbdccebcdfdfddfcffddacdddfddabbbaeacbaeceabcacedfcdeceeabdfaffcefaedadecbaeafdcadaefabeacaadaebabadbeddbeefecffeaaadbadbaebcceabecddeaaebeeebeadfaaeecdefaccbecffeecdbbcffaacacedaefbccefcfdeceecbdddfbbbaddabfddadddbfdcabcbdceabdbdbdeababcbeacdcfdddeaaccecfffeabaeaeaefcffdafebecaadcacaefacbbbbbcccaaddcbeefdaaffdcaaacbcbcbcdcdcfaccaebafbaccabbafecdfbbdbcbbceeafedeafaaffebbcbdadafeedfdfdfbddbfceaacabceadedeacfedbffaefeeadccdacffedccebcdcedfbaacdafddbbcedcfbafcaebaaddaafebaadaadfcfecfbebeedccfafedaecfcffcdcccabfbcaebbbcbabcaabeeeffcacfcdbaabbdedffafbdffbcdabeeaeeecadeeedabbdcfcfbdbdbceeadefacfaccfdcdceaaeadbaabcfffeecacecadcbfebaacbeecfcdaddeadccdcdaacdabaaefbcbbcbaaacafeacecebccabaacecaefbeeecbfeccaaeacdafcbcddcbeaaccdcedfbbadddcfadeeefdbdadbdfcebebaffcddabdddbbdcbeeeedaaebfacbddfdbddfbcccddedccbbfffbedccddfcdbaaafbbbfeaaeecdebffeccdabddccbafadacfadcddebaadefdabccfcdeafcbcacdefaaadadcddbcacfbdabeedfaacdcadedacfbeefbdbcffbdbbdddeacbdbfffaabffffefcaacdedbcbceddddfafcbeecadbfeffaeececdfaedaaafcdefdaffdadfdebccbacbbfedcbbcbcfecaaddbffdffddabdacbedfaccaacefbeecfbadebaefaaafcfcaaffdcedaacfedceeafbfccefedeaabaedbfbbeaddfdeaafcbffbdbbacedfbdeedbebbeaacbfcdccffddbabaebcbcfbadaafeacaacdfacbbfcffeadaaebfffbaaadebcacfcdbcacdbeacfceeaeddeabcaeabcacabbcbdcbaafffbdbcecabdddbdbddcbeddfedcaeceafaeeddfbfadabafdbeacdbdedccfcdecfaabadecfafdecaaabcfdebfcaccbfebaeffddedcffeaebfdefaaaddaeddeecacfbfeccdedaaebdeaddcfabfcccfeadbedaaedcbbbecabeebdfccccbecbadfdddfacbeccefdabdaceefcaecedceacefebbfeffacdcdcaedeebebfffedecadebbdeaecacceacacccaedceaddfeeaffaeadefcdfadfdbfbbbbddafeaebeacaccccaaddcbdecaebfdccdecdffcedaadfcdbcbabfefdcaeaaccafedbbefdbdbcfcabdcecfcfdabfbaaaddaeaabbfeffbbeaaadcadfcdeafcccaaabbdaeedddcaedccebafcfadffeebeabfbcfbcfebfcdeccabddffbbcaeacedfdeccdffcaadfdefbdebcbffcccefcfaabedecedcdbbeaeddbbffdfdabbefbaaedaceadccececaffdffcdafaedbedcbbcedcbcfefccdfbbfedddfdecfbbfddafdecefbaccadfacbbcdaacbdfdcdefcfcfcccadcbaefbdabaafcfffcdcdeffabfacafbbddaebaeacedabecdecaedecbedfbafcebbeddffbabbfdeaadebccdbacfbbccefeecdfeedaafcdfbdbaeebbcbfaaabcfcfddeecdadceeddafdbefeedbaadbedcfedfbfeedadebafceffbfbadbcbeefcefbdecffabcaecafebcaffeaafeecbfccdaecfeaecbdbcfbbcedfbdddbcfafaffbafdfbcabecbffbddfbadebbbfdaeaaeafaebeecaebfdaeccfaaadfdbcaacaedfcfaacceceafcddbbedcfafdbcecabfaedddceadbdcbeadbbdfebdecaefdfcebaeadcaedbabccbfaabdbbfebbcdcdadabaffbefebbadbfeceaeaafdacadbdfbecbafbdeabeafbddfceebaaedabebacfabadfbbebfbcaadabaecaadfbceeaacabebbefbbbcbfededbbfeadcbbdbdcbaabfdbaafeddbcbfdadfefcfacbdbfeededfcaacbabbdebabfdaaddcddfcdaafbeacbceefbeecbfcbdbbcedcecfcababafcdafebcbcfdcdbdeedabadcefcbfbfdfcecedaefbcfeabfdcabcfbfbfcbbeddfbbfeedbaeacbdcdcdcdafdcdecbdabbcaaedaccbdcdaffedcdfbffebdffcafcdffbfccbeffefbabbbdaadddccafdabbffecabccbebffffbbabbbceaeebcbedeeadafeffddfffcdeaeabcdefcbbcfecbaeecabffdfeccaafadccbbdccfcedcdafabbeaadccacbaddfbdeabfaacabdebdfcedafbdbcedfcdbcfdefedffbdfcfecaafcacfccecbfeecbdcaeaabcefafdfadcbecebcbdfdaedebebbeccebaccccfefffafbcefabecbeadacadbdbdddefeebabedcaefabcffaafaaebfaeedeeeefaaecbfbeaacfaebbfbaaecbdeaecddbccaaafadcbeffbdecaadaedbcbbcbffaefadfdefcdcadddfaebfafbcebeedbfedcbdbabeefcaedbfaadbbddefcbbfcadbcbcfebfdadabaebddbadfcdccbafcfeedfefbedbafdecbbddabbeaabefffefddaeaadfabdbcffbcdfabfedbaabddbbaeddceeefaeedadcdafcddbcddaafcceebdaecdbcdacabebbfcfeecbdccfadefdbbfecddbfcabcfdfdfdeaeedcfcdeefafffddbfaadaafbdcdfefadedcfdeddecfdceffbabebcabcbcedcdbdcfeedcfbbadafcceddcfbdcabbdeabfddaabcbfdbbeccbdeeddeaaafdfacebedbcfaeedfbddafecaeeeeafefdddeddfddcebeaeeafddcedddadabdbabacbcefedbdfccaebddfcdccefdaacceaeefddffeddefbdecdeabedfcfdcaaebcedbfacbaecfdabadacceaabeadcccbcfffebceccfbcaeddadbffedbdfbcfbafceffebfbcdfebafddeafadefcfcbabeaeddadfebbfaefadecfffbefbabaedaebfacafcdeffbbcbcadbadbcbccfdfebfeefcdefcacecfdafbbdbcbeccffaeddefdebcccbefcbdbcbadcbdedffafdbaafecaabfdfcbaeedfaacdedfdcacddacaafbbadbffeffbbefbccabbafdcdfcabcefcdfcffefaabaecacfdacdbabdefdcdedabfdfdafbcafdffacbdafdbafbcddfddcdbbbfaccfaacddccdecbcabeadffdfbdafcdbbafacdfceadefbbcfebffeefcdffedcaaabbdbbefafffcbbfecafabbedbaffedadfbbfaefdefdececdeecdbccbaaffceacefcccaaefeedaabfaadafcefadcbffebfdfdccfbbbacbabaaaccbaceaecdcfadacdedefdbaebcafcbeaaacdabeedcbdddbafafcdefedcaebcbfeecaacfacafafefbbccfadcdbabceebaedebbfbeefdcabadeddafafdbfaaddbfbedbeedefdaabdecbbedbbbbdcafbcfbceeabcabfafaabdaebcafdedbccafebdefbdedcedffddbfacbeffcbbabdffddfaeaedfaacafabaeaffbdecececfeacfbffcbbcbffbecaacadbffbdcdeabefeccfbcaaadcabccccdbcadccafdabbcdbbdaffddcdbdcdabafbaeceafcaeeaabafefdcbbabcacbcfccdafaacfdfaecbbfbbedbeceeecefbecaddeefeeeabfdacafbedbddaaeaabaedefdbfdeabecacacfefbfcdedadcaacffeafaeabcefaecedabdceabcdcfffaccedafdaaffdbadccffbfedbedeeedeadfcafeffadbcbfacfefcfcffcbaabeacecfebadddfcafbaabeefbabeffeefaaccfbafbacbbbefbadafcccabaebfaceacacacfbeadadcaaacbdebfcdcadfbccbaeccfcdbeffacccaaceaffcbecbceadfcaeebccadcaabdbfdcbefeebecccafebdbfbddccabcebfceffdeaabffabaedfffbceadbbfdfcfaccbeaaceebededbbafedafbceaefbddcaebbfeefddaeccbfcbcaceaaefecbccddbffbdcfdfebcdeefbceebccfdafbecedbbbafcbffedfceefdddacaeaffaffcbffceadbfaadaaaeeceadbbdacbbedbddcabdefdcbfefddfdeeaccdeafecdadfbacddfcbfacbbafeadcededbdfdfffcedbcfaafbebeeaaaddfcefffafcccafddeacfbcdfccfaaadaaefbabdbfaaaffafaccdcdaacefdffafdaacbaccefbaeedfeeecceafcdadcfabcdcebcaddecfcecfcaeaabbfeebafebcaffedacfbaccafbefbfaddbdffeddbbdadbecafacbadfccfabdabdebfdfdbccbedbabdbabcabfbcefbbcfabefedfcdafceedacdabccdaeffcebafcdabbbeabbabaabdcdcbddfbdebfddecbbdceefbddfddaecebeafdbfdefecefeddfacfdffabdefbeefcbecaecabfdfbdfcceeabcdceddefbdacffbfeeabddccebeadfddcadcfcedcebddabfbbfcffeeaeaebcefdafbebeacffadcafebddbebebcdffedbeebdebfcfdedabeedacffcfbbbcceeaabcdcfdceabcbbdeefaedabbbedecebdfcecaebbfeefdafbfbcbcecccefaffefdabddeffdffbacfcbaacecadefbbecfebffdcecbabfdbbbdfbebedaddefdffcfeffbaceefcccfbafbdcbcebdcfefabacfcbcacedaeafabdcbbfecfebefdfaffbccbccccfdebbbfedddbffbfdbcbfacaadfcecdeafcdadbcafeeedefcffcacfcfdbaafdffbfcafbcaccdbaddcdcddfdcfbfdcfacbeaadaaadaaefacaeafcaeeccefffffeffdfeedaddabcbabfdddaeebaccfcebabddcdccedbaffadceddfdbecdaabefbbaebceeddbcfcdafdfcccaeaceffecacdefcfcefddacdedadffefabcaafdcacfcabdbbfbbeeddbaadadaffbaedabfadebeebbafeefbfdccdccbfbcfedececacccbebadddabdeacaebdedebdcbdcaceddbfafaeacabdefefdcccffaaebedbddafeecdfaceadbecaeeebccfcaebdfcadaaacdecfecfdfcbfcaecacbbccbeedbcdeaafbcbcaabbeacbaddeefccbbfeabaeabaeabbcbbcbffeabfbbcafeedeccdeaacbaededdaeffcbeebccceeefaadeedcbdadfbfeeecdabdacacceffcbdbddecebbcafabddaedbadcebaecaebbefbdabbeeffdeeadddadeeefbabdbfcccdbfeabfaeecfdbfebadeecaeedfdbddedecdaedbccfacdedcbaaaaccddbcaabbbcebdeafeddccdddfcadbafcefaaddbedcbffbfbeefdddebfaefabbceebdfacdcafdccbdbfbcedacffecaacceadaebccbbacbffbbafbfbedfeadcddcabbbefcafdcacaeddebedadaecfcfddedebeecceeefffbabdaafcddcbbbacebaeadbaffafeaececcaafbcfaceacfdbffeadaabafaccfdcbeffeacfcbdacbfebddccfefbcfbfcbfdfbebaacffcdbafdaffabbcfebecaaaddaeaefebdfdebdfbefeaebcaafdedddaedddcdbbcaddcdcaddcbbfdeffccdeedfbdcfccabdadedeefbcbbebcafbbafbcccaddaccbbaadfedffecbdbafbcaaacecdaedddfdcbefffbafcefaabeabbaefddadeaadbbfbddbafbccfbbdddbbfeefebfeabdfcdbeebeffbcedfdecdaabbceafeebdedebeedeeaabbddfeaccadffedcdcabdefbbdfedcefabedbeeaeaeefecceaaaaeeaacaacffeafbcdfeeedcafabdeedbdcabecabbcfdbcfeeaecdaacdbffebbecaafefdfdedbebfbdddcdeccaabccedcbecdceaebdcaddcdcccceffaedcbfbcdacbffccacfdaceceebbfeaafbaeaffbecedecccfffcbebdeecaeebabdfeecfacceaeeaaeebebdbbdcffbcadeaecbafdebdffbcabdcddfcedadfabbcdaaabfddcddfcdeedfcbebffaebdbfadedabcaadeecaaebbedaedbebfeeeaaeccaddaeebfadedbedcdaecbfabaaeaddacffeabcafcebeedaefeccddfbeadaffcefddcdaeebabbdaefeabcdfdbaddabfbdeeceaeebdddefaaaddaeafbacfacdcffcaafcbbbcfebaddbbfdceceeaacfecbfefabfcecfddfaaabdfefbeaefcfccfdabdedeebfcfdfaaadfacaebebeccfadcdbceafacdcececadecceeeaffddadadeccebbddbbdaaccdfabcaadadacfefdadccbeacfaabdbaebbcceceefffabecdcaabccaffceacdcfacfbfacdefcbefddebfbbfccecaababddcfdebcffefeadecaecadbffefaacadbdbbaaddedfeddaafdbedaecdecccbfcebfafbfddadeadecbffbdedeecbeabddedaecbebecbbdcceacdebdeabcefabefbcabeeedadddeedbdfbdcbddcdaaafbedeaafcaeeecfdcecaede 您好, 这里需要密码.
serv00未读
ArgoX小白版教程








.4ckocdw8i3.jpg)

.6m3ovvgyxl.jpg)
.86tfvce6cy.jpg)

.3k7sunfmnw.jpg)
.4xubyoqopu.jpg)
.5j3zkzl4xf.jpg)

