diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..09ba6df
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,7 @@
+version: 2
+updates:
+- package-ecosystem: npm
+ directory: "/"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 20
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..dbe3d7c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+Thumbs.db
+db.json
+*.log
+node_modules/
+public/
+.deploy*/
+_multiconfig.yml
\ No newline at end of file
diff --git a/_config.fluid.yml b/_config.fluid.yml
new file mode 100644
index 0000000..159ac95
--- /dev/null
+++ b/_config.fluid.yml
@@ -0,0 +1,1116 @@
+#---------------------------
+# Hexo Theme Fluid
+# Author: Fluid-dev
+# Github: https://github.com/fluid-dev/hexo-theme-fluid
+#
+# 配置指南: https://hexo.fluid-dev.com/docs/guide/
+# 你可以从指南中获得更详细的说明
+#
+# Guide: https://hexo.fluid-dev.com/docs/en/guide/
+# You can get more detailed help from the guide
+#---------------------------
+
+
+#---------------------------
+# 全局
+# Global
+#---------------------------
+
+# 用于浏览器标签的图标
+# Icon for browser tab
+favicon: /img/favicon.png
+
+# 用于苹果设备的图标
+# Icon for Apple touch
+apple_touch_icon: /img/favicon.png
+
+# 浏览器标签页中的标题分隔符,效果: 文章名 - 站点名
+# Title separator in browser tab, eg: article - site
+tab_title_separator: " - "
+
+# 强制所有链接升级为 HTTPS(适用于图片等资源出现 HTTP 混入报错)
+# Force all links to be HTTPS (applicable to HTTP mixed error)
+force_https: false
+
+# 代码块的增强配置
+# Enhancements to code blocks
+code:
+ # 是否开启复制代码的按钮
+ # Enable copy code button
+ copy_btn: true
+
+ # 代码语言
+ # Code language
+ language:
+ enable: true
+ default: "TEXT"
+
+ # 代码高亮
+ # Code highlight
+ highlight:
+ enable: true
+
+ # 代码块是否显示行号
+ # If true, the code block display line numbers
+ line_number: true
+
+ # 实现高亮的库,对应下面的设置
+ # Highlight library
+ # Options: highlightjs | prismjs
+ lib: "highlightjs"
+
+ highlightjs:
+ # 在链接中挑选 style 填入
+ # Select a style in the link
+ # See: https://highlightjs.org/static/demo/
+ style: "github gist"
+ style_dark: "dark"
+
+ prismjs:
+ # 在下方链接页面右侧的圆形按钮挑选 style 填入,也可以直接填入 css 链接
+ # Select the style button on the right side of the link page, you can also set the CSS link
+ # See: https://prismjs.com/
+ style: "default"
+ style_dark: "tomorrow night"
+
+ # 设为 true 高亮将本地静态生成(但只支持部分 prismjs 插件),设为 false 高亮将在浏览器通过 js 生成
+ # If true, it will be generated locally (but some prismjs plugins are not supported). If false, it will be generated via JS in the browser
+ preprocess: true
+
+# 一些好玩的功能
+# Some fun features
+fun_features:
+ # 为 subtitle 添加打字机效果
+ # Typing animation for subtitle
+ typing:
+ enable: true
+
+ # 打印速度,数字越大越慢
+ # Typing speed, the larger the number, the slower
+ typeSpeed: 70
+
+ # 游标字符
+ # Cursor character
+ cursorChar: "_"
+
+ # 是否循环播放效果
+ # If true, loop animation
+ loop: false
+
+ # 在指定页面开启,不填则在所有页面开启
+ # Enable in specified page, all pages by default
+ # Options: home | post | tag | category | about | links | page | 404
+ scope: []
+
+ # 为文章内容中的标题添加锚图标
+ # Add an anchor icon to the title on the post page
+ anchorjs:
+ enable: true
+ element: h1,h2,h3,h4,h5,h6
+ # Options: left | right
+ placement: left
+ # Options: hover | always | touch
+ visible: hover
+ # Options: § | # | ❡
+ icon: ""
+
+ # 加载进度条
+ # Progress bar when loading
+ progressbar:
+ enable: true
+ height_px: 3
+ color: "#29d"
+ # See: https://github.com/rstacruz/nprogress
+ options: { showSpinner: false, trickleSpeed: 100 }
+
+# 主题暗色模式,开启后菜单中会出现切换按钮,用户浏览器会存储切换选项,并且会遵循 prefers-color-scheme 自动切换
+# Theme dark mode. If enable, a switch button will appear on the menu, each of the visitor's browser will store his switch option
+dark_mode:
+ enable: true
+ # 默认的选项(当用户手动切换后则不再按照默认模式),选择 `auto` 会优先遵循 prefers-color-scheme,其次按用户本地时间 18 点到次日 6 点之间进入暗色模式
+ # Default option (when the visitor switches manually, the default mode is no longer followed), choosing `auto` will give priority to prefers-color-scheme, and then enter the dark mode from 18:00 to 6:00 in the visitor’s local time
+ # Options: auto | light | dark
+ default: auto
+
+# 主题颜色配置,其他不生效的地方请使用自定义 css 解决,配色可以在下方链接中获得启发
+# Theme color, please use custom CSS to solve other colors, color schema can be inspired by the links below
+# See: https://www.webdesignrankings.com/resources/lolcolors/
+color:
+ # body 背景色
+ # Color of body background
+ body_bg_color: "#eee"
+ # 暗色模式下的 body 背景色,下同
+ # Color in dark mode, the same below
+ body_bg_color_dark: "#181c27"
+
+ # 顶部菜单背景色
+ # Color of navigation bar background
+ navbar_bg_color: "#2f4154"
+ navbar_bg_color_dark: "#1f3144"
+
+ # 顶部菜单字体色
+ # Color of navigation bar text
+ navbar_text_color: "#fff"
+ navbar_text_color_dark: "#d0d0d0"
+
+ # 副标题字体色
+ # Color of navigation bar text
+ subtitle_color: "#fff"
+ subtitle_color_dark: "#d0d0d0"
+
+ # 全局字体色
+ # Color of global text
+ text_color: "#3c4858"
+ text_color_dark: "#c4c6c9"
+
+ # 全局次级字体色(摘要、简介等位置)
+ # Color of global secondary text (excerpt, introduction, etc.)
+ sec_text_color: "#718096"
+ sec_text_color_dark: "#a7a9ad"
+
+ # 主面板背景色
+ # Color of main board
+ board_color: "#fff"
+ board_color_dark: "#252d38"
+
+ # 文章正文字体色
+ # Color of post text
+ post_text_color: "#2c3e50"
+ post_text_color_dark: "#c4c6c9"
+
+ # 文章正文字体色(h1 h2 h3...)
+ # Color of Article heading (h1 h2 h3...)
+ post_heading_color: "#1a202c"
+ post_heading_color_dark: "#c4c6c9"
+
+ # 文章超链接字体色
+ # Color of post link
+ post_link_color: "#0366d6"
+ post_link_color_dark: "#1589e9"
+
+ # 超链接悬浮时字体色
+ # Color of link when hovering
+ link_hover_color: "#30a9de"
+ link_hover_color_dark: "#30a9de"
+
+ # 超链接悬浮背景色
+ # Color of link background when hovering
+ link_hover_bg_color: "#f8f9fa"
+ link_hover_bg_color_dark: "#364151"
+
+ # 分隔线和表格边线的颜色
+ # Color of horizontal rule and table border
+ line_color: "#eaecef"
+ line_color_dark: "#435266"
+
+ # 滚动条颜色
+ # Color of scrollbar
+ scrollbar_color: "#c4c6c9"
+ scrollbar_color_dark: "#687582"
+ # 滚动条悬浮颜色
+ # Color of scrollbar when hovering
+ scrollbar_hover_color: "#a6a6a6"
+ scrollbar_hover_color_dark: "#9da8b3"
+
+ # 按钮背景色
+ # Color of button
+ button_bg_color: "transparent"
+ button_bg_color_dark: "transparent"
+ # 按钮悬浮背景色
+ # Color of button when hovering
+ button_hover_bg_color: "#f2f3f5"
+ button_hover_bg_color_dark: "#46647e"
+
+# 主题字体配置
+# Font
+font:
+ font_size: 16px
+ font_family:
+ letter_spacing: 0.02em
+ code_font_size: 85%
+
+# 指定自定义 .js 文件路径,支持列表;路径是相对 source 目录,如 /js/custom.js 对应存放目录 source/js/custom.js
+# Specify the path of your custom js file, support list. The path is relative to the source directory, such as `/js/custom.js` corresponding to the directory `source/js/custom.js`
+custom_js:
+
+# 指定自定义 .css 文件路径,用法和 custom_js 相同
+# The usage is the same as custom_js
+custom_css:
+
+# 网页访问统计
+# Analysis of website visitors
+web_analytics: # 网页访问统计
+ enable: ture
+
+ # 遵循访客浏览器"请勿追踪"的设置,如果开启则不统计其访问
+ # Follow the "Do Not Track" setting of the visitor's browser
+ # See: https://www.w3.org/TR/tracking-dnt/
+ follow_dnt: true
+
+ # 百度统计的 Key,值需要获取下方链接中 `hm.js?` 后边的字符串
+ # Baidu analytics, get the string behind `hm.js?`
+ # See: https://tongji.baidu.com/sc-web/10000033910/home/site/getjs?siteId=13751376
+ baidu:
+
+ # Google Analytics 4 的媒体资源 ID
+ # Google Analytics 4 MEASUREMENT_ID
+ # See: https://support.google.com/analytics/answer/9744165#zippy=%2Cin-this-article
+ google:
+ measurement_id: G-N8HM7PFMMZ
+
+ # 腾讯统计的 H5 App ID,开启高级功能才有cid
+ # Tencent analytics, set APP ID
+ # See: https://mta.qq.com/h5/manage/ctr_app_manage
+ tencent:
+ sid:
+ cid:
+
+ # 51.la 站点统计 ID
+ # 51.la analytics
+ # See: https://www.51.la/user/site/index
+ woyaola: # 51.la 站点统计 ID,参见
+
+ # 友盟/cnzz 站点统计 web_id
+ # cnzz analytics
+ # See: https://web.umeng.com/main.php?c=site&a=show
+ cnzz:
+
+ # LeanCloud 计数统计,可用于 PV UV 展示,如果 `web_analytics: enable` 没有开启,PV UV 展示只会查询不会增加
+ # LeanCloud count statistics, which can be used for PV UV display. If `web_analytics: enable` is false, PV UV display will only query and not increase
+ leancloud:
+ app_id:
+ app_key:
+ # REST API 服务器地址,国际版不填
+ # Only the Chinese mainland users need to set
+ server_url:
+ # 统计页面时获取路径的属性
+ # Get the attribute of the page path during statistics
+ path: window.location.pathname
+ # 开启后不统计本地路径( localhost 与 127.0.0.1 )
+ # If true, ignore localhost & 127.0.0.1
+ ignore_local: false
+
+# 对页面中的图片和评论插件进行懒加载处理,可见范围外的元素不会提前加载
+# Lazy loading of images and comment plugin on the page
+lazyload:
+ enable: true
+
+ # 加载时的占位图片
+ # The placeholder image when loading
+ loading_img: /img/loading.gif
+
+ # 开启后懒加载仅在文章页生效,如果自定义页面需要使用,可以在 Front-matter 里指定 `lazyload: true`
+ # If true, only enable lazyload on the post page. For custom pages, you can set 'lazyload: true' in front-matter
+ onlypost: false
+
+ # 触发加载的偏移倍数,基数是视窗高度,可根据部署环境的请求速度调节
+ # The factor of viewport height that triggers loading
+ offset_factor: 2
+
+# 图标库,包含了大量社交类图标,主题依赖的不包含在内,因此可自行修改,详见 https://hexo.fluid-dev.com/docs/icon/
+# Icon library, which includes many social icons, does not include those theme dependent, so your can modify link by yourself. See: https://hexo.fluid-dev.com/docs/en/icon/
+iconfont: //at.alicdn.com/t/font_1736178_lbnruvf0jn.css
+
+
+#---------------------------
+# 页头
+# Header
+#---------------------------
+
+# 导航栏的相关配置
+# Navigation bar
+navbar:
+ # 导航栏左侧的标题,为空则按 hexo config 中 `title` 显示
+ # The title on the left side of the navigation bar. If empty, it is based on `title` in hexo config
+ blog_title: "Art ∣ Tech"
+
+ # 导航栏毛玻璃特效,实验性功能,可能会造成页面滚动掉帧和抖动,部分浏览器不支持会自动不生效
+ # Navigation bar frosted glass special animation. It is an experimental feature
+ ground_glass:
+ enable: false
+
+ # 模糊像素,只能为数字,数字越大模糊度越高
+ # Number of blurred pixel. the larger the number, the higher the blur
+ px: 3
+
+ # 不透明度,数字越大透明度越低,注意透明过度可能看不清菜单字体
+ # Ratio of opacity, 1.0 is completely opaque
+ # available: 0 - 1.0
+ alpha: 0.7
+
+ # 导航栏菜单,可自行增减,key 用来关联 languages/*.yml,如不存在关联则显示 key 本身的值;icon 是 css class,可以省略;增加 name 可以强制显示指定名称
+ # Navigation bar menu. `key` is used to associate languages/*.yml. If there is no association, the value of `key` itself will be displayed; if `icon` is a css class, it can be omitted; adding `name` can force the display of the specified name
+ menu:
+ - { key: "home", link: "/", icon: "iconfont icon-home-fill" }
+ - { key: "archive", link: "/archives/", icon: "iconfont icon-archive-fill" }
+ - { key: "category", link: "/categories/", icon: "iconfont icon-category-fill" }
+ - { key: "tag", link: "/tags/", icon: "iconfont icon-tags-fill" }
+ - { key: "about", link: "/about/", icon: "iconfont icon-user-fill" }
+ - {
+ key: 'Generative AI',
+ icon: "iiconfont icon-codepen-fill",
+ submenu: [
+ { key: 'Art', link: '/maya/' },
+ { key: 'Avatar', link: '/avatar/' },
+ # { key: 'Audio', link: 'https://hexo.fluid-dev.com/docs/icon/' }
+ ]
+ }
+ #- { key: "remark", link: "/remark/" }
+ #- { key: "links", link: "/links/", icon: "iconfont icon-link-fill" }
+
+# 搜索功能,基于 hexo-generator-search 插件,若已安装其他搜索插件请关闭此功能,以避免生成多余的索引文件
+# Search feature, based on hexo-generator-search. If you have installed other search plugins, please disable this feature to avoid generating redundant index files
+search:
+ enable: true
+
+ # 搜索索引文件的路径,可以是相对路径或外站的绝对路径
+ # Path for search index file, it can be a relative path or an absolute path
+ path: /local-search.xml
+
+ # 文件生成在本地的位置,必须是相对路径
+ # The location where the index file is generated locally, it must be a relative location
+ generate_path: /local-search.xml
+
+ # 搜索的范围
+ # Search field
+ # Options: post | page | all
+ field: post
+
+ # 搜索是否扫描正文
+ # If true, search will scan the post content
+ content: true
+
+# 首屏图片的相关配置
+# Config of the big image on the first screen
+banner:
+ # 视差滚动,图片与板块会随着屏幕滚动产生视差效果
+ # Scrolling parallax
+ parallax: true
+
+ # 图片最小的宽高比,以免图片两边被过度裁剪,适用于移动端竖屏时,如需关闭设为 0
+ # Minimum ratio of width to height, applicable to the vertical screen of mobile device, if you need to close it, set it to 0
+ width_height_ratio: 1.0
+
+# 向下滚动的箭头
+# Scroll down arrow
+scroll_down_arrow:
+ enable: true
+
+ # 头图高度不小于指定比例,才显示箭头
+ # Only the height of the banner image is greater than the ratio, the arrow is displayed
+ # Available: 0 - 100
+ banner_height_limit: 80
+
+ # 翻页后自动滚动
+ # Auto scroll after page turning
+ scroll_after_turning_page: true
+
+# 向顶部滚动的箭头
+# Scroll top arrow
+scroll_top_arrow:
+ enable: true
+
+# Open Graph metadata
+# See: https://hexo.io/docs/helpers.html#open-graph
+open_graph:
+ enable: true
+ twitter_card: summary_large_image
+ twitter_id:
+ twitter_site:
+ google_plus:
+ fb_admins:
+ fb_app_id:
+
+
+#---------------------------
+# 页脚
+# Footer
+#---------------------------
+footer:
+ # 页脚第一行文字的 HTML,建议保留 Fluid 的链接,用于向更多人推广本主题
+ # HTML of the first line of the footer, it is recommended to keep the Fluid link to promote this theme to more people
+ content: '
+ Hexo
+
+ Fluid
+ '
+
+ # 展示网站的 PV、UV 统计数
+ # Display website PV and UV statistics
+ statistics:
+ enable: false
+
+ # 统计数据来源,使用 leancloud 需要设置 `web_analytics: leancloud` 中的参数;使用 busuanzi 不需要额外设置,但是有时不稳定,另外本地运行时 busuanzi 显示统计数据很大属于正常现象,部署后会正常
+ # Data source. If use leancloud, you need to set the parameter in `web_analytics: leancloud`
+ # Options: busuanzi | leancloud
+ source: "busuanzi"
+
+ # 国内大陆服务器的备案信息
+ # For Chinese mainland website policy, other areas keep disable
+ beian:
+ enable: false
+ # ICP证号
+ icp_text: 京ICP证123456号
+ # 公安备案号,不填则只显示ICP
+ police_text: 京公网安备12345678号
+ # 公安备案的编号,用于URL跳转查询
+ police_code: 12345678
+ # 公安备案的图片. 为空时不显示备案图片
+ police_icon: /img/police_beian.png
+
+
+#---------------------------
+# 首页
+# Home Page
+#---------------------------
+index:
+ # 首页 Banner 头图,可以是相对路径或绝对路径,以下相同
+ # Path of Banner image, can be a relative path or an absolute path, the same on other pages
+ banner_img: /img/Cover2_animation.gif
+
+ # 头图高度,屏幕百分比
+ # Height ratio of banner image
+ # Available: 0 - 100
+ banner_img_height: 100
+
+ # 头图黑色蒙版的不透明度,available: 0 - 1.0, 1 是完全不透明
+ # Opacity of the banner mask, 1.0 is completely opaque
+ # Available: 0 - 1.0
+ banner_mask_alpha: 0.2
+
+ # 首页副标题的独立设置
+ # Independent config of home page subtitle
+ slogan:
+ enable: true
+
+ # 为空则按 hexo config.subtitle 显示
+ # If empty, text based on `subtitle` in hexo config
+ text: "分享、研究新技術,AI與CG Pipeline整合應用"
+
+ # 通过 API 接口作为首页副标题的内容,必须返回的是 JSON 格式,如果请求失败则按 text 字段显示,该功能必须先开启 typing 打字机功能
+ # Subtitle of the homepage through the API, must be returned a JSON. If the request fails, it will be displayed in `text` value. This feature must first enable the typing animation
+ api:
+ enable: false
+
+ # 请求地址
+ # Request url
+ url: ""
+
+ # 请求方法
+ # Request method
+ # Available: GET | POST | PUT
+ method: "GET"
+
+ # 请求头
+ # Request headers
+ headers: {}
+
+ # 从请求结果获取字符串的取值字段,最终必须是一个字符串,例如返回结果为 {"data": {"author": "fluid", "content": "An elegant theme"}}, 则取值字段为 ['data', 'content'];如果返回是列表则自动选择第一项
+ # The value field of the string obtained from the response. For example, the response content is {"data": {"author": "fluid", "content": "An elegant theme"}}, the expected `keys: ['data','content']`; if the return is a list, the first item is automatically selected
+ keys: []
+
+ # 自动截取文章摘要
+ # Auto extract post
+ auto_excerpt:
+ enable: true
+
+ # 打开文章的标签方式
+ # The browser tag to open the post
+ # Available: _blank | _self
+ post_url_target: _self
+
+ # 是否显示文章信息(时间、分类、标签)
+ # Meta information of post
+ post_meta:
+ date: true
+ category: true
+ tag: true
+
+ # 文章通过 sticky 排序后,在首页文章标题前显示图标
+ # If the posts are sorted by `sticky`, an icon is displayed in front of the post title
+ post_sticky:
+ enable: true
+ icon: "iconfont icon-top"
+
+
+#---------------------------
+# 文章页
+# Post Page
+#---------------------------
+post:
+ banner_img: /img/Cover2_animation.gif
+ banner_img_height: 70
+ banner_mask_alpha: 0.3
+
+ # 文章在首页的默认封面图,当没有指定 index_img 时会使用该图片,若两者都为空则不显示任何图片
+ # Path of the default post cover when `index_img` is not set. If both are empty, no image will be displayed
+ default_index_img:
+
+ # 文章标题下方的元信息
+ # Meta information below title
+ meta:
+ # 作者,优先根据 front-matter 里 author 字段,其次是 hexo 配置中 author 值
+ # Author, based on `author` field in front-matter, if not set, based on `author` value in hexo config
+ author:
+ enable: false
+
+ # 文章日期,优先根据 front-matter 里 date 字段,其次是 md 文件日期
+ # Post date, based on `date` field in front-matter, if not set, based on create date of .md file
+ date:
+ enable: true
+ # 格式参照 ISO-8601 日期格式化
+ # ISO-8601 date format
+ # See: http://momentjs.cn/docs/#/parsing/string-format/
+ format: "LL a"
+
+ # 字数统计
+ # Word count
+ wordcount:
+ enable: true
+
+ # 估计阅读全文需要的时长
+ # Estimated reading time
+ min2read:
+ enable: true
+ # 每个字词的长度,建议:中文≈2,英文≈5,中英混合可自行调节
+ # Average word length (chars count in word), ZH ≈ 2, EN ≈ 5
+ awl: 2
+ # 每分钟阅读字数,如果大部分是技术文章可适度调低
+ # Words per minute
+ wpm: 60
+
+ # 浏览量计数
+ # Number of visits
+ views:
+ enable: false
+ # 统计数据来源
+ # Data Source
+ # Options: busuanzi | leancloud
+ source: "busuanzi"
+
+ # 在文章开头显示文章更新时间,该时间默认是 md 文件更新时间,可通过 front-matter 中 `updated` 手动指定(和 date 一样格式)
+ # Update date is displayed at the beginning of the post. The default date is the update date of the md file, which can be manually specified by `updated` in front-matter (same format as date)
+ updated:
+ enable: false
+
+ # 格式参照 ISO-8601 日期格式化
+ # ISO-8601 date format
+ # See: http://momentjs.cn/docs/#/parsing/string-format/
+ date_format: "LL a"
+
+ # 是否使用相对时间表示,比如:"3 天前"
+ # If true, it will be a relative time, such as: "3 days ago"
+ relative: false
+
+ # 提示标签类型
+ # Note class
+ # Options: default | primary | info | success | warning | danger | light
+ note_class: info
+
+ # 侧边栏展示当前分类下的文章
+ # Sidebar of category
+ category_bar:
+ enable: true
+
+ # 开启后,只有在文章 Front-matter 里指定 `category_bar: true` 才会展示分类,也可以通过 `category_bar: ["分类A"]` 来指定分类
+ # If true, only set `category_bar: true` in Front-matter will enable sidebar of category, also set `category_bar: ["CategoryA"]` to specify categories
+ specific: true
+
+ # 置于板块的左侧或右侧
+ # place in the board
+ # Options: left | right
+ placement: left
+
+ # 文章的排序字段,前面带减号是倒序,不带减号是正序
+ # Sort field for posts, with a minus sign is reverse order
+ # Options: date | title | or other field of front-matter
+ post_order_by: "title"
+
+ # 单个分类中折叠展示文章数的最大值,超过限制会显示 More,0 则不限制
+ # The maximum number of posts in a single category. If the limit is exceeded, it will be displayed More. If 0 no limit
+ post_limit: 0
+
+ # 侧边栏展示文章目录
+ # Table of contents (TOC) in the sidebar
+ toc:
+ enable: true
+
+ # 置于板块的左侧或右侧
+ # place in the board
+ # Options: left | right
+ placement: right
+
+ # 目录会选择这些节点作为标题
+ # TOC will select these nodes as headings
+ headingSelector: "h1,h2,h3,h4,h5,h6"
+
+ # 层级的折叠深度,0 是全部折叠,大于 0 后如果存在下级标题则默认展开
+ # Collapse depth. If 0, all headings collapsed. If greater than 0, it will be expanded by default if there are sub headings
+ collapseDepth: 0
+
+ # 版权声明,会显示在每篇文章的结尾
+ # Copyright, will be displayed at the end of each post
+ copyright:
+ enable: true
+
+ # CreativeCommons license
+ # Options: BY | BY-SA | BY-ND | BY-NC | BY-NC-SA | BY-NC-ND
+ license: 'BY'
+
+ # 显示作者
+ author:
+ enable: true
+
+ # 显示发布日期
+ # Show post date
+ post_date:
+ enable: true
+ format: "LL"
+
+ # 显示更新日期
+ # Show update date
+ update_date:
+ enable: false
+ format: "LL"
+
+ # 文章底部上一篇下一篇功能
+ # Link to previous/next post
+ prev_next:
+ enable: true
+
+ # 文章图片标题
+ # Image caption
+ image_caption:
+ enable: true
+
+ # 文章图片可点击放大
+ # Zoom feature of images
+ image_zoom:
+ enable: true
+ # 放大后图片链接替换规则,可用于将压缩图片链接替换为原图片链接,如 ['-slim', ''] 是将链接中 `-slim` 移除;如果想使用正则请使用 `re:` 前缀,如 ['re:\\d{3,4}\\/\\d{3,4}\\/', '']
+ # The image url replacement when zooming, the feature can be used to replace the compressed image to the original image, eg: ['-slim', ''] removes `-slim` from the image url when zooming; if you want to use regular, use prefix `re:`, eg: ['re:\\d{3,4}\\/\\d{3,4}\\/','']
+ img_url_replace: ['', '']
+
+ # 脚注语法,会在文章底部生成脚注,如果 Markdown 渲染器本身支持,则建议关闭,否则可能会冲突
+ # Support footnote syntax, footnotes will be generated at the bottom of the post page. If the Markdown renderer itself supports it, please disable it, otherwise it may conflict
+ footnote:
+ enable: true
+ # 脚注的节标题,也可以在 front-matter 中通过 `footnote:
Reference ` 这种形式修改单独页面的 header
+ # The section title of the footnote, you can also modify the header of a single page in the form of `footnote: Reference ` in front-matter
+ header: ''
+
+ # 数学公式,开启之前需要更换 Markdown 渲染器,否则复杂公式会有兼容问题,具体请见:https://hexo.fluid-dev.com/docs/guide/##latex-数学公式
+ # Mathematical formula. If enable, you need to change the Markdown renderer, see: https://hexo.fluid-dev.com/docs/en/guide/#math
+ math:
+ # 开启后文章默认可用,自定义页面如需使用,需在 Front-matter 中指定 `math: true`
+ # If you want to use math on the custom page, you need to set `math: true` in Front-matter
+ enable: false
+
+ # 开启后,只有在文章 Front-matter 里指定 `math: true` 才会在文章页启动公式转换,以便在页面不包含公式时提高加载速度
+ # If true, only set `math: true` in Front-matter will enable math, to load faster when the page does not contain math
+ specific: false
+
+ # Options: mathjax | katex
+ engine: mathjax
+
+ # 流程图,基于 mermaid-js,具体请见:https://hexo.fluid-dev.com/docs/guide/#mermaid-流程图
+ # Flow chart, based on mermaid-js, see: https://hexo.fluid-dev.com/docs/en/guide/#mermaid
+ mermaid:
+ # 开启后文章默认可用,自定义页面如需使用,需在 Front-matter 中指定 `mermaid: true`
+ # If you want to use mermaid on the custom page, you need to set `mermaid: true` in Front-matter
+ enable: false
+
+ # 开启后,只有在文章 Front-matter 里指定 `mermaid: true` 才会在文章页启动公式转换,以便在页面不包含公式时提高加载速度
+ # If true, only set `mermaid: true` in Front-matter will enable mermaid, to load faster when the page does not contain mermaid
+ specific: false
+
+ # See: http://mermaid-js.github.io/mermaid/
+ options: { theme: 'default' }
+
+ # 评论插件
+ # Comment plugin
+ comments:
+ enable: true
+ # 指定的插件,需要同时设置对应插件的必要参数
+ # The specified plugin needs to set the necessary parameters at the same time
+ # Options: utterances | disqus | gitalk | valine | waline | changyan | livere | remark42 | twikoo | cusdis | giscus | discuss
+ type: remark42
+
+
+#---------------------------
+# 评论插件
+# Comment plugins
+#
+# 开启评论需要先设置上方 `post: comments: enable: true`,然后根据 `type` 设置下方对应的评论插件参数
+# Enable comments need to be set `post: comments: enable: true`, then set the corresponding comment plugin parameters below according to `type`
+#---------------------------
+
+# Utterances
+# 基于 GitHub Issues
+# Based on GitHub Issues
+# See: https://utteranc.es
+utterances:
+ repo:
+ issue_term: pathname
+ label: utterances
+ theme: github-light
+ theme_dark: github-dark
+
+# Disqus
+# 基于第三方的服务,国内用户直接使用容易被墙,建议配合 Disqusjs
+# Based on third-party service
+# See: https://disqus.com
+disqus:
+ shortname:
+ # 以下为 Disqusjs 支持, 国内用户如果想使用 Disqus 建议配合使用
+ # The following are Disqusjs configurations, please ignore if DisqusJS is not required
+ # See: https://github.com/SukkaW/DisqusJS
+ disqusjs: false
+ apikey:
+
+# Gitalk
+# 基于 GitHub Issues
+# Based on GitHub Issues
+# See: https://github.com/gitalk/gitalk#options
+gitalk:
+ clientID:
+ clientSecret:
+ repo:
+ owner:
+ admin: ['name']
+ language: en
+ labels: ['Gitalk']
+ perPage: 10
+ pagerDirection: last
+ distractionFreeMode: false
+ createIssueManually: true
+ # 默认 proxy 可能会失效,解决方法请见下方链接
+ # The default proxy may be invalid, refer to the links for solutions
+ # https://github.com/gitalk/gitalk/issues/429
+ # https://github.com/Zibri/cloudflare-cors-anywhere
+ proxy: https://cors-anywhere.azm.workers.dev/https://github.com/login/oauth/access_token
+
+# Valine
+# 基于 LeanCloud
+# Based on LeanCloud
+# See: https://valine.js.org/
+valine:
+ appId:
+ appKey:
+ path: window.location.pathname
+ placeholder:
+ avatar: 'retro'
+ meta: ['nick', 'mail', 'link']
+ requiredFields: []
+ pageSize: 10
+ lang: 'zh-CN'
+ highlight: false
+ recordIP: false
+ serverURLs: ''
+ emojiCDN:
+ emojiMaps:
+ enableQQ: false
+
+# Waline
+# 从 Valine 衍生而来,额外增加了服务端和多种功能
+# Derived from Valine, with self-hosted service and new features
+# See: https://waline.js.org/
+waline:
+ serverURL: ''
+ path: window.location.pathname
+ meta: ['nick', 'mail', 'link']
+ requiredMeta: ['nick']
+ lang: 'zh-CN'
+ emoji: ['https://cdn.jsdelivr.net/gh/walinejs/emojis/weibo']
+ dark: 'html[data-user-color-scheme="dark"]'
+ wordLimit: 0
+ pageSize: 10
+
+# 畅言 Changyan
+# 基于第三方的服务
+# Based on third-party service, insufficient support for regions outside China
+# http://changyan.kuaizhan.com
+changyan:
+ appid: ''
+ appkey: ''
+
+# 来必力 Livere
+# 基于第三方的服务
+# Based on third-party service
+# See: https://www.livere.com
+livere:
+ uid: ''
+
+# Remark42
+# 需要自托管服务端
+# Based on self-hosted service
+# See: https://remark42.com
+remark42:
+ host: https://techblog.diskstation.me
+ site_id: 'remark'
+ max_shown_comments: 10
+ locale: en
+ components: ['embed']
+
+# Twikoo
+# 支持腾讯云、Vercel、Railway 等多种平台部署
+# Based on Tencent CloudBase
+# See: https://twikoo.js.org
+twikoo:
+ envId:
+ region: ap-shanghai
+ path: window.location.pathname
+
+# Cusdis
+# 基于第三方服务或自托管服务
+# Based on third-party or self-hosted service
+# See https://cusdis.com
+cusdis:
+ host:
+ app_id:
+ lang: zh-cn
+
+# Giscus
+# 基于 GitHub Discussions,类似于 Utterances
+# Based on GitHub Discussions, similar to Utterances
+# See: https://giscus.app/
+giscus:
+ repo:
+ repo-id:
+ category:
+ category-id:
+ theme-light: light
+ theme-dark: dark
+ mapping: pathname
+ reactions-enabled: 1
+ emit-metadata: 0
+ input-position: top
+ lang: zh-CN
+
+# Discuss
+# 多平台、多数据库、自托管、免费开源评论系统
+# Self-hosted, small size, multi-platform, multi-database, free and open source commenting system
+# See: https://discuss.js.org
+discuss:
+ serverURLs:
+ path: window.location.pathname
+
+
+#---------------------------
+# 归档页
+# Archive Page
+#---------------------------
+archive:
+ banner_img: /img/Cover2_animation.gif
+ banner_img_height: 60
+ banner_mask_alpha: 0.3
+
+
+maya:
+ banner_img: /img/banner.png
+ banner_img_height: 0.01
+ banner_mask_alpha: 0.3
+#---------------------------
+# 分类页
+# Category Page
+#---------------------------
+category:
+ enable: true
+ banner_img: /img/Cover2_animation.gif
+ banner_img_height: 60
+ banner_mask_alpha: 0.3
+
+ # 分类的排序字段,前面带减号是倒序,不带减号是正序
+ # Sort field for categories, with a minus sign is reverse order
+ # Options: length | name
+ order_by: "-length"
+
+ # 层级的折叠深度,0 是全部折叠,大于 0 后如果存在子分类则默认展开
+ # Collapse depth. If 0, all posts collapsed. If greater than 0, it will be expanded by default if there are subcategories
+ collapse_depth: 0
+
+ # 文章的排序字段,前面带减号是倒序,不带减号是正序
+ # Sort field for posts, with a minus sign is reverse order
+ # Options: date | title | or other field of front-matter
+ post_order_by: "-date"
+
+ # 单个分类中折叠展示文章数的最大值,超过限制会显示 More,0 则不限制
+ # The maximum number of posts in a single category. If the limit is exceeded, it will be displayed More. If 0 no limit
+ post_limit: 10
+
+
+#---------------------------
+# 标签页
+# Tag Page
+#---------------------------
+tag:
+ enable: true
+ banner_img: /img/Cover2_animation.gif
+ banner_img_height: 80
+ banner_mask_alpha: 0.3
+ tagcloud:
+ min_font: 15
+ max_font: 30
+ unit: px
+ start_color: "#BBBBEE"
+ end_color: "#337ab7"
+
+
+#---------------------------
+# 关于页
+# About Page
+#---------------------------
+about:
+ enable: true
+ banner_img: /img/about.png
+ banner_img_height: 60
+ banner_mask_alpha: 0.3
+ avatar: /img/avatar.jpg
+ name: "Stone"
+ intro: "Technical Pipeline Animator & Father of two children"
+ # 更多图标可从 https://hexo.fluid-dev.com/docs/icon/ 查找,`class` 代表图标的 css class,添加 `qrcode` 后,图标不再是链接而是悬浮二维码
+ # More icons can be found from https://hexo.fluid-dev.com/docs/en/icon/ `class` is the css class of the icon. If adding `qrcode`, The icon is no longer a link, but a hovering QR code
+ icons:
+ - { class: "iconfont icon-github-fill", link: "https://github.com/stonetein", tip: "GitHub" }
+ - { class: "iconfont icon-linkedin-fill", link: "https://www.linkedin.com/in/tein-stone-animator", tip: "Linkedin" }
+ - { class: "iconfont icon-wechat-fill", qrcode: "/img/wechat.png" }
+
+
+#---------------------------
+# 自定义页
+# Custom Page
+#
+# 通过 hexo new page 命令创建的页面
+# Custom Page through `hexo new page`
+#---------------------------
+page:
+ banner_img: /img/default.png
+ banner_img_height: 60
+ banner_mask_alpha: 0.3
+
+
+#---------------------------
+# 404页
+# 404 Page
+#---------------------------
+page404:
+ enable: true
+ banner_img: /img/default.png
+ banner_img_height: 85
+ banner_mask_alpha: 0.3
+ # 重定向到首页的延迟(毫秒)
+ # Delay in redirecting to home page (milliseconds)
+ redirect_delay: 5000
+
+
+#---------------------------
+# 友链页
+# Links Page
+#---------------------------
+links:
+ enable: true
+ banner_img: /img/default.png
+ banner_img_height: 60
+ banner_mask_alpha: 0.3
+ # 友链的成员项
+ # Member item of page
+ items:
+ - {
+ title: "Fluid Blog",
+ intro: "主题博客",
+ link: "https://hexo.fluid-dev.com/",
+ avatar: "/img/favicon.png"
+ }
+ - {
+ title: "Fluid Docs",
+ intro: "主题使用指南",
+ link: "https://hexo.fluid-dev.com/docs/",
+ avatar: "/img/favicon.png"
+ }
+ - {
+ title: "Fluid Repo",
+ intro: "主题 GitHub 仓库",
+ link: "https://github.com/fluid-dev/hexo-theme-fluid",
+ avatar: "/img/favicon.png"
+ }
+
+ # 当成员头像加载失败时,替换为指定图片
+ # When the member avatar fails to load, replace the specified image
+ onerror_avatar: /img/avatar.png
+
+ # 友链下方自定义区域,支持 HTML,可插入例如申请友链的文字
+ # Custom content at the bottom of the links
+ custom:
+ enable: false
+ content: '在下方留言申请加入我的友链,按如下格式提供信息:
博客名:Fluid 简介:Fluid 主题官方博客 链接:https://hexo.fluid-dev.com 图片:https://hexo.fluid-dev.com/img/favicon.png '
+
+ # 评论插件
+ # Comment plugin
+ comments:
+ enable: false
+ # 指定的插件,需要同时设置对应插件的必要参数
+ # The specified plugin needs to set the necessary parameters at the same time
+ # Options: utterances | disqus | gitalk | valine | waline | changyan | livere | remark42 | twikoo | cusdis | giscus | discuss
+ type: remark42
+
+
+#---------------------------
+# 以下是配置 JS CSS 等静态资源的 URL 前缀,可以自定义成 CDN 地址,
+# 如果需要修改,最好使用与默认配置相同的版本,以避免潜在的问题,
+# ** 如果你不知道如何设置,请不要做任何改动 **
+#
+# Here is the url prefix to configure the static assets. Set CDN addresses you want to customize.
+# Be aware that you would better use the same version as default ones to avoid potential problems.
+# DO NOT EDIT THE FOLLOWING SETTINGS UNLESS YOU KNOW WHAT YOU ARE DOING
+#---------------------------
+
+static_prefix:
+ # 内部静态
+ # Internal static
+ internal_js: /js
+ internal_css: /css
+ internal_img: /img
+
+ anchor: https://lib.baomitu.com/anchor-js/4.3.1/
+
+ github_markdown: https://lib.baomitu.com/github-markdown-css/4.0.0/
+
+ jquery: https://lib.baomitu.com/jquery/3.6.4/
+
+ bootstrap: https://lib.baomitu.com/twitter-bootstrap/4.6.1/
+
+ prismjs: https://lib.baomitu.com/prism/1.29.0/
+
+ tocbot: https://lib.baomitu.com/tocbot/4.20.1/
+
+ typed: https://lib.baomitu.com/typed.js/2.0.12/
+
+ fancybox: https://lib.baomitu.com/fancybox/3.5.7/
+
+ nprogress: https://lib.baomitu.com/nprogress/0.2.0/
+
+ mathjax: https://lib.baomitu.com/mathjax/3.2.2/
+
+ katex: https://lib.baomitu.com/KaTeX/0.16.2/
+
+ busuanzi: https://busuanzi.ibruce.info/busuanzi/2.3/
+
+ clipboard: https://lib.baomitu.com/clipboard.js/2.0.11/
+
+ mermaid: https://lib.baomitu.com/mermaid/8.14.0/
+
+ valine: https://lib.baomitu.com/valine/1.5.1/
+
+ waline: https://cdn.staticfile.org/waline/2.15.5/
+
+ gitalk: https://lib.baomitu.com/gitalk/1.8.0/
+
+ disqusjs: https://lib.baomitu.com/disqusjs/1.3.0/
+
+ twikoo: https://lib.baomitu.com/twikoo/1.6.8/
+
+ discuss: https://lib.baomitu.com/discuss/1.2.1/
+
+ hint: https://lib.baomitu.com/hint.css/2.7.0/
+
+ moment: https://lib.baomitu.com/moment.js/2.29.4/
diff --git a/_config.landscape.yml b/_config.landscape.yml
new file mode 100644
index 0000000..e69de29
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 0000000..18b7a2a
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,108 @@
+# Hexo Configuration
+## Docs: https://hexo.io/docs/configuration.html
+## Source: https://github.com/hexojs/hexo/
+
+# Site
+title: codeArt-TechBlog
+subtitle: 分享、研究新技術,AI與CG Pipeline整合應用
+description: "分享技術,包含APP,遊戲,CG"
+keywords: Maya,Rig,python,Animation,comfyUI,Unity,Unreal
+author: Stone
+language: en
+timezone: ""
+
+# URL
+## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project'
+url: https://stonetein.github.io/codeArt-TechBlog
+permalink: :year/:month/:day/:title/
+permalink_defaults:
+pretty_urls:
+ trailing_index: true # Set to false to remove trailing 'index.html' from permalinks
+ trailing_html: true # Set to false to remove trailing '.html' from permalinks
+
+# Directory
+source_dir: source
+public_dir: public
+tag_dir: tags
+archive_dir: archives
+category_dir: categories
+code_dir: downloads/code
+i18n_dir: :lang
+skip_render:
+
+# Writing
+new_post_name: :title.md # File name of new posts
+default_layout: post
+titlecase: false # Transform title into titlecase
+external_link:
+ enable: true # Open external links in new tab
+ field: site # Apply to the whole site
+ exclude: ""
+filename_case: 0
+render_drafts: false
+post_asset_folder: false
+relative_link: false
+future: true
+syntax_highlighter: highlight.js
+highlight:
+ line_number: true
+ auto_detect: false
+ tab_replace: ""
+ wrap: true
+ hljs: false
+prismjs:
+ preprocess: true
+ line_number: true
+ tab_replace: ""
+
+# Home page setting
+# path: Root path for your blogs index page. (default = '')
+# per_page: Posts displayed per page. (0 = disable pagination)
+# order_by: Posts order. (Order by date descending by default)
+index_generator:
+ path: ""
+ per_page: 10
+ order_by: -date
+
+# Category & Tag
+default_category: uncategorized
+category_map:
+tag_map:
+
+# Metadata elements
+## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta
+meta_generator: true
+
+# Date / Time format
+## Hexo uses Moment.js to parse and display date
+## You can customize the date format as defined in
+## http://momentjs.com/docs/#/displaying/format/
+date_format: YYYY-MM-DD
+time_format: HH:mm:ss
+## updated_option supports 'mtime', 'date', 'empty'
+updated_option: "mtime"
+
+# Pagination
+## Set per_page to 0 to disable pagination
+per_page: 10
+pagination_dir: page
+
+# Include / Exclude file(s)
+## include:/exclude: options only apply to the 'source/' folder
+include:
+exclude:
+ignore:
+
+# Extensions
+## Plugins: https://hexo.io/plugins/
+## Themes: https://hexo.io/themes/
+theme: fluid
+
+# Deployment
+## Docs: https://hexo.io/docs/one-command-deployment
+deploy:
+ type: git
+ repo: https://github.com/stonetein/codeArt-TechBlog
+ # example, https://github.com/hexojs/hexojs.github.io
+ branch: gh-pages
+ message: "update new page the ssh and video shop"
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..53f0967
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2444 @@
+{
+ "name": "hexo-site",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "hexo-site",
+ "version": "0.0.0",
+ "dependencies": {
+ "hexo": "^7.3.0",
+ "hexo-deployer-git": "^4.0.0",
+ "hexo-generator-archive": "^2.0.0",
+ "hexo-generator-category": "^2.0.0",
+ "hexo-generator-index": "^3.0.0",
+ "hexo-generator-tag": "^2.0.0",
+ "hexo-renderer-ejs": "^2.0.0",
+ "hexo-renderer-marked": "^6.0.0",
+ "hexo-renderer-stylus": "^3.0.0",
+ "hexo-server": "^3.0.0",
+ "hexo-theme-fluid": "^1.9.7",
+ "hexo-theme-landscape": "^1.0.0"
+ }
+ },
+ "node_modules/@adobe/css-tools": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz",
+ "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ=="
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/a-sync-waterfall": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz",
+ "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA=="
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "deprecated": "Use your platform's native atob() and btoa() methods instead"
+ },
+ "node_modules/abbrev": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
+ "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
+ "dependencies": {
+ "acorn": "^8.1.0",
+ "acorn-walk": "^8.0.2"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz",
+ "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/agent-base/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/agent-base/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw=="
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
+ },
+ "node_modules/async": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
+ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/basic-auth": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
+ "dependencies": {
+ "safe-buffer": "5.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/command-exists": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
+ "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w=="
+ },
+ "node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/connect": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
+ "utils-merge": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cssom": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+ },
+ "node_modules/cuid": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz",
+ "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==",
+ "deprecated": "Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead."
+ },
+ "node_modules/data-urls": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+ "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+ "dependencies": {
+ "abab": "^2.0.6",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domexception": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+ "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "dependencies": {
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/dompurify": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.3.tgz",
+ "integrity": "sha512-5sOWYSNPaxz6o2MUPvtyxTTqR4D3L77pr5rUQoWgD5ROQtVIZQgJkXbo1DLlK3vj11YGw5+LnF4SYti4gZmwng=="
+ },
+ "node_modules/domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fast-equals": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-3.0.3.tgz",
+ "integrity": "sha512-NCe8qxnZFARSHGztGMZOO/PC1qa5MIFB5Hp66WdzbCRAz8U8US3bx1UTgLS49efBQPcUtO9gf5oVEY8o7y/7Kg=="
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hexo": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/hexo/-/hexo-7.3.0.tgz",
+ "integrity": "sha512-dOe8mzBKrvjubW5oBmyhcnQDpC+M2xmAMLae5K+o+SkHxyvAhShkS2VQZoTsOLIJKY6xilv7dzCjCvE7ol/NHQ==",
+ "dependencies": {
+ "abbrev": "^2.0.0",
+ "archy": "^1.0.0",
+ "bluebird": "^3.7.2",
+ "hexo-cli": "^4.3.2",
+ "hexo-front-matter": "^4.2.1",
+ "hexo-fs": "^4.1.3",
+ "hexo-i18n": "^2.0.0",
+ "hexo-log": "^4.0.1",
+ "hexo-util": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "js-yaml-js-types": "^1.0.0",
+ "micromatch": "^4.0.4",
+ "moize": "^6.1.6",
+ "moment": "^2.29.1",
+ "moment-timezone": "^0.5.34",
+ "nunjucks": "^3.2.3",
+ "picocolors": "^1.0.0",
+ "pretty-hrtime": "^1.0.3",
+ "resolve": "^1.22.0",
+ "strip-ansi": "^6.0.0",
+ "text-table": "^0.2.0",
+ "tildify": "^2.0.0",
+ "titlecase": "^1.1.3",
+ "warehouse": "^5.0.1"
+ },
+ "bin": {
+ "hexo": "bin/hexo"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/hexo"
+ }
+ },
+ "node_modules/hexo-cli": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/hexo-cli/-/hexo-cli-4.3.2.tgz",
+ "integrity": "sha512-druJeBgLpG9ncDS5AhBHdAXk0G4CFj8Qes09pApyZ6bR+nJW1JYiDMuilhudaKDdq+1l49jWXVTidkcb7p0Jbw==",
+ "dependencies": {
+ "abbrev": "^2.0.0",
+ "bluebird": "^3.7.2",
+ "command-exists": "^1.2.9",
+ "hexo-fs": "^4.1.1",
+ "hexo-log": "^4.0.1",
+ "hexo-util": "^3.3.0",
+ "minimist": "^1.2.5",
+ "picocolors": "^1.0.0",
+ "resolve": "^1.20.0",
+ "tildify": "^2.0.0"
+ },
+ "bin": {
+ "hexo": "bin/hexo"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-deployer-git": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/hexo-deployer-git/-/hexo-deployer-git-4.0.0.tgz",
+ "integrity": "sha512-28t1Q+4taB/UaBAP52W3mD/wcCwa2y2zBieUfBJFBZudbmVgiKJB5YedYILeyI5QByaUKAOwoupmdTbocdQ+CQ==",
+ "dependencies": {
+ "bluebird": "^3.7.2",
+ "hexo-fs": "^4.0.0",
+ "hexo-util": "^2.7.0",
+ "luxon": "^3.0.4",
+ "nunjucks": "^3.2.3",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-deployer-git/node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/hexo-deployer-git/node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/hexo-deployer-git/node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/hexo-deployer-git/node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/hexo-deployer-git/node_modules/entities": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
+ "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/hexo-deployer-git/node_modules/hexo-util": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/hexo-util/-/hexo-util-2.7.0.tgz",
+ "integrity": "sha512-hQM3h34nhDg0bSe/Tg1lnpODvNkz7h2u0+lZGzlKL0Oufp+5KCAEUX9wal7/xC7ax3/cwEn8IuoU75kNpZLpJQ==",
+ "dependencies": {
+ "bluebird": "^3.5.2",
+ "camel-case": "^4.0.0",
+ "cross-spawn": "^7.0.0",
+ "deepmerge": "^4.2.2",
+ "highlight.js": "^11.0.1",
+ "htmlparser2": "^7.0.0",
+ "prismjs": "^1.17.1",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=12.4.0"
+ }
+ },
+ "node_modules/hexo-deployer-git/node_modules/htmlparser2": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
+ "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.2",
+ "domutils": "^2.8.0",
+ "entities": "^3.0.1"
+ }
+ },
+ "node_modules/hexo-front-matter": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/hexo-front-matter/-/hexo-front-matter-4.2.1.tgz",
+ "integrity": "sha512-sJJI0GNmejYiwBvgnGRKn5V3sbODB4dNPr8jyw2Qp0PRHr4Uuyv8iyxw6WfK3+T7yvzYvJOh+tZ7jnwr2BYARA==",
+ "dependencies": {
+ "js-yaml": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-fs": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/hexo-fs/-/hexo-fs-4.1.3.tgz",
+ "integrity": "sha512-Q92zQ5PlVDouvSWFLXQoFSTLIUIODikUJs2BfAXQglyOEjN1dOQn1Z5Nimk/7GHof17R5h/uObCQLnZAjzI2tg==",
+ "dependencies": {
+ "bluebird": "^3.7.2",
+ "chokidar": "^3.5.3",
+ "graceful-fs": "^4.2.10",
+ "hexo-util": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-generator-archive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hexo-generator-archive/-/hexo-generator-archive-2.0.0.tgz",
+ "integrity": "sha512-KikJk7dGFbtNHOgqtLFGf5T/S8n1paGp+Gy0KfVDz+HKYhGbXOouyiZkmc3O9KrYt6ja14rmkMhq7KKGtvfehw==",
+ "dependencies": {
+ "hexo-pagination": "3.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-generator-category": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hexo-generator-category/-/hexo-generator-category-2.0.0.tgz",
+ "integrity": "sha512-9OduRBf3WeRDa4BR0kAfRjOVHur7v3fm0NKAwbjUiqULigAdNZVZPO3cHKW2MlBbl/lI5PuWdhQ9zZ99CCCAgQ==",
+ "dependencies": {
+ "hexo-pagination": "3.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-generator-index": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hexo-generator-index/-/hexo-generator-index-3.0.0.tgz",
+ "integrity": "sha512-83AuNN4cWdLVi//3ugR8E3kR6rrOwhXZt+hOCm1IjtIGj353/GlrtpMHpqZHU5kqipzj4miy9dweVdukXglVWw==",
+ "dependencies": {
+ "hexo-pagination": "3.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-generator-tag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hexo-generator-tag/-/hexo-generator-tag-2.0.0.tgz",
+ "integrity": "sha512-1px/hF3veEohWDN8jjzchQhaiz+uOStUvvMaBJC9vWOlALh30UFcapL8IrvAwwJZjFRVA+WqGgDRqoQ8+yaaFw==",
+ "dependencies": {
+ "hexo-pagination": "3.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-i18n": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hexo-i18n/-/hexo-i18n-2.0.0.tgz",
+ "integrity": "sha512-dkUXecEtChaQMdTHN4WR13c8GwKqjbSOZPJS9qDqV6Ebnb77Wa/nQzWFckhP0dCps3a9lUQBd8hYGOMbOosiQQ==",
+ "dependencies": {
+ "sprintf-js": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-log": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hexo-log/-/hexo-log-4.1.0.tgz",
+ "integrity": "sha512-i2Sgxk8Cgx5viSjq5qW5N/rBFfwoCKQcH8qnnW1fawCapcdEAhIsq+Y3vbrs9bssyDlyU6Vqm4oQmosREaNI7Q==",
+ "dependencies": {
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-pagination": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-3.0.0.tgz",
+ "integrity": "sha512-8oo1iozloZo7TojPVYg4IxL3SJKCBdSJ908fTlIxIK7TWJIKdYnQlW31+12DBJ0NhVZA/lZisPObGF08wT8fKw==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-renderer-ejs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hexo-renderer-ejs/-/hexo-renderer-ejs-2.0.0.tgz",
+ "integrity": "sha512-qCjE1IdwgDgv65qyb0KMVCwCdSVAkH0vwAe9XihjvaKWkmb9dtt8DgErOdqCXn0HReSyWiEVP2BrLRj3gyHwOQ==",
+ "dependencies": {
+ "ejs": "^3.1.6"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/hexo-renderer-marked": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/hexo-renderer-marked/-/hexo-renderer-marked-6.3.0.tgz",
+ "integrity": "sha512-V/ATcJ+tZHkTJSbScPzzHKmrwVMohU8i9MfuX9jp07Un/NpPtaTP821unP3JPu+O1nNLWMi+3xRbFRdm+8vajw==",
+ "dependencies": {
+ "dompurify": "^3.0.3",
+ "hexo-util": "^3.1.0",
+ "jsdom": "^20.0.1",
+ "marked": "^4.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-renderer-stylus": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/hexo-renderer-stylus/-/hexo-renderer-stylus-3.0.1.tgz",
+ "integrity": "sha512-cFm8ZwShBBeFcQwOXc8EK7lIZnSYVD6OJykdL4GBw99hxc4eD5Hlsi32nRzE8sgKv00jhX1s9Da3GVVFMPAVQg==",
+ "dependencies": {
+ "nib": "^1.2.0",
+ "stylus": "^0.62.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/hexo-server": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hexo-server/-/hexo-server-3.0.0.tgz",
+ "integrity": "sha512-u4s0ty9Aew6jV+a9oMrXBwhrRpUQ0U8PWM/88a5aHgDru58VY81mVrxOFxs788NAsWQ8OvsJtF5m7mnXoRnSIA==",
+ "dependencies": {
+ "bluebird": "^3.5.5",
+ "compression": "^1.7.4",
+ "connect": "^3.7.0",
+ "mime": "^3.0.0",
+ "morgan": "^1.9.1",
+ "open": "^8.0.9",
+ "picocolors": "^1.0.0",
+ "serve-static": "^1.14.1"
+ },
+ "engines": {
+ "node": ">=12.13.0"
+ }
+ },
+ "node_modules/hexo-theme-fluid": {
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/hexo-theme-fluid/-/hexo-theme-fluid-1.9.7.tgz",
+ "integrity": "sha512-rLpUNcs8XhAQZ9Iq8nZ27XbMDtbJs/y35kkpPmebUqV9hV+j3/Yy3tf3zKJW3nzZhTO/8bXYrtNDvmoj1TRmBQ==",
+ "engines": {
+ "node": ">=8.10.0"
+ },
+ "peerDependencies": {
+ "nunjucks": "^3.0.0"
+ }
+ },
+ "node_modules/hexo-theme-landscape": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hexo-theme-landscape/-/hexo-theme-landscape-1.0.0.tgz",
+ "integrity": "sha512-bWQJWMqQI78wWiJPQZq5pJBH20TM442ShCaHGRetuEgMraxH0OKxB3NTupJzNEkzEk8DV2yrdizkXdKN6i501A=="
+ },
+ "node_modules/hexo-util": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/hexo-util/-/hexo-util-3.3.0.tgz",
+ "integrity": "sha512-YvGngXijE2muEh5L/VI4Fmjqb+/yAkmY+VuyhWVoRwQu1X7bmWodsfYRXX7CUYhi5LqsvH8FAe/yBW1+f6ZX4Q==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "cross-spawn": "^7.0.3",
+ "deepmerge": "^4.2.2",
+ "highlight.js": "^11.6.0",
+ "htmlparser2": "^9.0.0",
+ "prismjs": "^1.29.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "11.9.0",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz",
+ "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "dependencies": {
+ "whatwg-encoding": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz",
+ "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.1.0",
+ "entities": "^4.5.0"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-errors/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "dependencies": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http-proxy-agent/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/http-proxy-agent/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/https-proxy-agent/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/https-proxy-agent/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/jake": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz",
+ "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/js-yaml-js-types": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/js-yaml-js-types/-/js-yaml-js-types-1.0.1.tgz",
+ "integrity": "sha512-5tpfyORs8OQ43alNERbWfYRCtWgykvzYgY46fUhrQi2+kS7N0NuuFYLZ/IrfmVm5muLTndeMublgraXiFRjEPw==",
+ "dependencies": {
+ "esprima": "^4.0.1"
+ },
+ "peerDependencies": {
+ "js-yaml": "4.x"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
+ "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+ "dependencies": {
+ "abab": "^2.0.6",
+ "acorn": "^8.8.1",
+ "acorn-globals": "^7.0.0",
+ "cssom": "^0.5.0",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^3.0.2",
+ "decimal.js": "^10.4.2",
+ "domexception": "^4.0.0",
+ "escodegen": "^2.0.0",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.2",
+ "parse5": "^7.1.1",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.1.2",
+ "w3c-xmlserializer": "^4.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0",
+ "ws": "^8.11.0",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "engines": [
+ "node >= 0.2.0"
+ ]
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/luxon": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz",
+ "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/marked": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/micro-memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/micro-memoize/-/micro-memoize-4.1.2.tgz",
+ "integrity": "sha512-+HzcV2H+rbSJzApgkj0NdTakkC+bnyeiUxgT6/m7mjcz1CmM22KYFKp+EVj1sWe4UYcnriJr5uqHQD/gMHLD+g=="
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/moize": {
+ "version": "6.1.6",
+ "resolved": "https://registry.npmjs.org/moize/-/moize-6.1.6.tgz",
+ "integrity": "sha512-vSKdIUO61iCmTqhdoIDrqyrtp87nWZUmBPniNjO0fX49wEYmyDO4lvlnFXiGcaH1JLE/s/9HbiK4LSHsbiUY6Q==",
+ "dependencies": {
+ "fast-equals": "^3.0.1",
+ "micro-memoize": "^4.1.2"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moment-timezone": {
+ "version": "0.5.45",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz",
+ "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==",
+ "dependencies": {
+ "moment": "^2.29.4"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/morgan": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
+ "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
+ "dependencies": {
+ "basic-auth": "~2.0.1",
+ "debug": "2.6.9",
+ "depd": "~2.0.0",
+ "on-finished": "~2.3.0",
+ "on-headers": "~1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/nib": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/nib/-/nib-1.2.0.tgz",
+ "integrity": "sha512-7HgrnMl/3yOmWykueO8/D0q+0iWwe7Z+CK2Eaq/xQV8w1hK80WN1oReRQkfkrztbAAnp/nTHkUSl5EcVkor6JQ==",
+ "engines": {
+ "node": "*"
+ },
+ "peerDependencies": {
+ "stylus": "*"
+ }
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nunjucks": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz",
+ "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==",
+ "dependencies": {
+ "a-sync-waterfall": "^1.0.0",
+ "asap": "^2.0.3",
+ "commander": "^5.1.0"
+ },
+ "bin": {
+ "nunjucks-precompile": "bin/precompile"
+ },
+ "engines": {
+ "node": ">= 6.9.0"
+ },
+ "peerDependencies": {
+ "chokidar": "^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "chokidar": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.10",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz",
+ "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ=="
+ },
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+ "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+ "dependencies": {
+ "entities": "^4.4.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
+ "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg=="
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/sax": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
+ "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA=="
+ },
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=v12.22.7"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/send/node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/send/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stylus": {
+ "version": "0.62.0",
+ "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.62.0.tgz",
+ "integrity": "sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg==",
+ "dependencies": {
+ "@adobe/css-tools": "~4.3.1",
+ "debug": "^4.3.2",
+ "glob": "^7.1.6",
+ "sax": "~1.3.0",
+ "source-map": "^0.7.3"
+ },
+ "bin": {
+ "stylus": "bin/stylus"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://opencollective.com/stylus"
+ }
+ },
+ "node_modules/stylus/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/stylus/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/stylus/node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
+ },
+ "node_modules/through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dependencies": {
+ "readable-stream": "3"
+ }
+ },
+ "node_modules/tildify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz",
+ "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/titlecase": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/titlecase/-/titlecase-1.1.3.tgz",
+ "integrity": "sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw==",
+ "bin": {
+ "to-title-case": "bin.js"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ },
+ "node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
+ "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
+ "dependencies": {
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/warehouse": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/warehouse/-/warehouse-5.0.1.tgz",
+ "integrity": "sha512-5BQEQP56bPY+cqocTho4syazuGgSoyKd0y3PsS2j8tGN10HH+CEfJSIY+KUw9D0k4jaVEFMXLz0KqCiUzTYb8A==",
+ "dependencies": {
+ "bluebird": "^3.7.2",
+ "cuid": "^2.1.8",
+ "graceful-fs": "^4.2.10",
+ "hexo-log": "^4.0.1",
+ "is-plain-object": "^5.0.0",
+ "jsonparse": "^1.3.1",
+ "rfdc": "^1.3.0",
+ "through2": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..39cdfe7
--- /dev/null
+++ b/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "hexo-site",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "build": "hexo generate",
+ "clean": "hexo clean",
+ "deploy": "hexo deploy",
+ "server": "hexo server"
+ },
+ "hexo": {
+ "version": "7.2.0"
+ },
+ "dependencies": {
+ "hexo": "^7.3.0",
+ "hexo-deployer-git": "^4.0.0",
+ "hexo-generator-archive": "^2.0.0",
+ "hexo-generator-category": "^2.0.0",
+ "hexo-generator-index": "^3.0.0",
+ "hexo-generator-tag": "^2.0.0",
+ "hexo-renderer-ejs": "^2.0.0",
+ "hexo-renderer-marked": "^6.0.0",
+ "hexo-renderer-stylus": "^3.0.0",
+ "hexo-server": "^3.0.0",
+ "hexo-theme-fluid": "^1.9.7",
+ "hexo-theme-landscape": "^1.0.0"
+ }
+}
diff --git a/scaffolds/draft.md b/scaffolds/draft.md
new file mode 100644
index 0000000..fc8ef29
--- /dev/null
+++ b/scaffolds/draft.md
@@ -0,0 +1,4 @@
+---
+title: {{ title }}
+tags:
+---
diff --git a/scaffolds/page.md b/scaffolds/page.md
new file mode 100644
index 0000000..1a1812b
--- /dev/null
+++ b/scaffolds/page.md
@@ -0,0 +1,4 @@
+---
+title: {{ title }}
+date: {{ date }}
+---
diff --git a/scaffolds/post.md b/scaffolds/post.md
new file mode 100644
index 0000000..0e94afa
--- /dev/null
+++ b/scaffolds/post.md
@@ -0,0 +1,5 @@
+---
+title: {{ title }}
+date: {{ date }}
+tags:
+---
diff --git a/source/_posts/FBX_Exporter_workflow.md b/source/_posts/FBX_Exporter_workflow.md
new file mode 100644
index 0000000..f9effb4
--- /dev/null
+++ b/source/_posts/FBX_Exporter_workflow.md
@@ -0,0 +1,29 @@
+---
+title: FBX Exporter workflow
+date: 2024-05-14 19:00:44
+banner_img: /img/ExporterWorkflow.png
+index_img: /img/ExporterWorkflow.png
+category: Unity
+tags: [Unity, maya]
+---
+
+
+# Step by Step:
+
+### Acquisition and installation
+
+### Unity fbxExport (實機操作演示)
+
+### mesh 置換
+
+### animation 更新
+
+### Visibility switch on off
+
+### light 加入
+
+### 更換材質
+
+### camera 導入 Game CAMERA 視角
+
+### 加入屬性控制 點擊 take 001 檔更新
diff --git a/source/_posts/Follow_object.md b/source/_posts/Follow_object.md
new file mode 100644
index 0000000..08a37e0
--- /dev/null
+++ b/source/_posts/Follow_object.md
@@ -0,0 +1,93 @@
+---
+title: Follow Object
+banner_img: img/maya/followObject.gif
+index_img: img/maya/followObject.gif
+category: maya
+tags: [maya, tool]
+---
+
+## Follow object
+
+
+
+
+
+### GUI
+
+
+### Usage
+```python
+step1. Select your A_object
+
+step2. Check the B_object you want to follow
+
+step3. Check your time range
+
+step4. Apply
+```
+
+### Code
+```python
+#~~ IMPORT - Area ~~#
+
+import maya.cmds as cmds
+import maya.mel as mel
+
+#~~ End of IMPORT Area ~~#
+
+#~~ Script - Area ~~#
+
+WindowWinUi="TargetFollow" #Here must to add ' and ' to be 'xxxxxxxx'
+
+def zarmWppsWinExe(*args):
+ if cmds.window(WindowWinUi, exists = True):
+ cmds.deleteUI(WindowWinUi)
+
+
+
+def Doit():
+ stime = cmds.intField( 'startTimeField', q=1, v=1 )
+ etime = cmds.intField( 'endTimeField', q=1, v=1 ) + 1
+ time = stime
+ sel = cmds.ls(sl = True)
+ for i in range(stime,etime):
+ cmds.currentTime(i)
+ cmds.xform( sel[0],ws=1, m=cmds.xform(sel[1],q=1,ws=1,m=1) )
+ cmds.setKeyframe(sel[0])
+
+#~~ End of Script Area ~~#q
+
+#~~ UI - Area ~~#
+zarmWppsWinExe()
+
+cmds.window(WindowWinUi,bgc=(0.5,0.5,0.5) )
+
+#~~ Contents ~~#
+
+cmds.columnLayout("A")
+
+cmds.rowColumnLayout(p="A",nc=1,cw=[(1,100)])
+
+cmds.text( label='Target Object:')
+
+cmds.separator ( h=5, style='none')
+
+cmds.button(l="Apply",bgc=(0.5,0.8,0.5), command=('Doit()'))
+
+cmds.separator ( h=5, style='none')
+
+cmds.text( label='Time Range:')
+
+cmds.rowColumnLayout(p="A",nc=3,cw=[(1,100),(2,100)])
+
+cmds.intField('startTimeField', v=cmds.playbackOptions( q=1, min=1))
+
+cmds.intField('endTimeField', v=cmds.playbackOptions( q=1, max=1 ))
+
+
+#~~ Contents ~~#
+
+cmds.showWindow(WindowWinUi)
+cmds.window(WindowWinUi,e=1,wh=(204,102),s=1 )
+cmds.window(WindowWinUi,q=1,wh=1)
+```
\ No newline at end of file
diff --git a/source/_posts/Make_Hammer_3_hits_combo_in_Unity.md b/source/_posts/Make_Hammer_3_hits_combo_in_Unity.md
new file mode 100644
index 0000000..a3d12e5
--- /dev/null
+++ b/source/_posts/Make_Hammer_3_hits_combo_in_Unity.md
@@ -0,0 +1,250 @@
+---
+title: Make Hammer 3 hits combo in Unity
+tags: [Unity, maya]
+category: Unity
+index_img: /img/hammer.jfif
+banner_img: /img/MakeHammer.gif
+archive: false
+---
+
+## Unity Game Play View
+
+
+
+
+
+## Design and Thoughts Hammer 3 hits combo
+
+### key pose and spacing
+
+1. 重量感 key pose and spacing
+2. 誇張 key pose
+3. 重量緩衝預備
+4. 重量與動作拉扯感
+
+### 遊戲攻擊節奏 spacing
+
+1. 強調重型武器的重量感,預備與緩衝動作間距小且速度慢,攻擊動作間距大且速度快,如下圖以 Attack 02 為例
+ - Attack02
+
+
+2. 重型武器,hits ( atk01-40 frames、atk02-33 frames、atk03-56 frames ) 如下參考 3 hit combo
+ - 當攻擊間距較大且速度快與預備緩衝間距小且速度慢,會形成反差的對比,玩家在體感上也較可以明顯感受武器的重量
+
+
+
+
+## Import process and settings & build game
+
+### maya export fbx option item
+
+#### option
+
+
+1. Axis Conversion (座標軸轉換):這個選項允許你設置座標軸之間的轉換。你可以根據目標應用程序的座標系統來調整轉換方式,以確保FBX文件在其他軟件中的位置和方向正確。
+
+2. Animation (動畫):
+ - Bake Animation (烘焙動畫):烘焙動畫將動畫數據轉換為關鍵幀,並將其嵌入到FBX文件中。這有助於確保在其他軟件中播放動畫時的一致性和準確性。
+ - Animation Layers (動畫層):選擇是否導出使用了動畫層的動畫數據。
+ - Deformed Models (變形模型):選擇是否導出變形模型,包括綁定的皮膚、骨骼和權重等信息。
+ - Constraints (約束):選擇是否導出場景中的約束條件,例如點約束、方向約束等。
+
+3. Geometry (幾何體):
+ - Smoothing Groups (平滑群組):選擇是否導出平滑群組信息,以保留模型的平滑外觀。
+ - Tangents and Binormals (切線和副法線):選擇是否導出切線和副法線信息,用於光照和渲染效果。
+ - Skins (蒙皮):選擇是否導出模型的蒙皮信息,用於骨骼變形。
+ - Blend Shapes (形狀融合):選擇是否導出形狀融合信息,用於模型的表情和變形。
+
+4. Cameras (相機):選擇是否導出場景中的相機信息,包括位置、方向、焦距等。
+HFOV (Unreal)
+VFOF (Unity)
+
+5. Lights (燈光):選擇是否導出場景中的燈光信息,包括位置、類型、光強度等。
+
+6. Embed Media (嵌入媒體):選擇是否將媒體文件嵌入到FBX文件中。這包括導出使用的紋理貼圖、材質、音頻文件等。如果你選擇嵌入媒體,那麼FBX文件將成為一個獨立的文件,不再需要依賴外部媒體文件。
+
+7. Embed Textures (嵌入紋理):選擇是否將紋理貼圖嵌入到FBX文件中。如果你選擇嵌入紋理,那麼紋理文件將成為FBX文件的一部分,不再需要單獨的紋理文件。
+8. Up Axis (上軸):設置FBX文件中的上軸方向。根據不同的應用程序和預設設置,你可以選擇將上軸設置為X、Y或Z軸。
+9. Collada (DAE) Options (Collada (DAE) 選項):如果你要導出Collada格式(.dae),你可以在這裡設置相關選項,例如導出點約束、動畫等。
+10. Constraints (約束):選擇是否導出場景中的約束信息,例如鏈接約束、點約束等。
+11. Include Cameras (包括相機):選擇是否導出場景中的相機。
+12. Include Lights (包括燈光):選擇是否導出場景中的燈光。
+
+### Setting up the animation and blending attributes:
+
+#### animation assets
+
+
+#### Setting up the animation and blending attributes.
+
+
+### create player_camera
+
+#### CameraFollow.cs
+```cs
+using UnityEngine;
+
+public class CameraFollow : MonoBehaviour
+{
+ public Transform target; // 角色的 Transform
+ public Vector3 offset; // 相機和角色之間的偏移量
+ public float smoothSpeed = 0.125f; // 平滑跟隨的速度
+
+ void LateUpdate()
+ {
+ // 計算相機應該的位置
+ Vector3 desiredPosition = target.position + offset;
+ // 平滑移動相機到目標位置
+ Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
+ transform.position = smoothedPosition;
+
+ // 確保相機朝向角色
+ transform.LookAt(target);
+ }
+}
+```
+
+### create scene & props
+#### assets:
+
+
+#### processing:
+
+
+### add sounds to gameplay
+
+ #### sounds assets
+
+
+ #### setup in animation then add events to frmes bar
+
+
+### setup animator controller
+
+#### controller assets
+
+
+### animator controller
+
+
+
+
+
+### sciprts
+
+#### scripts assets
+
+
+#### Attack.cs
+```cs
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Audio;
+
+public class Attack : MonoBehaviour
+{
+ private Animator animator;
+ private bool isAttacking = false;
+ private AudioSource audioSource;
+ public AudioClip attackSound01; // Attack01 的音效檔
+ public AudioClip attackSound02; // Attack02 的音效檔
+ public AudioClip attackSound03; // Attack03 的音效檔
+
+
+ // Start is called before the first frame update
+ void Start()
+ {
+ animator = GetComponent();
+ audioSource = GetComponent();
+
+ if (audioSource == null)
+ {
+ Debug.LogError("AudioSource component is missing!");
+ }
+ }
+
+ // Update is called once per frame
+ void Update()
+ {
+ if (Input.GetKeyDown(KeyCode.Mouse0))
+ {
+ HandleAttack();
+ }
+
+ // 檢查當前動畫狀態,如果不是攻擊動畫,則重置攻擊狀態
+ AnimatorStateInfo currentState = animator.GetCurrentAnimatorStateInfo(0);
+ if (isAttacking && !currentState.IsName("ANI_Player_Warhammer_Attack01") &&
+ !currentState.IsName("ANI_Player_Warhammer_Attack02") &&
+ !currentState.IsName("ANI_Player_Warhammer_Attack03"))
+ {
+ isAttacking = false;
+ }
+ }
+
+ void HandleAttack()
+ {
+ var currentState = animator.GetCurrentAnimatorStateInfo(0);
+ Debug.Log("Current State: " + currentState.fullPathHash);
+
+ if (currentState.IsName("ANI_Player_Warhammer_Attack02"))
+ {
+ // 如果當前的動畫狀態是 Attack02,立即觸發 Attack03
+ Debug.Log("Triggering Attack03");
+ animator.SetTrigger("Attack03Trigger");
+ }
+ else if (currentState.IsName("ANI_Player_Warhammer_Attack01"))
+ {
+ // 如果當前的動畫狀態是 Attack01,立即觸發 Attack02
+ Debug.Log("Triggering Attack02");
+ animator.SetTrigger("Attack02Trigger");
+ }
+ else
+ {
+ // 否則,觸發 Attack01
+ Debug.Log("Triggering Attack01");
+ isAttacking = true;
+ animator.SetTrigger("Attack01Trigger");
+ }
+
+ }
+ public void PlayAttackSound(int attackNumber)
+ {
+ Debug.Log("Attempting to play sound");
+ AudioClip clipToPlay = null;
+ switch (attackNumber)
+ {
+ case 1:
+ clipToPlay = attackSound01;
+ break;
+ case 2:
+ clipToPlay = attackSound02;
+ break;
+ case 3:
+ clipToPlay = attackSound03;
+ break;
+ default:
+ Debug.LogError("Invalid attack number!");
+ return;
+ }
+
+ if (clipToPlay != null && audioSource != null)
+ {
+ Debug.Log("AudioSource and AudioClip are set correctly");
+ audioSource.PlayOneShot(clipToPlay);
+ Debug.Log("Playing Attack Sound " + attackNumber);
+ }
+ else
+ {
+ if (clipToPlay == null)
+ {
+ Debug.LogError("Attack sound is not set!");
+ }
+ if (audioSource == null)
+ {
+ Debug.LogError("AudioSource component is missing!");
+ }
+ }
+ }
+}
+```
\ No newline at end of file
diff --git a/source/_posts/MoCapGraphPlus.md b/source/_posts/MoCapGraphPlus.md
new file mode 100644
index 0000000..5298290
--- /dev/null
+++ b/source/_posts/MoCapGraphPlus.md
@@ -0,0 +1,671 @@
+---
+title: MoCap GraphPlus
+banner_img: img/maya/MoCapGraphPlus.gif
+index_img: /img/maya/curve_editor_tool.png
+category: maya
+tags: [maya, tool]
+---
+
+## usage function
+- oaSmoothKeys:選取軸向進行平滑
+- Get value:取得目前軸向的數值
+- Translate(Rotate)X,Y,Z:選擇anim curve
+- Set Keyframe:取得目前軸向峰值keypose
+- Value Zero:取得目前軸向值將 anim curver 第一格歸
+
+## Gui
+
+
+
+## demo
+
+
+
+
+## scripts
+
+### python2
+{% note info %}
+```python
+import pymel.core as pm
+import maya.cmds as cmds
+
+
+if cmds.window("GE_ui_window", exists=True): #If the window exists
+ cmds.deleteUI("GE_ui_window") #Delete it
+
+cmds.window("GE_ui_window", title="My custom Graph Editor") #Create your custom win
+cmds.frameLayout("GE_ui_frameLayout", p="GE_ui_window", lv=False, bv=False )
+
+
+if cmds.scriptedPanel("GE_ui_scriptedPanel", exists=True): #If the scriptel panel already exists
+ cmds.deleteUI("GE_ui_scriptedPanel") #Delete it
+cmds.scriptedPanel("GE_ui_scriptedPanel", unParent=True, type="graphEditor")
+cmds.scriptedPanel( "GE_ui_scriptedPanel", e=True, parent="GE_ui_window|GE_ui_frameLayout") #parent the scripted panel to your frame layout
+
+
+TranslateX = 0
+TranslateY = 0
+TranslateZ = 0
+RotateX = 0
+RotateY = 0
+RotateZ = 0
+
+minV = False
+maxV = False
+
+kf_list = []
+
+def sl():
+ depNodeName = cmds.ls(sl = True)
+ if depNodeName:
+ depNodeName = cmds.ls(sl = True)[0]
+ else:
+ depNodeName = cmds.ls(sl = True)
+ return depNodeName
+
+def Get():
+ TranslateX = cmds.getAttr(sl() + '.translateX')
+ cmds.floatField('TranslateX_V', e=1,v = TranslateX )
+ TranslateY = cmds.getAttr(sl() + '.translateY')
+ cmds.floatField('TranslateY_V', e=1,v = TranslateY )
+ TranslateZ = cmds.getAttr(sl() + '.translateZ')
+ cmds.floatField('TranslateZ_V', e=1,v = TranslateZ )
+ RotateX = cmds.getAttr(sl() + '.rotateX')
+ cmds.floatField('RotateX_V', e=1,v = RotateX )
+ RotateY = cmds.getAttr(sl() + '.rotateY')
+ cmds.floatField('RotateY_V', e=1,v = RotateY )
+ RotateZ = cmds.getAttr(sl() + '.rotateZ')
+ cmds.floatField('RotateZ_V', e=1,v = RotateZ )
+
+ time_v()
+ global TranslateX, TranslateY, TranslateZ, RotateX, RotateY, RotateZ
+
+
+def oaSmoothkeys():
+ curves=cmds.keyframe(q=1, name=1)
+ #Get the selected curves
+ if len(curves) == 0:
+ cmds.mel.error("Select at least 3 keys in the Graph Editor.")
+ #Go
+
+ prevVal = []
+ currVal = []
+ nextVal = []
+ average = 0.0
+ keys = []
+ #frame numbers
+ sizeOfKeys = 0
+ dupCurve = []
+ dupCurveVal = []
+ for curve in curves:
+ keys=cmds.keyframe(curve, q=1, sl=1)
+ #Get the selected keys
+ sizeOfKeys=len(keys)
+ #The first and last key will not be touched.
+ #Therefore there must be at least 3 keys selected.
+ if sizeOfKeys<3:
+ continue
+ #Duplicate the curve to store values in
+
+ dupCurve=cmds.duplicate(curve)
+ #Start with frame 2, don't touch last frame
+ for i in range(1,sizeOfKeys - 1):
+ prevVal=cmds.keyframe(curve, q=1, vc=1, time=(keys[i - 1],keys[i - 1]))
+ currVal=cmds.keyframe(curve, q=1, vc=1, time=(keys[i],keys[i]))
+ nextVal=cmds.keyframe(curve, q=1, vc=1, time=(keys[i + 1],keys[i + 1]))
+ #Calculate average
+ average= (prevVal[0] + currVal[0] + nextVal[0]) / 3
+ #Store the value in the dup curve
+ cmds.keyframe(dupCurve[0], valueChange=average, absolute=1, time=(keys[i],keys[i]))
+
+ #Apply the new values
+ for i in range(1,sizeOfKeys - 1):
+ dupCurveVal=cmds.keyframe(dupCurve[0], q=1, vc=1, time=(keys[i],keys[i]))
+ cmds.keyframe(curve, valueChange=dupCurveVal[0], absolute=1, time=(keys[i],keys[i]))
+
+ cmds.delete(dupCurve[0])
+
+
+#if have a animLayer or not animLayer attr change name
+# sample 1.original: [ pSphere1_translateX ]
+# 2.layer: [ pSphere1_translateX_AnimLayer1_inputB ]
+# 3.merge layer:[ pSphere1_translateX_Merged_Layer_inputB ]
+def Sel_Attr():
+ crvAll = []
+ for atr in cmds.listAttr(sl(),k=1):
+ # print atr
+ connectAtrs = cmds.listConnections('%s.%s'%(sl(),atr))
+ # print connectAtrs
+ getAniCrv = cmds.ls(connectAtrs,typ='animCurve')
+ crvAll += getAniCrv
+
+ if getAniCrv:
+ crvAll += getAniCrv
+ if connectAtrs:
+ for cta in connectAtrs:
+ # print '----', cta
+ crvAll += cmds.listConnections(cta,type='animCurve')or []
+ else:
+ pass
+ # print connectAtrs
+ Tx = [v for v in crvAll if "translateX" in v or "TranslateX1" in v]
+ Ty = [v for v in crvAll if "translateY" in v or "TranslateY1" in v]
+ Tz = [v for v in crvAll if "translateZ" in v or "TranslateZ1" in v]
+ Rx = [v for v in crvAll if "rotate" in v and "X" in v or "inRotateX" in v]
+ Ry = [v for v in crvAll if "rotate" in v and "Y" in v or "inRotateY" in v]
+ Rz = [v for v in crvAll if "rotate" in v and "Z" in v or "inRotateZ" in v]
+ return Tx, Ty, Tz, Rx, Ry, Rz
+
+
+#Combine 2 lists into 1 dictionary
+def Opt_Tx():
+ cmds.selectKey(Sel_Attr()[0])
+ cmds.FrameSelected()
+ Get()
+
+def Opt_Ty():
+ cmds.selectKey(Sel_Attr()[1])
+ cmds.FrameSelected()
+ Get()
+
+def Opt_Tz():
+ cmds.FrameSelected()
+ cmds.selectKey(Sel_Attr()[2])
+ Get()
+
+def RotateX_Doit():
+ cmds.FrameSelected()
+ cmds.selectKey(Sel_Attr()[3])
+
+def RotateY_Doit():
+ cmds.FrameSelected()
+ cmds.selectKey(Sel_Attr()[4])
+
+def RotateZ_Doit():
+ cmds.FrameSelected()
+ cmds.selectKey(Sel_Attr()[5])
+
+
+def time_v():
+ n1 = cmds.keyframe(sl(), q =True)
+ minV = min(n1)
+ maxV = max(n1)
+ cmds.playbackOptions(min =minV, max = maxV)
+
+ global minV , maxV
+
+
+#Combine 2 lists into 1 dictionary
+
+def setkeyframe():
+ selobj = cmds.keyframe(q=1,n=1)
+ min = minV
+ max = maxV
+
+ axial_V = []
+ for i in selobj:
+ if 'translateX' in i:
+ axial_V = '.tx'
+ print axial_V
+ elif 'translateY' in i:
+ axial_V = '.ty'
+ print axial_V
+ elif 'translateZ' in i:
+ axial_V = '.tz'
+ print axial_V
+ elif 'rotate' and 'X' in i:
+ axial_V = '.rx'
+ print axial_V
+ elif 'rotate' and 'Y' in i:
+ axial_V = '.ry'
+ print axial_V
+ elif 'rotate' and 'Z' in i:
+ axial_V = '.rz'
+ print axial_V
+
+ val_list = cmds.keyframe(sl() + axial_V, q = True, vc= True)
+ key_list = cmds.keyframe(sl() + axial_V, q = True)
+
+ # print key_list, val_list
+ kv_list = zip(key_list,val_list)
+ kv_list = sorted(kv_list,key=lambda x:x[0])
+
+ if kf_list:
+ kf_list = []
+ else:
+ pass
+
+ for i in range(len(kv_list)):
+ key, value = kv_list[i]
+ bi, ai = i-1, i+1
+ #If first is equal to -1 or the latter value is greater than the length -1 to skip
+ if bi == -1 or ai > (len(kv_list)-1):continue
+
+ if kv_list[i][0] == min +1 or kv_list[i][0] == max -1:
+ # Get the smallest keyframe of the length
+ if kv_list[i][0] == min +1:
+ kf_list.append(min)
+ # Get the largest keyframe in length
+ if kv_list[i][0] == max -1:
+ kf_list.append(max)
+ #Get the most extreme keyframe in length
+ if kv_list[i][1] > kv_list[bi][1] and kv_list[i][1] > kv_list[ai][1]:
+ kf_list.append(key)
+ if kv_list[i][1] < kv_list[bi][1] and kv_list[i][1] < kv_list[ai][1]:
+ kf_list.append(key)
+
+ global kf_list
+
+ pm.mel.animLayerEditorOnSelect("BaseAnimation", 0)
+ cmds.animLayer((sl()), at = sl() ,aso =1 )
+ for i in kf_list:
+ cmds.setKeyframe(id = True, t= (i), bd = True)
+
+#Value zero
+def ValueZero_Doit():
+ selobj = cmds.keyframe(q=1,n=1)
+
+ axial_V = []
+ for i in selobj:
+ if 'X' in i:
+ axial_V = '.tx'
+ cmds.currentTime(minV)
+ TranslateX = cmds.getAttr(sl() + '.translateX')
+ cmds.keyframe(an='keys',r=1, vc =(0 -TranslateX))
+ Get()
+ print axial_V
+ elif 'Y' in i:
+ axial_V = '.ty'
+ TranslateY = cmds.getAttr(sl() + '.translateY')
+ cmds.keyframe(an='keys',r=1, vc =(0-TranslateY))
+ Get()
+ print axial_V
+ elif 'Z' in i:
+ axial_V = '.tz'
+ cmds.currentTime(minV)
+ TranslateZ = cmds.getAttr(sl() + '.translateZ')
+ cmds.keyframe(an='keys',r=1, vc =(0-TranslateZ))
+ Get()
+ print axial_V
+ elif 'rotate' and 'X' in i:
+ axial_V = '.rx'
+ print axial_V
+ elif 'rotate' and 'Y' in i:
+ axial_V = '.ry'
+ print axial_V
+ elif 'rotate' and 'Z' in i:
+ axial_V = '.rz'
+ print axial_V
+
+cmds.showWindow("GE_ui_window")
+
+channelLayout = cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", query=True, ca=True)[0] #Get the channel box's layout
+filterLayout = cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", query=True, ca=True)[1] #Get the filter's layout
+
+myRowLayout =cmds.rowColumnLayout(numberOfColumns=2 ,cw=[(1,105),(2,105)],bgc=(0.2,0.2,0.2), p="GE_ui_scriptedPanelOutlineEdForm") #Create a row layout
+cmds.button(l="oaSmoothKeys",bgc=(0.0,0.0,0.3) , command=('oaSmoothkeys()'))
+cmds.button(l="Get value", command=('Get()'))
+cmds.button(l="TranslateX",bgc=(0.6,0.6,0.6),command=('Opt_Tx()'))
+cmds.floatField('TranslateX_V',bgc = (0.1,0.1,0.1), v =TranslateX)
+
+cmds.button(l="TranslateY",bgc=(0.6,0.6,0.6),command=('Opt_Ty()'))
+cmds.floatField('TranslateY_V',bgc = (0.1,0.1,0.1), v = TranslateY)
+
+cmds.button(l="TranslateZ",bgc=(0.6,0.6,0.6),command=('Opt_Tz()'))
+cmds.floatField('TranslateZ_V',bgc = (0.1,0.1,0.1), v = TranslateZ)
+
+cmds.button(l="RotateX",bgc=(0.6,0.6,0.6),command=('RotateX_Doit()'))
+cmds.floatField('RotateX_V',bgc = (0.1,0.1,0.1), v = RotateX)
+
+cmds.button(l="RotateY",bgc=(0.6,0.6,0.6),command=('RotateY_Doit()'))
+cmds.floatField('RotateY_V',bgc = (0.1,0.1,0.1), v = RotateY)
+
+cmds.button(l="RotateZ",bgc=(0.6,0.6,0.6),command=('RotateZ_Doit()'))
+cmds.floatField('RotateZ_V',bgc = (0.1,0.1,0.1), v = RotateZ)
+
+cmds.button(l="Set_Keyframe",bgc = (0.0,0.8,0), command=('setkeyframe()'))
+cmds.button(l="Value Zero",bgc = (0.8,0,0), command=('ValueZero_Doit()'))
+
+# cmds.text("Time Slider")
+# cmds.separator ( h=20, style='none')
+
+# cmds.intField('startTimeField',bgc = (0.1,0.1,0.1), v = cmds.playbackOptions(ast = minV ,min = minV))
+# cmds.intField('endTimeField',bgc = (0.1,0.1,0.1), v = cmds.playbackOptions(aet =maxV, max = maxV))
+cmds.separator ( h=2, style='none',bgc = (0.8,0.0,0.0))
+cmds.separator ( h=2, style='none',bgc = (0.8,0.0,0.0))
+
+#This will reorder the content of the left formLayout
+cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", edit=True, af=[ \
+ (channelLayout, "bottom", 0), \
+ (channelLayout, "right", 0), \
+ (filterLayout, "top", 0), \
+ (myRowLayout, "left", 0), \
+ (myRowLayout, "right", 0)], \
+ ac=[(myRowLayout, "top", 0, filterLayout), \
+ (channelLayout, "top", 0, myRowLayout)])
+```
+{% endnote %}
+
+### python3
+{% note info %}
+```python
+import pymel.core as pm
+import maya.cmds as cmds
+
+
+if cmds.window("GE_ui_window", exists=True): #If the window exists
+ cmds.deleteUI("GE_ui_window") #Delete it
+
+cmds.window("GE_ui_window", title="My custom Graph Editor") #Create your custom win
+cmds.frameLayout("GE_ui_frameLayout", p="GE_ui_window", lv=False, bv=False )
+
+
+if cmds.scriptedPanel("GE_ui_scriptedPanel", exists=True): #If the scriptel panel already exists
+ cmds.deleteUI("GE_ui_scriptedPanel") #Delete it
+cmds.scriptedPanel("GE_ui_scriptedPanel", unParent=True, type="graphEditor")
+cmds.scriptedPanel( "GE_ui_scriptedPanel", e=True, parent="GE_ui_window|GE_ui_frameLayout") #parent the scripted panel to your frame layout
+
+
+TranslateX = 0
+TranslateY = 0
+TranslateZ = 0
+RotateX = 0
+RotateY = 0
+RotateZ = 0
+
+minV = False
+maxV = False
+
+kf_list = []
+
+def sl():
+ depNodeName = cmds.ls(sl = True)
+ if depNodeName:
+ depNodeName = cmds.ls(sl = True)[0]
+ else:
+ depNodeName = cmds.ls(sl = True)
+ return depNodeName
+
+def Get():
+ TranslateX = cmds.getAttr(sl() + '.translateX')
+ cmds.floatField('TranslateX_V', e=1,v = TranslateX )
+ TranslateY = cmds.getAttr(sl() + '.translateY')
+ cmds.floatField('TranslateY_V', e=1,v = TranslateY )
+ TranslateZ = cmds.getAttr(sl() + '.translateZ')
+ cmds.floatField('TranslateZ_V', e=1,v = TranslateZ )
+ RotateX = cmds.getAttr(sl() + '.rotateX')
+ cmds.floatField('RotateX_V', e=1,v = RotateX )
+ RotateY = cmds.getAttr(sl() + '.rotateY')
+ cmds.floatField('RotateY_V', e=1,v = RotateY )
+ RotateZ = cmds.getAttr(sl() + '.rotateZ')
+ cmds.floatField('RotateZ_V', e=1,v = RotateZ )
+
+ time_v()
+ #global TranslateX, TranslateY, TranslateZ, RotateX, RotateY, RotateZ
+
+
+def oaSmoothkeys():
+ curves=cmds.keyframe(q=1, name=1)
+ #Get the selected curves
+ if len(curves) == 0:
+ cmds.mel.error("Select at least 3 keys in the Graph Editor.")
+ #Go
+
+ prevVal = []
+ currVal = []
+ nextVal = []
+ average = 0.0
+ keys = []
+ #frame numbers
+ sizeOfKeys = 0
+ dupCurve = []
+ dupCurveVal = []
+ for curve in curves:
+ keys=cmds.keyframe(curve, q=1, sl=1)
+ #Get the selected keys
+ sizeOfKeys=len(keys)
+ #The first and last key will not be touched.
+ #Therefore there must be at least 3 keys selected.
+ if sizeOfKeys<3:
+ continue
+ #Duplicate the curve to store values in
+
+ dupCurve=cmds.duplicate(curve)
+ #Start with frame 2, don't touch last frame
+ for i in range(1,sizeOfKeys - 1):
+ prevVal=cmds.keyframe(curve, q=1, vc=1, time=(keys[i - 1],keys[i - 1]))
+ currVal=cmds.keyframe(curve, q=1, vc=1, time=(keys[i],keys[i]))
+ nextVal=cmds.keyframe(curve, q=1, vc=1, time=(keys[i + 1],keys[i + 1]))
+ #Calculate average
+ average= (prevVal[0] + currVal[0] + nextVal[0]) / 3
+ #Store the value in the dup curve
+ cmds.keyframe(dupCurve[0], valueChange=average, absolute=1, time=(keys[i],keys[i]))
+
+ #Apply the new values
+ for i in range(1,sizeOfKeys - 1):
+ dupCurveVal=cmds.keyframe(dupCurve[0], q=1, vc=1, time=(keys[i],keys[i]))
+ cmds.keyframe(curve, valueChange=dupCurveVal[0], absolute=1, time=(keys[i],keys[i]))
+
+ cmds.delete(dupCurve[0])
+
+
+#if have a animLayer or not animLayer attr change name
+# sample 1.original: [ pSphere1_translateX ]
+# 2.layer: [ pSphere1_translateX_AnimLayer1_inputB ]
+# 3.merge layer:[ pSphere1_translateX_Merged_Layer_inputB ]
+def Sel_Attr():
+ crvAll = []
+ for atr in cmds.listAttr(sl(),k=1):
+ # print atr
+ connectAtrs = cmds.listConnections('%s.%s'%(sl(),atr))
+ # print connectAtrs
+ getAniCrv = cmds.ls(connectAtrs,typ='animCurve')
+ crvAll += getAniCrv
+
+ if getAniCrv:
+ crvAll += getAniCrv
+ if connectAtrs:
+ for cta in connectAtrs:
+ # print '----', cta
+ crvAll += cmds.listConnections(cta,type='animCurve')or []
+ else:
+ pass
+ # print connectAtrs
+ Tx = [v for v in crvAll if "translateX" in v or "TranslateX1" in v]
+ Ty = [v for v in crvAll if "translateY" in v or "TranslateY1" in v]
+ Tz = [v for v in crvAll if "translateZ" in v or "TranslateZ1" in v]
+ Rx = [v for v in crvAll if "rotate" in v and "X" in v or "inRotateX" in v]
+ Ry = [v for v in crvAll if "rotate" in v and "Y" in v or "inRotateY" in v]
+ Rz = [v for v in crvAll if "rotate" in v and "Z" in v or "inRotateZ" in v]
+ return Tx, Ty, Tz, Rx, Ry, Rz
+
+
+#Combine 2 lists into 1 dictionary
+def Opt_Tx():
+ cmds.selectKey(Sel_Attr()[0])
+ cmds.FrameSelected()
+ Get()
+
+def Opt_Ty():
+ cmds.selectKey(Sel_Attr()[1])
+ cmds.FrameSelected()
+ Get()
+
+def Opt_Tz():
+ cmds.FrameSelected()
+ cmds.selectKey(Sel_Attr()[2])
+ Get()
+
+def RotateX_Doit():
+ cmds.FrameSelected()
+ cmds.selectKey(Sel_Attr()[3])
+
+def RotateY_Doit():
+ cmds.FrameSelected()
+ cmds.selectKey(Sel_Attr()[4])
+
+def RotateZ_Doit():
+ cmds.FrameSelected()
+ cmds.selectKey(Sel_Attr()[5])
+
+
+def time_v():
+ n1 = cmds.keyframe(sl(), q =True)
+ minV = min(n1)
+ maxV = max(n1)
+ cmds.playbackOptions(min =minV, max = maxV)
+
+ #global minV , maxV
+
+
+#Combine 2 lists into 1 dictionary
+
+def setkeyframe():
+ selobj = cmds.keyframe(q=1,n=1)
+ min = minV
+ max = maxV
+
+ axial_V = []
+ for i in selobj:
+ if 'translateX' in i:
+ axial_V = '.tx'
+ print (axial_V)
+ elif 'translateY' in i:
+ axial_V = '.ty'
+ print (axial_V)
+ elif 'translateZ' in i:
+ axial_V = '.tz'
+ print (axial_V)
+ elif 'rotate' and 'X' in i:
+ axial_V = '.rx'
+ print (axial_V)
+ elif 'rotate' and 'Y' in i:
+ axial_V = '.ry'
+ print (axial_V)
+ elif 'rotate' and 'Z' in i:
+ axial_V = '.rz'
+ print (axial_V)
+
+ val_list = cmds.keyframe(sl() + axial_V, q = True, vc= True)
+ key_list = cmds.keyframe(sl() + axial_V, q = True)
+
+ # print key_list, val_list
+ kv_list = zip(key_list,val_list)
+ kv_list = sorted(kv_list,key=lambda x:x[0])
+
+ if kf_list:
+ kf_list = []
+ else:
+ pass
+
+ for i in range(len(kv_list)):
+ key, value = kv_list[i]
+ bi, ai = i-1, i+1
+ #If first is equal to -1 or the latter value is greater than the length -1 to skip
+ if bi == -1 or ai > (len(kv_list)-1):continue
+
+ if kv_list[i][0] == min +1 or kv_list[i][0] == max -1:
+ # Get the smallest keyframe of the length
+ if kv_list[i][0] == min +1:
+ kf_list.append(min)
+ # Get the largest keyframe in length
+ if kv_list[i][0] == max -1:
+ kf_list.append(max)
+ #Get the most extreme keyframe in length
+ if kv_list[i][1] > kv_list[bi][1] and kv_list[i][1] > kv_list[ai][1]:
+ kf_list.append(key)
+ if kv_list[i][1] < kv_list[bi][1] and kv_list[i][1] < kv_list[ai][1]:
+ kf_list.append(key)
+
+ #global kf_list
+
+ pm.mel.animLayerEditorOnSelect("BaseAnimation", 0)
+ cmds.animLayer((sl()), at = sl() ,aso =1 )
+ for i in kf_list:
+ cmds.setKeyframe(id = True, t= (i), bd = True)
+
+#Value zero
+def ValueZero_Doit():
+ selobj = cmds.keyframe(q=1,n=1)
+
+ axial_V = []
+ for i in selobj:
+ if 'X' in i:
+ axial_V = '.tx'
+ cmds.currentTime(minV)
+ TranslateX = cmds.getAttr(sl() + '.translateX')
+ cmds.keyframe(an='keys',r=1, vc =(0 -TranslateX))
+ Get()
+ print (axial_V)
+ elif 'Y' in i:
+ axial_V = '.ty'
+ TranslateY = cmds.getAttr(sl() + '.translateY')
+ cmds.keyframe(an='keys',r=1, vc =(0-TranslateY))
+ Get()
+ print (axial_V)
+ elif 'Z' in i:
+ axial_V = '.tz'
+ cmds.currentTime(minV)
+ TranslateZ = cmds.getAttr(sl() + '.translateZ')
+ cmds.keyframe(an='keys',r=1, vc =(0-TranslateZ))
+ Get()
+ print (axial_V)
+ elif 'rotate' and 'X' in i:
+ axial_V = '.rx'
+ print (axial_V)
+ elif 'rotate' and 'Y' in i:
+ axial_V = '.ry'
+ print (axial_V)
+ elif 'rotate' and 'Z' in i:
+ axial_V = '.rz'
+ print (axial_V)
+
+cmds.showWindow("GE_ui_window")
+
+channelLayout = cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", query=True, ca=True)[0] #Get the channel box's layout
+filterLayout = cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", query=True, ca=True)[1] #Get the filter's layout
+
+myRowLayout =cmds.rowColumnLayout(numberOfColumns=2 ,cw=[(1,105),(2,105)],bgc=(0.2,0.2,0.2), p="GE_ui_scriptedPanelOutlineEdForm") #Create a row layout
+cmds.button(l="oaSmoothKeys",bgc=(0.0,0.0,0.3) , command=('oaSmoothkeys()'))
+cmds.button(l="Get value", command=('Get()'))
+cmds.button(l="TranslateX",bgc=(0.6,0.6,0.6),command=('Opt_Tx()'))
+cmds.floatField('TranslateX_V',bgc = (0.1,0.1,0.1), v =TranslateX)
+
+cmds.button(l="TranslateY",bgc=(0.6,0.6,0.6),command=('Opt_Ty()'))
+cmds.floatField('TranslateY_V',bgc = (0.1,0.1,0.1), v = TranslateY)
+
+cmds.button(l="TranslateZ",bgc=(0.6,0.6,0.6),command=('Opt_Tz()'))
+cmds.floatField('TranslateZ_V',bgc = (0.1,0.1,0.1), v = TranslateZ)
+
+cmds.button(l="RotateX",bgc=(0.6,0.6,0.6),command=('RotateX_Doit()'))
+cmds.floatField('RotateX_V',bgc = (0.1,0.1,0.1), v = RotateX)
+
+cmds.button(l="RotateY",bgc=(0.6,0.6,0.6),command=('RotateY_Doit()'))
+cmds.floatField('RotateY_V',bgc = (0.1,0.1,0.1), v = RotateY)
+
+cmds.button(l="RotateZ",bgc=(0.6,0.6,0.6),command=('RotateZ_Doit()'))
+cmds.floatField('RotateZ_V',bgc = (0.1,0.1,0.1), v = RotateZ)
+
+cmds.button(l="Set_Keyframe",bgc = (0.0,0.8,0), command=('setkeyframe()'))
+cmds.button(l="Value Zero",bgc = (0.8,0,0), command=('ValueZero_Doit()'))
+
+# cmds.text("Time Slider")
+# cmds.separator ( h=20, style='none')
+
+# cmds.intField('startTimeField',bgc = (0.1,0.1,0.1), v = cmds.playbackOptions(ast = minV ,min = minV))
+# cmds.intField('endTimeField',bgc = (0.1,0.1,0.1), v = cmds.playbackOptions(aet =maxV, max = maxV))
+cmds.separator ( h=2, style='none',bgc = (0.8,0.0,0.0))
+cmds.separator ( h=2, style='none',bgc = (0.8,0.0,0.0))
+
+#This will reorder the content of the left formLayout
+cmds.formLayout("GE_ui_scriptedPanelOutlineEdForm", edit=True, af=[ \
+ (channelLayout, "bottom", 0), \
+ (channelLayout, "right", 0), \
+ (filterLayout, "top", 0), \
+ (myRowLayout, "left", 0), \
+ (myRowLayout, "right", 0)], \
+ ac=[(myRowLayout, "top", 0, filterLayout), \
+ (channelLayout, "top", 0, myRowLayout)])
+```
+{% endnote %}
\ No newline at end of file
diff --git a/source/_posts/Position-Locator.md b/source/_posts/Position-Locator.md
new file mode 100644
index 0000000..68c1130
--- /dev/null
+++ b/source/_posts/Position-Locator.md
@@ -0,0 +1,35 @@
+---
+title: Position Locator
+banner_img: img/maya/posicitionLocator.gif
+index_img: /img/maya/posicitionLocator.gif
+comment: 'remark42'
+category: maya
+tags: [maya, tool]
+---
+
+## usage
+- 點擊要建立locator的位置,按下script
+
+## demo
+
+
+
+
+## scripts
+{% note success %}
+```python
+import maya.cmds as cmds
+
+sel=cmds.ls(sl=1)
+bigbig = 20
+lc = cmds.spaceLocator()[0]
+sp = cmds.listRelatives( lc, s=1 )[0]
+
+cmds.setAttr("%s.overrideEnabled" % sp, 1 )
+cmds.setAttr("%s.overrideColor" % sp, 9 )
+
+cmds.setAttr( "%s.localScale" % sp, bigbig, bigbig, bigbig )
+cmds.xform( lc,ws=1, ro=cmds.xform(sel[0],q=1,ws=1,ro=1))
+cmds.xform( lc,ws=1,t=cmds.xform(sel[0],q=1,ws=1,t=1))
+```
+{% endnote %}
\ No newline at end of file
diff --git a/source/_posts/Remote-SSH-to-GCP-VM.md b/source/_posts/Remote-SSH-to-GCP-VM.md
new file mode 100644
index 0000000..2522167
--- /dev/null
+++ b/source/_posts/Remote-SSH-to-GCP-VM.md
@@ -0,0 +1,134 @@
+---
+title: Remote -SSH to GCP-VM
+banner_img: img/SSHtoGCPVM.png
+index_img: /img/SSHtoGCPVM.png
+comment: 'remark42'
+tags: SSH
+---
+
+# Remote -SSH to GCP VM
+
+
+
+
+
+## Step 1 install Remote - SSH extenxions
+
+
+
+## Step 2 google GCP 確定你的VM
+
+
+
+## Step 3 connect your VS Code ,快速鍵 F1 或 View > Command Palette
+
+
+
+
+## Step 4 搜尋Remote - SSH > Remote - SSH: Open SSH Configuration File
+
+
+
+### Step 4.2打開 使用者配置檔案 /User/codeart/.ssh/config
+
+
+
+#### 對應的參數
+```json
+# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
+ Host remote-ssh-demo // VM的名稱
+ HostName 35.234.24.25 // 外部IP位址
+ User wu_peiflower01 // 你的使用者名稱
+ IdentityFile // 新增一組 Key
+```
+
+
+
+## Step 6 打開Terminal (終端機) 或 按熱鍵
+
+
+
+
+## Step 7 在終端機 cd 到 /User/codeart/ 資料夾下面 建立資料夾 mykeys 產生私錀
+
+
+
+```json
+cd /User/codeart //使用者下的使用者名稱
+```
+
+## Step 8 建立一個名叫mykeys新資料夾,放私錀的地方
+```json
+mkdir mykeys
+```
+## Step 9 cd 到你的mykeys 子目錄下
+
+```json
+cd mykeys
+```
+
+
+## Step 10 打入以下命令,產生ssh 公錀
+```json
+ssh-keygen -t rsa -f remote-ssh-demo -C wu_peiflower01 -b 2048
+```
+
+
+
+
+## Step 11 打入 ls 查詢是否產生 remote-ssh-demo 私錀與 remote-ssh-demo.pub公錀
+```json
+ls
+```
+
+
+
+## Step 12 把 私錀 加入 到 IdentityFile 底下
+```json
+# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
+Host remote-ssh-demo
+ HostName 35.234.24.25
+ User wu_peiflower01
+ IdentityFile /Users/codeart/mykeys/remote-ssh-demo // 加到這裡
+```
+
+
+
+## Step 13 [打開remote-ssh-demo.pub](http://打開remote-ssh-demo.pub) 公錀 並復製
+
+
+
+## Step 14 回到GCP VM 點擊編輯 往下拉到 **安全殼層金鑰 新增項目 貼上公錀 按下儲存**
+
+
+
+## Step 15 回到 VS cdoe 設定VS code 讓 VM 連接到你的VS Code ,快速鍵 F1 或 View > Command Palette
+
+### 搜尋Remote - SSH > **Remote - SSH: Connect to Host 並點擊**
+
+
+
+
+## Step 16 連線中..…點擊Continue
+
+
+
+
+## Step 17 測試新增資料夾看看 open folder ,點擊OK
+
+
+
+## Step 18 點擊 信任
+
+
+
+## Step 19 測試建立一個web 資料夾, 是否可兩端同步
+
+
+
+
+
+
+
+
+
diff --git a/source/_posts/chrome-extension.md b/source/_posts/chrome-extension.md
new file mode 100644
index 0000000..71df17b
--- /dev/null
+++ b/source/_posts/chrome-extension.md
@@ -0,0 +1,19 @@
+---
+title: chrome extension VideoShop
+date: 2024-07-17 13:31:40
+banner_img: /img/chrome_extension_VideoShop.png
+index_img: /img/chrome_extension_VideoShop.png
+category:
+tags: [extension]
+---
+
+## Welcome to VideoShop
+
+### Video shop is a free browser extension which enables Content Creators every single product seen in their videos.
+
+### useage
+
+
+
+
+
diff --git a/source/_posts/hello-world.md b/source/_posts/hello-world.md
new file mode 100644
index 0000000..0e864ec
--- /dev/null
+++ b/source/_posts/hello-world.md
@@ -0,0 +1,50 @@
+---
+title: Hello World
+hide: ture
+---
+
+{% note success %}
+文字 或者 `markdown` 均可
+{% endnote %}
+
+
+
+
+
+
+
+Welcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in [troubleshooting](https://hexo.io/docs/troubleshooting.html) or you can ask me on [GitHub](https://github.com/hexojs/hexo/issues).
+
+## Quick Start
+
+### Create a new post
+
+```bash
+$ hexo new "My New Post"
+```
+
+More info: [Writing](https://hexo.io/docs/writing.html)
+
+### Run server
+
+```bash
+$ hexo server
+```
+
+More info: [Server](https://hexo.io/docs/server.html)
+
+### Generate static files
+
+```bash
+$ hexo generate
+```
+
+More info: [Generating](https://hexo.io/docs/generating.html)
+
+### Deploy to remote sites
+
+```bash
+$ hexo deploy
+```
+
+More info: [Deployment](https://hexo.io/docs/one-command-deployment.html)
diff --git "a/source/_posts/\351\227\234\346\226\274\347\253\231\351\225\267.md" "b/source/_posts/\351\227\234\346\226\274\347\253\231\351\225\267.md"
new file mode 100644
index 0000000..67335ef
--- /dev/null
+++ "b/source/_posts/\351\227\234\346\226\274\347\253\231\351\225\267.md"
@@ -0,0 +1,17 @@
+---
+title: 關於站長 example
+date: 2024-05-14 15:44:05
+hide: ture
+---
+
+## 很高興可以架設這個網站
+
+可以幫助與分享更多需要的人
+
+## 標題範例
+
+待辦清單:
+
+1. Learn
+2. Practice
+3. search[google](https://www.google.com.tw)
diff --git a/source/about/index.md b/source/about/index.md
new file mode 100644
index 0000000..ab32ed0
--- /dev/null
+++ b/source/about/index.md
@@ -0,0 +1,23 @@
+---
+title: about
+layout: about
+---
+
+## 關於站長
+
+Hi!我是 codeArt-3D 的站長石浩田。長年從事遊戲行業與動畫主要負責 Animation,大家都叫我「Stone」。
+記得在 1998 年,第一次接觸到了電腦,紅色警戒的遊戲,大富翁,美少女夢工場 2,讓我非常印象深刻,對電腦產生非常奇妙的情感,這世上怎麼有這麼好玩的東西它叫電腦。
+
+高識就讀資訊科,接觸了網頁 flash,當時告訴自已,我要做出一個很勵害的音樂網站,二技讀資訊管理系,發現自已對會動的物件,在電腦上跑來跑去,產生莫名的興奮感,退伍後突然有個目標變成動畫師,覺得很酷,2009 年從 PA > layout Artist > Animator,成功轉為動畫師,緊接著往 Generative AI TD的目標前進。
+
+## 關於本站
+{% note info %}
+希望透過以往經驗,可以分享更多相關技術與流程,與大家一起學習,如有任何改進的建議,隨時歡迎提出指教,謝謝各位。
+{% endnote %}
+{% note info %}
+西元2023年,因為在Neobards建立了良好的程式基礎,從Animator轉職到Technical Pipeline Animator。
+{% endnote %}
+雖然對於Unreal Engine而言,我主要熟悉於動畫相關的功能,但我能夠快速適應並利用動畫相關的工具。我將其他時間投入到我不太熟悉的領域。
+在Pandawow視覺設計公司初期,我必須建立完整的pipeline、規格,並根據每個專案的不同需求做配置,以確保公司整體的製作流程更加順暢。
+因為客戶的專案需求從概念、模型、綁定、動畫、相機、環境、材質、燈光、視覺特效、渲染都需要熟悉,最後必須在截止日期前提交影片給客戶。當
+時專案時間非常緊湊,必須自己找解決問題的答案。幾乎每天工作時間都花在尋找資料與解決方法上。最終我整理出所需的功能與規格,並進行除錯、分析和學習。
diff --git a/source/maya/index.md b/source/maya/index.md
new file mode 100644
index 0000000..8110da7
--- /dev/null
+++ b/source/maya/index.md
@@ -0,0 +1,4 @@
+---
+title: maya
+layout: maya
+---
diff --git a/test.py b/test.py
new file mode 100644
index 0000000..caa26b4
--- /dev/null
+++ b/test.py
@@ -0,0 +1,2 @@
+import random
+print(random.randrange())
diff --git a/themes/.gitkeep b/themes/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/themes/fluid b/themes/fluid
new file mode 160000
index 0000000..4f30bf0
--- /dev/null
+++ b/themes/fluid
@@ -0,0 +1 @@
+Subproject commit 4f30bf004764585b5602a246bb41b22fc0fd8fb2
diff --git a/themes/landscape b/themes/landscape
new file mode 160000
index 0000000..a2befb9
--- /dev/null
+++ b/themes/landscape
@@ -0,0 +1 @@
+Subproject commit a2befb90e5bfedf7d9858d4ece72fc95d5cf840c