├── .env.example ├── .github ├── FUNDING.yml └── workflows │ ├── compile-linux.yml │ ├── compile-macos.yml │ └── compile-windows.yml ├── .gitignore ├── .npmrc ├── .tool-versions ├── README.md ├── app ├── .gitignore ├── app-path.js ├── browser │ ├── index.css │ ├── index.html │ └── index.js ├── dev-app-update.yml ├── index.js ├── menu.js ├── package.json ├── pnpm-lock.yaml └── yarn.lock ├── icon.icns ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── publish-linux.sh ├── publish-macos.sh ├── publish.sh └── screenshot.png /.env.example: -------------------------------------------------------------------------------- 1 | CSC_IDENTITY_AUTO_DISCOVERY=false -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: coldlogic 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/workflows/compile-linux.yml: -------------------------------------------------------------------------------- 1 | name: Build Linux App 2 | 3 | on: 4 | push: 5 | branches: [ compile-exe, main ] 6 | pull_request: 7 | branches: [ compile-exe, main ] 8 | 9 | jobs: 10 | 11 | build-linux: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v4 16 | 17 | - name: Use Node.js 18 | uses: actions/setup-node@v4 19 | with: 20 | node-version: 20 21 | 22 | - name: Install pnpm 23 | uses: pnpm/action-setup@v3 24 | with: 25 | version: 8 26 | run_install: false 27 | 28 | - name: Get pnpm store directory 29 | shell: bash 30 | run: | 31 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV 32 | 33 | - uses: actions/cache@v4 34 | name: Setup pnpm cache 35 | with: 36 | path: ${{ env.STORE_PATH }} 37 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 38 | restore-keys: | 39 | ${{ runner.os }}-pnpm-store- 40 | 41 | - name: Install dependencies 42 | run: pnpm install --frozen-lockfile 43 | 44 | - name: Create .env file 45 | run: | 46 | echo "GH_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> .env 47 | 48 | - name: Build Electron App 49 | run: | 50 | # Build the Electron app 51 | npm run build 52 | 53 | # Package the app into a Linux app 54 | npm run package-linux 55 | 56 | - name: Upload Artifact 57 | uses: actions/upload-artifact@v4 58 | with: 59 | name: linux-app 60 | path: dist/*.AppImage 61 | -------------------------------------------------------------------------------- /.github/workflows/compile-macos.yml: -------------------------------------------------------------------------------- 1 | name: Build macOS App 2 | 3 | on: 4 | push: 5 | branches: [ compile-exe, main ] 6 | pull_request: 7 | branches: [ compile-exe, main ] 8 | 9 | jobs: 10 | 11 | build-macos: 12 | runs-on: macos-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v4 16 | 17 | - name: Use Node.js 18 | uses: actions/setup-node@v4 19 | with: 20 | node-version: 20 21 | 22 | - name: Install pnpm 23 | uses: pnpm/action-setup@v3 24 | with: 25 | version: 8 26 | run_install: false 27 | 28 | - name: Get pnpm store directory 29 | shell: bash 30 | run: | 31 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV 32 | echo "CSC_IDENTITY_AUTO_DISCOVERY=false" >> $GITHUB_ENV 33 | 34 | - uses: actions/cache@v4 35 | name: Setup pnpm cache 36 | with: 37 | path: ${{ env.STORE_PATH }} 38 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 39 | restore-keys: | 40 | ${{ runner.os }}-pnpm-store- 41 | 42 | - name: Install dependencies 43 | run: pnpm install --frozen-lockfile 44 | 45 | - name: Create .env file 46 | run: | 47 | echo "GH_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> .env 48 | 49 | - name: Build Electron App 50 | run: | 51 | # Build the Electron app 52 | npm run build 53 | 54 | # Package the app into a macOS app 55 | npm run package-mac 56 | 57 | - name: Upload Artifact 58 | uses: actions/upload-artifact@v4 59 | with: 60 | name: macos-app 61 | path: dist/*.dmg 62 | -------------------------------------------------------------------------------- /.github/workflows/compile-windows.yml: -------------------------------------------------------------------------------- 1 | name: Build Windows App 2 | 3 | on: 4 | push: 5 | branches: [ compile-exe, main ] 6 | pull_request: 7 | branches: [ compile-exe, main ] 8 | 9 | jobs: 10 | 11 | build-windows: 12 | runs-on: windows-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v4 16 | 17 | - name: Use Node.js 18 | uses: actions/setup-node@v4 19 | with: 20 | node-version: 20 21 | 22 | - name: Install pnpm 23 | uses: pnpm/action-setup@v3 24 | with: 25 | version: 8 26 | run_install: false 27 | 28 | - name: Get pnpm store directory 29 | shell: bash 30 | run: | 31 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV 32 | 33 | - uses: actions/cache@v4 34 | name: Setup pnpm cache 35 | with: 36 | path: ${{ env.STORE_PATH }} 37 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 38 | restore-keys: | 39 | ${{ runner.os }}-pnpm-store- 40 | 41 | - name: Install dependencies 42 | run: pnpm install --frozen-lockfile 43 | 44 | - name: Setup MSBuild 45 | uses: microsoft/setup-msbuild@v2 46 | 47 | - name: Create .env file 48 | run: | 49 | echo "GH_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> .env 50 | 51 | - name: Build Electron App 52 | run: | 53 | # Build the Electron app 54 | npm run build 55 | 56 | # Package the app into a Windows executable 57 | npm run package-win 58 | 59 | - name: Upload Artifact 60 | uses: actions/upload-artifact@v4 61 | with: 62 | name: windows-executable 63 | path: dist/*.exe 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .pnpm-store/ 2 | node_modules/ 3 | dist/ 4 | 5 | .env 6 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | auto-install-peers = true 2 | lockfile = true 3 | node-linker = hoisted 4 | provenance = true 5 | save-exact = true 6 | strict-peer-dependencies = false 7 | tag-version-prefix="" 8 | -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 20.12.1 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Heos Controller 2 | Desktop controller for [Denon Heos](http://heosbydenon.denon.com) wifi speakers. 3 | 4 | ## Screenshot 5 | 6 | ![](screenshot.png) 7 | 8 | ## Features 9 | * Automatic detection of speakers 10 | * User friendly volume dial 11 | * Playback controls (previous, play/pause, next) 12 | 13 | ## Usage 14 | 1. [Download a release](https://github.com/cold-logic/heos-controller/releases) and extract the app into your Applications directory 15 | 2. Run the app and wait for speaker detection 16 | 3. Select a speaker from the dropdown and use the controls 17 | 18 | ## Development 19 | 1. Clone this repo 20 | 2. Install all the dependencies using the `yarn install` command 21 | 3. Run the app using `yarn start` 22 | 4. To preview changes made in the *app* directory while the app is running, refresh with the (cmd-r) hot key 23 | 5. Dev tools are available using the (cmd-opt-i) hot key 24 | 25 | ## Generating the compiled app 26 | 1. Rename `.env.example` to `.env`. This will disable code signing. 27 | 2. To generate only the app bundle run: `yarn run pack` 28 | 3. To generate the app bundle, ZIP and DMG, run: `yarn build` 29 | 4. Look in the `dist` folder for the results 30 | 31 | ## ToDo 32 | * Detection and control of grouped speakers 33 | * Details about the currently playing stream 34 | * A slider to scrub and track playback position 35 | * A "sources" media stream picker 36 | 37 | ## Reference Materials 38 | 39 | - https://rn.dmglobal.com/usmodel/HEOS_CLI_ProtocolSpecification-Version-1.16.pdf 40 | - http://rn.dmglobal.com/euheos/HEOS_CLI_ProtocolSpecification.pdf 41 | - https://support.denon.com/app/answers/detail/a_id/6953/~/heos-control-protocol-%28cli%29 42 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | .pnp.* 2 | .yarn/* 3 | !.yarn/patches 4 | !.yarn/plugins 5 | !.yarn/releases 6 | !.yarn/sdks 7 | !.yarn/versions 8 | -------------------------------------------------------------------------------- /app/app-path.js: -------------------------------------------------------------------------------- 1 | module.exports = exports = function() { 2 | const path = require("path"); 3 | 4 | let appPath; 5 | 6 | // Determine if this is a packaged app or a gulp run 7 | if (process.resourcesPath.indexOf("/Heos Controller.app/") > -1) { 8 | // Packaged app should use app.asar 9 | appPath = [process.resourcesPath, "app.asar","browser"].join(path.sep); 10 | } else { 11 | // Gulp runs should use the app directory 12 | appPath = [__dirname, "..","app","browser"].join(path.sep); 13 | } 14 | 15 | return appPath; 16 | }; -------------------------------------------------------------------------------- /app/browser/index.css: -------------------------------------------------------------------------------- 1 | @import url('../node_modules/bootstrap/dist/css/bootstrap.min.css'); 2 | @import url('../node_modules/bootstrap/dist/css/bootstrap-theme.min.css'); 3 | 4 | body { 5 | overflow: hidden; 6 | } 7 | 8 | #main-panel > .panel-body { 9 | height: 100%; 10 | } 11 | 12 | #main-panel > .panel-body > .container-fluid { 13 | display: flex; 14 | flex-direction: column; 15 | height: 100%; 16 | } 17 | 18 | #main-panel { 19 | display: flex; 20 | flex-direction: column; 21 | /* justify-content: space-between; */ 22 | height: 100vh; 23 | margin: 0; 24 | } 25 | 26 | .volume-row { 27 | justify-content: center; 28 | display: flex; 29 | margin-top: 2rem; 30 | height: 100%; 31 | } 32 | 33 | .volume-dial { 34 | display: flex; 35 | height: 100%; 36 | justify-content: center; 37 | width: 100%; 38 | } 39 | 40 | .volume-dial > div { 41 | position: absolute; 42 | } 43 | 44 | .panel-footer { 45 | margin-top: auto; 46 | padding: 0px; 47 | } 48 | 49 | .control { 50 | display: flex; 51 | height: 41px; 52 | justify-content: center; 53 | align-items: center; 54 | } 55 | 56 | .control:hover { 57 | background-color: #DBDBDB; 58 | } 59 | 60 | .control>.glyphicon { 61 | top: 0px; 62 | } 63 | -------------------------------------------------------------------------------- /app/browser/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | Heos Controller 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 |

Heos Controller

20 |
21 |
22 |
23 |
24 |
25 | 26 |
27 |
28 |
29 |
30 |
31 | 34 | 35 | 38 | 39 |
40 |
41 |
42 |
43 |
44 | 45 |
46 |
47 |
48 |
49 | 62 |
63 | 64 | 65 | -------------------------------------------------------------------------------- /app/browser/index.js: -------------------------------------------------------------------------------- 1 | /* global $ */ 2 | 3 | window.$ = window.jQuery = require('jquery'); 4 | require('jquery-knob/dist/jquery.knob.min.js'); 5 | 6 | const dgram = require('node:dgram'); // dgram is UDP 7 | const net = require('node:net'); 8 | const os = require('node:os'); 9 | 10 | const HEOS_BROADCAST_ADDR = "239.255.255.250"; 11 | let connection, ui, lastCommand, discovery_interval; 12 | 13 | // Before the window closes, de-register and disconnect 14 | window.onbeforeunload = function(e) { 15 | if (connection && connection.readyState == 'open') { 16 | sendCmd('system/register_for_change_events', { 17 | enable: 'off' 18 | }); 19 | connection.end(); 20 | } 21 | }; 22 | 23 | // Setup UI event handlers 24 | $(function() { 25 | const jQ = (function() { 26 | function jQ(s) { 27 | this.sel = s; 28 | this.$ = $(s); 29 | } 30 | return jQ; 31 | })(); 32 | 33 | ui = { 34 | dial: new jQ('.dial'), 35 | speaker: new jQ('#speaker'), 36 | speaker_count: new jQ('#speaker_count'), 37 | refresh: new jQ('#refresh'), 38 | prev: new jQ('#prev'), 39 | state: new jQ('#state'), 40 | next: new jQ('#next') 41 | }; 42 | 43 | const knobConfig = { 44 | fgColor: '#66CC66', 45 | angleOffset: -125, 46 | angleArc: 250, 47 | width: '100%', 48 | release: function(v) { 49 | if (lastCommand != 'populateVolume') { 50 | const option = ui.speaker.$.children().filter(':selected'); 51 | const pid = option.data('pid'); 52 | setVolume(pid, v); 53 | } 54 | lastCommand = ''; 55 | } 56 | } 57 | 58 | ui.dial.$.knob(knobConfig); 59 | 60 | ui.speaker.$.on('change', function(e){ 61 | const pid = $(this).find(':selected').data('pid'); 62 | getVolume(pid); 63 | getState(pid); 64 | }); 65 | 66 | // Controller button click highlights 67 | $('.control').on('mousedown mouseup', function(e){ 68 | $(this).css('background-color', (e.type == 'mousedown' ? '#C2C2C2' : '')); 69 | }); 70 | 71 | // Click events 72 | const clickSelectors = [ 73 | ui.refresh.sel, 74 | ui.prev.sel, 75 | ui.state.sel, 76 | ui.next.sel 77 | ].join(','); 78 | $(document).on('click', clickSelectors, function (e) { 79 | const $this = $(this); 80 | const pid = ui.speaker.$.find(':selected').data('pid'); 81 | if ($this.is(ui.refresh.sel)) { 82 | sendCmd('player/get_players'); 83 | } 84 | if ($this.is(ui.prev.sel)) { 85 | playPrev(pid); 86 | } 87 | if ($this.is(ui.state.sel)) { 88 | const state = ui.state.$.find('.glyphicon').attr('class').split('-')[1]; 89 | setState(pid, state); 90 | } 91 | if ($this.is(ui.next.sel)) { 92 | playNext(pid); 93 | } 94 | }); 95 | }); 96 | 97 | // Start the SSDP discovery process 98 | discover(); 99 | 100 | /****************************** 101 | * Functions 102 | ******************************/ 103 | 104 | function broadcast_address() { 105 | if (os.platform() == "win32") { 106 | let addresses = []; 107 | const ifaces = os.networkInterfaces(); 108 | Object.values(ifaces).forEach((i) => { 109 | let iface_addresses = i.filter(iface => iface.family == "IPv4" && !iface.internal).map(iface => iface.address); 110 | 111 | // create broadcast address from interface adress 112 | iface_addresses = iface_addresses.map(addr => { 113 | let blocks = addr.split("."); 114 | blocks[3] = "255"; 115 | return blocks.join("."); 116 | }); 117 | 118 | addresses.push(...iface_addresses); 119 | }); 120 | return addresses; 121 | } else { 122 | return [ HEOS_BROADCAST_ADDR ]; 123 | } 124 | } 125 | 126 | function discover() { 127 | const client = dgram.createSocket('udp4'); 128 | client.on('error', (err) => { 129 | console.error(`client error:\n${err.stack}`); 130 | client.close(); 131 | }); 132 | client.on('listening', () => { 133 | const address = client.address(); 134 | console.log(`listening ${address.address}:${address.port}`); 135 | const BROADCAST_ADDR = broadcast_address()[0]; 136 | const message = Buffer.from( 137 | 'M-SEARCH * HTTP/1.1\r\n' + 138 | `HOST: ${HEOS_BROADCAST_ADDR}:1900\r\n` + 139 | 'MAN: "ssdp:discover"\r\n' + 140 | 'ST: urn:schemas-denon-com:device:ACT-Denon:1\r\n' + // Essential, used by the client to specify what they want to discover, eg 'ST:ge:fridge' 141 | 'MX: 1\r\n' + // 1 second to respond (but they all respond immediately?) 142 | '\r\n' 143 | ); 144 | client.send(message, 0, message.length, 1900, BROADCAST_ADDR); 145 | console.log('sent discovery request...'); 146 | }); 147 | client.on('message', function (msg, rinfo) { 148 | console.log(`client got: ${msg} from ${rinfo.address}:${rinfo.port}`); 149 | if ( msg.indexOf('ST: urn:schemas-denon-com:device:ACT-Denon:1') > -1) { 150 | client.close(); 151 | connect(rinfo.address); 152 | clearInterval(discovery_interval); 153 | } 154 | }); 155 | client.bind(null); 156 | if (!discovery_interval) // Setup an interval to keep trying to discover speakers 157 | discovery_interval = setInterval(discover, 10000) 158 | } 159 | 160 | // Connect to the speaker 161 | function connect(ip) { 162 | connection = net.createConnection({ 163 | host: ip, 164 | port: 1255 165 | }); 166 | connection.on('error', err => { 167 | console.error(new Date(), String(err)) 168 | if (err && err.code && err.code === 'ECONNREFUSED') { 169 | setTimeout(function () { 170 | console.log('Retrying connect...'); 171 | connection.connect(1255, ip, connectListener) 172 | }, 3e4); // retry every 30 seconds 173 | } 174 | }) 175 | connection.on('connect', () => { // gets triggered on successful connection 176 | console.log('connected to server!'); 177 | setTimeout(function () { 178 | sendCmd('system/register_for_change_events', { 179 | enable: 'off' 180 | }); 181 | sendCmd('player/get_players'); 182 | sendCmd('system/register_for_change_events', { 183 | enable: 'on' 184 | }); 185 | }, 1000); 186 | }); 187 | connection.on('data', function(data) { 188 | const events = data.toString().split('\r\n'); 189 | for (const event of events) { 190 | if (event.length > 0) { 191 | const json = JSON.parse(event); 192 | console.log('%s: %o', json.heos.command, json); 193 | if (json.heos.command == 'player/get_players' && json.payload) { 194 | populatePlayers(json.payload); 195 | } 196 | if (json.heos.command == 'player/get_play_state') { 197 | parseMsg(json.heos.message, populateState); 198 | } 199 | if (json.heos.command == 'player/get_volume' || json.heos.command == 'event/player_volume_changed') { 200 | parseMsg(json.heos.message, populateVolume); 201 | } 202 | } 203 | } 204 | }); 205 | connection.on('end', function() { 206 | console.log('disconnected from server'); 207 | }); 208 | } 209 | 210 | // Cleanup the msg and execute a callback 211 | function parseMsg (msg, cb) { 212 | const args = [], qs = msg.split('&'); 213 | for (const param of qs) { 214 | args.push(param.split('=')[1]); 215 | } 216 | if (typeof cb == 'function') cb.apply(this, args); 217 | } 218 | 219 | // Send a command to the HEOS API 220 | function sendCmd (cmd, obj) { 221 | if (connection && connection.readyState == 'open') { 222 | const qs = []; 223 | let msg = 'heos://' + cmd; 224 | if (obj) { 225 | for (const k in obj) { 226 | if (obj.hasOwnProperty(k)) { 227 | const v = obj[k]; 228 | qs.push([k,v].join('=')); 229 | } 230 | } 231 | msg += '?' + qs.join('&'); 232 | } 233 | connection.write(msg + '\r\n'); 234 | } 235 | } 236 | 237 | // Toggle UI play/pause/stop button 238 | function toggleState (state) { 239 | const toggle = { 240 | 'play': 'pause', 241 | 'pause': 'play', 242 | 'stop': 'play' 243 | }; 244 | return toggle[state]; 245 | } 246 | 247 | // Fill the speaker dropdown with what we've discovered 248 | function populatePlayers(payload) { 249 | ui.speaker_count.$.text(`(${payload.length} detected)`); 250 | ui.speaker.$.children().remove(); 251 | for (const i in payload) { 252 | const obj = payload[i]; 253 | const option = document.createElement('option'); 254 | option.textContent = obj.name; 255 | for (const k in obj) { 256 | option.dataset[k] = obj[k]; 257 | } 258 | ui.speaker.$.append(option); 259 | } 260 | if (payload[0] && payload[0].pid) { 261 | getVolume(payload[0].pid); 262 | getState(payload[0].pid); 263 | } 264 | } 265 | 266 | // Set the UI volume dial level 267 | function populateVolume(pid, level) { 268 | lastCommand = 'populateVolume'; 269 | if (ui.speaker.$.children().filter(':selected').data('pid') == pid) { 270 | ui.dial.$.val(level).trigger('change'); 271 | } 272 | } 273 | 274 | // Set the UI play/pause/stop button's state 275 | function populateState (pid, state) { 276 | lastCommand = 'populateState'; 277 | if (ui.speaker.$.children().filter(':selected').data('pid') == pid) { 278 | ui.state.$.find('.glyphicon') 279 | .removeClass('glyphicon-play glyphicon-pause glyphicon-stop') 280 | .addClass('glyphicon-' + toggleState(state)); 281 | } 282 | } 283 | 284 | // Query HEOS API for volume 285 | function getVolume(pid) { 286 | sendCmd('player/get_volume', { 287 | pid: pid 288 | }); 289 | } 290 | 291 | // Query HEOS API for state 292 | function getState (pid) { 293 | sendCmd('player/get_play_state', { 294 | pid: '-652946493' 295 | }); 296 | } 297 | 298 | // Query HEOS API for play queue 299 | function getPlayQueue (pid, range) { 300 | sendCmd('player/get_queue', { 301 | pid: '-652946493' 302 | }); 303 | } 304 | 305 | // Crank the volume to 11 ;) 306 | function setVolume(pid, level) { 307 | sendCmd('player/set_volume', { 308 | pid: pid, 309 | level: level 310 | }); 311 | } 312 | 313 | // Play that funky music 314 | function setState(pid, state) { 315 | sendCmd('player/set_play_state', { 316 | pid: pid, 317 | state: state 318 | }); 319 | populateState(pid, state); 320 | } 321 | 322 | // Play my jam again! 323 | function playPrev (pid) { 324 | sendCmd('player/play_previous', { 325 | pid: pid 326 | }); 327 | } 328 | 329 | // NOPE! Next song plz... 330 | function playNext (pid) { 331 | sendCmd('player/play_next', { 332 | pid: pid 333 | }); 334 | } 335 | -------------------------------------------------------------------------------- /app/dev-app-update.yml: -------------------------------------------------------------------------------- 1 | owner: cold-logic 2 | repo: heos-controller 3 | provider: github 4 | -------------------------------------------------------------------------------- /app/index.js: -------------------------------------------------------------------------------- 1 | // Vendor deps 2 | const {app, BrowserWindow, Menu} = require('electron'); 3 | const log = require('electron-log') 4 | const {autoUpdater} = require('electron-updater') 5 | 6 | // Local deps 7 | const menu = require('./menu.js') 8 | 9 | autoUpdater.logger = log; 10 | autoUpdater.logger.transports.file.level = 'info'; 11 | log.info('App starting...'); 12 | 13 | // Keep a global reference of the window object, if you don't, the window will 14 | // be closed automatically when the JavaScript object is garbage collected. 15 | let mainWindow; 16 | 17 | // Quit when all windows are closed. 18 | app.on("window-all-closed", function() { 19 | // On OS X it is common for applications and their menu bar 20 | // to stay active until the user quits explicitly with Cmd + Q 21 | // if (process.platform != "darwin") { 22 | app.quit(); 23 | // } 24 | }); 25 | 26 | // Handle Updates 27 | autoUpdater.on('checking-for-update', () => { 28 | log.info('Checking for update...'); 29 | }) 30 | autoUpdater.on('update-available', (info) => { 31 | log.info('Update available.'); 32 | }) 33 | autoUpdater.on('update-not-available', (info) => { 34 | log.info('Update not available.'); 35 | }) 36 | autoUpdater.on('error', (err) => { 37 | log.info('Error in auto-updater.'); 38 | }) 39 | autoUpdater.on('download-progress', (progressObj) => { 40 | let log_message = "Download speed: " + progressObj.bytesPerSecond; 41 | log_message = log_message + ' - Downloaded ' + progressObj.percent + '%'; 42 | log_message = log_message + ' (' + progressObj.transferred + "/" + progressObj.total + ')'; 43 | log.info(log_message); 44 | }) 45 | autoUpdater.on('update-downloaded', (info) => { 46 | log.info('Update downloaded; will install in 5 seconds'); 47 | }); 48 | autoUpdater.on('update-downloaded', (info) => { 49 | // Wait 5 seconds, then quit and install 50 | // In your application, you don't need to wait 5 seconds. 51 | // You could call autoUpdater.quitAndInstall(); immediately 52 | setTimeout(function() { 53 | autoUpdater.quitAndInstall(); 54 | }, 5000) 55 | }) 56 | 57 | // This method will be called when Electron has done everything 58 | // initialization and ready for creating browser windows. 59 | app.on("ready", function() { 60 | // Check for updates 61 | autoUpdater.checkForUpdates(); 62 | 63 | // Create the browser window. 64 | mainWindow = new BrowserWindow({ 65 | 'min-width': 350, 66 | 'min-height': 413, 67 | center: true, 68 | width: 350, 69 | height: 413, 70 | show: false, 71 | webPreferences: { 72 | contextIsolation: false, 73 | nodeIntegration: true 74 | } 75 | }); 76 | 77 | // Setup the main menu 78 | Menu.setApplicationMenu(menu); 79 | 80 | // Load the homepage 81 | mainWindow.loadFile('browser/index.html'); 82 | mainWindow.show(); 83 | 84 | // Open the dev tools 85 | // mainWindow.webContents.openDevTools(); 86 | 87 | // Emitted when the window is closed. 88 | mainWindow.on("closed", function() { 89 | // Dereference the window object, usually you would store windows 90 | // in an array if your app supports multi windows, this is the time 91 | // when you should delete the corresponding element. 92 | mainWindow = null; 93 | }); 94 | }); -------------------------------------------------------------------------------- /app/menu.js: -------------------------------------------------------------------------------- 1 | const {app, Menu, BrowserWindow} = require("electron") 2 | 3 | const isMac = process.platform === 'darwin' 4 | 5 | module.exports = exports = Menu.buildFromTemplate([ 6 | ...(isMac ? [{ 7 | label: app.name, 8 | submenu: [ 9 | { role: 'about' }, 10 | { type: 'separator' }, 11 | { role: 'services' }, 12 | { type: 'separator' }, 13 | { role: 'hide' }, 14 | { role: 'hideOthers' }, 15 | { role: 'unhide' }, 16 | { type: 'separator' }, 17 | { role: 'quit' } 18 | ] 19 | }] : []), 20 | { 21 | label: 'File', 22 | submenu: [ 23 | isMac ? { role: 'close' } : { role: 'quit' } 24 | ] 25 | }, 26 | { 27 | label: 'Edit', 28 | submenu: [ 29 | { role: 'undo' }, 30 | { role: 'redo' }, 31 | { type: 'separator' }, 32 | { role: 'cut' }, 33 | { role: 'copy' }, 34 | { role: 'paste' }, 35 | ...(isMac ? [ 36 | { role: 'pasteAndMatchStyle' }, 37 | { role: 'delete' }, 38 | { role: 'selectAll' }, 39 | { type: 'separator' }, 40 | { 41 | label: 'Speech', 42 | submenu: [ 43 | { role: 'startSpeaking' }, 44 | { role: 'stopSpeaking' } 45 | ] 46 | } 47 | ] : [ 48 | { role: 'delete' }, 49 | { type: 'separator' }, 50 | { role: 'selectAll' } 51 | ]) 52 | ] 53 | }, 54 | { 55 | label: 'View', 56 | submenu: [ 57 | { role: 'reload' }, 58 | { role: 'forceReload' }, 59 | { role: 'toggleDevTools' }, 60 | { type: 'separator' }, 61 | { role: 'resetZoom' }, 62 | { role: 'zoomIn' }, 63 | { role: 'zoomOut' }, 64 | { type: 'separator' }, 65 | { role: 'togglefullscreen' } 66 | ] 67 | }, 68 | { 69 | label: 'Window', 70 | submenu: [ 71 | { role: 'minimize' }, 72 | { role: 'zoom' }, 73 | ...(isMac ? [ 74 | { type: 'separator' }, 75 | { role: 'front' }, 76 | { type: 'separator' }, 77 | { role: 'window' } 78 | ] : [ 79 | { role: 'close' } 80 | ]) 81 | ] 82 | }, 83 | { 84 | role: 'help', 85 | submenu: [{ 86 | label: "Documentation", 87 | click: async () => { 88 | const { shell } = require('electron'); 89 | await shell.openExternal("https://github.com/cold-logic/heos-controller/wiki"); 90 | } 91 | }] 92 | } 93 | ]); -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "productName": "Heos Controller", 3 | "description": "Controller for Denon Heos speakers", 4 | "author": "Christopher Davison", 5 | "version": "1.0.10", 6 | "name": "heos-controller", 7 | "main": "index.js", 8 | "dependencies": { 9 | "bootstrap": "^3.4.1", 10 | "electron-log": "^5.1.2", 11 | "electron-updater": "^6.3.0", 12 | "jquery": "^3.7.1", 13 | "jquery-knob": "ssh://git@github.com:aterrien/jQuery-Knob.git" 14 | }, 15 | "private": true, 16 | "license": "ISC" 17 | } 18 | -------------------------------------------------------------------------------- /app/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | bootstrap: 9 | specifier: ^3.4.1 10 | version: 3.4.1 11 | electron-log: 12 | specifier: ^4.4.8 13 | version: 4.4.8 14 | electron-updater: 15 | specifier: ^4.6.5 16 | version: 4.6.5 17 | jquery: 18 | specifier: ^3.6.3 19 | version: 3.6.3 20 | jquery-knob: 21 | specifier: ssh://git@github.com:aterrien/jQuery-Knob.git 22 | version: github.com/aterrien/jQuery-Knob/755309e933d326ffaa5a2d758dc377147b766515 23 | 24 | packages: 25 | 26 | /@types/semver@7.5.1: 27 | resolution: {integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==} 28 | dev: false 29 | 30 | /argparse@2.0.1: 31 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 32 | dev: false 33 | 34 | /bootstrap@3.4.1: 35 | resolution: {integrity: sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==} 36 | engines: {node: '>=6'} 37 | dev: false 38 | 39 | /builder-util-runtime@8.9.2: 40 | resolution: {integrity: sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==} 41 | engines: {node: '>=12.0.0'} 42 | dependencies: 43 | debug: 4.3.4 44 | sax: 1.2.4 45 | transitivePeerDependencies: 46 | - supports-color 47 | dev: false 48 | 49 | /debug@4.3.4: 50 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 51 | engines: {node: '>=6.0'} 52 | peerDependencies: 53 | supports-color: '*' 54 | peerDependenciesMeta: 55 | supports-color: 56 | optional: true 57 | dependencies: 58 | ms: 2.1.2 59 | dev: false 60 | 61 | /electron-log@4.4.8: 62 | resolution: {integrity: sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA==} 63 | dev: false 64 | 65 | /electron-updater@4.6.5: 66 | resolution: {integrity: sha512-kdTly8O9mSZfm9fslc1mnCY+mYOeaYRy7ERa2Fed240u01BKll3aiupzkd07qKw69KvhBSzuHroIW3mF0D8DWA==} 67 | dependencies: 68 | '@types/semver': 7.5.1 69 | builder-util-runtime: 8.9.2 70 | fs-extra: 10.1.0 71 | js-yaml: 4.1.0 72 | lazy-val: 1.0.5 73 | lodash.escaperegexp: 4.1.2 74 | lodash.isequal: 4.5.0 75 | semver: 7.5.4 76 | transitivePeerDependencies: 77 | - supports-color 78 | dev: false 79 | 80 | /fs-extra@10.1.0: 81 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} 82 | engines: {node: '>=12'} 83 | dependencies: 84 | graceful-fs: 4.2.11 85 | jsonfile: 6.1.0 86 | universalify: 2.0.0 87 | dev: false 88 | 89 | /graceful-fs@4.2.11: 90 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 91 | dev: false 92 | 93 | /jquery@3.6.3: 94 | resolution: {integrity: sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==} 95 | dev: false 96 | 97 | /js-yaml@4.1.0: 98 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 99 | hasBin: true 100 | dependencies: 101 | argparse: 2.0.1 102 | dev: false 103 | 104 | /jsonfile@6.1.0: 105 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 106 | dependencies: 107 | universalify: 2.0.0 108 | optionalDependencies: 109 | graceful-fs: 4.2.11 110 | dev: false 111 | 112 | /lazy-val@1.0.5: 113 | resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} 114 | dev: false 115 | 116 | /lodash.escaperegexp@4.1.2: 117 | resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} 118 | dev: false 119 | 120 | /lodash.isequal@4.5.0: 121 | resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} 122 | dev: false 123 | 124 | /lru-cache@6.0.0: 125 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 126 | engines: {node: '>=10'} 127 | dependencies: 128 | yallist: 4.0.0 129 | dev: false 130 | 131 | /ms@2.1.2: 132 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 133 | dev: false 134 | 135 | /sax@1.2.4: 136 | resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} 137 | dev: false 138 | 139 | /semver@7.5.4: 140 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 141 | engines: {node: '>=10'} 142 | hasBin: true 143 | dependencies: 144 | lru-cache: 6.0.0 145 | dev: false 146 | 147 | /universalify@2.0.0: 148 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 149 | engines: {node: '>= 10.0.0'} 150 | dev: false 151 | 152 | /yallist@4.0.0: 153 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 154 | dev: false 155 | 156 | github.com/aterrien/jQuery-Knob/755309e933d326ffaa5a2d758dc377147b766515: 157 | resolution: {tarball: https://codeload.github.com/aterrien/jQuery-Knob/tar.gz/755309e933d326ffaa5a2d758dc377147b766515} 158 | name: jquery-knob 159 | version: 1.2.13 160 | dev: false 161 | -------------------------------------------------------------------------------- /app/yarn.lock: -------------------------------------------------------------------------------- 1 | # This file is generated by running "yarn install" inside your project. 2 | # Manual changes might be lost - proceed with caution! 3 | 4 | __metadata: 5 | version: 6 6 | cacheKey: 8 7 | 8 | "@types/semver@npm:^7.3.6": 9 | version: 7.3.9 10 | resolution: "@types/semver@npm:7.3.9" 11 | checksum: 60bfcfdfa7f937be2c6f4b37ddb6714fb0f27b05fe4cbdfdd596a97d35ed95d13ee410efdd88e72a66449d0384220bf20055ab7d6b5df10de4990fbd20e5cbe0 12 | languageName: node 13 | linkType: hard 14 | 15 | "argparse@npm:^2.0.1": 16 | version: 2.0.1 17 | resolution: "argparse@npm:2.0.1" 18 | checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced 19 | languageName: node 20 | linkType: hard 21 | 22 | "bootstrap@npm:^3.4.1": 23 | version: 3.4.1 24 | resolution: "bootstrap@npm:3.4.1" 25 | checksum: 5742035e8c541cd525780542771e7d56f63e5d4b2d902427bf182d3383e74a17c9074b6809f50d7f3de0585377e673339628b97cfdcde597ad69ecb1d2b562a6 26 | languageName: node 27 | linkType: hard 28 | 29 | "builder-util-runtime@npm:8.9.2": 30 | version: 8.9.2 31 | resolution: "builder-util-runtime@npm:8.9.2" 32 | dependencies: 33 | debug: ^4.3.2 34 | sax: ^1.2.4 35 | checksum: 35adcd6162e2ed16635ff7b7ecc353e400dcbbb3e7cd01823bfefc7256cefca8c820f62d15a0f7dbee1c7495a5f1fba4e0e238857a79b48d5f6bd35064f27208 36 | languageName: node 37 | linkType: hard 38 | 39 | "debug@npm:^4.3.2": 40 | version: 4.3.4 41 | resolution: "debug@npm:4.3.4" 42 | dependencies: 43 | ms: 2.1.2 44 | peerDependenciesMeta: 45 | supports-color: 46 | optional: true 47 | checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 48 | languageName: node 49 | linkType: hard 50 | 51 | "electron-log@npm:^4.4.8": 52 | version: 4.4.8 53 | resolution: "electron-log@npm:4.4.8" 54 | checksum: 5a7958f8fd9a5c95987e885ffe1c5b88be15bb41d348b65c92e2d8664519faddf17ce0208cd4e7027b0908f92fecedfbef246a45061f53e4a53b5d2201aafbd9 55 | languageName: node 56 | linkType: hard 57 | 58 | "electron-updater@npm:^4.6.5": 59 | version: 4.6.5 60 | resolution: "electron-updater@npm:4.6.5" 61 | dependencies: 62 | "@types/semver": ^7.3.6 63 | builder-util-runtime: 8.9.2 64 | fs-extra: ^10.0.0 65 | js-yaml: ^4.1.0 66 | lazy-val: ^1.0.5 67 | lodash.escaperegexp: ^4.1.2 68 | lodash.isequal: ^4.5.0 69 | semver: ^7.3.5 70 | checksum: 06b34490fa6213f5c6a01de6f7b3d96eba4e1b7d27e8346747d8b094b9591684f55f92c703e2ee3407c562a240518c0eede699462cc333fcfe2983141941fe98 71 | languageName: node 72 | linkType: hard 73 | 74 | "fs-extra@npm:^10.0.0": 75 | version: 10.0.1 76 | resolution: "fs-extra@npm:10.0.1" 77 | dependencies: 78 | graceful-fs: ^4.2.0 79 | jsonfile: ^6.0.1 80 | universalify: ^2.0.0 81 | checksum: c1faaa5eb9e1c5c7c7ff09f966e93922ecb068ae1b04801cfc983ef05fcc1f66bfbb8d8d0b745c910014c7a2e7317fb6cf3bfe7390450c1157e3cc1a218f221d 82 | languageName: node 83 | linkType: hard 84 | 85 | "graceful-fs@npm:^4.1.6": 86 | version: 4.1.15 87 | resolution: "graceful-fs@npm:4.1.15" 88 | checksum: 0c7d7fcb739f760b3b702f993b64e2c111fce22084bbc9c5c8ff7f1a051691a7bba2baf0bf1c464ea5081225f8e17610c6b30167bcd6899aaabca820d55e403c 89 | languageName: node 90 | linkType: hard 91 | 92 | "graceful-fs@npm:^4.2.0": 93 | version: 4.2.3 94 | resolution: "graceful-fs@npm:4.2.3" 95 | checksum: ec1f6a7027dfd4f6b69a15b2c78493d7211e88a8c0fdb6d93aa504f8f6b5353abac6ba0a202aedb9d970be22c2c257a1481426913ae0166bdc8bb8f3bed378dc 96 | languageName: node 97 | linkType: hard 98 | 99 | "heos-controller@workspace:.": 100 | version: 0.0.0-use.local 101 | resolution: "heos-controller@workspace:." 102 | dependencies: 103 | bootstrap: ^3.4.1 104 | electron-log: ^4.4.8 105 | electron-updater: ^4.6.5 106 | jquery: ^3.6.3 107 | jquery-knob: "ssh://git@github.com:aterrien/jQuery-Knob.git" 108 | languageName: unknown 109 | linkType: soft 110 | 111 | "jquery-knob@ssh://git@github.com:aterrien/jQuery-Knob.git": 112 | version: 1.2.13 113 | resolution: "jquery-knob@ssh://git@github.com:aterrien/jQuery-Knob.git#commit=755309e933d326ffaa5a2d758dc377147b766515" 114 | checksum: 12076a75ee04734bb043e4b634a2ed87462054d43295a7133bae799b6f8fb0c98f82bf4f5adc4aeff5d496bc2d64ffb662d01e67aa8a9eab24ce4e9114638b42 115 | languageName: node 116 | linkType: hard 117 | 118 | "jquery@npm:^3.6.3": 119 | version: 3.6.3 120 | resolution: "jquery@npm:3.6.3" 121 | checksum: 0fd366bdcaa0c84a7a8751ce20f8192290141913978b5059574426d9b01f4365daa675f95aab3eec94fd794d27b08d32078a2236bef404b8ba78073009988ce6 122 | languageName: node 123 | linkType: hard 124 | 125 | "js-yaml@npm:^4.1.0": 126 | version: 4.1.0 127 | resolution: "js-yaml@npm:4.1.0" 128 | dependencies: 129 | argparse: ^2.0.1 130 | bin: 131 | js-yaml: bin/js-yaml.js 132 | checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a 133 | languageName: node 134 | linkType: hard 135 | 136 | "jsonfile@npm:^6.0.1": 137 | version: 6.0.1 138 | resolution: "jsonfile@npm:6.0.1" 139 | dependencies: 140 | graceful-fs: ^4.1.6 141 | universalify: ^1.0.0 142 | dependenciesMeta: 143 | graceful-fs: 144 | optional: true 145 | checksum: d37b3732c6a44d2839338d4580f6092d569a1dc6b1895b8f0b02ece5c39420b4b8b89cf3540caa4a7da9986c5844d2f6d39753651ddd785959e628b9d87ba216 146 | languageName: node 147 | linkType: hard 148 | 149 | "lazy-val@npm:^1.0.5": 150 | version: 1.0.5 151 | resolution: "lazy-val@npm:1.0.5" 152 | checksum: 31e12e0b118826dfae74f8f3ff8ebcddfe4200ff88d0d448db175c7265ee537e0ba55488d411728246337f3ed3c9ec68416f10889f632a2ce28fb7a970909fb5 153 | languageName: node 154 | linkType: hard 155 | 156 | "lodash.escaperegexp@npm:^4.1.2": 157 | version: 4.1.2 158 | resolution: "lodash.escaperegexp@npm:4.1.2" 159 | checksum: 6d99452b1cfd6073175a9b741a9b09ece159eac463f86f02ea3bee2e2092923fce812c8d2bf446309cc52d1d61bf9af51c8118b0d7421388e6cead7bd3798f0f 160 | languageName: node 161 | linkType: hard 162 | 163 | "lodash.isequal@npm:^4.5.0": 164 | version: 4.5.0 165 | resolution: "lodash.isequal@npm:4.5.0" 166 | checksum: da27515dc5230eb1140ba65ff8de3613649620e8656b19a6270afe4866b7bd461d9ba2ac8a48dcc57f7adac4ee80e1de9f965d89d4d81a0ad52bb3eec2609644 167 | languageName: node 168 | linkType: hard 169 | 170 | "lru-cache@npm:^6.0.0": 171 | version: 6.0.0 172 | resolution: "lru-cache@npm:6.0.0" 173 | dependencies: 174 | yallist: ^4.0.0 175 | checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 176 | languageName: node 177 | linkType: hard 178 | 179 | "ms@npm:2.1.2": 180 | version: 2.1.2 181 | resolution: "ms@npm:2.1.2" 182 | checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f 183 | languageName: node 184 | linkType: hard 185 | 186 | "sax@npm:^1.2.4": 187 | version: 1.2.4 188 | resolution: "sax@npm:1.2.4" 189 | checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe 190 | languageName: node 191 | linkType: hard 192 | 193 | "semver@npm:^7.3.5": 194 | version: 7.5.3 195 | resolution: "semver@npm:7.5.3" 196 | dependencies: 197 | lru-cache: ^6.0.0 198 | bin: 199 | semver: bin/semver.js 200 | checksum: 9d58db16525e9f749ad0a696a1f27deabaa51f66e91d2fa2b0db3de3e9644e8677de3b7d7a03f4c15bc81521e0c3916d7369e0572dbde250d9bedf5194e2a8a7 201 | languageName: node 202 | linkType: hard 203 | 204 | "universalify@npm:^1.0.0": 205 | version: 1.0.0 206 | resolution: "universalify@npm:1.0.0" 207 | checksum: 095a808f2b915e3b89d29b6f3b4ee4163962b02fa5b7cb686970b8d0439f4ca789bc43f319b7cbb1ce552ae724e631d148e5aee9ce04c4f46a7fe0c5bbfd2b9e 208 | languageName: node 209 | linkType: hard 210 | 211 | "universalify@npm:^2.0.0": 212 | version: 2.0.0 213 | resolution: "universalify@npm:2.0.0" 214 | checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 215 | languageName: node 216 | linkType: hard 217 | 218 | "yallist@npm:^4.0.0": 219 | version: 4.0.0 220 | resolution: "yallist@npm:4.0.0" 221 | checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 222 | languageName: node 223 | linkType: hard 224 | -------------------------------------------------------------------------------- /icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cold-logic/heos-controller/bb0e4ee85abdc0f82447bd59ac55d576ce140ac4/icon.icns -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "heos-controller", 3 | "version": "1.0.10", 4 | "description": "Controller for Denon Heos speakers", 5 | "repository": "https://github.com/cold-logic/heos-controller", 6 | "main": "app/index.js", 7 | "scripts": { 8 | "pack": "env-cmd electron-builder --dir", 9 | "dist": "env-cmd electron-builder", 10 | "build": "env-cmd electron-builder build", 11 | "package-linux": "env-cmd electron-builder --linux", 12 | "package-mac": "env-cmd electron-builder --mac --arm64 --x64", 13 | "package-win": "env-cmd electron-builder --win --ia32 --x64", 14 | "release": "build", 15 | "start": "electron app", 16 | "test": "echo \"Error: no test specified\" && exit 1" 17 | }, 18 | "author": "Christopher Davison", 19 | "private": true, 20 | "license": "ISC", 21 | "build": { 22 | "appId": "me.christopherd.heos-controller", 23 | "productName": "Heos Controller", 24 | "mac": { 25 | "icon": "icon.icns", 26 | "category": "public.app-category.music", 27 | "publish": [ 28 | "github" 29 | ] 30 | }, 31 | "linux": { 32 | "icon": "icon.icns", 33 | "category": "public.app-category.music", 34 | "target": "AppImage", 35 | "publish": [ 36 | "github" 37 | ] 38 | } 39 | }, 40 | "packageManager": "pnpm@8.15.6", 41 | "dependencies": { 42 | "electron": "^29.2.0", 43 | "electron-builder": "^24.13.3", 44 | "env-cmd": "^10.1.0" 45 | }, 46 | "workspaces": [ 47 | "app" 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | electron: 12 | specifier: ^29.2.0 13 | version: 29.2.0 14 | electron-builder: 15 | specifier: ^24.13.3 16 | version: 24.13.3(electron-builder-squirrel-windows@24.13.3) 17 | env-cmd: 18 | specifier: ^10.1.0 19 | version: 10.1.0 20 | 21 | app: 22 | dependencies: 23 | bootstrap: 24 | specifier: ^3.4.1 25 | version: 3.4.1 26 | electron-log: 27 | specifier: ^5.1.2 28 | version: 5.1.2 29 | electron-updater: 30 | specifier: ^6.3.0 31 | version: 6.3.0 32 | jquery: 33 | specifier: ^3.7.1 34 | version: 3.7.1 35 | jquery-knob: 36 | specifier: ssh://git@github.com:aterrien/jQuery-Knob.git 37 | version: github.com/aterrien/jQuery-Knob/755309e933d326ffaa5a2d758dc377147b766515 38 | 39 | packages: 40 | 41 | /7zip-bin@5.2.0: 42 | resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} 43 | dev: false 44 | 45 | /@develar/schema-utils@2.6.5: 46 | resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} 47 | engines: {node: '>= 8.9.0'} 48 | dependencies: 49 | ajv: 6.12.6 50 | ajv-keywords: 3.5.2(ajv@6.12.6) 51 | dev: false 52 | 53 | /@electron/asar@3.2.4: 54 | resolution: {integrity: sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==} 55 | engines: {node: '>=10.12.0'} 56 | hasBin: true 57 | dependencies: 58 | chromium-pickle-js: 0.2.0 59 | commander: 5.1.0 60 | glob: 7.2.3 61 | minimatch: 3.1.2 62 | dev: false 63 | 64 | /@electron/get@2.0.3: 65 | resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} 66 | engines: {node: '>=12'} 67 | dependencies: 68 | debug: 4.3.4 69 | env-paths: 2.2.1 70 | fs-extra: 8.1.0 71 | got: 11.8.6 72 | progress: 2.0.3 73 | semver: 6.3.1 74 | sumchecker: 3.0.1 75 | optionalDependencies: 76 | global-agent: 3.0.0 77 | transitivePeerDependencies: 78 | - supports-color 79 | dev: false 80 | 81 | /@electron/notarize@2.2.1: 82 | resolution: {integrity: sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==} 83 | engines: {node: '>= 10.0.0'} 84 | dependencies: 85 | debug: 4.3.4 86 | fs-extra: 9.1.0 87 | promise-retry: 2.0.1 88 | transitivePeerDependencies: 89 | - supports-color 90 | dev: false 91 | 92 | /@electron/osx-sign@1.0.5: 93 | resolution: {integrity: sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==} 94 | engines: {node: '>=12.0.0'} 95 | hasBin: true 96 | dependencies: 97 | compare-version: 0.1.2 98 | debug: 4.3.4 99 | fs-extra: 10.1.0 100 | isbinaryfile: 4.0.10 101 | minimist: 1.2.8 102 | plist: 3.1.0 103 | transitivePeerDependencies: 104 | - supports-color 105 | dev: false 106 | 107 | /@electron/universal@1.5.1: 108 | resolution: {integrity: sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==} 109 | engines: {node: '>=8.6'} 110 | dependencies: 111 | '@electron/asar': 3.2.4 112 | '@malept/cross-spawn-promise': 1.1.1 113 | debug: 4.3.4 114 | dir-compare: 3.3.0 115 | fs-extra: 9.1.0 116 | minimatch: 3.1.2 117 | plist: 3.1.0 118 | transitivePeerDependencies: 119 | - supports-color 120 | dev: false 121 | 122 | /@malept/cross-spawn-promise@1.1.1: 123 | resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} 124 | engines: {node: '>= 10'} 125 | dependencies: 126 | cross-spawn: 7.0.3 127 | dev: false 128 | 129 | /@malept/flatpak-bundler@0.4.0: 130 | resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} 131 | engines: {node: '>= 10.0.0'} 132 | dependencies: 133 | debug: 4.3.4 134 | fs-extra: 9.1.0 135 | lodash: 4.17.21 136 | tmp-promise: 3.0.3 137 | transitivePeerDependencies: 138 | - supports-color 139 | dev: false 140 | 141 | /@sindresorhus/is@4.6.0: 142 | resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} 143 | engines: {node: '>=10'} 144 | dev: false 145 | 146 | /@szmarczak/http-timer@4.0.6: 147 | resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} 148 | engines: {node: '>=10'} 149 | dependencies: 150 | defer-to-connect: 2.0.1 151 | dev: false 152 | 153 | /@tootallnate/once@2.0.0: 154 | resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} 155 | engines: {node: '>= 10'} 156 | dev: false 157 | 158 | /@types/cacheable-request@6.0.3: 159 | resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} 160 | dependencies: 161 | '@types/http-cache-semantics': 4.0.1 162 | '@types/keyv': 3.1.4 163 | '@types/node': 20.12.7 164 | '@types/responselike': 1.0.0 165 | dev: false 166 | 167 | /@types/debug@4.1.8: 168 | resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} 169 | dependencies: 170 | '@types/ms': 0.7.31 171 | dev: false 172 | 173 | /@types/fs-extra@9.0.13: 174 | resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} 175 | dependencies: 176 | '@types/node': 20.5.9 177 | dev: false 178 | 179 | /@types/http-cache-semantics@4.0.1: 180 | resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} 181 | dev: false 182 | 183 | /@types/keyv@3.1.4: 184 | resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} 185 | dependencies: 186 | '@types/node': 20.12.7 187 | dev: false 188 | 189 | /@types/ms@0.7.31: 190 | resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} 191 | dev: false 192 | 193 | /@types/node@20.12.7: 194 | resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} 195 | dependencies: 196 | undici-types: 5.26.5 197 | dev: false 198 | 199 | /@types/node@20.5.9: 200 | resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} 201 | dev: false 202 | 203 | /@types/plist@3.0.2: 204 | resolution: {integrity: sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==} 205 | requiresBuild: true 206 | dependencies: 207 | '@types/node': 20.12.7 208 | xmlbuilder: 15.1.1 209 | dev: false 210 | optional: true 211 | 212 | /@types/responselike@1.0.0: 213 | resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} 214 | dependencies: 215 | '@types/node': 20.12.7 216 | dev: false 217 | 218 | /@types/verror@1.10.6: 219 | resolution: {integrity: sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==} 220 | requiresBuild: true 221 | dev: false 222 | optional: true 223 | 224 | /@types/yauzl@2.10.0: 225 | resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} 226 | requiresBuild: true 227 | dependencies: 228 | '@types/node': 20.12.7 229 | dev: false 230 | optional: true 231 | 232 | /@xmldom/xmldom@0.8.10: 233 | resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} 234 | engines: {node: '>=10.0.0'} 235 | requiresBuild: true 236 | dev: false 237 | 238 | /agent-base@6.0.2: 239 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 240 | engines: {node: '>= 6.0.0'} 241 | dependencies: 242 | debug: 4.3.4 243 | transitivePeerDependencies: 244 | - supports-color 245 | dev: false 246 | 247 | /ajv-keywords@3.5.2(ajv@6.12.6): 248 | resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} 249 | peerDependencies: 250 | ajv: ^6.9.1 251 | dependencies: 252 | ajv: 6.12.6 253 | dev: false 254 | 255 | /ajv@6.12.6: 256 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 257 | dependencies: 258 | fast-deep-equal: 3.1.3 259 | fast-json-stable-stringify: 2.1.0 260 | json-schema-traverse: 0.4.1 261 | uri-js: 4.4.1 262 | dev: false 263 | 264 | /ansi-regex@5.0.1: 265 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 266 | engines: {node: '>=8'} 267 | dev: false 268 | 269 | /ansi-styles@4.3.0: 270 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 271 | engines: {node: '>=8'} 272 | dependencies: 273 | color-convert: 2.0.1 274 | dev: false 275 | 276 | /app-builder-bin@4.0.0: 277 | resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} 278 | dev: false 279 | 280 | /app-builder-lib@24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3): 281 | resolution: {integrity: sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==} 282 | engines: {node: '>=14.0.0'} 283 | peerDependencies: 284 | dmg-builder: 24.13.3 285 | electron-builder-squirrel-windows: 24.13.3 286 | dependencies: 287 | '@develar/schema-utils': 2.6.5 288 | '@electron/notarize': 2.2.1 289 | '@electron/osx-sign': 1.0.5 290 | '@electron/universal': 1.5.1 291 | '@malept/flatpak-bundler': 0.4.0 292 | '@types/fs-extra': 9.0.13 293 | async-exit-hook: 2.0.1 294 | bluebird-lst: 1.0.9 295 | builder-util: 24.13.1 296 | builder-util-runtime: 9.2.4 297 | chromium-pickle-js: 0.2.0 298 | debug: 4.3.4 299 | dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) 300 | ejs: 3.1.9 301 | electron-builder-squirrel-windows: 24.13.3(dmg-builder@24.13.3) 302 | electron-publish: 24.13.1 303 | form-data: 4.0.0 304 | fs-extra: 10.1.0 305 | hosted-git-info: 4.1.0 306 | is-ci: 3.0.1 307 | isbinaryfile: 5.0.0 308 | js-yaml: 4.1.0 309 | lazy-val: 1.0.5 310 | minimatch: 5.1.6 311 | read-config-file: 6.3.2 312 | sanitize-filename: 1.6.3 313 | semver: 7.5.4 314 | tar: 6.2.0 315 | temp-file: 3.4.0 316 | transitivePeerDependencies: 317 | - supports-color 318 | dev: false 319 | 320 | /archiver-utils@2.1.0: 321 | resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} 322 | engines: {node: '>= 6'} 323 | dependencies: 324 | glob: 7.2.3 325 | graceful-fs: 4.2.11 326 | lazystream: 1.0.1 327 | lodash.defaults: 4.2.0 328 | lodash.difference: 4.5.0 329 | lodash.flatten: 4.4.0 330 | lodash.isplainobject: 4.0.6 331 | lodash.union: 4.6.0 332 | normalize-path: 3.0.0 333 | readable-stream: 2.3.8 334 | dev: false 335 | 336 | /archiver-utils@3.0.4: 337 | resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} 338 | engines: {node: '>= 10'} 339 | dependencies: 340 | glob: 7.2.3 341 | graceful-fs: 4.2.11 342 | lazystream: 1.0.1 343 | lodash.defaults: 4.2.0 344 | lodash.difference: 4.5.0 345 | lodash.flatten: 4.4.0 346 | lodash.isplainobject: 4.0.6 347 | lodash.union: 4.6.0 348 | normalize-path: 3.0.0 349 | readable-stream: 3.6.2 350 | dev: false 351 | 352 | /archiver@5.3.2: 353 | resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} 354 | engines: {node: '>= 10'} 355 | dependencies: 356 | archiver-utils: 2.1.0 357 | async: 3.2.4 358 | buffer-crc32: 0.2.13 359 | readable-stream: 3.6.2 360 | readdir-glob: 1.1.3 361 | tar-stream: 2.2.0 362 | zip-stream: 4.1.1 363 | dev: false 364 | 365 | /argparse@2.0.1: 366 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 367 | dev: false 368 | 369 | /assert-plus@1.0.0: 370 | resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} 371 | engines: {node: '>=0.8'} 372 | requiresBuild: true 373 | dev: false 374 | optional: true 375 | 376 | /astral-regex@2.0.0: 377 | resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} 378 | engines: {node: '>=8'} 379 | requiresBuild: true 380 | dev: false 381 | optional: true 382 | 383 | /async-exit-hook@2.0.1: 384 | resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} 385 | engines: {node: '>=0.12.0'} 386 | dev: false 387 | 388 | /async@3.2.4: 389 | resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} 390 | dev: false 391 | 392 | /asynckit@0.4.0: 393 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 394 | dev: false 395 | 396 | /at-least-node@1.0.0: 397 | resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} 398 | engines: {node: '>= 4.0.0'} 399 | dev: false 400 | 401 | /balanced-match@1.0.2: 402 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 403 | dev: false 404 | 405 | /base64-js@1.5.1: 406 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 407 | requiresBuild: true 408 | dev: false 409 | 410 | /bl@4.1.0: 411 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 412 | dependencies: 413 | buffer: 5.7.1 414 | inherits: 2.0.4 415 | readable-stream: 3.6.2 416 | dev: false 417 | 418 | /bluebird-lst@1.0.9: 419 | resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} 420 | dependencies: 421 | bluebird: 3.7.2 422 | dev: false 423 | 424 | /bluebird@3.7.2: 425 | resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} 426 | dev: false 427 | 428 | /boolean@3.2.0: 429 | resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} 430 | requiresBuild: true 431 | dev: false 432 | optional: true 433 | 434 | /bootstrap@3.4.1: 435 | resolution: {integrity: sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==} 436 | engines: {node: '>=6'} 437 | dev: false 438 | 439 | /brace-expansion@1.1.11: 440 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 441 | dependencies: 442 | balanced-match: 1.0.2 443 | concat-map: 0.0.1 444 | dev: false 445 | 446 | /brace-expansion@2.0.1: 447 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 448 | dependencies: 449 | balanced-match: 1.0.2 450 | dev: false 451 | 452 | /buffer-crc32@0.2.13: 453 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 454 | dev: false 455 | 456 | /buffer-equal@1.0.0: 457 | resolution: {integrity: sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==} 458 | engines: {node: '>=0.4.0'} 459 | dev: false 460 | 461 | /buffer-from@1.1.2: 462 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 463 | dev: false 464 | 465 | /buffer@5.7.1: 466 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 467 | requiresBuild: true 468 | dependencies: 469 | base64-js: 1.5.1 470 | ieee754: 1.2.1 471 | dev: false 472 | 473 | /builder-util-runtime@9.2.4: 474 | resolution: {integrity: sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==} 475 | engines: {node: '>=12.0.0'} 476 | dependencies: 477 | debug: 4.3.4 478 | sax: 1.2.4 479 | transitivePeerDependencies: 480 | - supports-color 481 | dev: false 482 | 483 | /builder-util-runtime@9.2.5: 484 | resolution: {integrity: sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg==} 485 | engines: {node: '>=12.0.0'} 486 | dependencies: 487 | debug: 4.3.4 488 | sax: 1.2.4 489 | transitivePeerDependencies: 490 | - supports-color 491 | dev: false 492 | 493 | /builder-util@24.13.1: 494 | resolution: {integrity: sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==} 495 | dependencies: 496 | 7zip-bin: 5.2.0 497 | '@types/debug': 4.1.8 498 | app-builder-bin: 4.0.0 499 | bluebird-lst: 1.0.9 500 | builder-util-runtime: 9.2.4 501 | chalk: 4.1.2 502 | cross-spawn: 7.0.3 503 | debug: 4.3.4 504 | fs-extra: 10.1.0 505 | http-proxy-agent: 5.0.0 506 | https-proxy-agent: 5.0.1 507 | is-ci: 3.0.1 508 | js-yaml: 4.1.0 509 | source-map-support: 0.5.21 510 | stat-mode: 1.0.0 511 | temp-file: 3.4.0 512 | transitivePeerDependencies: 513 | - supports-color 514 | dev: false 515 | 516 | /cacheable-lookup@5.0.4: 517 | resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} 518 | engines: {node: '>=10.6.0'} 519 | dev: false 520 | 521 | /cacheable-request@7.0.4: 522 | resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} 523 | engines: {node: '>=8'} 524 | dependencies: 525 | clone-response: 1.0.3 526 | get-stream: 5.2.0 527 | http-cache-semantics: 4.1.1 528 | keyv: 4.5.3 529 | lowercase-keys: 2.0.0 530 | normalize-url: 6.1.0 531 | responselike: 2.0.1 532 | dev: false 533 | 534 | /chalk@4.1.2: 535 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 536 | engines: {node: '>=10'} 537 | dependencies: 538 | ansi-styles: 4.3.0 539 | supports-color: 7.2.0 540 | dev: false 541 | 542 | /chownr@2.0.0: 543 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 544 | engines: {node: '>=10'} 545 | dev: false 546 | 547 | /chromium-pickle-js@0.2.0: 548 | resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} 549 | dev: false 550 | 551 | /ci-info@3.8.0: 552 | resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} 553 | engines: {node: '>=8'} 554 | dev: false 555 | 556 | /cli-truncate@2.1.0: 557 | resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} 558 | engines: {node: '>=8'} 559 | requiresBuild: true 560 | dependencies: 561 | slice-ansi: 3.0.0 562 | string-width: 4.2.3 563 | dev: false 564 | optional: true 565 | 566 | /cliui@8.0.1: 567 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 568 | engines: {node: '>=12'} 569 | dependencies: 570 | string-width: 4.2.3 571 | strip-ansi: 6.0.1 572 | wrap-ansi: 7.0.0 573 | dev: false 574 | 575 | /clone-response@1.0.3: 576 | resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} 577 | dependencies: 578 | mimic-response: 1.0.1 579 | dev: false 580 | 581 | /color-convert@2.0.1: 582 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 583 | engines: {node: '>=7.0.0'} 584 | dependencies: 585 | color-name: 1.1.4 586 | dev: false 587 | 588 | /color-name@1.1.4: 589 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 590 | dev: false 591 | 592 | /combined-stream@1.0.8: 593 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 594 | engines: {node: '>= 0.8'} 595 | dependencies: 596 | delayed-stream: 1.0.0 597 | dev: false 598 | 599 | /commander@4.1.1: 600 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 601 | engines: {node: '>= 6'} 602 | dev: false 603 | 604 | /commander@5.1.0: 605 | resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} 606 | engines: {node: '>= 6'} 607 | dev: false 608 | 609 | /compare-version@0.1.2: 610 | resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} 611 | engines: {node: '>=0.10.0'} 612 | dev: false 613 | 614 | /compress-commons@4.1.2: 615 | resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} 616 | engines: {node: '>= 10'} 617 | dependencies: 618 | buffer-crc32: 0.2.13 619 | crc32-stream: 4.0.3 620 | normalize-path: 3.0.0 621 | readable-stream: 3.6.2 622 | dev: false 623 | 624 | /concat-map@0.0.1: 625 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 626 | dev: false 627 | 628 | /config-file-ts@0.2.4: 629 | resolution: {integrity: sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==} 630 | dependencies: 631 | glob: 7.2.3 632 | typescript: 4.9.5 633 | dev: false 634 | 635 | /core-util-is@1.0.2: 636 | resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} 637 | requiresBuild: true 638 | dev: false 639 | 640 | /crc-32@1.2.2: 641 | resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} 642 | engines: {node: '>=0.8'} 643 | hasBin: true 644 | dev: false 645 | 646 | /crc32-stream@4.0.3: 647 | resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} 648 | engines: {node: '>= 10'} 649 | dependencies: 650 | crc-32: 1.2.2 651 | readable-stream: 3.6.2 652 | dev: false 653 | 654 | /crc@3.8.0: 655 | resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} 656 | requiresBuild: true 657 | dependencies: 658 | buffer: 5.7.1 659 | dev: false 660 | optional: true 661 | 662 | /cross-spawn@7.0.3: 663 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 664 | engines: {node: '>= 8'} 665 | dependencies: 666 | path-key: 3.1.1 667 | shebang-command: 2.0.0 668 | which: 2.0.2 669 | dev: false 670 | 671 | /debug@4.3.4: 672 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 673 | engines: {node: '>=6.0'} 674 | peerDependencies: 675 | supports-color: '*' 676 | peerDependenciesMeta: 677 | supports-color: 678 | optional: true 679 | dependencies: 680 | ms: 2.1.2 681 | dev: false 682 | 683 | /decompress-response@6.0.0: 684 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 685 | engines: {node: '>=10'} 686 | dependencies: 687 | mimic-response: 3.1.0 688 | dev: false 689 | 690 | /defer-to-connect@2.0.1: 691 | resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} 692 | engines: {node: '>=10'} 693 | dev: false 694 | 695 | /define-properties@1.2.0: 696 | resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} 697 | engines: {node: '>= 0.4'} 698 | requiresBuild: true 699 | dependencies: 700 | has-property-descriptors: 1.0.0 701 | object-keys: 1.1.1 702 | dev: false 703 | optional: true 704 | 705 | /delayed-stream@1.0.0: 706 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 707 | engines: {node: '>=0.4.0'} 708 | dev: false 709 | 710 | /detect-node@2.1.0: 711 | resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} 712 | requiresBuild: true 713 | dev: false 714 | optional: true 715 | 716 | /dir-compare@3.3.0: 717 | resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==} 718 | dependencies: 719 | buffer-equal: 1.0.0 720 | minimatch: 3.1.2 721 | dev: false 722 | 723 | /dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): 724 | resolution: {integrity: sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==} 725 | dependencies: 726 | app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) 727 | builder-util: 24.13.1 728 | builder-util-runtime: 9.2.4 729 | fs-extra: 10.1.0 730 | iconv-lite: 0.6.3 731 | js-yaml: 4.1.0 732 | optionalDependencies: 733 | dmg-license: 1.0.11 734 | transitivePeerDependencies: 735 | - electron-builder-squirrel-windows 736 | - supports-color 737 | dev: false 738 | 739 | /dmg-license@1.0.11: 740 | resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} 741 | engines: {node: '>=8'} 742 | os: [darwin] 743 | hasBin: true 744 | requiresBuild: true 745 | dependencies: 746 | '@types/plist': 3.0.2 747 | '@types/verror': 1.10.6 748 | ajv: 6.12.6 749 | crc: 3.8.0 750 | iconv-corefoundation: 1.1.7 751 | plist: 3.1.0 752 | smart-buffer: 4.2.0 753 | verror: 1.10.1 754 | dev: false 755 | optional: true 756 | 757 | /dotenv-expand@5.1.0: 758 | resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} 759 | dev: false 760 | 761 | /dotenv@9.0.2: 762 | resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} 763 | engines: {node: '>=10'} 764 | dev: false 765 | 766 | /ejs@3.1.9: 767 | resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} 768 | engines: {node: '>=0.10.0'} 769 | hasBin: true 770 | dependencies: 771 | jake: 10.8.7 772 | dev: false 773 | 774 | /electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3): 775 | resolution: {integrity: sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==} 776 | dependencies: 777 | app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) 778 | archiver: 5.3.2 779 | builder-util: 24.13.1 780 | fs-extra: 10.1.0 781 | transitivePeerDependencies: 782 | - dmg-builder 783 | - supports-color 784 | dev: false 785 | 786 | /electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): 787 | resolution: {integrity: sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==} 788 | engines: {node: '>=14.0.0'} 789 | hasBin: true 790 | dependencies: 791 | app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) 792 | builder-util: 24.13.1 793 | builder-util-runtime: 9.2.4 794 | chalk: 4.1.2 795 | dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) 796 | fs-extra: 10.1.0 797 | is-ci: 3.0.1 798 | lazy-val: 1.0.5 799 | read-config-file: 6.3.2 800 | simple-update-notifier: 2.0.0 801 | yargs: 17.7.2 802 | transitivePeerDependencies: 803 | - electron-builder-squirrel-windows 804 | - supports-color 805 | dev: false 806 | 807 | /electron-log@5.1.2: 808 | resolution: {integrity: sha512-Cpg4hAZ27yM9wzE77c4TvgzxzavZ+dVltCczParXN+Vb3jocojCSAuSMCVOI9fhFuuOR+iuu3tZLX1cu0y0kgQ==} 809 | engines: {node: '>= 14'} 810 | dev: false 811 | 812 | /electron-publish@24.13.1: 813 | resolution: {integrity: sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==} 814 | dependencies: 815 | '@types/fs-extra': 9.0.13 816 | builder-util: 24.13.1 817 | builder-util-runtime: 9.2.4 818 | chalk: 4.1.2 819 | fs-extra: 10.1.0 820 | lazy-val: 1.0.5 821 | mime: 2.6.0 822 | transitivePeerDependencies: 823 | - supports-color 824 | dev: false 825 | 826 | /electron-updater@6.3.0: 827 | resolution: {integrity: sha512-3Xlezhk+dKaSQrOnkQNqCGiuGSSUPO9BV9TQZ4Iig6AyTJ4FzJONE5gFFc382sY53Sh9dwJfzKsA3DxRHt2btw==} 828 | dependencies: 829 | builder-util-runtime: 9.2.5 830 | fs-extra: 10.1.0 831 | js-yaml: 4.1.0 832 | lazy-val: 1.0.5 833 | lodash.escaperegexp: 4.1.2 834 | lodash.isequal: 4.5.0 835 | semver: 7.5.4 836 | tiny-typed-emitter: 2.1.0 837 | transitivePeerDependencies: 838 | - supports-color 839 | dev: false 840 | 841 | /electron@29.2.0: 842 | resolution: {integrity: sha512-ALKrCN52RG4g9prx4DriXSPnY5WoiyRUCNp7zEVQuoiNOpHTNqMMpRidQAHzntV4hajF1LMWHVoBkwqIs1jHhg==} 843 | engines: {node: '>= 12.20.55'} 844 | hasBin: true 845 | requiresBuild: true 846 | dependencies: 847 | '@electron/get': 2.0.3 848 | '@types/node': 20.12.7 849 | extract-zip: 2.0.1 850 | transitivePeerDependencies: 851 | - supports-color 852 | dev: false 853 | 854 | /emoji-regex@8.0.0: 855 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 856 | dev: false 857 | 858 | /end-of-stream@1.4.4: 859 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 860 | dependencies: 861 | once: 1.4.0 862 | dev: false 863 | 864 | /env-cmd@10.1.0: 865 | resolution: {integrity: sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==} 866 | engines: {node: '>=8.0.0'} 867 | hasBin: true 868 | dependencies: 869 | commander: 4.1.1 870 | cross-spawn: 7.0.3 871 | dev: false 872 | 873 | /env-paths@2.2.1: 874 | resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} 875 | engines: {node: '>=6'} 876 | dev: false 877 | 878 | /err-code@2.0.3: 879 | resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} 880 | dev: false 881 | 882 | /es6-error@4.1.1: 883 | resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} 884 | requiresBuild: true 885 | dev: false 886 | optional: true 887 | 888 | /escalade@3.1.1: 889 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 890 | engines: {node: '>=6'} 891 | dev: false 892 | 893 | /escape-string-regexp@4.0.0: 894 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 895 | engines: {node: '>=10'} 896 | requiresBuild: true 897 | dev: false 898 | optional: true 899 | 900 | /extract-zip@2.0.1: 901 | resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} 902 | engines: {node: '>= 10.17.0'} 903 | hasBin: true 904 | dependencies: 905 | debug: 4.3.4 906 | get-stream: 5.2.0 907 | yauzl: 2.10.0 908 | optionalDependencies: 909 | '@types/yauzl': 2.10.0 910 | transitivePeerDependencies: 911 | - supports-color 912 | dev: false 913 | 914 | /extsprintf@1.4.1: 915 | resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} 916 | engines: {'0': node >=0.6.0} 917 | requiresBuild: true 918 | dev: false 919 | optional: true 920 | 921 | /fast-deep-equal@3.1.3: 922 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 923 | requiresBuild: true 924 | dev: false 925 | 926 | /fast-json-stable-stringify@2.1.0: 927 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 928 | requiresBuild: true 929 | dev: false 930 | 931 | /fd-slicer@1.1.0: 932 | resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} 933 | dependencies: 934 | pend: 1.2.0 935 | dev: false 936 | 937 | /filelist@1.0.4: 938 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} 939 | dependencies: 940 | minimatch: 5.1.6 941 | dev: false 942 | 943 | /form-data@4.0.0: 944 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 945 | engines: {node: '>= 6'} 946 | dependencies: 947 | asynckit: 0.4.0 948 | combined-stream: 1.0.8 949 | mime-types: 2.1.35 950 | dev: false 951 | 952 | /fs-constants@1.0.0: 953 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 954 | dev: false 955 | 956 | /fs-extra@10.1.0: 957 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} 958 | engines: {node: '>=12'} 959 | dependencies: 960 | graceful-fs: 4.2.11 961 | jsonfile: 6.1.0 962 | universalify: 2.0.0 963 | dev: false 964 | 965 | /fs-extra@8.1.0: 966 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 967 | engines: {node: '>=6 <7 || >=8'} 968 | dependencies: 969 | graceful-fs: 4.2.11 970 | jsonfile: 4.0.0 971 | universalify: 0.1.2 972 | dev: false 973 | 974 | /fs-extra@9.1.0: 975 | resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} 976 | engines: {node: '>=10'} 977 | dependencies: 978 | at-least-node: 1.0.0 979 | graceful-fs: 4.2.11 980 | jsonfile: 6.1.0 981 | universalify: 2.0.0 982 | dev: false 983 | 984 | /fs-minipass@2.1.0: 985 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 986 | engines: {node: '>= 8'} 987 | dependencies: 988 | minipass: 3.3.6 989 | dev: false 990 | 991 | /fs.realpath@1.0.0: 992 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 993 | dev: false 994 | 995 | /function-bind@1.1.1: 996 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 997 | requiresBuild: true 998 | dev: false 999 | optional: true 1000 | 1001 | /get-caller-file@2.0.5: 1002 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1003 | engines: {node: 6.* || 8.* || >= 10.*} 1004 | dev: false 1005 | 1006 | /get-intrinsic@1.2.1: 1007 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 1008 | requiresBuild: true 1009 | dependencies: 1010 | function-bind: 1.1.1 1011 | has: 1.0.3 1012 | has-proto: 1.0.1 1013 | has-symbols: 1.0.3 1014 | dev: false 1015 | optional: true 1016 | 1017 | /get-stream@5.2.0: 1018 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 1019 | engines: {node: '>=8'} 1020 | dependencies: 1021 | pump: 3.0.0 1022 | dev: false 1023 | 1024 | /glob@7.2.3: 1025 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1026 | dependencies: 1027 | fs.realpath: 1.0.0 1028 | inflight: 1.0.6 1029 | inherits: 2.0.4 1030 | minimatch: 3.1.2 1031 | once: 1.4.0 1032 | path-is-absolute: 1.0.1 1033 | dev: false 1034 | 1035 | /global-agent@3.0.0: 1036 | resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} 1037 | engines: {node: '>=10.0'} 1038 | requiresBuild: true 1039 | dependencies: 1040 | boolean: 3.2.0 1041 | es6-error: 4.1.1 1042 | matcher: 3.0.0 1043 | roarr: 2.15.4 1044 | semver: 7.5.4 1045 | serialize-error: 7.0.1 1046 | dev: false 1047 | optional: true 1048 | 1049 | /globalthis@1.0.3: 1050 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 1051 | engines: {node: '>= 0.4'} 1052 | requiresBuild: true 1053 | dependencies: 1054 | define-properties: 1.2.0 1055 | dev: false 1056 | optional: true 1057 | 1058 | /got@11.8.6: 1059 | resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} 1060 | engines: {node: '>=10.19.0'} 1061 | dependencies: 1062 | '@sindresorhus/is': 4.6.0 1063 | '@szmarczak/http-timer': 4.0.6 1064 | '@types/cacheable-request': 6.0.3 1065 | '@types/responselike': 1.0.0 1066 | cacheable-lookup: 5.0.4 1067 | cacheable-request: 7.0.4 1068 | decompress-response: 6.0.0 1069 | http2-wrapper: 1.0.3 1070 | lowercase-keys: 2.0.0 1071 | p-cancelable: 2.1.1 1072 | responselike: 2.0.1 1073 | dev: false 1074 | 1075 | /graceful-fs@4.2.11: 1076 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1077 | dev: false 1078 | 1079 | /has-flag@4.0.0: 1080 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1081 | engines: {node: '>=8'} 1082 | dev: false 1083 | 1084 | /has-property-descriptors@1.0.0: 1085 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 1086 | requiresBuild: true 1087 | dependencies: 1088 | get-intrinsic: 1.2.1 1089 | dev: false 1090 | optional: true 1091 | 1092 | /has-proto@1.0.1: 1093 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1094 | engines: {node: '>= 0.4'} 1095 | requiresBuild: true 1096 | dev: false 1097 | optional: true 1098 | 1099 | /has-symbols@1.0.3: 1100 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1101 | engines: {node: '>= 0.4'} 1102 | requiresBuild: true 1103 | dev: false 1104 | optional: true 1105 | 1106 | /has@1.0.3: 1107 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1108 | engines: {node: '>= 0.4.0'} 1109 | requiresBuild: true 1110 | dependencies: 1111 | function-bind: 1.1.1 1112 | dev: false 1113 | optional: true 1114 | 1115 | /hosted-git-info@4.1.0: 1116 | resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} 1117 | engines: {node: '>=10'} 1118 | dependencies: 1119 | lru-cache: 6.0.0 1120 | dev: false 1121 | 1122 | /http-cache-semantics@4.1.1: 1123 | resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} 1124 | dev: false 1125 | 1126 | /http-proxy-agent@5.0.0: 1127 | resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} 1128 | engines: {node: '>= 6'} 1129 | dependencies: 1130 | '@tootallnate/once': 2.0.0 1131 | agent-base: 6.0.2 1132 | debug: 4.3.4 1133 | transitivePeerDependencies: 1134 | - supports-color 1135 | dev: false 1136 | 1137 | /http2-wrapper@1.0.3: 1138 | resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} 1139 | engines: {node: '>=10.19.0'} 1140 | dependencies: 1141 | quick-lru: 5.1.1 1142 | resolve-alpn: 1.2.1 1143 | dev: false 1144 | 1145 | /https-proxy-agent@5.0.1: 1146 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 1147 | engines: {node: '>= 6'} 1148 | dependencies: 1149 | agent-base: 6.0.2 1150 | debug: 4.3.4 1151 | transitivePeerDependencies: 1152 | - supports-color 1153 | dev: false 1154 | 1155 | /iconv-corefoundation@1.1.7: 1156 | resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} 1157 | engines: {node: ^8.11.2 || >=10} 1158 | os: [darwin] 1159 | requiresBuild: true 1160 | dependencies: 1161 | cli-truncate: 2.1.0 1162 | node-addon-api: 1.7.2 1163 | dev: false 1164 | optional: true 1165 | 1166 | /iconv-lite@0.6.3: 1167 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 1168 | engines: {node: '>=0.10.0'} 1169 | dependencies: 1170 | safer-buffer: 2.1.2 1171 | dev: false 1172 | 1173 | /ieee754@1.2.1: 1174 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1175 | requiresBuild: true 1176 | dev: false 1177 | 1178 | /inflight@1.0.6: 1179 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1180 | dependencies: 1181 | once: 1.4.0 1182 | wrappy: 1.0.2 1183 | dev: false 1184 | 1185 | /inherits@2.0.4: 1186 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1187 | dev: false 1188 | 1189 | /is-ci@3.0.1: 1190 | resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} 1191 | hasBin: true 1192 | dependencies: 1193 | ci-info: 3.8.0 1194 | dev: false 1195 | 1196 | /is-fullwidth-code-point@3.0.0: 1197 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1198 | engines: {node: '>=8'} 1199 | dev: false 1200 | 1201 | /isarray@1.0.0: 1202 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 1203 | dev: false 1204 | 1205 | /isbinaryfile@4.0.10: 1206 | resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} 1207 | engines: {node: '>= 8.0.0'} 1208 | dev: false 1209 | 1210 | /isbinaryfile@5.0.0: 1211 | resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==} 1212 | engines: {node: '>= 14.0.0'} 1213 | dev: false 1214 | 1215 | /isexe@2.0.0: 1216 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1217 | dev: false 1218 | 1219 | /jake@10.8.7: 1220 | resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} 1221 | engines: {node: '>=10'} 1222 | hasBin: true 1223 | dependencies: 1224 | async: 3.2.4 1225 | chalk: 4.1.2 1226 | filelist: 1.0.4 1227 | minimatch: 3.1.2 1228 | dev: false 1229 | 1230 | /jquery@3.7.1: 1231 | resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} 1232 | dev: false 1233 | 1234 | /js-yaml@4.1.0: 1235 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1236 | hasBin: true 1237 | dependencies: 1238 | argparse: 2.0.1 1239 | dev: false 1240 | 1241 | /json-buffer@3.0.1: 1242 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1243 | dev: false 1244 | 1245 | /json-schema-traverse@0.4.1: 1246 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1247 | requiresBuild: true 1248 | dev: false 1249 | 1250 | /json-stringify-safe@5.0.1: 1251 | resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} 1252 | requiresBuild: true 1253 | dev: false 1254 | optional: true 1255 | 1256 | /json5@2.2.3: 1257 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1258 | engines: {node: '>=6'} 1259 | hasBin: true 1260 | dev: false 1261 | 1262 | /jsonfile@4.0.0: 1263 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 1264 | optionalDependencies: 1265 | graceful-fs: 4.2.11 1266 | dev: false 1267 | 1268 | /jsonfile@6.1.0: 1269 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1270 | dependencies: 1271 | universalify: 2.0.0 1272 | optionalDependencies: 1273 | graceful-fs: 4.2.11 1274 | dev: false 1275 | 1276 | /keyv@4.5.3: 1277 | resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} 1278 | dependencies: 1279 | json-buffer: 3.0.1 1280 | dev: false 1281 | 1282 | /lazy-val@1.0.5: 1283 | resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} 1284 | dev: false 1285 | 1286 | /lazystream@1.0.1: 1287 | resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} 1288 | engines: {node: '>= 0.6.3'} 1289 | dependencies: 1290 | readable-stream: 2.3.8 1291 | dev: false 1292 | 1293 | /lodash.defaults@4.2.0: 1294 | resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} 1295 | dev: false 1296 | 1297 | /lodash.difference@4.5.0: 1298 | resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} 1299 | dev: false 1300 | 1301 | /lodash.escaperegexp@4.1.2: 1302 | resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} 1303 | dev: false 1304 | 1305 | /lodash.flatten@4.4.0: 1306 | resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} 1307 | dev: false 1308 | 1309 | /lodash.isequal@4.5.0: 1310 | resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} 1311 | dev: false 1312 | 1313 | /lodash.isplainobject@4.0.6: 1314 | resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} 1315 | dev: false 1316 | 1317 | /lodash.union@4.6.0: 1318 | resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} 1319 | dev: false 1320 | 1321 | /lodash@4.17.21: 1322 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1323 | dev: false 1324 | 1325 | /lowercase-keys@2.0.0: 1326 | resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} 1327 | engines: {node: '>=8'} 1328 | dev: false 1329 | 1330 | /lru-cache@6.0.0: 1331 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1332 | engines: {node: '>=10'} 1333 | dependencies: 1334 | yallist: 4.0.0 1335 | dev: false 1336 | 1337 | /matcher@3.0.0: 1338 | resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} 1339 | engines: {node: '>=10'} 1340 | requiresBuild: true 1341 | dependencies: 1342 | escape-string-regexp: 4.0.0 1343 | dev: false 1344 | optional: true 1345 | 1346 | /mime-db@1.52.0: 1347 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1348 | engines: {node: '>= 0.6'} 1349 | dev: false 1350 | 1351 | /mime-types@2.1.35: 1352 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1353 | engines: {node: '>= 0.6'} 1354 | dependencies: 1355 | mime-db: 1.52.0 1356 | dev: false 1357 | 1358 | /mime@2.6.0: 1359 | resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} 1360 | engines: {node: '>=4.0.0'} 1361 | hasBin: true 1362 | dev: false 1363 | 1364 | /mimic-response@1.0.1: 1365 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} 1366 | engines: {node: '>=4'} 1367 | dev: false 1368 | 1369 | /mimic-response@3.1.0: 1370 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 1371 | engines: {node: '>=10'} 1372 | dev: false 1373 | 1374 | /minimatch@3.1.2: 1375 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1376 | dependencies: 1377 | brace-expansion: 1.1.11 1378 | dev: false 1379 | 1380 | /minimatch@5.1.6: 1381 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 1382 | engines: {node: '>=10'} 1383 | dependencies: 1384 | brace-expansion: 2.0.1 1385 | dev: false 1386 | 1387 | /minimist@1.2.8: 1388 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1389 | dev: false 1390 | 1391 | /minipass@3.3.6: 1392 | resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} 1393 | engines: {node: '>=8'} 1394 | dependencies: 1395 | yallist: 4.0.0 1396 | dev: false 1397 | 1398 | /minipass@5.0.0: 1399 | resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} 1400 | engines: {node: '>=8'} 1401 | dev: false 1402 | 1403 | /minizlib@2.1.2: 1404 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 1405 | engines: {node: '>= 8'} 1406 | dependencies: 1407 | minipass: 3.3.6 1408 | yallist: 4.0.0 1409 | dev: false 1410 | 1411 | /mkdirp@1.0.4: 1412 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1413 | engines: {node: '>=10'} 1414 | hasBin: true 1415 | dev: false 1416 | 1417 | /ms@2.1.2: 1418 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1419 | dev: false 1420 | 1421 | /node-addon-api@1.7.2: 1422 | resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} 1423 | requiresBuild: true 1424 | dev: false 1425 | optional: true 1426 | 1427 | /normalize-path@3.0.0: 1428 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1429 | engines: {node: '>=0.10.0'} 1430 | dev: false 1431 | 1432 | /normalize-url@6.1.0: 1433 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} 1434 | engines: {node: '>=10'} 1435 | dev: false 1436 | 1437 | /object-keys@1.1.1: 1438 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1439 | engines: {node: '>= 0.4'} 1440 | requiresBuild: true 1441 | dev: false 1442 | optional: true 1443 | 1444 | /once@1.4.0: 1445 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1446 | dependencies: 1447 | wrappy: 1.0.2 1448 | dev: false 1449 | 1450 | /p-cancelable@2.1.1: 1451 | resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} 1452 | engines: {node: '>=8'} 1453 | dev: false 1454 | 1455 | /path-is-absolute@1.0.1: 1456 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1457 | engines: {node: '>=0.10.0'} 1458 | dev: false 1459 | 1460 | /path-key@3.1.1: 1461 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1462 | engines: {node: '>=8'} 1463 | dev: false 1464 | 1465 | /pend@1.2.0: 1466 | resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} 1467 | dev: false 1468 | 1469 | /plist@3.1.0: 1470 | resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} 1471 | engines: {node: '>=10.4.0'} 1472 | dependencies: 1473 | '@xmldom/xmldom': 0.8.10 1474 | base64-js: 1.5.1 1475 | xmlbuilder: 15.1.1 1476 | dev: false 1477 | 1478 | /process-nextick-args@2.0.1: 1479 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1480 | dev: false 1481 | 1482 | /progress@2.0.3: 1483 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 1484 | engines: {node: '>=0.4.0'} 1485 | dev: false 1486 | 1487 | /promise-retry@2.0.1: 1488 | resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} 1489 | engines: {node: '>=10'} 1490 | dependencies: 1491 | err-code: 2.0.3 1492 | retry: 0.12.0 1493 | dev: false 1494 | 1495 | /pump@3.0.0: 1496 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 1497 | dependencies: 1498 | end-of-stream: 1.4.4 1499 | once: 1.4.0 1500 | dev: false 1501 | 1502 | /punycode@2.3.0: 1503 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 1504 | engines: {node: '>=6'} 1505 | requiresBuild: true 1506 | dev: false 1507 | 1508 | /quick-lru@5.1.1: 1509 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 1510 | engines: {node: '>=10'} 1511 | dev: false 1512 | 1513 | /read-config-file@6.3.2: 1514 | resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} 1515 | engines: {node: '>=12.0.0'} 1516 | dependencies: 1517 | config-file-ts: 0.2.4 1518 | dotenv: 9.0.2 1519 | dotenv-expand: 5.1.0 1520 | js-yaml: 4.1.0 1521 | json5: 2.2.3 1522 | lazy-val: 1.0.5 1523 | dev: false 1524 | 1525 | /readable-stream@2.3.8: 1526 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} 1527 | dependencies: 1528 | core-util-is: 1.0.2 1529 | inherits: 2.0.4 1530 | isarray: 1.0.0 1531 | process-nextick-args: 2.0.1 1532 | safe-buffer: 5.1.2 1533 | string_decoder: 1.1.1 1534 | util-deprecate: 1.0.2 1535 | dev: false 1536 | 1537 | /readable-stream@3.6.2: 1538 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1539 | engines: {node: '>= 6'} 1540 | dependencies: 1541 | inherits: 2.0.4 1542 | string_decoder: 1.3.0 1543 | util-deprecate: 1.0.2 1544 | dev: false 1545 | 1546 | /readdir-glob@1.1.3: 1547 | resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} 1548 | dependencies: 1549 | minimatch: 5.1.6 1550 | dev: false 1551 | 1552 | /require-directory@2.1.1: 1553 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1554 | engines: {node: '>=0.10.0'} 1555 | dev: false 1556 | 1557 | /resolve-alpn@1.2.1: 1558 | resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} 1559 | dev: false 1560 | 1561 | /responselike@2.0.1: 1562 | resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} 1563 | dependencies: 1564 | lowercase-keys: 2.0.0 1565 | dev: false 1566 | 1567 | /retry@0.12.0: 1568 | resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} 1569 | engines: {node: '>= 4'} 1570 | dev: false 1571 | 1572 | /rimraf@3.0.2: 1573 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1574 | hasBin: true 1575 | dependencies: 1576 | glob: 7.2.3 1577 | dev: false 1578 | 1579 | /roarr@2.15.4: 1580 | resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} 1581 | engines: {node: '>=8.0'} 1582 | requiresBuild: true 1583 | dependencies: 1584 | boolean: 3.2.0 1585 | detect-node: 2.1.0 1586 | globalthis: 1.0.3 1587 | json-stringify-safe: 5.0.1 1588 | semver-compare: 1.0.0 1589 | sprintf-js: 1.1.2 1590 | dev: false 1591 | optional: true 1592 | 1593 | /safe-buffer@5.1.2: 1594 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1595 | dev: false 1596 | 1597 | /safe-buffer@5.2.1: 1598 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1599 | dev: false 1600 | 1601 | /safer-buffer@2.1.2: 1602 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1603 | dev: false 1604 | 1605 | /sanitize-filename@1.6.3: 1606 | resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} 1607 | dependencies: 1608 | truncate-utf8-bytes: 1.0.2 1609 | dev: false 1610 | 1611 | /sax@1.2.4: 1612 | resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} 1613 | dev: false 1614 | 1615 | /semver-compare@1.0.0: 1616 | resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} 1617 | requiresBuild: true 1618 | dev: false 1619 | optional: true 1620 | 1621 | /semver@6.3.1: 1622 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1623 | hasBin: true 1624 | dev: false 1625 | 1626 | /semver@7.5.4: 1627 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 1628 | engines: {node: '>=10'} 1629 | hasBin: true 1630 | dependencies: 1631 | lru-cache: 6.0.0 1632 | dev: false 1633 | 1634 | /serialize-error@7.0.1: 1635 | resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} 1636 | engines: {node: '>=10'} 1637 | requiresBuild: true 1638 | dependencies: 1639 | type-fest: 0.13.1 1640 | dev: false 1641 | optional: true 1642 | 1643 | /shebang-command@2.0.0: 1644 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1645 | engines: {node: '>=8'} 1646 | dependencies: 1647 | shebang-regex: 3.0.0 1648 | dev: false 1649 | 1650 | /shebang-regex@3.0.0: 1651 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1652 | engines: {node: '>=8'} 1653 | dev: false 1654 | 1655 | /simple-update-notifier@2.0.0: 1656 | resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} 1657 | engines: {node: '>=10'} 1658 | dependencies: 1659 | semver: 7.5.4 1660 | dev: false 1661 | 1662 | /slice-ansi@3.0.0: 1663 | resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} 1664 | engines: {node: '>=8'} 1665 | requiresBuild: true 1666 | dependencies: 1667 | ansi-styles: 4.3.0 1668 | astral-regex: 2.0.0 1669 | is-fullwidth-code-point: 3.0.0 1670 | dev: false 1671 | optional: true 1672 | 1673 | /smart-buffer@4.2.0: 1674 | resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} 1675 | engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} 1676 | requiresBuild: true 1677 | dev: false 1678 | optional: true 1679 | 1680 | /source-map-support@0.5.21: 1681 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1682 | dependencies: 1683 | buffer-from: 1.1.2 1684 | source-map: 0.6.1 1685 | dev: false 1686 | 1687 | /source-map@0.6.1: 1688 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1689 | engines: {node: '>=0.10.0'} 1690 | dev: false 1691 | 1692 | /sprintf-js@1.1.2: 1693 | resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} 1694 | requiresBuild: true 1695 | dev: false 1696 | optional: true 1697 | 1698 | /stat-mode@1.0.0: 1699 | resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} 1700 | engines: {node: '>= 6'} 1701 | dev: false 1702 | 1703 | /string-width@4.2.3: 1704 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1705 | engines: {node: '>=8'} 1706 | dependencies: 1707 | emoji-regex: 8.0.0 1708 | is-fullwidth-code-point: 3.0.0 1709 | strip-ansi: 6.0.1 1710 | dev: false 1711 | 1712 | /string_decoder@1.1.1: 1713 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1714 | dependencies: 1715 | safe-buffer: 5.1.2 1716 | dev: false 1717 | 1718 | /string_decoder@1.3.0: 1719 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1720 | dependencies: 1721 | safe-buffer: 5.2.1 1722 | dev: false 1723 | 1724 | /strip-ansi@6.0.1: 1725 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1726 | engines: {node: '>=8'} 1727 | dependencies: 1728 | ansi-regex: 5.0.1 1729 | dev: false 1730 | 1731 | /sumchecker@3.0.1: 1732 | resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} 1733 | engines: {node: '>= 8.0'} 1734 | dependencies: 1735 | debug: 4.3.4 1736 | transitivePeerDependencies: 1737 | - supports-color 1738 | dev: false 1739 | 1740 | /supports-color@7.2.0: 1741 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1742 | engines: {node: '>=8'} 1743 | dependencies: 1744 | has-flag: 4.0.0 1745 | dev: false 1746 | 1747 | /tar-stream@2.2.0: 1748 | resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 1749 | engines: {node: '>=6'} 1750 | dependencies: 1751 | bl: 4.1.0 1752 | end-of-stream: 1.4.4 1753 | fs-constants: 1.0.0 1754 | inherits: 2.0.4 1755 | readable-stream: 3.6.2 1756 | dev: false 1757 | 1758 | /tar@6.2.0: 1759 | resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} 1760 | engines: {node: '>=10'} 1761 | dependencies: 1762 | chownr: 2.0.0 1763 | fs-minipass: 2.1.0 1764 | minipass: 5.0.0 1765 | minizlib: 2.1.2 1766 | mkdirp: 1.0.4 1767 | yallist: 4.0.0 1768 | dev: false 1769 | 1770 | /temp-file@3.4.0: 1771 | resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} 1772 | dependencies: 1773 | async-exit-hook: 2.0.1 1774 | fs-extra: 10.1.0 1775 | dev: false 1776 | 1777 | /tiny-typed-emitter@2.1.0: 1778 | resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} 1779 | dev: false 1780 | 1781 | /tmp-promise@3.0.3: 1782 | resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} 1783 | dependencies: 1784 | tmp: 0.2.1 1785 | dev: false 1786 | 1787 | /tmp@0.2.1: 1788 | resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} 1789 | engines: {node: '>=8.17.0'} 1790 | dependencies: 1791 | rimraf: 3.0.2 1792 | dev: false 1793 | 1794 | /truncate-utf8-bytes@1.0.2: 1795 | resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} 1796 | dependencies: 1797 | utf8-byte-length: 1.0.4 1798 | dev: false 1799 | 1800 | /type-fest@0.13.1: 1801 | resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} 1802 | engines: {node: '>=10'} 1803 | requiresBuild: true 1804 | dev: false 1805 | optional: true 1806 | 1807 | /typescript@4.9.5: 1808 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 1809 | engines: {node: '>=4.2.0'} 1810 | hasBin: true 1811 | dev: false 1812 | 1813 | /undici-types@5.26.5: 1814 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1815 | dev: false 1816 | 1817 | /universalify@0.1.2: 1818 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 1819 | engines: {node: '>= 4.0.0'} 1820 | dev: false 1821 | 1822 | /universalify@2.0.0: 1823 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 1824 | engines: {node: '>= 10.0.0'} 1825 | dev: false 1826 | 1827 | /uri-js@4.4.1: 1828 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1829 | requiresBuild: true 1830 | dependencies: 1831 | punycode: 2.3.0 1832 | dev: false 1833 | 1834 | /utf8-byte-length@1.0.4: 1835 | resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} 1836 | dev: false 1837 | 1838 | /util-deprecate@1.0.2: 1839 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1840 | dev: false 1841 | 1842 | /verror@1.10.1: 1843 | resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} 1844 | engines: {node: '>=0.6.0'} 1845 | requiresBuild: true 1846 | dependencies: 1847 | assert-plus: 1.0.0 1848 | core-util-is: 1.0.2 1849 | extsprintf: 1.4.1 1850 | dev: false 1851 | optional: true 1852 | 1853 | /which@2.0.2: 1854 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1855 | engines: {node: '>= 8'} 1856 | hasBin: true 1857 | dependencies: 1858 | isexe: 2.0.0 1859 | dev: false 1860 | 1861 | /wrap-ansi@7.0.0: 1862 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1863 | engines: {node: '>=10'} 1864 | dependencies: 1865 | ansi-styles: 4.3.0 1866 | string-width: 4.2.3 1867 | strip-ansi: 6.0.1 1868 | dev: false 1869 | 1870 | /wrappy@1.0.2: 1871 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1872 | dev: false 1873 | 1874 | /xmlbuilder@15.1.1: 1875 | resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} 1876 | engines: {node: '>=8.0'} 1877 | requiresBuild: true 1878 | dev: false 1879 | 1880 | /y18n@5.0.8: 1881 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1882 | engines: {node: '>=10'} 1883 | dev: false 1884 | 1885 | /yallist@4.0.0: 1886 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1887 | dev: false 1888 | 1889 | /yargs-parser@21.1.1: 1890 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1891 | engines: {node: '>=12'} 1892 | dev: false 1893 | 1894 | /yargs@17.7.2: 1895 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1896 | engines: {node: '>=12'} 1897 | dependencies: 1898 | cliui: 8.0.1 1899 | escalade: 3.1.1 1900 | get-caller-file: 2.0.5 1901 | require-directory: 2.1.1 1902 | string-width: 4.2.3 1903 | y18n: 5.0.8 1904 | yargs-parser: 21.1.1 1905 | dev: false 1906 | 1907 | /yauzl@2.10.0: 1908 | resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} 1909 | dependencies: 1910 | buffer-crc32: 0.2.13 1911 | fd-slicer: 1.1.0 1912 | dev: false 1913 | 1914 | /zip-stream@4.1.1: 1915 | resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} 1916 | engines: {node: '>= 10'} 1917 | dependencies: 1918 | archiver-utils: 3.0.4 1919 | compress-commons: 4.1.2 1920 | readable-stream: 3.6.2 1921 | dev: false 1922 | 1923 | github.com/aterrien/jQuery-Knob/755309e933d326ffaa5a2d758dc377147b766515: 1924 | resolution: {tarball: https://codeload.github.com/aterrien/jQuery-Knob/tar.gz/755309e933d326ffaa5a2d758dc377147b766515} 1925 | name: jquery-knob 1926 | version: 1.2.13 1927 | dev: false 1928 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'app' -------------------------------------------------------------------------------- /publish-linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | # For building a linux AppImage 4 | 5 | docker run --rm -ti \ 6 | --env-file .env \ 7 | --env ELECTRON_CACHE="/root/.cache/electron" \ 8 | --env ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder" \ 9 | -v ${PWD}:/project \ 10 | -v ${PWD##*/}-node-modules:/project/node_modules \ 11 | -v ~/.cache/electron:/root/.cache/electron \ 12 | -v ~/.cache/electron-builder:/root/.cache/electron-builder \ 13 | electronuserland/builder \ 14 | pnpm install && pnpm dist 15 | pnpx electron-builder --publish onTagOrDraft 16 | -------------------------------------------------------------------------------- /publish-macos.sh: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | # For building a macOS app 4 | 5 | pnpx env-cmd pnpx electron-builder --publish onTagOrDraft 6 | -------------------------------------------------------------------------------- /publish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | echo '1. Bump version in BOTH package.json files' 4 | echo '2. Commit, Tag, and Push the changes up to GitHub' 5 | echo '3. Create a tag and a draft release in GitHub' 6 | echo '4. Run the publish scripts:' 7 | echo ' ./publish-macos.sh' 8 | echo ' ./publish-linux.sh' 9 | echo '5. Publish the release' 10 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cold-logic/heos-controller/bb0e4ee85abdc0f82447bd59ac55d576ce140ac4/screenshot.png --------------------------------------------------------------------------------