常见的Node.js面试题有哪些?答案和解析指南

2021年11月28日21:53:58 发表评论 1,050 次浏览
常见的Node.js面试题有哪些?答案和解析指南
Node.js面试题和答案合集
Node.js 最初由 Ryan Dahl 开发,并于 2009 年 5 月首次发布。它是一个用于在浏览器外执行 JavaScript 代码的 JS 环境。基于 Chrome 的 V8 引擎,它代表了 JavaScript 无处不在的编程范式,将 Web 应用程序开发统一为单一语言,而不是服务器和客户端脚本的不同语言。 LinkedIn、IBM、GoDaddy、Groupon、Netflix 和 Paypal 等许多公司都使用 Node.js。它的日益普及引发了对 Node.js 开发人员的需求。

常见的Node.js面试题有哪些?

如果你想在 Node.js 中谋生,下面是最热门的 Node js 面试问题和答案,它们将使你做好面试准备。

问题:解释 Node.js 的基础知识。

Node.js面试题解析从本质上讲,Node.js 是使用 Chrome 的 V8 JavaScript 引擎作为平台构建的 JS 运行时。Node.js 因其轻量级和高效而广受欢迎,这主要是由于其事件驱动和非阻塞 I/O 模型。Node.js 以性能为主要关注点,负责将 JavaScript 代码处理成本地机器代码,然后你的计算机可以使用它来执行这些过程。尽管它基于谷歌 Chrome 和其他基于铬的浏览器(Vivaldi、Brave 和 Opera)中使用的 V8 引擎,但它并不在浏览器本身中运行。在开发过程中,引擎中添加了文件系统 API、HTTP 库和 OS 实用程序方法等各种功能,以便 Node.js 可以作为程序在计算机上执行。

问题:在 Node.js 中如何处理“子线程”?

答:从本质上讲,Node.js 是一个单线程进程。此外,它不会向开发人员公开任何子线程和线程管理模式。但是,子线程可能会在 Node.js 中的各种进程中生成,其中之一是异步 I/O。尽管通过这些进程产生的子线程在后台运行,但它们不会阻塞主代码或执行任何应用程序代码。但是,如果你需要在由 Node.js 提供支持的应用程序中支持线程,则可以使用多种工具。

问题:请说明 Angular JS 和 Node.js 之间的一些差异。

答:Node.js面试题和答案合集 - 以下是 Angular JS 和 Node.js 之间的一些区别
Angular JS Node.js
Angular JS 是用 TypeScript 编写的 Node.js 是用多种语言编写的,例如 C、C++ 和 JavaScript
在创建高度交互的网页时是理想的 它适用于小型项目和应用
它是一个用于Web 应用程序开发的开源框架 它是一个基于多平台的运行时环境
用于为客户端创建单页应用程序 用于创建服务器端网络应用程序
帮助将应用程序拆分为模型-视图-控制器 (MVC) 组件 帮助生成数据库查询
适合开发实时应用 它适用于需要更快和高度可扩展的东西的情况
Angular 本身就是一个 Web 应用程序框架 Node.js 有很多框架,包括 Express.js、Partial.js 等等

问题:陈述 Node.js 的主要用途。

回答:
  • 复杂的单页应用程序: Node.js 非常适合创建性质复杂的单页应用程序,例如在线绘图工具、邮件解决方案和社交网络。这些类型的应用程序仅限于一页,用户体验类似于桌面应用程序的用户体验。由于 Node.js 的异步数据流发生在后端,因此可以在这里使用它。
  • 实时应用程序 (RTA):我们在日常生活中使用大量实时应用程序。例如,Google Docs、Slack、Skype、WhatsApp 等等。Node.js 的事件 API、WebSockets 和异步数据流可以确保服务器运行无故障,这将立即更新数据。
  • 聊天室:这可能属于 RTA,但由于即时消息和聊天已成为顶级实时应用程序模型之一,因此需要特别关注。如果你的产品在这个领域,你正在寻找诸如轻量级、高流量容量和大量数据流等要求。所有这些要求都可以使用 Node.js 和后端的一些JavaScript 框架来满足。上述网络套接字在聊天室环境中接收和发送消息时派上用场。
  • 基于浏览器的游戏:上述聊天室也可以集成到基于浏览器的游戏中,其中 Node.js 是一个完美的选择。将 Node.js 技术与 HTML5 甚至 JS 工具相结合,将帮助你创建基于浏览器的实时游戏。
  • 数据流应用程序:另一种 Node.js 完美的应用程序是数据流应用程序。这些应用程序的主要卖点是它们可以在卸载阶段处理数据。通过这种方式,虽然可以预先下载某些部分以保持连接,并且可以在必要时下载其他部分。在这种情况下,Node.js 流应用程序处理音频和视频数据。
  • 具象状态传输 (REST) 应用程序编程接口 (API):由于超文本传输​​协议 (HTTP) 的广泛使用,基于 REST 的 API 在构建现代商业软件架构中占有关键地位。Node.js 生态系统的 Express.js 框架可以帮助构建快速、轻便的 REST API。
  • 服务器端 Web 应用程序:虽然 Node.js 及其框架可以帮助创建服务器端 Web 应用程序,但应该注意的是,不应期望 CPU 密集型操作。
  • 命令行工具: Node.js 庞大的生态系统是构建命令行工具的一个优势,网上有各种教程可以帮助你构建自己的 CLT。

问题:什么是事件驱动编程?

答:事件驱动编程方法深刻地使用事件来触发各种功能。在这种情况下,事件可以是任何事件,例如按下键或单击鼠标按钮。每当发生事件时,都会按照“发布-订阅”模式执行已向元素注册的回调函数。由于这种编程方法,Node.js 比其他类似技术更快。

问题:在 Node.js 的上下文中,什么是 REPL?

答:在 Node.js 的上下文中,REPL 是读取、评估、打印和循环。REPL 是一种计算机环境(类似于 Windows 控制台或 Linux shell),其中输入的任何命令都会得到系统响应的输出。默认情况下,REPL 环境与 Node.js 捆绑在一起,它执行以下任务:
  • 读取:读取用户的输入并将其转换为 JavaScript 数据结构,最后将其存储在内存中
  • Eval:它接收数据结构并对其进行评估
  • 打印:它打印最终输出
  • 循环:它循环提供的命令,直到按 CTRL + C 两次

问题:Node.js 中的测试金字塔是什么?

答:在 Node.js 中,测试金字塔是一个图表,它解释了项目的富有成效的开发所需的单元测试、集成测试和端到端测试的比例。测试金字塔的组成部分如下:
  • 单元测试:他们单独测试代码的各个单元。它们很快,你可能会执行很多这些测试
  • 集成测试:他们测试不同单元之间的集成。
  • 端到端 (E2E) 测试:他们测试整个系统,从用户界面到数据存储,然后返回。

问题:什么是 libuv?

Node.js面试题解析 Libuv是Node.js的一个支持库,用于异步输入/输出。虽然它最初是为 Node.js 开发的,但现在它见证了其他系统的实践,如 Luvit、Julia、Pyuv 等。Libuv 的一些特点是:
  • 文件系统事件
  • 子进程
  • 支持全功能事件循环
  • 异步 TCP 和 UDP 套接字

问题:Node.js 是 CPU 密集型应用程序的最佳平台吗?

答:尽管 Node.js 可以帮助创建服务器端应用程序,但 CPU 激励应用程序并不是 Node.js 的强项。占用大量 CPU 的操作为阻塞传入请求铺平了道路,并将线程推入危急情况。

问题:Express JS 包的目的是什么?

答: 常见的Node.js面试题有哪些 - ExpressJS 建立在 Node.js 之上,是一个 JS 框架,用于管理服务器端应用程序中路由和服务器之间的信息流。轻量级、灵活且具有多种相关功能,适用于移动和 Web 应用程序开发。 问题:Node.js 与 Javascript 之间的主要区别是什么? 回答: 
Node.js JavaScript
跨平台开源 JS 运行时引擎。  一种基于 OOPS 概念的高级脚本语言。
代码可以在浏览器之外运行。  代码只能在浏览器中运行。
在服务器端使用。 在客户端使用。
没有添加 HTML 标签的能力。 可以添加 HTML 标签。 
只能在 Google Chrome 的 V8 引擎上运行。 可以在任何浏览器上运行。
用 C++ 和 JavaScript 编写。 用 C++ 编写的 ECMA 脚本的升级版本。

问题:Node.js 的主要优点是什么?

答: Node.js 的一些主要优点是:
  • 易于学习和巨大的社区支持。
  • 易于扩展和高性能。
  • 具有扩展支持的高度可扩展性。
  • 全栈 JavaScript。
  • 缓存机制使网页加载速度更快。
  • 非阻塞 I/O 系统。

问题:解释异步和非阻塞的区别?

答:异步或非同步是指对于发送的消息,我们不会立即收到响应;因此,没有依赖性或执行顺序。服务器存储信息,并在执行操作时收到确认。这提高了性能和效率。 非阻塞操作,顾名思义,不会停止或阻塞任何操作。不同之处在于非阻塞操作会立即收到带有任何可用数据的响应。如果数据不可用,则返回错误。它主要与 I/O 一起使用。

问题:解释package.json?

答: npm 包在项目根文件夹中包含一个文件 package.json,其中包含与项目相关的元数据。它向 npm 提供信息,npm 通过这些信息识别项目及其依赖项。除此之外,它还包含其他元数据,如项目描述、版本、许可证信息和配置数据。 

问题:描述 Node.js 中的错误优先回调?

答:Node.js面试题和答案合集 - 错误优先回调,也称为 errorback 给出错误和数据。它需要一些参数,第一个是错误对象,其他是数据。错误优先回调模式有很多优点:因为它是一致的,导致更多的采用,如果没有引用数据,就不需要处理它。如果没有错误,回调函数会以 null 作为第一个参数被调用。

问题:解释module.exports的用途。

答:目的是告诉 Node.js 应该从给定文件中导出代码的哪一部分,如对象、函数、字符串等,以便其他文件可以访问它。假设我们有一个如下所示的模块:
{
    id: '.',
    exports: {},
    parent: null,
    filename: '/modtest.js',
    loaded: false,
    children: [],
    paths:
    [
        '/node_modules',
        '/Users/node_modules',
        '/Users/mycomp/projects/node_modules',
        '/node_modules'
    ]
}
请注意,exports 属性为空,现在如果我们将代码应用于此属性,它将成为模块的导出。如果我们需要另一个文件中的模块,那将是导出属性值:
module.exports.stringProperty = "Hello, welcome";
console.log(module);
{
    id: '.',
    exports: { stringProperty: 'Hello, welcome' }
    ...
}

问题:Node.js 中的 Reactor 模式是什么?

答:是 Node.js 中非阻塞 I/O 操作的概念。通过这种模式,我们获得了每个 I/O 操作的处理程序(或回调函数)。每个 I/O 请求都被提交给一个多路分解器,该多路分解器处理并发性并对请求/事件进行排队。Reactor 模式由资源、事件通知器/解复用器、事件循环、事件队列、请求处理程序组成。

问题:解释 Node.js 的 LTS 版本

答: LTS 或长期支持适用于 Node.js 项目长期支持和维护的发布行。LTS 有两种类型: 
  1. Active,即主动维护和升级,以及 
  2. 接近生产线末端并维持一小段时间的维护生产线。

问题:什么是 URL 模块?

答: URL 模块提供了用于处理 URL 的 API:
  • 特定于 Node.js 的遗留 API。
  • 实现 Web 浏览器使用的 WHATWG URL 标准的较新 API。
一些示例方法是 URL 类下的 URL.port、URL.password、URL.host、url.toString()。有关完整文档,请查看官方URL 模块页面

问题:解释控制流函数的工作机制?

答:控制流函数是执行语句或函数的顺序。由于 Node.js 中的 I/O 操作是非阻塞的,因此控制流不能是线性的。因此,它会向事件循环注册一个回调,并将控制权传递回节点,以便下一行代码可以不间断地运行。例如:
[code language="javascript"]
fs.readFile('/root/text.txt', func(err, data){
  console.log(data);
});
console.log("This is displayed first");
[/code]
在这里,readFile 操作需要一些时间;但是,下一个console.log 不会被阻止。操作完成后,将显示数据。

问题:Node.js 中的 spawn() 和 fork() 方法的主要区别是什么?

回答: 
Spawn Fork
旨在运行系统命令。 spawn() 的一个特殊实例,它运行一个新的 V8 实例。
在节点进程内不执行任何其他代码。  可以创建在同一个 Node 代码库上运行的多个工作程序。
child_process.spawn(command[, args][, options]) 使用给定的命令创建一个新进程。  使用 spawn() 创建子进程的特殊情况。child_process.fork(modulePath[, args][, options])
在父进程和子进程之间创建流接口(二进制格式的数据缓冲)。 在父进程和子进程之间创建通信(消息)通道。
对于数据流(读/写)等连续操作更有用,例如,将图像/文件从 spawn 进程流式传输到父进程。 对于消息传递更有用,例如 JSON 或 XML 数据消息传递。

问:Node.js 中 ExpressJS 包的用途是什么?

答: ExpressJS 包或框架建立在 Node.js 之上,以快速跟踪基于单页、多页和混合服务器的应用程序的开发。Express 据说是 MEAN 堆栈的后端部分。 问题:突出 process.nextTick() 和 setImmediate() 之间的差异。 回答: 
let execseq = function() {  
 setImmediate(() => console.log("immediate"));  
 process.nextTick(() => console.log("nextTick"));  
 console.log("event loop");
}
这将执行“事件循环”,然后是“nextTick”,然后是“立即”。

问题:解释一下 Node.js 和 Ajax 的区别?

答: Ajax 是一种客户端技术,用于在不刷新页面内容的情况下更新页面内容。Node.js 是用于开发服务器软件的服务器端 JavaScript。此外,Node.js 是一个成熟的开发环境,而 Ajax 仅用于获取数据或运行脚本。

问题:请说明必须将 Express 的“应用程序”和“服务器”分开的原因。

答:如果我们将应用程序和服务器功能分开,可以将代码分成多个模块,从而减少模块之间的依赖关系。每个模块将执行单个任务。另外,由于逻辑分离,我们可以避免重复代码。

问题:解释 setImmediate() 与 setTimeout() 之间的区别。

答:虽然立即这个词有点误导,但回调只发生在 I/O 事件回调之后,当我们调用 setImmediate() 时。setTimeout() 用于设置执行一次性回调的延迟(以毫秒为单位)。如果我们执行, 
setImmediate(function() {
  console.log('setImmediate')
})
setTimeout(function() {
  console.log('setTimeout')
}, 0)
我们将获得输出为“setTimeOut”,然后是“setImmediate”。 Node.js面试题解析: Node.js 的核心模块是:
http 包括用于创建 Node.js http 服务器的类、方法和事件。
URL 包含用于 URL 解析和解析的方法。
querystring 处理查询字符串。
path 包含处理文件路径的方法。
FS 由处理文件 I/O 的类、方法和事件组成。
util util 模块包含对开发人员有用的实用函数。

问题:在 Node.js 中添加 Streams 的示例?

答:从流中读取的示例:
var readStream = fs.createReadStream('data.txt');
readStream.on('data', function(chunk) {
   data += chunk;
});
写入流的示例:
var writeStream = fs.createWriteStream('dataout.txt');
writeStream.write(data,'UTF8');
writeStream.end();

问题:Node.js 中的加密是什么?它是如何使用的?

答: Node.js面试题和答案合集 - Node.js 中的crypto 模块用于密码学,即包括一组用于open SSL 的hash、HMAC、sign、decipher、cipher 和verify 函数的包装器。 以下是使用密码进行加密的示例:
const crypto = require('crypto');  
const cipher = crypto.createCipher('usrnm', 'pwdd');  
var encryptd = cipher.update('Welcome to hackr', 'utf8', 'hex');  
encryptd += cipher.final('hex');  
console.log(encryptd);
让我们使用 decipher 解密上面的内容,看看我们是否得到相同的文本:
const crypto = require('crypto');  
const decipher = crypto.createDecipher('usrnm', 'pwdd');  
var encryptd = '<enter the previous output-encrypted code here>';  
var decryptd = decipher.update(encryptd, 'hex', 'utf8');  
decryptd += decipher.final('utf8');  
console.log(decryptd);  

问题:解释一下Node.js中DNS模块的使用?

答: 常见的Node.js面试题有哪些 - DNS 模块用于解析名称。它由操作系统提供,也用于实际的 DNS 查找。使用此模块,DNS 服务器将域/子域转换为 IP 地址,因此不需要记住 IP 地址。

问题:解释Node.js的安全机制?

答:一些机制是:
  • 授权码:我们可以使用授权码来保护 Node.js。这样,任何想要访问 Node.js 的第三方都会通过资源提供者网络的 GET 请求。 
  • 认证模块:认证模块就像过滤器,它扫描 Node.js 的库以识别是否存在任何第三方代码。可以使用认证检测任何黑客行为。 
  • Curated Screening register:这是一个质量控制系统,所有包(代码和软件)都经过检查以确保其安全。此扫描有助于消除未经验证或不可靠的库进入你的应用程序。
  • 定期更新:下载最新版本的 Node.js 将防止潜在的黑客和攻击。 

问题:解释 Node.js 中各种类型的 API 函数。

答: Node.js 中的两种 API 函数是:
  • 异步/非阻塞:这些请求不等待服务器响应。它们继续处理下一个请求,一旦收到响应,它们就会收到相同的响应。
  • 同步/阻塞:这些是阻塞任何其他请求的请求。请求完成后,才会处理下一个请求。

问题:Node.js 的 LTS 版本是什么?

答: Node.js 的长期支持或 LTS 版本/发行版是接收所有关键修复、性能提升和安全更新的发行版。这些版本获得至少 1.5 年的支持,并专注于应用程序的安全性和稳定性。

问题:解释 Node.js 中 assert 的工作原理

答: Assert 用于在 Node.js 中编写测试。仅当正在运行的任何测试用例失败时才提供反馈。为了测试不变量,该模块为你提供了一组断言测试。它在 Node.js 内部使用,但如果你使用 require ('assert') 代码,你也可以在其他应用程序中使用它。

问题:什么是回调地狱?

答:在 Node.js 中,回调地狱也被称为末日金字塔。由密集嵌套、不可读和不可管理的回调引起,使代码更难阅读和调试。这是由于异步逻辑执行不当造成的。

问题:Node.js 中的存根是什么?

答:存根是用于刺激组件行为的程序或函数。存根在测试用例期间提供函数的答案。

问题:什么是事件循环?

答:所有异步回调都由 Node.js 中的事件循环处理。它是 Node.js 中非阻塞输入/输出的基础,使其成为环境中最重要的特性之一。由于 Node.js 是事件驱动的,因此可以将侦听器附加到事件上,以便在事件发生时由前者执行回调。Node.js 执行事件循环,然后继续执行其余代码,无需等待输出。一旦整个操作达到高潮,它就会接收输出并执行回调函数。一旦它收到响应,函数就会一一执行。

问题:Node.js 中的流是什么?它的种类有哪些?

答:在 Node.js 中,流是类似于字符串和数组的数据集合。此外,流是你可以连续读取源数据或写入目标数据的对象。这些流对于读取和处理大量信息特别有用。Node.js 中有四种类型的流,它们是:
  • 可读:用于从源读取大量数据
  • Writeable : 用于将数据写入目的地
  • 双工:用于读写
  • Transform:用于数据修改的双工流

问题:列出并解释 Node.js 的计时特性。

答: Node.js 提供了一个定时器模块,包含多个函数,用于在特定时间段后执行代码。此模块中提供的一些功能是:
  • process.nextTick:该函数调度一个回调函数,该函数需要在事件循环的下一次迭代中调用
  • setTimeout/clearTimeout:此函数在指定的时间量(以毫秒为单位)之后安排代码执行
  • setImmediate/clearImmediate:此函数在现有事件循环周期结束时执行代码
  • setInterval/clearInterval:该函数用于多次执行一段代码

问题:突出 process.nextTick() 和 setImmediate() 之间的差异。

答: process.nextTick() 和 setImmediate() 都是 Timers 模块的函数,但不同之处在于它们的执行方式。
  • process.nextTick() 函数等待动作的执行,直到事件循环中的下一次传递或事件循环结束时,然后只调用回调函数。
  • setImmediate() 函数用于在事件循环的下一个循环中执行回调方法,将其返回到事件循环以执行输入/输出操作。

问题:解释Node.js中的readFile和createReadStream。

答: readFile 和 createReadStream 都是 Node.js 提供的读取和执行文件的方式。 readFile 进程是完全缓冲的,只有当完整的文件进入缓冲区并且可以读取时才返回响应。此过程是高度内存密集型的,并且在文件很大的情况下可能会变慢。 createReadStream 过程被部分缓冲,将整个过程视为一系列事件。在这个过程中,整个文件被分割成块,这些块被处理,然后作为一个连续的响应单独发送。与 readFile 不同,createReadStream 在读取和处理大文件时很有效。

问题:Node.js 是否提供调试器?

答: Node.js 提供了内置的 TCP 协议和调试客户端。如果要调试文件,可以在要调试的 JS 文件名称前使用以下参数。
node debug [script.js | -e “script” | :]

问题:描述 Node.js 中的退出代码。

答: Node.js 中的退出代码是一组用于完成进程的特定代码,也可以包括全局对象。Node.js 中的一些退出代码是:
  • 内部 JavaScript 评估失败
  • 致命错误
  • 内部异常处理程序运行时失败
  • 没用过
  • 未捕获的致命异常

问题:为什么使用 NODE_ENV?

答:常见的Node.js面试题有哪些 - 当任何Node.js项目处于生产阶段时,Node.js提倡使用NODE_ENV变量来标记它的原则。当 NODE-ENV 设置为生产时,你的应用程序将以比平时快 2 到 3 倍的速度执行。该变量还提高了项目开发阶段的判断力。

问题:Node.js 中的事件发射器是什么?

答: Node.js 有一个 EventEmitter 类,它保存所有可以发出事件的对象。这些对象拥有一个名为 eventEmitter.on() 的函数,使用该函数可以将多个函数附加到对象发出的事件。每当 EventEmitter 类中的对象抛出事件时,都会同步调用所有附加到 vent 的函数。

问题:什么是 Punycode?

答: Punycode 可以定义为 Node.js 中的一种编码语法,它有助于将 Unicode 字符串转换为 ASCII。这是因为主机名只能理解 ASCII 代码而不是 Unicode。虽然它在最近版本的默认包中捆绑在一起,但你可以使用以下代码在以前的版本中使用它:
punycode = require('punycode') ;

问题:解释 JIT 的概念并强调它与 Node.js 的关系。

答: JIT 或即时编译器通过将字节码(由可解释的指令组成)转换为指令来将字节码(由可解释的指令组成)发送到处理器。一旦你完成了程序的编写部分,源语言语句被编译器编译成字节码,而不是类似于目标硬件平台处理器的携带数据的代码。 Node.js 采用了 JIT 编译,在很大程度上提高了代码执行速度。它获取源代码并在运行时将其转换为机器代码。通过这种方式,定期调用的函数被编译为机器代码,从而提高代码执行的整体速度。

问题:Node.js 中为什么要使用buffer类?

Node.js面试题解析:在 Node.js 中,缓冲区类以类似于整数数组的方式存储原始数据。但是,它会与分配在 V8 堆之外的原始内存转储通信。Buffer 类是一个全局类,可以在应用程序中访问,而无需导入缓冲区模块。它主要用于纯 JavaScript 代码不与二进制数据协调。

问题:Node.js 中的 fork() 和 spawn() 方法有什么区别?

答:Node.js面试题和答案合集 - 在 Node.js 中,spawn() 使用可用的命令集启动一个新进程。这不会生成新的 V8 实例,只有节点模块的单个副本在处理器上处于活动状态。当你的子进程向节点返回大量数据时,可以使用此方法。 另一方面,fork() 是 spawn() 的一个特例,它生成一个新的 V8 引擎实例。通过这种方法,多个worker 可以在一个节点代码库上运行多个任务。

问题:说明编写 Express JS 应用程序的步骤。

答:常见的Node.js面试题有哪些 - 要设置一个 ExpressJs 应用程序,你需要按照以下步骤操作:
  • 使用项目名称创建文件夹
  • 在文件夹内创建一个名为 package.json 的文件
  • 在命令提示符下运行“npm install”命令以安装包文件中存在的库\
  • 创建一个名为 server.js 的文件
  • 在包含名为 index.js 的文件夹的包中创建“路由器”文件
  • 应用程序是在包含 index.html 文件的包中创建的
至此,我们结束了最热门的 Node.js 面试问题。你认为我们是否遗漏了一个重要问题或有任何需要澄清的疑问?请在下面的评论中告诉我们。你还可以查看由社区成员策划的我们最好的Node.js 教程。
木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: