asp.net 4.5在医院自助系统中使用DeepSeek帮助医生分析患者报告
环境:
- asp.net 4.5
- Visual Studio 2015
- 本地已经部署deepseek-r1:1.5b
涉及技术
- ASP.NET MVC框架用于构建Web应用程序。
- 使用HttpWebRequest和HttpWebResponse进行HTTP请求和响应处理。
- JSON序列化和反序列化用于构造和解析数据。
- SSE(服务器发送事件)用于向客户端推送实时更新。
完成显示效果如下 (患者信息是AI生成的,非真实信息)
1、在前端界面(cshtml)使用SSE技术向后端传送患者报告的路径。
<!-- 根据系统环境获取PDF文件路径 -->
@{string pdffilepath = datas.ReportFile;}
<div class="deepseek-title"> <!-- DeepSeek输入框 --><h4 class="title3">DeepSeek分析</h4>
</div>
<div class="deepseek-textarea"><textarea class="text-box" id="outputTextarea" readonly></textarea> <!-- 第二行文本框 --><button class="text-button" id="reparseButton">重新解析报告</button> <!-- 新增按钮 -->
</div>
<script>var textarea = document.getElementById('outputTextarea');var reparseButton = document.getElementById('reparseButton');var source;// 初始化SSE连接的函数function startEventSource() {// 如果已有连接,先关闭if (source) {source.close();}// 创建新的SSE连接source = new EventSource('@Url.Action("StreamAI", "DeepSeek", new { pdfPath = pdffilepath })');// 接收数据并更新textareasource.onmessage = function(event) {if (event.data.includes("换1行")) {textarea.value += event.data.replace("换1行", "\n"); // 替换为一个换行符} else if (event.data.includes("换2行")) {textarea.value += event.data.replace("换2行", "\n\n"); // 替换为两个换行符} else {textarea.value += event.data; // 无特殊标记,按原数据添加}// 自动滚动到最新内容//textarea.scrollTop = textarea.scrollHeight; // 恢复滚动功能};// 错误处理source.onerror = function() {console.log('SSE 连接错误');source.close();};}// 页面加载时初次启动SSEstartEventSource();// 按钮点击事件:清空文本框并重新解析reparseButton.addEventListener('click', function() {textarea.value = ''; // 清空文本框startEventSource(); // 重新建立SSE连接});
</script>
<style>.title3{margin: 30px 20px 0px 20px;margin-top:10px;}.text-box {margin: 10px 20px;width: 540px;height: 260px;font-size: 15px;outline:0px;border: 2px solid rgba(228,228,228,1); border-radius: 4px;line-height: 25px; /* 设置行距像素 */}.text-button{margin: 20px 20px 0px 20px;width: 140px;height: 30px;background-color: #FFC107;font-size: 18px;color: white;font-family:SourceHanSansCN-Regular;border: 0px;border-radius: 4px;outline: 0;cursor: pointer; /* 到达按钮旁边时显示手 */}
</style>
2、后端接收到传递过来的患者报告路径,进行解析,然后发送给DeepSeek分析,DeepSeek分析的内容实时使用Response.Write()推送至前端。
DeepSeekController.cs
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web.Mvc;
using Newtonsoft.Json;namespace *********
{public class DeepSeekController : Controller{public ActionResult StreamAI(string pdfPath){// 提取 PDF 文本string pdfText = DeepSeekHelper.ExtractTextFromPdf(pdfPath);if (string.IsNullOrEmpty(pdfText)){return Content("PDF文件不存在或无法读取", "text/event-stream");}// 设置 SSE 响应头Response.ContentType = "text/event-stream";Response.Headers.Add("Cache-Control", "no-cache");Response.Headers.Add("Connection", "keep-alive");// 构造 AI 请求数据var requestData = new{model = "deepseek-r1:1.5b",prompt = $"请以专业医生的身份,对以下患者报告进行详细分析,并提供医学建议:{pdfText}请按照以下结构输出:影像/检查结果分析:详细解读报告中的影像表现或检查结果,结合医学知识说明异常情况及其可能的临床意义。诊断建议:根据分析结果,提出初步诊断方向(如疾病名称或疑似病因)。请确保内容准确、专业,并符合临床实践规范",stream = true};string jsonContent = JsonConvert.SerializeObject(requestData);byte[] byteArray = Encoding.UTF8.GetBytes(jsonContent);HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:11434/api/generate");request.Method = "POST";request.ContentType = "application/json";request.ContentLength = byteArray.Length;try{using (Stream dataStream = request.GetRequestStream()){dataStream.Write(byteArray, 0, byteArray.Length);}//string linestrs = "";try{using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())using (Stream responseStream = response.GetResponseStream())using (StreamReader reader = new StreamReader(responseStream)){string line;while ((line = reader.ReadLine()) != null){if (!string.IsNullOrEmpty(line)){dynamic result = JsonConvert.DeserializeObject(line);if (result != null && result.response != null){string responseText = result.response.ToString();string processedText = DeepSeekHelper.RegexLine(responseText);if (processedText.Contains("\n\n")){processedText = processedText.Replace("\n\n", "换2行");}else if (processedText.Contains("\n")){processedText = processedText.Replace("\n\n", "换1行");}//linestrs += processedText;//推送数据到客户端Response.Write($"data: {processedText}\n\n");Response.Flush();}}}}}catch (WebException ex){Response.Write($"data: 错误:{ex.Message}\n\n");Response.Flush();}}catch{try{// 返回自定义错误信息Response.Write($"data: 错误:请配置本地DeepSeek,或者启动相关服务。\n\n");Response.Flush();}catch{}}return new EmptyResult();}}
}
DeepSeekHelper.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using System.Text;
using System.Net;
using System.Text.RegularExpressions;
using System.Threading;
using Newtonsoft.Json;namespace *******
{public static class DeepSeekHelper{/// <summary>/// 读取PDF文件获取PDF中的文字/// </summary>/// <param name="pdfPath"></param>/// <returns></returns>public static string ExtractTextFromPdf(string pdfPath){string pdfPath2 = pdfPath.Replace("_1.png", ".pdf");if (!File.Exists(pdfPath2)){Console.WriteLine("PDF文件不存在!");return "";}PdfReader reader = new PdfReader(pdfPath2); // 直接创建PdfReader对象string strs = "";for (int page = 1; page <= reader.NumberOfPages; page++){ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();string currentText = PdfTextExtractor.GetTextFromPage(reader, page, strategy);strs += currentText;}reader.Close(); // 手动关闭PdfReader对象return strs;}/// <summary>/// 处理DeepSeek返回的字符串/// </summary>/// <param name="responseText"></param>/// <returns></returns>public static string RegexLine(string responseText){// 使用正则表达式去掉 <think> 和 </think> 标签responseText = Regex.Replace(responseText, @"<\/?think>", "\n");// 去掉开头的换行符responseText = responseText.TrimStart('\r', '\n');return responseText;}}
}
总结
- 前端技术:HTML、JavaScript(使用EventSource实现SSE)。
- 后端技术:C# ASP.NET MVC、HTTP请求/响应处理、JSON处理。
- 通信技术:SSE用于服务器向客户端推送实时数据。
- 功能:实现了一个可以解析PDF文件内容,通过AI服务进行医学报告分析,并将结果实时推送给前端显示的应用程序。
相关文章:
asp.net 4.5在医院自助系统中使用DeepSeek帮助医生分析患者报告
环境: asp.net 4.5Visual Studio 2015本地已经部署deepseek-r1:1.5b 涉及技术 ASP.NET MVC框架用于构建Web应用程序。使用HttpWebRequest和HttpWebResponse进行HTTP请求和响应处理。JSON序列化和反序列化用于构造和解析数据。SSE(服务器发送事件…...
LCCI ESG 中英联合认证国际分析师适合的岗位
LCCI ESG中英联合认证国际分析师领域热门岗位大揭秘!🌍 大家好!今天我们来探讨LCCI ESG中英联合认证国际分析师领域的热门岗位,看看是否有适合你的选择。 1️⃣ LCCI ESG中英联合认证国际分析师报告专员:主要负责编制…...
AGI成立的条件
AGI(通用人工智能)的成立需满足多项核心条件,这些条件既涵盖技术能力层面的突破,也涉及伦理与认知维度的考量。 一、通用性与多任务处理能力 跨领域泛化能力 AGI需具备类似人类的通用性,能够灵活切换不同领域…...
论文阅读:2023 EMNLP SeqXGPT: Sentence-level AI-generated text detection
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 SeqXGPT: Sentence-level AI-generated text detection https://aclanthology.org/2023.emnlp-main.73/ https://github.com/Jihuai-wpy/SeqXGPT https://www.doubao.com/…...
解决python配置文件类configparser.ConfigParser,插入、读取数据,自动转为小写的问题
配置类 [Section1] Key_AAA Value[Section2] AnotherKey Value默认情况下,ConfigParser会将ini配置文件中的KEY,转为小写。 重载后配置类: 继承类从configparser.ConfigParser改为configparser.RawConfigParser重载方法optionxform&#…...
超图神经网络的详细解析与python示例
扩展传统集合关系至超边结构,处理高阶交互问题。 有关人工智能的数学基础之逻辑、集合论和模糊理论:看我文章人工智能的数学基础之逻辑、集合论和模糊理论-CSDN博客 一、超图神经网络概述 超图神经网络(Hypergraph Neural Network࿰…...
机器视觉中图像的腐蚀和膨胀是什么意思?它能用来做什么?
腐蚀(Erosion)和膨胀(Dilation)是两种基本的形态学操作,通常用于二值图像(黑白图像)的处理。它们是形态学图像处理的基础,广泛应用于图像分割、边缘检测、噪声去除等任务。 1…...
破局 MySQL 死锁:深入理解锁机制与高效解决方案
死锁的原理 1. 什么是死锁? 当 多个事务 在并发执行时,每个事务都 持有其他事务需要的锁,同时又在 等待对方释放锁,导致所有事务都无法继续执行的状态,称为 死锁(Deadlock)。 2. 死锁的四个必要…...
机器学习——分类、回归、聚类、LASSO回归、Ridge回归(自用)
纠正自己的误区:机器学习是一个大范围,并不是一个小的方向,比如:线性回归预测、卷积神经网络和强化学都是机器学习算法在不同场景的应用。 机器学习最为关键的是要有数据,也就是数据集 名词解释:数据集中的…...
脚本语言 Lua
概念 Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译、运行。Lua脚本可以很容易地被C/C 代码调用,也可以反过来调用C/C的函数,这使得Lua在应用程序中可以被广泛应用。Lua并没有提供强大的库,它是不适合作为开发独立应…...
Spring相关面试题
目录 Spring中常用的注解有哪些 Spring Boot中RestController和Controller注解有什么区别? Spring的注解requestBody和responseBody的区别 说说Bean和componentscan的区别 简单介绍一下springboot Spring Boot有哪些常用的Starter依赖? 说说sprin…...
Python学习- 数据结构类型
一. list list_data [10, 20, 30]列表:是一个不限制类型,可增加,修改,删除的数据类型 可操作的方法:append,extend, pop,del ,insert append: 可向list最后一个位置添加一个元…...
Azure Delta Lake、Databricks和Event Hubs实现实时欺诈检测
设计Azure云架构方案实现Azure Delta Lake和Azure Databricks,结合 Azure Event Hubs/Kafka 摄入实时数据,通过 Delta Lake 实现 Exactly-Once 语义,实时欺诈检测(流数据写入 Delta Lake,批处理模型实时更新࿰…...
【从零开始学习计算机科学】软件测试(十)嵌入式系统测试、游戏开发与测试过程、移动应用软件测试 与 云应用软件测试
【从零开始学习计算机科学】软件测试(十)嵌入式系统测试、游戏开发与测试过程、移动应用软件测试 与 云应用软件测试 嵌入式系统测试测试策略及测试流程嵌入式软件测试问题及测试方法嵌入式软件的测试流程游戏开发与测试过程游戏开发与通用软件的开发过程区别游戏测试主要内容…...
C#零基础入门篇(18. 文件操作指南)
## 一、文件操作基础 在C#中,文件操作主要通过System.IO命名空间中的类来实现,例如File、FileStream、FileInfo等。 ## 二、常用文件操作方法 ### (一)文件读取 1. **使用File.ReadAllText方法读取文件内容为字符串** …...
深入探究 JVM 堆的垃圾回收机制(一)— 判活
垃圾回收分为两步:1)判定对象是否存活。2)将“消亡”的对象进行内存回收。 1 判定对象存活 可达性分析算法:通过一系列“GC Roots”对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,…...
SQL优化主要有哪些方式
对经常查询的区分度高的条件字段建立索引,也就是用在where条件里的字段。使用没有建立索引的非主键字段作为条件查询时,会进行全表扫描,因为这个字段的数据分步是不规律的,但是需要避免在频繁更新的字段上建立索引,因为…...
基于Spring Boot的公司资产网站的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
笔记本电脑关不了机是怎么回事 这有解决方法
在快节奏的现代生活中,笔记本电脑已成为我们工作、学习和娱乐的得力助手。在使用电脑的过程中,笔记本电脑突然关不了机了,怎么回事?下面驱动人生就来讲一讲笔记本电脑不能正常关机的解决方法,有需要的可以来看看。 一、…...
OSPF 协议详解:从概念原理到配置实践的全网互通实现
什么是OSPF OSPF(开放最短路径优先)是由IETF开发的基于链路状态的自治系统内部路由协议,用来代替存在一些问题的RIP协议。与距离矢量协议不同,链路状态路由协议关心网络中链路活接口的状态(包括UP、DOWN、IP地址、掩码…...
【C++】多态
目录 文章目录 前言 一、多态的概念 二、多态的定义及实现 三、重载/重写/隐藏的对比 四、纯虚函数和抽象类 五、多态的原理 总结 前言 本文主要讲述C中的多态,涉及的概念有虚函数、协变、纯虚函数、抽象类、虚表指针和虚函数表等。 一、多态的概念 多态分…...
CentOS 8 停止维护后通过 rpm 包手动安装 docker
根据 Docker官方文档 的指引,进入 Docker rpm 包下载的地址,根据自己系统的架构和具体版本选择对应的路径 这里使用 Index of linux/centos/7/x86_64/stable/ 版本,根据 docker 官方的给出的安装命令选择性的下载对应的 rpm 包 最终使用 yum …...
STT-MRAM CIM 赋能边缘 AI:高性能噪声鲁棒贝叶斯神经网络宏架构详解
引言 近年来,基于卷积神经网络(CNN)和视觉转换器(ViT)的存算一体(CIM)边缘AI设备因其低延迟、高能效、低成本等性能受到越来越广泛的关注。然而,当环境中存在噪声时(例如…...
Performance Hub Active Report
Performance Hub 是 Oracle Enterprise Manager Database Express (EM Express) 中的一项功能,可提供给定时间范围内所有性能数据的新整合视图。用户可以使用 Database Express 页面顶部的时间选择器选择时间范围,详细信息选项卡将…...
小白闯AI:Llama模型Lora中文微调实战
文章目录 0、缘起一、如何对大模型进行微调二、模型微调实战0、准备环境1、准备数据2、模型微调第一步、获取基础的预训练模型第二步:预处理数据集第三步:进行模型微调第四步:将微调后的模型保存到本地4、模型验证5、Ollama集成部署6、结果测试三、使用总结AI是什么?他应该…...
【数学建模】TOPSIS法简介及应用
文章目录 TOPSIS法的基本原理TOPSIS法的基本步骤TOPSIS法的应用总结 在 多目标决策分析中,我们常常需要在多个选择中找到一个最优解。 TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)法是一个广泛应用的决策方法…...
优选算法训练篇08--力扣15.三数之和(难度中等)
目录 1.题目链接:15.三数之和 2.题目描述: 3.解法(排序双指针) 1.题目链接:15.三数之和 2.题目描述: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &…...
【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!
在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【WSL 】--- Windows11 迁移 WSL 超详细指南 —— 给室友换一个宿舍! 开发环境一、引…...
RAG 架构地基工程-Retrieval 模块的系统设计分享
目录 一、知识注入的关键前奏——RAG 系统中的检索综述 (一)模块定位:连接语言模型与知识世界的桥梁 (二)核心任务:四大关键问题的协调解法 (三)系统特征:性能、精度…...
解决stm32引脚如果选择输入模式
1. 输入模式分类 STM32的GPIO输入模式主要分为以下四种: 浮空输入(Floating Input / Input Floating) 上拉输入(Input Pull-Up) 下拉输入(Input Pull-Down) 模拟输入(Analog Inp…...
Java 填充 PDF 模版
制作 PDF 模版 安装 OnlyOffice 从 OnlyOffice 官网下载 OnlyOffice Desktop,安装过程很简单,一路下一步即可。用 OnlyOffice 制作 PDF 模版(表单) 使用 OnlyOffice 表单设计器,制作表单,如下图 注意命名…...
Maven安装与环境配置
首先我们先介绍一些关于Maven的知识,如果着急直接看下面的安装教程。 目录 Maven介绍 Maven模型 Maven仓库 Maven安装 下载 安装步骤 Maven介绍 Apache Maven是一个项目管理和构建工具,它基于项目对象模型(Project Object Model , 简称: POM)的概念…...
鸿蒙HarmonyOS NEXT应用崩溃分析及修复
鸿蒙HarmonyOS NEXT应用崩溃分析及修复 如何保证应用的健壮性,其中一个指标就是看崩溃率,如何降低崩溃率,就需要知道存在哪些崩溃,然后对症下药,解决崩溃。那么鸿蒙应用中存在哪些崩溃类型呢?又改如何解决…...
基于PySide6的CATIA自动化工具开发实战——空几何体批量清理系统
一、功能概述 本工具通过PySide6构建用户界面,结合PyCATIA库实现CATIA V5的自动化操作,提供两大核心功能: 空几何体清理:智能识别并删除零件文档中的无内容几何体(Bodies)空几何图形集清理࿱…...
【CSS文字渐变动画】
CSS文字渐变动画 HTML代码CSS代码效果图 HTML代码 <div class"title"><h1>今天是春分</h1><p>正是春天到来的日子,花都开了,小鸟也飞回来了,大山也绿了起来,空气也有点嫩嫩的气息了</p>…...
Mysql深分页的解决方案
在数据量非常大的情况下,深分页查询则变得很常见,深分页会导致MySQL需要扫描大量前面的数据,从而效率低下。例如,使用LIMIT 100000, 10时,MySQL需要扫描前100000条数据才能找到第10000页的数据。 在MySQL中解决深分页…...
使用pycel将Excel移植到Python
1.适用需求 有些工作可能长期适用excel来进行公式计算,当需要把工作流程转换为可视化界面时,开发人员不懂专业逻辑,手动摸索公式很大可能出错,而且费时费力 2.可用工具及缺点 pandas 方便进行数据处理,支持各种格…...
Apache Tomcat CVE-2025-24813 安全漏洞
Apache Tomcat CVE-2025-24813被广泛利用,但是他必须要满足两个点: 1.被广泛的使用,并且部署在服务器中。 2.漏洞必须依赖在服务器中的配置。 并且漏洞补丁已经发布。 漏洞攻击方式: CVE-2025-24813 是 Apache Tomcat 部分 PUT…...
Spring常用注解汇总
1. IOC容器与Bean管理 注解说明示例Component通用注解,标记类为Spring Bean Component public class MyService { ... } Controller标记Web控制器(应用在MVC的控制层) Controller public class UserController { ... } Service标记业务逻辑层…...
【CXX-Qt】2.1.1 为 WebAssembly 构建
CXX-Qt 及其编写的应用程序可以编译为 WebAssembly,但存在一些限制。以下是关于如何为 WASM 目标构建的详细说明。 你需要安装 Qt for WebAssembly。下一篇将展示已测试的版本。 此外,如果尚未完成,请从此处克隆 emsdk git 仓库。 使用正确…...
MySql创建分区表并且按月分区
前言 在mysql中,按月份分区,再使用分区字段时间来查询数据将会很快,因为这样只需要扫描指定的分区。因此,在处理大量数据时,使用分区表是一个非常好的选择。 1、创建表,并使用RANGE COLUMNS分区 按创建时间…...
YOLO-UniOW: 高效通用开放世界目标检测模型【附论文与源码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
Flink实战教程从入门到精通(基础篇)(一)Flink简介
目录 一、Flink 二、谁在用Flink? 三、Flink特点 1、批流统一 2、性能卓越 3、规模计算 4、生态兼容性 5、高容错性 四、Flink介绍 1、无界数据 2、有界数据流 3、有状态流处理 五、Flink的发展历史 六、Flink的核心特点 1、高吞吐和低延迟 2、结果的准确性 …...
C/C++编程:Openssl使用 Windows安装包32和64位 RSA加密/解密、AES-GCM加密/解密以及ECDSA签名/验证示例
Openssl的头文件和库 C/C使用openssl,需要openssl的头文件和库,这些都在安装包里。从http://slproweb.com/products/Win32OpenSSL.html下载已经编译好的包含 lib 和 include 文件的安装包。 也可以从官网下载源码,再编译成安装包࿰…...
Es6新特性
1. let 和 const 概念 let:用于声明 块级作用域 的变量。const:用于声明 块级作用域 的常量,声明后不可重新赋值(但可以修改对象的属性或数组的内容)。 原理 JavaScript 在 ES5 中只有全局作用域和函数作用域&…...
大数据学习(80)-数仓分层
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
StarRocks 升级注意事项
前段时间升级了生产环境的 StarRocks,从 3.3.3 升级到了 3.3.9,期间还是踩了不少坑所以在这里记录下。 因为我们的集群使用的是存算分离的版本,也是使用官方提供的 operator 部署在 kubernetes 里的,所以没法按照官方的流程进入虚…...
Java 大视界 -- Java 大数据分布式计算中的通信优化与网络拓扑设计(145)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
LabVIEW软件长时间运行导致蓝屏问题排查与优化
计算机在长时间运行LabVIEW或其他软件后出现蓝屏(BSOD),通常由硬件资源耗尽、驱动冲突或软件内存泄漏引发。本文提供从日志分析到根本性优化的全流程解决方案,确保系统稳定运行。 一、蓝屏记录查询方法 1. 查看Windows事件日志 操…...
【机密计算顶会解读】11:ACAI——使用 Arm 机密计算架构保护加速器执行
导读:本文介绍ACAI,其构建一个基于CCA的解决方案,使得机密虚拟机能够安全地使用加速器,同时保持与现有应用程序的兼容性和安全性,能够实现对加速器的安全访问。 原文链接:ACAI: Protecting Accelerator Ex…...