devicely 2.0.12 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/devicely.js +1 -1
- package/lib/.env.example +20 -0
- package/lib/androidDeviceDetection.js +1 -1
- package/lib/appMappings.js +1 -1
- package/lib/deviceDetection.js +1 -1
- package/lib/devices.js +1 -1
- package/lib/doctor.js +1 -1
- package/lib/executor.js +1 -1
- package/lib/frontend/static/js/main.96600727.js +3 -1
- package/lib/logger.js +1 -1
- package/lib/server.js +1 -1
- package/package.json +6 -1
- package/scripts/shell/android_device_control.enc +1 -0
- package/scripts/shell/connect_android_usb_multi_final.enc +1 -0
- package/scripts/shell/connect_android_wireless.enc +1 -0
- package/scripts/shell/connect_android_wireless_multi_final.enc +1 -0
- package/scripts/shell/connect_ios_usb_multi_final.enc +1 -0
- package/scripts/shell/connect_ios_wireless_multi_final.enc +1 -0
- package/scripts/shell/ios_device_control.enc +1 -0
- package/scripts/shell/android_device_control.sh +0 -67
- package/scripts/shell/connect_android_usb_multi_final.sh +0 -67
- package/scripts/shell/connect_android_wireless.sh +0 -67
- package/scripts/shell/connect_android_wireless_multi_final.sh +0 -67
- package/scripts/shell/connect_ios_usb_multi_final.sh +0 -67
- package/scripts/shell/connect_ios_wireless_multi_final.sh +0 -67
- package/scripts/shell/create_production_scripts.sh +0 -67
- package/scripts/shell/install_uiautomator2.sh +0 -67
- package/scripts/shell/ios_device_control.sh +0 -67
- package/scripts/shell/organize_project.sh +0 -67
- package/scripts/shell/pre-publish-check.sh +0 -67
- package/scripts/shell/publish-to-npm.sh +0 -67
- package/scripts/shell/publish.sh +0 -67
- package/scripts/shell/setup.sh +0 -67
- package/scripts/shell/start.sh +0 -67
- package/scripts/shell/sync-to-npm-package-final.sh +0 -67
- package/scripts/shell/sync-to-npm-package.sh +0 -67
- package/scripts/shell/test-local-package.sh +0 -67
- package/scripts/shell/verify-shell-protection.sh +0 -67
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: 'c87b3377fa11e167378d0a2def26f4d2',
|
|
33
|
-
content: '357c34140da35ab078a5ee90472bc2dbf3cadcb1b71895e26a0ae88190d69a771d093f833a70534a531032df3fea55c5ebdb71212eb9c0b62aa17d2b3c7cab95739e99e23b39ef5ff8da45ab98d1dd436f16d2ff652c4a199b592140bd1b827c55bb24ddb37ca19749339a573802fe101d4da301fd79323836499969a95feb702c2cd45f736c2e7623a19952c32dae9eafeb891a0f2a005653ea6fb1453195f85c4184dd90eab59c0e41cb589e7b98e7c63f68a7951ab4728a916232d1b98b4c6628271cf3591b2a76c003323841f68608ac3227d086806b47045b11afb661f3217dfc0122552b1e091a0eecceac72295128075208d92c42fde524920c43c25d845328b68916339d9663b5319585e9ac584d38b5c742054363b155f0ac9155615bd5b131b6d24a9ea0ea62f3263a4530ee541c43dc932237a71b7bf1c8e1c2a1bb3a1543ce46f4280fd2f500bc8ad0b3c377009761729ca5a9ee5f79cf4ff9a07380fd30a36fd3ee01122fcc3f274e91519118d9e2f888e5b3c76d3b47af130e0ff5c105ec26e2cf43ffb63a7b139c2100a1f0004dcaf803759d08035d71f84bf0a20142e43bca96ce1a46a3d4570772c3db6661eca219782fd54d7ae6b592720e26351cbc5bf8ceaba9155c8792f1dbb0956a59a8ac25e3c19ca0c450ad2d3ada2f1bedebcd2f5a1487e08db8a349ed8793e1e08048af96b00b55c2a7bb3d637c3dbbfc5e9c9b8af6b1a0212536ccf8a0b3274a1d1df34735ce40b484d2d861d9359d662e4b73701b78393fae1872f4a2cd4cc55e77287366d383947b4edf647d184d9fc6f2e595b64cc8c013a2aef8c168d8c97d6146b03be6379ef1b8d41f98ab2e5778752cff79d7180a99e670c0f56b324bb83ade3e4adac2fba41b5fb0c641b0fb892ff66283ad1631ad6897aa6537307e0cbd05cad5c885fd3a85bf8bb4139c962138b12f53872a93d3fdd2c1051ea58ea60048c9a6d45839eb31fc8579167c9ad54e7f505011ea9fe1512212d640aaf4bbb05a081e6793dbb79600127dcd494abbc2fda3f34469bb3ea332d0cdb2c4e5c354323536284424538456595e419051a03eb7e33b4c5e9e02f9685ec793ddec9459574cf9f7d21fe4ff7720c57698e201d446b8396a327aeb8a01d92a16413d7e32260e2a5a1c635ed21d29349bf351eb2d0fbb74861cb4eaeaf361eebba611c1b33c24807222288a972ddf26ccabe07af9a31d161b5891b0a3b172ba8e39e2845f83508c0e775776f1d0a72ad466081ae6ca23082eb4cbd21fac94ae3b136ad2743fdd55f8a324aa3ec09dc38a9ba27193c7679582557d19e69f075ac14bb4db8a9e362b204d7bb81d866f1587998dd7d2fe8c401bdcfbe9bf1b755db0b10aff5c5f2bb4241134d1a4d9f56dc790571679a29f4092b3f1a52b42815891bf881be3e633c728b8a44893171be556797b1bf733436e08214ccb772b18b4a187b3d0e345b217942c8d0897e37c17d235d52e4c5b125045138348a41a89377716e73c9a7ab8f9ccfda60b5ab962374f46bf188373d99cdfc537b332fd9d1ba73340aee77b2794c9032c31b0cf2c'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: 'f5415c932ba5632284d1d10177538b0d',
|
|
33
|
-
content: 'bb818051586e8df9dc025c794745e90f834815a551983a7f4cbaf94865fcd0d415a6a2cafd5de053556f13eeb63309aacf7501c921ec1a16446b76eedc91ef3548a725f6a11871048b4bf30fb237d5a8113b62bf0685a4eca0986dbdc9d82e9220fea6396f6074c91b11f444fc322cab47978430749a56b6f0a99ec91c1dc91d54ca1dfbf70100fc9de2dd5c81c0a73ee9d0e09072f57fb5ab9ce17e7e60e9e187ff8cb8f31ddc5370f129e48e244a0bd0f338c1c5d657b0cc0cf67662ff584dd065fffcb8ef698f61853be35de7f84f76c546971b6c99c8c92ef1ca75f923bd5c1b5c9f153526e9cc59efc1caf858cc3a8460cff34ee1b976d1bf1432df4dbda4043b33cecf3224702fb08e64076570d6b2c40ade4cdaec0f7cdb47861888df79a66e4915331ea8040f859b90c23154ac20584f7c36530fd4dc0230f4c1f34bda9c72d449562cca91ac200866e939171c15315dd4ab734f01d7f58e5e1e2612957d82d6aefef3831fee102ed00bfb9569d29be55b8b065aa3dc751f4380c3cdc8cb90ab2fc23bbcc424a52d7ea229a3ca123172b53aeef1261b6a9963b0195542cb58ec22f1699f23e51366a43a18f908c1be19555876566b39b2aa2356bfba20797392e508306629eb0d43bf26aee56950725cabbaea2cea83eba3234377c9722e9de8faece0d3c921cd44ab9c79aa8ee9142e3e091d1ceb1264aadf2218aae1cbd8291a6ff71f6d2290f2c4f66add63d44eaf5b1485ed8c532d13a55a4fa60a1885cf3860d2a1217bbaaebc0aae8ab920a8dd253028726e5609a0d9d199f3576cad91cd3f9a93b9849c7204ade968689ae253591e47d946b385d2bb911b2ae8986c7ab162fe437e1ab5abc87120e995bef6b047a27657fb085b1beb059f986324584acf6f585b450b84d8f7b87bbaac6280373f923bcc6657119d9963ffcdf4b7331a7d88e2ecd68be81d446cb3e60235c0fb7e5ac59a87902dd56a0329c6e97b446f087d036a89c30ae7b8446596e9138466fbc90786ff4e7ad132d9462c362e79a7e7dbb38316d591bad0d1458564265177bbdce45fead989f5d9957a8eb6a24be24919fe91b9d31b9c855cba67511a84732ce65b61c5475a3158f39a8c55d70b6d7971184e2301ebd248e6c736f79037bf30cab4d0dcedc0b06955baf3dac872649a0d7b3b82cc7b51f6344258e52767fd2122885e8215b3fdc1159a25dcd5d262847effc22febda93ce3ac9422ab5b0cd76a315b5a5932988e9979a105c98566b24358b7d996d642381eaf16052fc167322654bee957e458edbed2df3ef40f7fecc865a3bf91cdf044176ea804c8b5c9c8f364d5c9813fce59b3246520a26df5a0d76dc6c4e78caaaa5c118454fdf1af031ff1470572537d4f552c09c80727d4d7c589b8dfd0be504ea0731305e96e6adf4a9ee1c2b1b82229fc74803c358d03421be15ff79637753539d7d52e53c0021f736fbcf40262e5654b71cf7a4f54393771d6d07cc24fa5b703cde56f018ec0ef180d112e7d463bbd3baa65a94ec83e034eb2c0434de0efc0df5802ac78cbaa09a6278480646eb19aa4eb1bb2b3fe3c8e1ac4ba6239c8a66a7717631853d9bbb6d131b749cbcaa86190cd1b0d00d514240037d23fbd3c6884fe89c48f2e3c45576021cfce42db32e2245e9d796ee3eeff5ad14b60743d8383045df05e565ded2c0597ad01637c2ca89fd18d7f3c18038e3a5297e31e2cb1b6f971d0d278597f298c5bedb40d8b6074f100d3f54336e8d248320feca43b15b6b9d6f0235529717e0ea0685f221a511a599bd236483732657cb4dddf92d5a22d955754428140486161ad2c1bd61b6119d4201ed9e24809d9be17cb67ce9e1ae0d3f8a407ceebaba5f6935b6e6422dab4a40e1d1ce0e53effe6a4f0b1532ce2b37acd08428990095d5bc55673de54b221db6fa6e2bfe0700367929d071b511129a0ec7aa089ff6b8f70e7251ab0b93e300b84f110e06415141c786c3f6700a7be1a9269e2359d95818521efeaf49eb3a14e5a5331dd0efb9c43ddb32960a8958a3d7b69380c7e4dec84293e0fbe14095b50dc1cd71e9932a8de4ce72c2dc4da9d91b8927ad091de098ed301bf6aa83b4cda4e0c53a82b2443f31847700be1042447093807157d7c82120ced0a5260efa9d8277b75184c76b157d6240a9cd561d734c2c901334cdccd3033f957e42b29ada1f3c00953d5ee00b475fbad50b66c3c6977373a99b4f687a6b7028d8747d141d8d01e977d59acd22b205619d15c1c2fed16f038d74c2be9f4928a910d00b7254186d91ffc8f11679c1eb8dd25aaf9f2468a4d93a9886f7cebd5c7a8e5c65b558900ee9b30eab643ab981dceecccac414e83e15c3050a2deaf9d67c7afda6d236fcf420b00055af8bb8cbed1b1cea970ad43d32908e1ae67770354ba94dc48298334eb1504bb3bf1b8f29ac36c81fcc97e6797fe5dc1ba5bae72e291fdc54a6a80859530f71891a8fa60cb1e20e74994bebfc8cd742948ad48387f51bdaaf2a82e926e9931059efe84943a05d53433d8918d3ad1d3d6748926d29a199d8a243180a8bda859cb574bb7e9543b986b19c28468a7445ebef3a62f968f9be6f0b5b830b5717c54ea2b114590cb9fc12070e1ae771a3166640b7afa2a52d71aad112a5ae264f1930f69476207c3430202dcaec3a39e9c1708844b75c4e50427e7ef6b07ca8005f2fa00bbde3c45ee1c318053362269531e80164937cdc11553f4336d4d9b91cea06737d37d19c3d1752d789dd3491b67246a2e50b32dfa49fd692e506f11bd81d84ecb62f6386af38ad79ae05408382b6855cdf73fd7dc1e0c2071ec40384bbf9e4c9f484c7314b62a134f26b366564e8bb86f05a0d19388da96f3aac3577377e34580ad4308f4ca43af374f341fcdfc0db8a2289c1e76cd7a88b315f5f8d7064108a812c7fe5578941cdc030d2be96a715c4c7636aefb7b9d04460bd3aaa6cb1a761d976e85a04c390cd12a14af20cec7a74cafe776f3811e21c802db38b0061bae31a5178e339b302e4a478db9e307b0d840185ad61abb70eaf72b04ca88a0c48f2a5b89a33b0fa928be0cbf867414962faab098b6739fef18c6116a88d341b0b0254f064589d6834993364fbec251ba3fe892abd0ba507ca1aeba728353f718884bfdff0a0955dc486defa90309a70a34730f7a70f080068ec1477fd5dbd7335e9dca0bb9be274c5c25eba2d6ab2c064b452c69ef2e6cc853f5b381e54f07124290b56d9c2334131463c418efb7eb5671f1dae3700b1a761346419d28bd675ce58a20d7502e248cf4da635ab817f08166e0de7c692a7cf27d2ddab2be746b0fa9b482045c5742a05d1e0543a3e3742cd6f761bc83a96d1a8028c71858f196f8ab08a1d7e5711c8c30f01a06ccd6900b9871e8c00ee8b53ff07b66ea2fb03322398428a7c5b5b7ea4c5f3ecbb57b1e433dfdf9f551cb5793602f38cdb2fe59596d25243430718a5db77090a9fe515c882126af3a07d7794b9044b7bb385fa3f1dcb5745786456d48aa0259868bf4900b6ee94ae577cc3b87f7a9661b396cb075bcaa26f4a3b6c0c32e1981e6fff4cd88f1561eacca5ddbe71d4832d28f18274ea882535080dda9b91a7135416f2e86b7ee0f9d2399e09bf8b7dfe0c5b6aff36469f393db00881bb73d40a071e4fff'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: 'b31decb26415629e4f7bd318baa58284',
|
|
33
|
-
content: 'd73207f64fdd96da7c9f857cbcf73bb413d82ae58b0596bb67067f31cff811698f4c4eaacd033832f40026af81b0d1d65ba386dfbd2cfda2f265cd4f6670e43940095082f94f0d02aa708999c9bb5425c7c6ff74b9814f8ba7ffd303c7d76c213898490663abda3c5f31bd8d0205ed6efea42de4e63cdb8035d3260700be051848db6b9c68f5db7f8bbefbb988053f056d153d368b6939581980f73117a341901ed09436b5d2ee4064f6fc79d34d18e605cb279eaf4c4f6fa263d4e9116168ead0b1b851891520d0e41ad857dd8b99296ad2797e94ca573e527de1e9b2be53f85f8d5ca7281f1252a23c0ddb38af5d45f8bfaf6e22fdc018fcfddb58686d1192ebd15e071bc04a2c4519812aa6b9f7b5e1ea8c33e0d3740daeecf299664885c40920fb3e6b436d464bac40cc4b1ec03544c04993eb1f0bc05c5739348fd4f617f3737ef7df704e64e87b8fa942d506f5421e6a4b0e21bfd900cbec9e33a019797dc303bbf0b9dfcc8436e4328cd2bbd1b3caf275ac82b142157eefcdb9a3a7278aac3fe14c08f6cc420f0cca0e61df7d7e9d7c45f0a423bb176515e13789f870b86a3b84dbf8447be7c07a828868160b32471ce5f4c037e03b00789ec0b68eedba1ceab49772fff0a20dc64fd59f598ecde4ba4d84df7cc567ef3beda28ffff2fcf79b25c49000819cd3b9d0107fd064fa766706f2c98b030cc6148e6a1b860e528f13315631e43e8b5c3dee692f534aad0c3cbc8d89ba9d6cb94ea5a03e02e129a47398d0876ab5e786207dace1fbad5cb17dd321b2b6dcb812ff49716f960aa05853586d0bd078449e815ba2d6a95a49bf3e3077c778df500cb9973171d657ac5f033892943c1f5aae326e194f2a4364022726f5206047037dba016cbcc9894246faba34c6937b28d14e9a914103c6827adc8851ca93068b579559a45ac5adf216b2ef44db03500b2b9d5bfee281aa6266796ad5dc5a6725ba314fe7fd84be952282d1f2e240b3fbf4263973c3fcfc97618a02e5c2d5bc5dfa263aa1bef03037ce3f15bffb102795348cb8de716cf5eec7cfe941a35ca8737bd5ffe4573437d6a2dbd9f88eec355660e42235dea4e1c9061b03b2b835431d2e18bc081a9c1faf8659fd077f056fb5bf173943b3dd56d4533b62a5c20df8f06dc76efc5ed5cb96591480e511a62d777954ea6b0f28ba53e59824cdce29017f898a86c0bdad8b8613efd979a051f99230c52f9e2ea91054f058c20cdc0abba69d0f30806febf13768fdca4d3a3e6f3ff53dade74c4987de4bcf9af9af06dbc6a9ddb6d00e03cb55d95a4398c9646d6e8a921ca8b0719b531aebe6c66d6c461aa0856f2df4bfb52b72238fa864e43f313aee099017d5b839f0b0a537b0df2a87e49f179d59d6eb524bd30b146a9a385106366afa175a024b7e4113b46282a6ba550a2994d93d3b2dc358232249f4111976c12544dd6ef176fa025969dc0f47f8a2c642b51be9db8b9b5dafb97c9e2fb43ef4030548b1366838ade13c55478b56ae73d5ba79705a908fb4ab46d030ff8021b9353f9ee3e030a48f6db2e266867e9c029877102990b2aae13ca13ab80080b5d8f2c3ee1fb3028296c8a9f7853b561c403250a2a19d48982d044e4d42205c1e6b3f4d10bac11f1832d0edd38343d0205784118b361aa3d7b23c5add0476554a68790a06239701c4a451e8b5aca56bb3396d82e09c01e412f3416f03fcdffb0e957816f06c696b5968bdca0129c437024de2586f3fa36d67361b4551659a97da2c14842f6c5e75f44138e7d46439db501cc24c1532b2e999e4840ea8368589e9a830f8520e7f101c41ff811213ea392492ca51e957a7ff34a3cb2e6ee7bf05cfd894144492f3a92c470a77a043beedf308c2c641c18e60ff95d7d96ab442a806d8e796c7060fb738236d3c0e550ce6eadd7211132c2428ede8f3f8549fd2a18b10af41a4a7a109f34547a19c2395d059d611461ed733872670340a8c225d07751f9a1894e65ee45a9a35a7f077668198f8f3271fb40f1beac3ae4809fa752aca3dd634987fed77e2bfd20831c8e1ce004237b92d665fd06e9db4e22d98a6938a6fbda1906fad66c2db6fc6277375ce120e3edaaf1412b2e3fff9436f6539e99fb8fe21ef12e58a326321987a3d4ff3750d2eb8cb3d6d7c0f36cd45a327dd832b82c809c4f5bd988a9fb5dc6372991c56a02f60537f41de40675a99c55c2fb145878c349e8525b783968c7503b5940599a477ea5d3d2052b36502f4b514c94a933fe652cfa6cd34ebd7ba4d1130bcb7f7e81086fbf3f0de9bf8e3da3f3a8999c5ede8adcb8847f6e2bc559a41a381f13917cd946cd173f508e8248ac876f34f4b5220783032f98b408e70de579983b6fd0a9b8c0f20d8b0fc2b60674fb80ef022e3ac09f0eb25af3178e2569d3ab33250470d4e131f5960653e929d4c1c3f97b3cca36bddc9fa424c213e2c751887fe4e015e0478037859be0eb27e058ef5df64a99715f34e898d547fb3cecace5e67d8923bd8f1badfb9ab80d763d28ffee29ba4c71818175d0618b8d3ea51f30bb5362c1f98fcc1f7e3f049f8fa239f2ae1198b5cbf292340398185c040fa114553f6cc71dddc37d66536198b3370398f45e84b2393627ab2c5abd929894e1dbd70359fca6672044d6491559c51000eb7c1cfe2aadea5dde0eea8f76773c0c0c060e2b09aa54463c9e7eb76ee1ddbcf75dd78115603a87ff328409339a5e6b66f85d688cf752046a079d3ac4d53ab522a0b11a3a14404d044c2f9587aa7074f81e23557fdf415a7ff46acdfa3618267dacdc1b75fddf4da1fdd6663dcf2323fc52e5e402309c09282a55ce590595aa0e07571211143bd5210f8d4d57603dbc87db95719b0fc74a59e8dbe19cd40e9e180b70606f77a87b959793e2b0432da4b61b15eb94820c814b414d45d235f36456b8a67c922e1af444c4623e9e1e8f1f1c7bb86c2175071dea6472be5b3461d2be562746bfeccddd7fd0d15d5d53fc2cda68617e3edad4c584466518704ab688e610380f78d0d0fd5beee894488a7236e095d7564ddd376772bb3e1303497c47eb7e88b651e9526399c16c49cceffd97e94059b6769f2cebfbe87e19d3302dc5837682c5168ac52d68959242cb11d65f3d301157beaf8198148e1c2735ed97c9cad7790961d50dcf60d3c48c1fca1151ed4f760c2a0bdd2a883527e8a9c0b25948d8dc08bf891019e1d05ba815d4350db37595c98d89b11b1307980062b791d5beed9e39ec86005791260220e66bad21c77e00e301657f1582fd1ca013ec96950a6a16c4a82a48697813e06011ecd3369c71e849a7fe4d4118ed9a76edb6f8e7f7416da5cb1894d587c86b48b5072bd9bf81aeba9eedc7422722df5891abc3e3541b12c6d89278d7529261228c328964c567c21ddefb4105d8f58aaf7de6f880e48cc02b84b2916dd58c9a5602f5189fd8cd84d50175fc1e8d183423ec8e10f57d0cf6c577688fae111b008de5dc5191cee525396eef9aeee3a97b84af6980e34aaf63f80ec07fabe5f7a946e3efb584e96d7a88a65ccc7c73a3cdd09a19043b202031c9b08344aca8519dba2131959aa99b652f8643cc732c3bc758c5859c1d4c5bf46334fc855cffef0f64fdcaae4d872375be504985cf6ed92ea2d0439cc18b6fe74be81816c575b46cfbb23d181e2e930df8506c9be3e8dbb9b83fc155f740d88e7862a47aad823651d3a44d04ff7e33efe25e435d2da61b1d56d7a2a70b305fdcf2e2139a986869dd66f897d9dab46b1decab2879eace75606f7768e194a6298582c2e4975796d2d147396696082d66e5d19ad62bec3716bf65ed0dc5c5ea188e1976b494a141fde6ff5861285df8d6952a8ca4a86c0475360000a21bbd2884611b5616bbeb269d61263bfc8fb8393770a83b57e49877dc214f6d8bd91ce86b3390028d58442d6e2631569490d7b3e1723be9e85e0e7808d53259685a437c7b8343214978e100ed547d511bc0e8b9e2d7ec9dd9698ee002f8af1f7b1c2390fe0710e57feaefba4704bd03fca7a02d95dd851ba473239f7f890783d31a28959201d57f8e8e3e94cb4eb6019c1c011725e65b96804b16a00a6218771b6166d5760dcd3f682410abdc22bfcff758f17715fc57b658a2d3669e5eba4b3da9fdd803236c7d41bdb9c4ce7f078b3664d1c076a743714b585882e682f29e381b911bbf161086ec397f4048f3422d036da6c840063a4f24ef1a7ef4040836a653e03b8bee1679762a7b91e3938dd7f24350c5a9542e98951f8d517934f972618af62fc11b8a0eeb60809e8eaf5262c61585e7a3bcd871961194fd92ed2d899d7a98fac191d99f65524ed5bca802edb8fb6276ccfdc75b853022651c77a7f5e903991a989968bca0e1b1922b421766554295b2d71b592b4a1c0feb3bd647085ee918f2b2defc8749a0f8c873331744b31c19669d3ee2e086da9fa26c594b4dc3e6022f62d175d33b0ab6eebf4fadfd92540348dcf3e3e8d4a3a145919c5153a1fdc925040bc106ee8267d429704c82f6b41852b12f827910908b718e308921ae354b524f63dde29affc9ca39a160288647bd39d24c2af26c5a55234de4b6b1a1aaedf817f5b13b5d3af9fa394228549f67947cc37176d8abc423346a80344356fe49c0ae91d6ffd6afa73f5e091856007370847f9c5812b9c37f2d6f2ba60ce50a9e9c9bb9f616f2bbdbd48d2894d48b7676d2cbff6261ab1db3611641e51a03e1b56091ccc1e707d2b025e09898f0a44118245a95e738ccac188d32a62951d1de4b40d7b9cbb97036a2ab24f966b0586f3c1b28d317ec5c495fd32681f8f397a73fd2385e783a44e9eb5b6c40f38b9ba4a243d90cac8e9a2ed2283b7356cf1f3dc0097e4cb74a5f70f618344e0a2da65bee63fa10e970bb6e36f397dab360f596db332c22160f859f38c3050019334ce98373af37dec0a459cab210db23d89401d18e5c38d9a710e0260396fb423d68033434eb5f22e902ccc66d206da7975f36245091ea16b249f3080ae11a2cafb9ecdd77515743ae8438c580b1166d8b75ef74d2db44bed012fa327723a190f22832ca2215c5a00ebed42e15c053308828cdf5ebec3ae64e121538704579aba3d8af704e66000564cb7e61dae256fe601e9f3817903768079794eeb8e16ef9f74a602c527b80b57835696442322d1cc7f597d2a5efc944b5f93754f82368950a1551b45fe7dcbfb0bcb53968a8f7c1b7b5d2e36f5d023b718e6153f68534d13cd796ed8123202cdcfb45ea271c96eabe4051f613582221054d279bec2168c7710f40a4fcad26105d46fa21ae7f6d7d65a3e9e7f81fb7ef77268e8758b8f0107cab41b88c1440045ea7b4df82cea3c4284319516d7356798ff0ad9417dd228f9c570ccc02031613e7613e110e04a08a4aae83951ccc2a0214023f8fc98e16c71762adcea935f3723bdf5ac2e7dfdb3e939eda56926fc305f1f27cd50aef0d878a63ed2e41657511065dd14303aa8ecf927a19f4ff760a7aa001816cc631387925a2a6710b6f7e57a82388797bab49ab8cd7511e71874300146beb86db30769d7709486d37fa26190b6eaaa6b854628cae3fb93a38ae3e3afb3a261bb15d1a08097739509b4ddff3f66bf8c580f2254be1b1610c9786d66c11464f593380621c246163e58914503813c897665a6365557db8e264b7d0c3cadbc768c926f92b980dd136accf71bb2442447ceab48530382f26875f5a9b75ebb294e005e13d76af9b713b772f77a64ce999e5bf9451c34f4002d262f36c74844976f32e4eea81e1664176b1cb2e731b2b5165b54ecbe735de2767832379f8800af2263bf45c9324709a53075645e81c5c4527ef97c50f46326091fa423b84845b1f7c10648d248c5d958c9eb6b1facc453a1ba3de1994bb8aec02aad31823d36efbb63ea972e9dcb9f61c1e98ae69906d8278bc6ac79927d130633c5d540829527e69a03394373a395de1970630ae9eeb514d1978b290d57de08d03af0592d5506c7ad830f65266f89a4355e94e5980d9fdca394317849902e5d10f396fd1b7a58a345d60471b805042abadfa341873e18e77118b5d167f93e4dae76a3360ae7242bed32ed7e838f0d1b09b48b01eacf10f0afcd7476d51f25121d0a5371abef23bbc712d654f3e516267dc2c93e5882c4e94c0bcbcf71a9cafa268c1d800cae17c389d1f78edef13fa3f20d42436a6622c66a933c13663515f64acb35d74dd13ae9fcefd07ee48336b17ff74486a12ea5fcacd3f2a4398a0d6d6fb6cfea539595b065bcb19723daffca4ef9001abde4007ffd2140b4fec58cfa26d55cbd588061a66e72eda31ca1e62a832351415ec782dfdb78f2009fb50c3ee86ceeff6ce88fba0c37a7f1fb9a49d35bba419255d8035fadf411d3413bb2a3ed69745ac1c55c2cbc2e14076372b13c5f60e24632fa0bcc0e88e6dd3f271626856314ba98ee4bdf08f5fb69e6659f66098ba683205b990097102c1b99e625285920e6d5a9242584b29ea7abed5ceab1ad298f9b3e70660b4c8d0dd11b7a190850b25cc776e69ca760e073c0213bc95fda035d6db55032edef3871dcc9bd678b58d744770ad49f11668f8fcd4812f2778e08ac1dd66bd052e2ebfcc67b6914ec0d37b04d9b4d9d72b822b8ccc878229a3b1c1b659681d24cb39466549bf60674805b9e7254b5d42bc290f08d2436b1a8c2a302683661713c2b62ea2ca50020ba76504198e7d684f5240cea2ec5bab5cab7f90b31e9ab0047e6aa481ad039dac30ba8e590cca5c733949757233420436bfd7eecd79967096a6f8b583fd1bd4e5a1678c662841abef50039b4d84eb9be5a984c66dc6cfacb4a7ef02756b86d1abb13472ec9b5f85f7faf1b5f53707253c6dbe972c39953fab8a2f5f365d58cc85b509fff4e16418865f9ff54e156c6d203a9dd29c446052dd23828e683527aa3f14dea1698ffc6f3f9f99e2a5792bf4c5f66fc117e9ee8340aad30f51ee765bd7db2f3f54d4ae1c5e1697575e03cf92bf8a62cb3619b77eeffd2a22eb3566545e981ece22df79fca7e2e90ae3ec7960db09512897c04937d384e89078253fab565b9fe9ff413d45f0e909707c5c86a8331a5e67802d9762e272beafcdf9802d3f8d40caeb97d0eb3c23658a0ae38d769ddc910064d549ddf04f983b66aaa6b4061e6a6bc4d033f93bb196a9f4bf94de61dd4aa215cb9a0e3bc2f700b6e7d08ffa3c2f538b839b750b660ae275de088826393dcedeb9365fabcc28c2e707c8e399daa15f9d17f0627edd9a73135d1563509ad2fdb1b2f1af69312306a0697224a399617115ffd6c378ed1932407f35a8cdf1673af8c082cd9e836d66f066179825998bfe92e65f34ff93a6af40a0ebba35ea9bd95201dc6a37b9aa2aeffe632f8780d6eacd267433d6fe914f9fd3198f45d13879a0be837051ba544f3fcb5cc39a0d8738ead19a7d25afef5ca5b1d2f7214b1dfd35c10840c98bb6a6bd744dde70f6652051ddac981abe1fb617a77fead222e90f6e72c6c08bd51ceae6a726e9a5ea7a935ef4990d3dd55e38f2e66a36a238017e7c58221f8f10f3ea9bd5f9eb683175c630f01cd2d4fa42566170048e97185776979bce21a4884f79148e3e5820ef7422e0ce49cb4beef343ac8765e3ac2b018e9d564a56a63b4be496c5f1ca1eae80898159ef887a51049eeb3654853b86dfd622d2f9421a698ccdf340817721a1b0b0cc8e89d265c998a5124a72c8947d786bdf03c54e88561e84418afb72fca887f90a466aa0afe4d46bba20a3005caf17ba34e6583742c3d2482a2e0fc10c1092b22079073aaa28110f100fe076b3b4a16708d1f76faa59909f3118c64835b6fb84336ac02deb81aac2acc43f33086b7372682073c1dcb6551e36fce065fe337d05d98adc3caa18205626261ea890a838d72178f7ea34d531a751964c18f8639a6a48961db380360bf82fd13d5b70ace513380e5dc3ab9beee038558dab2a6310cbb5595a356f1de8e29b3e11b9a0a115c02b8c01e81ccd62f09c0c76a878b3e952c9fdda14585491160d8397cd8ca5736ba9736f8049e2e380c7f4f0ace0d4efe48c59dc5b616038356c8c814b48df6651bd92bd69e3891fa5e389ed62548061da9966d2ee0681b4d797acd4ad2de35d4b2baf8e8aeb7e0e555c381bbb90634fa8136441673f9552e33e45a3e298c3b261c71be91236cf463d861446aad6853588bd6be8d8735a8957155360a17b72b30fc1b3066fd0a2d08a8bec5156012718907a976b8ac1321c6fb19afdaed77138538e4d5893d3437500ec09e7a7d6301f4805b447618a2f07f5ee4b9ec782249dacb04ac427922578995d837c10d35254aaf1222d849a4f29eddf803d92bdb126b024ef2b60f57a3a787d9e11fc94ef3ffa78d0ebe7b0a91316e24fc2106090b2be60fbfad285935a1f3763d9124846774c255d8b6434993239145605cf840ad01fb00bed93a760988eeaf9505df0bf3788e66041d577d31c8d1af85621c2fb0ecfc7cd7bf99921d7984422c110ed85d3b175a3607c70d58a211b0bfd9979653dd5e63a2f7fff84e43bc7445a81b1db54b2ccbe04d7804cc2bfa17ad2e27184fadf87bed62bd13313e00d0f1592eed6713acf201186437ff711c5b73a6d44a3f85b354b84d83f6c45314a11dbebbea7f187a5588627e47c1370028283c47c198cdb63107540491348b3817e2c45a7a08bfab82b05c925ecb032ae191eb3a5673358972d87b26b498a0fd1d311877d2ef868cc83dd2ff693214c4458d26b322bcb664c5b4ed2edde6cff05978dd882680bc0119d2de3b43845811a75f1f1462f58774cc597f1af3a4bd92cb4c84a59926a9e91e3d43ba928eaf08f25335f4b3649b6be85e98cbb7f88ba162ad5f54964f3550033f81325f979ad79e7589a982686edfad5c5ff9328f8db84977c01861fd890d1a3dd881bbbeb474e34df7cc887e0d611c70b652b0d497c10bd4e851c211c22bb9daae64421cc40badddab616a4d97af3672c072d4ea328f51d12e4d4b43b6a8512ad425e82158d6d3b2fea326afc4514f71f29167a6f021355146cc508458ec76b6fbb0ed9a07c6'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '798700bed3cf94c0a6c0ef3e05756e92',
|
|
33
|
-
content: '8980f4d4df4ca6de560db5439e951bf9b4510cd40d986b26883a055fbd8bfbc0213d5b732d47c14f36eefb356cbe94f1ebe80e8f8262b156d4320a9c39979d5edc8ab9eca52dbaeaa327a8e29cd7691413ad920ea2e82dfab8b1e3958533596a2429f17ab2082a246bcaeb1b52bb713a6d4c75fd3bccf36ac1f210e8e0f573f462d9bfab7738b44667c637ec30aa7fc8b512c44ad99c0a4177ba9c54b5c1a3bcff3a1cc357e9c7bba57a57c001098383cb0e907a2d41de3efbe24aaba0478948823c86a24255153e3705b9d5317a16c77d6fd699a158ee69d88ef9a8bf1152005faa35a89e0d1e80e5a9fde35c37569326f270fc904cad738a1263e599b1612d3f8e637e2a1235a88b4241dff8b933c06c771de649d3bf58572a57f71d8352effd11fe4fce0c0c6f0f2d180a1fccaafcdb11a66880bff0ee25d543a3b644b69a191ed3484ba48fb9681fcfa4b6a8f7f725ee6e1f9ad7d1772486515730f5c96aca1d7024413efcf35e6bf129ce9de783842510c01a2d21c57f9649d6a7af7ea5dc8728afd66be8814d0f18f52a138487aa51e19fd1a0abe6f050dd5e0532064330d937e98f350dff5e63b3fc2505ddeee40b7c4b0ebc691dddf01520bbc7286b42223e983cbf793209e2e77ed7757e1d15e8e7a195c74a7a9be1d8f40d1cfac82714f1021c19af4b411c2cc66777e4412fdf40d28bbe48c2ff5738bfd2a7550b609993a7847b424baf1a058d66693ad863c0fb03003d5bad06d91c4be0e1cf51f75b3256828f776fc1f9e98bd8e0521ce535d6f7bf3b387e2b04f8a4402fd4acea1d128933abf3019a093cf84bb0b37b7b3651266b8be1792520462ec1403ef2175d0306ebfb7ca0aaf3943cc371c7ad36dbf922bd85fda8d81364bcb8aceb4d5c961afba11b57c4cf92991a35be6ae9c089bf0e49da9cbe784594fdab61c008d033f140f4bbf062898e21633e14790c5aeebb9d0d30a252e4dc2a99e1a450cdde35bbe32b149f14c53b6c3be48b7d0a8de66520a3c92e389ee991c51d655f68f7af97dd53eb513093c81dd42e962cbd07fb159b01891606dda0ba8e756321beca2bca30abac169621d1ab1b95b0823e82c517ddf2d1d615212ee7866803d4000fa40cebafe0c9d39cc45ea25247a8418f3cf0a193cd61a6f61154bc4c32dba2f30489a3a0bcd42c2221f4a0be0007c32f6ce9fe314c55702871297711e785b8ee255f386fc395d207489eef50f4f17f6ae7b8f37438bbd2e75b9b716d3f79a2217395870d0089e8fa32daaeea970c4aaa7ccb8ce490587937d3fdbbde3f0c72a15a6c943aa43adf898b0cd804fbed8c0e811e517be3a7559c5b889c1dab3da464310069fe298cd4b0d849bac1b377283e63583755fc867ec8e3bb313b69835bb96dc75a6503474f1765c748c170116a8008319e72113cc2d729e6ce1eee4b81ad31702361cc06685be0745d8f4cf9849c27e0c9bb116eba2433e0816747133322ffe2e5b2437d9cce4b2dfc38aa89f328cb71fba22c6620f280b8089df0d55d92d310a2ab097a83ad7f0eacc75847df3861a6b488bbe81f74bc165f5a2becbcde1882a0dcd8573752f6c917aafcd472e43fff5d9f5df7871e4b62d8910d0ba7056493108fe34c230df88934ff3e1e4f9d340f431081263dfb9e41bd0ba0dc91b0a6f4ac76541a420683adde8ce9021d3ed7c8d72c58bd5702118fc19e26907e4ea880cab62f42e4de157e31f49944f1973c819bf85686b656279b2e2b190b9cc048a53f9719aeb6accae89007ba52f53f4552d4e0f4fa0fc60aae512a4e47fb2cbcf685d08b11b7046cd15c02c22dfc5cf6bcc31ad4b57a348b72ca224f02d8bc24a25b34ed6042125735aecca96d25c17a3a456fca07f9b3e765fdc5926d9499c5c625585f2524db9e48ad693523c74960d7518b22b1ca63a4f522a84cc79f39be8d8729c936112ee42fb0f13a4c29a19775822c92d3eb1b9eb6a833bb45a2a004893b0e51a0a9e4e6b44559aa797edfeb07d19c64f2d802d0e1600d1568155bcd1d8b4dfaa7e72ea39051673abfe54e1d55d2adfdc1dba389bc8dce6dbfa3db2f25e615eebd7b8bd546754793d0dffd8c1ee8a7ca3413a51159f2af69ec9173c90c29b008099e9968fbd73eec7b4c72b66ae716610337edb8a34753720dda684b56b65e2c5307bde239726d885e4db06df8bc7f141e1fc210f0e7ae70ea3acef0bdb3a5ed8ada48886e7fedaa8813cf9ecf287111ced7bab8ec96220055e2cbef930488e2b6a2121abafe496267e147ebeeb8ea362e4672e90ffc95b9fec4609cd9866320ef56d485247bb5e1e3ca08b500bc8fbf10c38c208e170bc5ccb2'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '09f0001020a5a26889acf67e489aba77',
|
|
33
|
-
content: '6d550cdbbe5b130f7ad4825d3c46960faf5239d0fbd6ae59982c7b4a16238a5abf9b6b07acc38382b251bf69d130d70892772a2b3a413ff9c251588fc94cba51f815692cc75a665b1f33bf9f1c9154083357f72e9181b0761cc085d9046cbbc32b162e5a81bd711f21513c5ca8aac5c44218c627d8bda2985af7cef9d49314973272382f45db9d486371ae233c9e2bb4f8ea74478f6ee895b876ef1c1f980f6564141af8228b353034d2ca6044a4c92d1c1fd3a0b3e8294b90abdf221e42e9a5cada7fe60bcce719d43492a4a7e527d29216f3785dfd651e156e571ca4d0802813b94fbf663136276beb6c3bc9abb5ef1138e42d1de4e9b956fffc1be61adfdd36b2dc7b31e7a71e446b52896149c496d9e69f5f38826ed5187c3aa60df6a98427b0f8e636c27e08efc3b35699284a3038a9e070e25416ccfa80c84f82bb8a44b044c31aa989a44feedfb323b0f4d01cb8994f27759c13128ae075e1d0614b6a50f1d43ee2a8e994825979acd66e7fc8c565c3cecc4b373f8e20ac725ce0bbdc06292be76dcce0e2b49aba92e8fde33fb20c636347f9ba8ff04a9da8bf9c73790f5a99b7e50cbc3ed9873b593bc10346853cf050c9d7f2c4b115f2365b755d5d032c0f077df8b02fbef51997286524d4073afb8128b823213430d7657cfdbfb743dfedb4af2bf4a7c62f19d98d2b525371711db938146eaddab5fc441034828550ca8e7c8b9987788f0f222958e04f38a8923b7eed4e4d86de600a28506419bb700f2b9970976b5272bef96ec9f9ab293463dd46845516a74b06b57301928dcc5d196ce2261d495fa614c009613fabcbf1dc6353ab31f56af30874b187e5b9be7c9b691b1a635bd29d7314dad595fbe334c51616a197c5638d6d8bda7dbbbd857131a6fc6505401977437ffb09f2b0df9b56368a3e5d566859a586a97e139915bce784b830af62bbee9bce06803fa0182f3082ee74860f927e29f0b6cb14f376fa4c57603b7610a5350cc0c488486142fca74dd92d392cb7627e6fa435f77d3ccdd354e892f0b6e516031c18ba6f542e97dc691a551817a8aec3f5efcc960f92562969a6bce867b885fe1475868b09f46d714bfbff01332d909fa13fcea05f3c7c6cbdbfc1e103930c737f6aa236fc0c6bb97bd88853aa97a0bd648fd4f00182ea7b6dfc8f98a3fbcaad81ff4a25475df20e3f7f5894444b3d61e45596a86a42e50afab7be96e5aadf250cba9319d9c558f04080a5c814203fa05da580c0c154e0de8e1520f374bd9e6b6eda383ee496f6a9610077430382643bc656d40e75715756189bff1903d95391d53b8fbb328da7d2c2f6b8da3d17fa23d3ac0948a1b1fd7a9d6c8df0984a9df7590fbb6a0f56d8bd62bc464d64a03a63a12ae16882fd506c1d30c06a5f82b2551b88dbf025701a0fecd2552eda3d9274a64c45a19667b85f12ac78ec74f0b3fe345dbb64322d6a42e976cc26446ac84f56a08fcbf943a761a545aad65523bafb69d595586b4632bf64845a8de57f58cdf7166fd5d01c42ab072f712b10322765e6d5559b346973d20be4a0fdcc1077266b1b7956e14bce1d6262c553969ac768c97a4b129112942e5d3826931b06ba3b428e62738b3c200cb36522bd4edb5cb466746c26bace62d55fccbe61c320670e1cd422f2dbec4bd7854f641faf0973e60b8c3777a0e7e2078ff2f12f1c6a02c5b206066a5fa8f5bd6e315ab4b7930f630a5e87ee726c34b59092d2e184902bee9c35f04900c988ab3dd55af766106fc04b45e2187bf54954e1de8921f06560e0f74cdce937c7e0cde49793b64720175b44a6bfcdd3d76d19fa141b686db5bc8be31ce4f8731756a9461a66037d7fc5daf9cb2833af6ebfe2ce7f9b6a1f2041d5d9728aaeaf75cb9db24648308dfd0a993f6ed07ef2982eb290936aaca58cb09d226de9f76ba7f27d1aa7158b7cfb699b50c2bfbb9daa9514754264be2b9cce719a72e74f03747cb28ba12b8c0b9b70b571de3d1c7a6e14863154e1ae86ba4cb524eaf0085818282db0b35e3271a9abedb94273eb1f1d8d94e06bafcef7efc8aa467aaa9d77599d3e4f92e677da3d03fe85b4cd52c2e8b93af9e6dd55bde25182c81ce8a73132f38a52c4fa102d79bb64fec1bd9c424a42f2a9eaec5b2226892b0d47d8eca8bda32d7d3d2f643f3dd4a4ca76f64e173bdc8d4807f0c6b1abd0ec52559fade1b45f175b53d589077a1db4015e0cb83d925af9a9cb30e19c7033cdeb896dacffc72040cc5cf67b1b7d3aaa7c4e11c606c25660cb0e62eca4a2c1ed68884c4806f0be9a0a293b682f72215a7ab3820dfaa1ba6b1fed7456ed27d1e7ef342ec4b48e7d77ed54fe2a8e0dc9541f1cecef1e2e5ca3b80a9389304f2038fdbdbda0c5527330d5f875db85f2c97a9afb13f9911736341d99427fdde14674662b81a59cd8a582d75a63e8edf4d5211ca4727ef07dd5ef04560605b0f6659dd8f903cf45ff6ff118e0b3d4abafad296d653d62ad245bad0bc5045efd60f17a6a2568f5ef2989bf91821c51780834fcf499e5512310c2875d27b43b181fc89c19b53d53a9703283ad80ce9ca0bed52ac636517a629ce64145db6f3c49e4d09692c180e3d4f7170725b371e449368b6399dd3496e9c42f8d2972176f5e0b0041c87af6fa9da687fe1578558b145015db7dc6a73d7f86c2d0e2a6e58bae8da3fcf09002bd475ed299b41681b6391069b10049498dbeadf7242a9ac67baa7c768b878dc7c4c133624cddb19deebb1b970e2fc986374f0cde0f310db0461515598244e1e5e3d3fb2a6d690cb793a91cc700a8772de2744580a909257c3f203b7efccb3f1458c531dd409dc3699ac1c6a1c23baf554fe571a50552e5753b4e5a6ab6d2e3366a6c5c15ea1f423b4f8b0142619879bada48f6884c4f6bc6605229e163ad7a648e22f57e741ad4b0c7e6aacb385c20dc53d5b09e623414167a6be5970e1dd74afd13b9ef9fa5abb65f7eb08d52243ef7770f8963e6267f0ae9ac47297f9beb6b32e054683e5373ffae05db4c964f06e41ad71f1d91768f457e7557e5954f781589ba67986ee351b17d99e7b2214f209bb1d25f2977ace866b74b9258856ec8446d4d5e1b0fa253beacb632eff235edcaa52dba83287e39617df5f0b1cd17985a9e1811c4879230d46ae6d4d76f10ec410b43987271f00d3950e3a4a06c134f8e990e271d1c1ebb6bcc4a420fd35e836a056d8f4786722ad28e6a467e1ceb1ec5813dc79dc605c4a3ee5a0f9a5b090b0ca9f93eb50ae57099a72a8222a6bf6d58190a732fd2f7d0ba0f90cba4795f54ec4c9ac126d58db9cab622186147d282f6b4400aeef3a07b80496741477275176b5d31f9b5882881b526830bb5035a514536374a73e2803f8a90c675a9d9cd58c596c34b5c696f7573ce28da4429a26d728cb492a9f376b30e4051d4a6f86c228ddf6a871b75570feba440265d62730973b23ff2a91e0b39f8c1e016618f85fdc980c6e93c19ce44f171ec634e71ad7d91122363a9a3045ee8866facdc08d173db992481784d51ec20498e036e9e171cd072f80afe0b4cdeb8ccbc850f61ae79c3bd4218ffbf26eae57073ba88169fb166f55bd4fa2868a80ec78ca8475eb071f4472d384a72cf36ad72ef77891bd71af2c3dc9136d962ab0543126cc03a61083fad97507bb45214183f53cda3bdebebe6f55bf5a6837be98284b20d8c63579fc246b98a560d5926f04c9a8211bcf6c801346d57795e6ca1860b2fd25e1372d2a53358fcb318e3293b7365ffd62dd17991d66c93a371c46dfd48558e46d64555e67d07b5cc87379610b1d51cf11b16b1ce3e73c44ca2122f0e7b581a7f107db2649abda660a74afee88175f346103b6745cbdf0581c5811946977b7d8f750c6dee6edb2725b7b43330538fea3cd1ca0a66afb2973fe11ed628ff9aaebce3135fc5449f0ed4e4b70bdc7af5b16f200d0c0bcd7e20d2b231c1e57e95572b5808c8d493f1cf85e98b47d63de58d11d8582a5feddbba0fb8411eccdb64cbff30261706819fb8fd75d40614d35fbe4d30cf0bbf19780292c53f449466a790b1412d2bad67121c6999ea0c3d426217d52b30a7c61d28d0d38fed7b16423425fb61d70387391dc99eefb50bfce3051f81f41a4152f5ccb55f564d054e0d5e9295f777e26be10e9327f3c7406977900a1fd2a455e9efc148c116b608625b6c0ee53b7ea677c241444a1717656391472a39db1c45af72f42eb60dbec5c2f8ef1876b30634ed9b1a7b877da411b4679d030488d3f3b087c26eb1e4575b534b35f26a98f8cf2edf62a3b45022d89145562aecb525ebd77c4f5b1c3d5213b728039b0cc3377d97e2cf52a303d9211ee045b6a9d6f4141d5dab142e1712b6d588cf78e6922bbf884e9062924f12621179d0bfb1590189c57ef4c8c69631f02ca032924a004ee184d1a0f0e55036b37d7557a563d3a8ae80ccdf6699bd31326e6f82ae973b76140ab1e886c4f9e29ded6cebf2e870c07c45f04f31541b64281a6065021971787408ac26101f19b522b70538c9b7195463b1988e67f905db967df4ebbd628759f31861a1f75c90536b0ebcb5611315396d48ed6009d67412d710ebaae559a095ba27a78fecb03d605f2d7e862d4930de195b49cf72780d169cf98e1adf061972c8cf3899e187372c8c1e843ee4d6dd4f14b5eece96fcf30efd9d044e2764568a5c96acce0db09effa1f935fc5e9432cfbd83dddc6a8847ddcff759001fc21f1399bc64c7018910f37f8b13e6e879d9ed199ea87f6cd4b8ca265d0d28681089701e5f5fd1aacca3c8defd53ee9bfd112d9ecbc390cfda8c7436ee17d43947e0975647bf71151a643f7e7ee51620ec9b92dd9611ebf548ddd6f4874d9e7b9d98ca633ec2100bc2cadc67f5350f21cccc18435457c463035156689aee6ff6ccaa5e098763a482a3bba948be4b7a8c983d5ee7b7142c1a95a1f09bced39f3f3937a39eb286f30ff0591fb278927ffbc292b43a467875fe82c49e45495861a8db8596a978dc09196db7ba990e1efca031879cfb5f2ad6d76e38f0fab52b104a40c38914d7573124e81aa45171a064b614d451e6d65ddd012b86a29a63c4b272967545346aa910f885fdf7a515c47c0d2a01d2944ea6f6767b84700bae0b54f844107aff40108021e4bd68c05b01521bbb4251b7cb11148235eac9da91f9d54f7bf6891db16bf8ead1494017a0f164c1e70eae8d9abc53d8ecc7807a4970fde59935a7f485bedc8e784421385359178e8dfb1d50b907cb01c4a4db6839b8e6269d2492ead23b2d4dff6b0a668028df5f017edb79d66104a5f479ae42c76004b550f75991224b8e956a7f03af735e7daa86358a305de7b7af0db0eeaf1d91d4c98a7f82a2ed241fa229abc5aa92ff13a31b7a8d1c64bf11afe2cabeedf2228716a99c53536b75e2d8b824b17d12c74057672e0281d4f0faa6ccf4fde014ad45d385513ca8cb5f6340fcce69f98d1c6d80e77917f248f88282962ada3195edd361fdf3963b5b02309085c91a6d2b8816d04da7b22fee63b7ff0c6fe6f996d031bb1a68bf949a4aee1bf79508c31d44bb8539b304dace0ff57b519d6ea60fd343e285b905496fad61c3974c36f3b6c1dd0af4f943a6c2bf9526198076b276d5e27df8f3a0654b436b9080a88cae4fa42293356487a81f6875020a6233e28fb49346e92bfbbf548c8df8e2dce4880d6ce0ddeefa0d670b14a0287ef5c7fed52146fe5d1e7d794bae43ef9e1e04d025e7516a8d6b6a746031b9bb1f3256a3ce3b989062c6bfe8d41d03b7b5be85f38d5bdd9d372c8e4d685aa2cd6622c033571ac19ae60bd37d2f83f969a9851120f7098ba30e0a7f9c3892dc8ec275a36dd5902374e43da9aa68aa0aa57e2b3660a71fb7b848ab9cbe8358198da9b732b6f71c609d387b1c194892a5ee2e40e41f8a6b9995eb3f2424a4b9fb4db1c6849c339e898eec248e09aa710961823d4946cd89a9d5fc5fa80ecfc7cdc63216fe28f295e2ac9bbd0ef4fa8ca711e069014d9db88d8cdadb686dd1b80d16b771229330378c7134a8f612eb52374f2f7a8ecfe1a2598325111a7c217d17db3491bb772c6c1a12d9b426046ac3f4f83659aa82f10947b12a1457176b5224a912b4395f33cb0b62d8654e50481c6c05b27350192fb55706cb939f3cb71b7d7086159480b0272730c9511abc307ffe457731c8ccf4be3149107079e1dd75ee4bcd5c01145ba14f458b552faa8c622b0d027e7469e490e8284bf8ca9dc1d28c7472dda1aaa13c86b7157b55ff66eb9fd6276f261480be40e76cce5dc65b118d27a7f9072684b3eac19073a3833021e78cc5d1fdfb6af65800bfadb2dc3cb757695e47c18234f907244556e93f918ccbef2d96038b4b26c904ddcf753223a29fec4339f9b794e2c03e7407bfc5e1726150801b0ede9081084969c02c654db927cb397442aef861e25b0da49abb958a441fc234c9ed79def8845f405c22b32d28db84a9f6901cc3845846132c0c59eee6bd37cfaa030898d67aa8278b2e38d7ecfa8253476dfd30a9fa53705526e54349cea9db6e51819010c50fa5a3439c4d878f94fabd9c5810af24f9393c0044b65d4f86572c59345d028f4aa6c31a19525a6b13bcfa405973967d6705c6249260cb6a72b2e67f1cee0157c1254ba84e3396b8059ef1045a0ff247e823526c8eda98d82127bfdeee37c39759fe88034c3b169b64f55304b2bb6b7be6128e66ba297b4808f9a5825ce28fb8927bb9e57ba73d24b02733ace502bc1c6ed7b7bd56db2e67df8bf56e74fb24178266b1508d4085c530ce044783db34a1a6f7e97d96b4f57e737365f66690cff6bc18a886356b1472e167ece7e17503dd3dca53e2a836ebcd3fd0f873e2e0051d373d3609d21107b6273ee0619476073ff2209d09c925e3188681c2c1c08a404e7ef8da1e674b5dc0ea24583cde4f63b56d3b733a286f8f5ef535e7a6aeb7f3ec783dc3b4676e7ef187261327fcc8d14b622b98ead7b0b5c8c4e74850ddd39e4ebf5c350bb22132358a935ba9220590bd269809b11f9aea0366f33a09db1d5894c3f4fdc20e1d53618a0ecfee78d5b7048edf8274c1232df17f5f1b387c27b78bd428f41c35f31e5ba03c861530d133931b478b693cd37d150b871e230685ac3d15a10d96be5f286dc28832c02abd159bbed2ee088b249133b0cbe9525e14346f106d3583a694324a60afa8b775fe00aaf27acd6552bfe359d02d9109e9952bd18095f07a94510333eaa81a07504e9fe4f6c93ecbe085c46899ee9b55834d82eaf6f45c3c139dc5721e3ca9b97fb74cc6cfe6dc2d9ae09fe751bc708d7101f7dc191138a941dff374104ade741509189635cfeb8552d031d41d4475f66a636e71099cfdcfbf7876b0c6799e5ca753bf06846c5d5d876cc5246a0c17131c0651a204512f9f5960134c8c6fa3f24098624062bf1b2c3970acdd976310c2814ffdd9a355177a8216d65c752c1de1baf59e868823630f5c69b067097fc7add8b5ba662e616c2dbcb5434edc2582971a69cfc1b2dd82f590859b001169b1151fe392af3155cbb780d78514e5b43203616509e50b9042979f9bc2e56ad43b55773a6f4da3173b9c7beefae94213baea97cafa51955c6ac101cbe75f49f91cbeebfc54ba5041fc21fbcfbdc546a6916c59a9d3878061ea27aaffd55ec49b854abfc6551cb63e69680db848fe4f3ced66aa458fe3689618a6f3f08432d601dd44ef7280dd1ebf60006eab7448fc084dc525562316765ac388c4e2469afea5c6b2eb8cdecc9dee00d26e567fd30ff71482d2304a8b29fdf5d4be504a385c8da385264dfd3062879853cc8b9693e8b2e28e756dd15f2f931f8801de03a5e3d2a2472be184cb7534efee218c0301b4b1392cb69204a68a74ccc9c9d90b58040860e88c11787681a8b522e9abeadd858ae272d3231b1cb040599cc0083b7010cb4e991d7796b681e3c8ae62664c35443ceb3712d38bd6d784b35ee48bd8f7d15ccef63015ff5774e9fd5842bd463e150ca0d633cae99103045ea8370483b0df542ef6196b9a5f45d622ad3c0953792a2d98a21cbfe34de9490f0ec92e738f88c0110b713d38d66203b6cf59cad3be40056ac873e7305ba3f96e60eda7595981cfb95a37750b1da9867042e0a360b91936077e8c8eda0eb8185a5ea28412e4268b28ad622babebc037d1561e262c8c56f4a76f6acf9fb59ace755e535079a82a38e976dc27ea34cfb90d633c391654f3cb028c0c821ec2e9ad53f5198575f6116e9ef11d2c21675c456ac09fa2b7443aab51cf78fea3d19c47dfd14ea42a8f69c723c224ba2c45033cc181e154474623142e51cf31a3ef2d67fa9087c80d7f2d3cbeaa163e6e41018ccddd1507f2d91ef27f1707f6c2e4b0b05ea19f326bbd39bbc2cf02d3c794568d099ad909c7c12bae36ccbb731a1d8ef72b75c40e91bb2261bfe19936158f0842acd219e187bd48279eef9f667fceda0bb597c200b16b65fdc55999382487e7d13051d12003efc0802cfebc2e9a36ed4d6afade0e8ee635403fb6ed194d4a656b3c4c96dcf2bcdb33d71cdf606451408cc7877214345b9aa02c9a37afb24a8cc2b1b06b80212a240d1433be14e7be30c16d5ff10a6320e666a2f672afb9b6e498ec602dcda27101e149b8ed462310607f1c1be35ac9ac3999bebb72d0176486a8dd5f98d49223817f52cc246625006185dd4c97bd52b10907f8f879bc10b444a2a38214f39d92893219742f9c23a4271fa3ed732170746dfec3c35e26f969d4b240d7c8716b3fdcd2c3954b63c162e1e2675cacf722c1d485067163db0149e1dfbcd857e7ef8ec3ff9a37432e78d015b1d78c13609f02792b8ed420f1bfa554cde338fc619207a8e4f32c09718bb6e7fa53348485c4e8336fed29529abafcad82c9638ac1cdfeb5fdd7e09c3ef9fa701f52f4938a8e97db4af1d5680a8aae9db155ad8cb5a69badeeb3e413967b12ee75623f908c4dcdf6d10c8841c6724aa35b49078ae67acac3220dce232ed68ea7137ccad2158f43be5bd836728fd5ba838113afcb4efbdc8bfacadc754a7aea2547124549bfca2f80f3c68e9004a273a247c7e9007c6a970cdd477a6af7adb468e3cc43e31d17896e695414a1006ed228fd1190c58b773365d053bba14483f27e56164bf90ce93382b86ee4ac59971f65a69b63fb725b591379305acac977f6076085f48dc750bfa682a1118d8a094bf6f99c997b2d397ea3f18d67af150e8df7ecb22b25f074f3afe16f975f202366781374a5cdec50cb565713b44e2a421ca92da9d59a7278d9c0f87a1bb1d5a1b4b1084a9a18aa7d62d6ccce9a90d369a0f49e07d51e65da6d356bc8f1a08503aeb602e1a983eeae08de322ce43b4882149d4e5b68534f774b2516ec6b98bc42d8242c2c05620baf5ef82e204859d1fa57e97ecd0ea87272cfc0a7fa70d16da97a9a2e11167c29b908318f76d168caa52ce7c6645e64451f7e4650a11f841ade8033f5a689c383ca9830d3eb8a78b87d97b1e59b0975ba7d49ab469d90d60bea719218b42f868994aeb0134252c81ee8ce96f3d2f470c60f7478af993439a9b37ec9e95301d8e86818598bfb72574c0c55e27588428c226596d6ff59e41a71ca41c6e4b4b0700fded0eab96393e8164755e13116e1264dd3af50e7175add4dcf2559a90d8423c1ae86046a558ba9d184fac566b697b49eeaf11396e4eb1ff89798ff5b91dbc88a555979e7701062411b0e8598fbd0a135be8982f0a2c96261d823bd53244cf1d7f2fc724cc78ef7aefc029fd1da40e1dcbad32fdd2d46f525219c86049e507e137db14466fdf2d9f98b46b034bbef346751542733fc4d6af69121b2f1cd8c938e670fd218460bab607e4f83ceec791694a2ff52f660c3d91570f63d4d82614a8669acfb7a4ec7fb277918e5ddd947eaa6d877711cd782ade1ec667d23f93aefb64c736667a487c4b496ea49b76b09571cfb25adca346e59c9a8eae9d126433be7c3524dca4acf75827af36756d9db861b59136fe7f0527e594a1d908014b2234aeaff5c5b48e2c371f6843e16adea2bf3690f962d800419a87b3be3257742c38165afdbcdea5a70bc65f8b0b07361dd98de63bd3d31dec9f60c11343933e59ba18e1f6f5951d3751b119e31fab6cd1aea5c3b7da3020886471bacfe885a679f2c367eec692169ba7866348c4c25deffbd056a5086b183ca35333424be1ac4560c4678eb81436b4efec1d06bcd17bf47448a252bbd54b653558ee760a1942eb48e1f7a389225bd1a6c81f77148abf915f2ea3d87eefb98f2e14b46f10e8dd3868adc5bd7df73d66b6b5d9dc0247f828e7b94825463832b6253ebbd799d16e237c1f0e4c5b8ae56338000aba408c8af1ecbfa3a36b56cdee5b7ce9dae05846cc1e2d1b57836eeae9755b8878d53a45f4dd49250927761e44af00e33114d705f930ccbcbfc08357589054211c688cc6215252a41a9681dfacc108b742f253370e6eba6c8930dc95828f4f1861243aa4d6ac0a63fd5a837acd4a2b3e544a4749d5555e1dd6434db5ca90f72d717888685b3ad7ea495188f6ce30e8032d5596f01958f9b65ce56839631009cccb1a98ab929cee725db8492300e3ab8e8d4a4c9945fc43e8bb5a730cbf6db53b8b78018e08d4608e75f0832b2b9d8bb7dc739bceb92a7c1451f9f7c319056c8dffba70b932e69054edc33c91adc6ea065f7794337a47b4a392e72a5410c100635820c0269041ebd323a9fefd7e04d7a2654437b2a56019f34cabbcbe99e8bc799b7dbe7ef9cd36b8b44b8b836e4fa8dc34502fc0e8f91b71a541a8bd44f6216294b5f36499048e6cea0c80c1707eaf7a83ffe2315afa699f371d81cc046a7fe71c254f51bf6911b0ca193c2355d64107561221e6cb9d58db9f3c6e2ded94b7d2e4c550bc61fbcb45c9625c84a7f82c3675161375235ed41557e0e14c7031bc456917acbf97eb6e10f9b475ae2086bdf2bae4f335d92f38aab9e01574486a2d06026e3ea19ead6acfeb007e2a6d38c3b6b843770929426831d1580260e85d655fdbf30ccf40f1d8161163039f2f7913a9810e07c8d3299c4f160f3d4ea48789a75c15124995edb024d6df5334ab46fd04f409854439d2082d5ca043050cd95b4d95b22398269202d25e3d55bc2af7b0470cc4814fccc75716188d1bea5b1219bcbbcfc976d13c4c1a26e3acb083361485eb25af6f91fa67663938eef9c1119e62645901104bfd77c37d7d147292d9a41ce39d0ff3459fc60787042f64a3da085d733d976ada50d3f7d213f48752673eb6d12f38e26649ecc62940ef93132a85ad75c42c892e3e51a1052b73b0cacf273c17b1299f8778942640bba50a3e31475de735242c5289b750ff5ef7ffcaa2b25e7d365c6ea370d1a37bf486f214788dcb03154e349c46bf98aa202cb6bff875d0a738734b55bf518c380fa91b0585944378af2456ce9046c604a7c4327b26c82a2356fd74affcf89de6c5f61eef694bf07909a88651ee6d21531c641a214dc961eb6d6750dbc185cebd182f3c4c9cbaa92409277ada4419a0a60f82ba71963a3af6b388fafa245c03b7dd8470e7242362b1cd865a632325d641993474f9752b3890896aa73f5c70d5641aa04501344b6b983df74981f288045c6100cc711f8655dae7c98fc2e98b1b5555aebad3e16c0a3ff1e6d75a4fbf9e93d2884e5afc21a00c6bc8bc90aa6d7dd36cb66627da9049a77c14c8a8df9264689691cb36e5e852649e89ab25272b3ddcd37bee22b1334bda527105abee7ec534dd2d78204253fcedaaa1d732b71a64ff17b8f343d3956b0c74562f989dfd8f40d19b6ae50f067f7fc2c476fb093d0a5a4dcc82b6687975e7d5c4a8717187cb4482bb86cbd3855cf20934723213fb36e9671ea1563805cb883f4af07a718b72165b367769f474358ec742798423629d81f2e9b06bbb46172a9d2d387ded0ae8a0d6f7782bbcf92bb2c61d92c6c504ebcb6c449c2518e45754139d1a9af195be91fda03940603bbbca65264733e335766f93c6849a711b02a2aa06fb191eda7f63759ff4e7eb65c99d8209aebcd21aa2d5a02b448a8405bbfef0cce1aef74e45c9e2e1248eeb40df72941dcafb4ea356dfa497af0998b49d24913cf9eb7521e005a62c9f6007f7877af043382d4fbaf5401b556a331bf9fc7475814f46545f9692c9b1ff3767aaad5d0e5051a3e4c7839fbd6d1fef7c12db881a409aa0cbfe410e307aa7dabd6b530a84961b4c246090971219833d5f75bd3dbf8192ab9baf035ecd9f7f34586bf9aed5f42167a1f134cf314feb61aa9f5a25c630825d5c4366625a099cca9d403a69bb049a6952030a39f87dd227873a765332031bce1c35595fc86249d81807f4f2c7085ccc88ea8658d3a990483469ff5df3986ed88982fe83fb14688b852f28c0d1f93a2a3cbef5492db3f072bc1bd8cb4d97578bc4775a12a853a252cb6f702b3d3c4c89d5ca27152495940fc2cb953b398c9173e2e9847ac63669cd66f29b00bd567cccb1b6de40458ffe876cf52ca13c63f7672d34d62e868c9da371958a8fa2d6e76e5fdcf392918084b9a0f57060af4a18703489dc0a5d83d59583465583e5ff38e45c6e51ba55b4e7b1c51c02fa3e392f3cdd87454de7336af238ce971d2bb3a8ee13f0a22f64a88a500dc9691a53d05fbe1208cf6017cec868f2bd5a1ebfef136ec7a8ff6a5d52c73b511b8e9545c3442aaefebdf6bfb74a8ef3ebee0924ec15158a5e740aff61ed17eeaba4dcab94bf71d1764288bfa71cb45b65b9ed90a5628eff74c3dd8be429540724d53cef4e199620f00bfe9d93d61670e1a985a1a364fca7b72734e4bf50a047cdd94845a4b33b7074f051c64617f69d6b50b9fd981dab602b93f397e620850f85abf739c294ed0097e90ae84069bfac1733a65192553d38171f262d45d0068d2fb2855af60814241820afb856ef959ecc01eb1b13b7178383b571bf601e1cc36327988f08b9b1f3639e71440f8c15e3530d87b8bec4dd12f42aab7c6f17d30cf005623850d7902ea28ce7c474ce6b8a4163903c25b653a801b380107052b94b51c23ab08bd31fcb8f1beaf34044932ff72ad62d6a550051b7a7783f1b2a4786581c2f9308a05ae43ab8b98f33a89f0a56643a464ae1ff83dd9d00d51df9313d64520d5d60006f7c72a86b2d6a06b6ec25a75bb307e93bad391f0541ba1b246000224ea8446031921077ef0b4e89591d413edfc884b34f898859f27b476e1d84519b745d36cd7686afa3fb481fa55ea551f984dd190e7f764ea898cd7d9eb4086bcb7800793d271c451b6e1e023bf0f35d67cfcfff519bdd3717227a788a1d1e8ca04e610e7a1b2049581ce848f859e94eb091fe47b054d59f5804a321958221e713243e6d0f5215b66865880f5dcf950ef04e1bdc3f9abb4791860b285e957095a80812946c56de5dc03f887acbdc3ee66b9f47d1dae9fa3a2b8aafdcd7c31bedc147167259e846c777db2d6ad94eb95cad9c7deca08ddc5e4d52b3646afffdc0c9807085acf73437d458d1f7da8ba1b73448ea56872d6470f230938412ce827d44f6d4345ee921ee18fb6bb1ddc7838404fa599972430bf0165be69dd6a359c30b413a055c26db0b197cfbe9ec6fb548bc2f15f4f79ea5957473f3372e280afa38a7a124fb10491718dac9cd0718a2e793e39fc01cfb56ea8c390a7d95ce7fc76dd31bf9fea475df909fb029b86fcdb5fb2011f75c829f5f732ec89a28404cf298b1b461d44215cdac194202fa0525a060fe270df1d89f05a09bc8ea54c14e2d5c090ec0d956c6f7468ffd63221a23d499613ffe8ce2f98f9a18d0b0235f8f631325f0cc9c2786bf2c92519884284fda16fef97f42919c787e37ab9ea02bf765b195bf02ecbd5658f4c4f21a615a5ec009ba536bdb7193fc616'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '8e36fa069be424d330504649439bb674',
|
|
33
|
-
content: '3d5438e962c4c962587f2e32ebd4f6f5f9b581bbc0b76ef47e16eeffa163f6777ac13d4b6b38b23628613cd4a95c831ad16baa410977a09cce219db20dea14250bd0af1c784588b5d9db269c39bc2b5148f05b492561949855cc95f80d5e03d216c505e4f15d710f203a54e075cc027acd52ad9549fe71159624102887d1a84c89a9a4d3e2dee78dc03b7eef7e6948a4ab18d15a7513bc27ae80b9702b4df61f2ffd92cc736e91cdb961857262e5d33e90d65d73288632bc33f4722d94989637b9ad364dbe5825a2a8e0e0824804ca764a589b2e2c85ac573117272699beca6bdadfd65e0bafe6a0a737c3f81ca660941dc93f183da829b55ce3a94b7dfaafa8483258d3e639905c4916f311bf379b3cadeaa102e3ff4b70694a44fdc7e6cca8bb70828437cb1f0438b2cf77197736a8f5c69394e8b99023313ed271d94ff32c4179815c5f2ac1585d39cfbbe78bfce0e3eb460b1856a015bca6f76e2ff7e9c1f0b1d5691cf91ff721b0b2559123b04461b8e83882140c8aeda452fb505e9cf9c23fc56f0f6449515ca724fffb65dfffbb0bfef30433380c2a53c07e15011535283df4116fc1af88928945f25f195cb02501cdc0cf80c0e392cd31ec4ec94b978edb8ed5b9b113499db8a208301edda993f69be44cd615b123409110c26695c90fafd40ee371683aa465add15eece06d8cd179d2c0f6c55914c6f0d571be8eeba5636a95097585bcc746fd8f76cada365de93fefc639faad33c11ec9867feb1b05a5d3058a75a1d937075f93410c4e5d2cad92769dd1fe43a724cf23e029f7a11aa602cb14856bd82aea15312f9490a5bb4e7049002dbc54f7273930c8ad664bf53a3c61041355191b2cde7804a90e0a74e39c66fe8ef939fbb2c9854055919fff1b25f62bcf939ff8e92309e556da639c45c7847cee98614931b28c5dae45e28a528efd103834594f4ea6b1d990204ab2e2663f84005eb8cd4bab0024e72567352c3107ef06f0cb170fc0a05af620f90bb84ff000dbe94755ddb3ded70db5dadeec286d6447808c0a20a1647fc84446c4007eb26e3124cc1a216a8d3aa1327619b94270f685153a34ec79162c420ffe0b1145459d063f9d2cdc1c31efa6325b02b866b9e8e31ed921b3fd9c2e53c1571368392f9222b745db194304fbadcd3f009d487ed14af954ff9c5805b9555c3ddb88514aec51e424b04a7d3b1a65c0acbf32a612ed0a2a32555bd964630d4c690ddf3ef97419edfcbb507ee474f30f0498dab2b055cc083913835dfcd6368063c96e05d06ee01ea3811e3a6f0b4983939824885e3282745c3f954ec2a215b8e584b502fd22a3c3e6e54c9d4a9f031ac21ef0e2b9aa5a2737f1e5dac459d46a5d101929a99be44287b935885b062e44fc6f85b68f35ef3ce3e1bc116b388268199ac7d8f8b30a835185265c94e11ee106bc53f61c96f8e8a3ed9370bee707e409767250834668765212c5eb36d90e06f173317f02aa241b1209eb43de6c22faa8f20788d09ab0f1bef3a03990c45028a08e4f294d995b938a0885f812b0244845d1357ec86e9145804d005a0651a8566209f12800385606dfeab0821788aa1bebfb6e612f6de0a963b6381c61f4cd004e51398bde277fc4bf3062c22235a68d4de3b8f050f0dc7ac9043525ccef9f8133ff2d5707ac24f81487b6815c034270a57468fd242addaa766080a91a76b0d21760d7195f11b4114bb44ab5abda0c66c9149e322c0ba01426d55cec079f5eaad5893e12f2b44a4a1445b2836d531b0ae9c24175f867a04cc50509743faa99b776ba55828d7c75f270976f9630bb927b1d38d47f408fc6cfe9cfac5a7434c4d31d8b915ded673e435fc502b81e843cae7797dcab672e8a372ab20a13893fdddd7c1d87e9e973cd3320bfb1c141797b1c9033e5a0219b5f9e7ddc2540b4331b7a7cbe78f7d7e989ffdeba1b410579d2a779688705e9f5f91ab2d21486f9934280bb7834f77ef0a932d6997c4710272a6d7ca831dcdf25b16fb1e75b402432adbcefcd9a80e3650150c2e934b9288d7d3e8293df20d29be8b2b2189a83af2992cc92dfb7fc128abaca819c3f3c1cb8b5b58c09dbfd23df5a04f06e824b699715003ea02c32a8c69f7cb29aca3b974d02d15578a53759f1ed8dc992831b80ae7658fd611ed148b6889dd5a7d535fa808e4ade175d07a0e22635aefd88be807d8ababa59eb6a0fa7d3f6394de1bf6b36984efd10ef7a30278684e0638bb7e17f2e36db192c062966e4d4768c9b63a11a47dd9a377e14bdd68a2cc24bcb44cb6f0600a6884fc597db1f0ca8d91d2eec19001e63fb86bf25b38c19842164c0c8914a85688544ff4ddacd6aa47dbbb6302cf6752513855a0a85e2ce2880044044571cf328f8d5e278e0c74f20f44d58386a60bf985a6f41bae4ec398bf2e15ccdda4f50c8e35990b9685e0531ca9a6ff3e87ef5067d43a973bf04dd10bdf58c4514c5011fb137f9e3936eade27ad0bd1001dbf3eed3b62acb2be2fd52ec72694d39eb5f88fc8d387fc767d8c5fa956cc12ad5e0429063dab69775eee618d62cfd01cd97eb422523e9589cb52105dc6a8c165ed6abd514462b2b50400a937f19624fbef2d497f733f75f0b4aa5e801849ae85a93c79ce98ca31f26514cc099136dd9f71d0b0f324b409ad751087da72897549dc309b85209012ffd4bca8e19da369eb6a763ef721b9569f77fdf3a12945df7b64b440b5737abc576ca27d1f2dcdc0d28a8dc1cb27df5154e5fd0c5cd700ff56bfc44fd0cb0ca086f3f7e9ee6fae3cca794fa7746bbd0fade351d32f85d7abdf003f5c82bb7d5bf6d6b5f83c1ead40c90eb4ec70b28a196b1479edecb4300b1e7d05c39739cedb9e4751dfa09fa7940871c1794cad9d5228ee6bce3b8e8dbb287975f1374f8cbb420e9ed74ce51a218be4934d670df815bf2289638b30f99964d70ff610de23c9262a614d98bbef524d01c7fc60c29b199a3678f48f30ffbdaa9d849afb961e49c91ddd6e6751e5069400c8ec0e6824d85dc495a6328f523c722f800d77a12baa6d61c9dfca85b9cbcf87ce4ff307c02a51ec34d164b4ebe2b8fa005e9d9fec9123555077519bb63879cab6998546a82b75c80cf1ba1c8f77b5ddbda404863bbc75e535b9b13b8260a666a4cd573c0a7e5e4bb2c090bd106d1d82f4b7c348cf803d682eefe568434491b5bea3a2b1b8447834f5cbbf868b422b65cd234ddb4d8a7d9aa34c274279bf3ac5fcb28122d34db1fe8421095cd8c7799d7ba780b4c03c21aafd094036056f85b38de09f5b270a4fea2463ce9d5fa72e0657a30128cd85ac63daaf25358da407d22544dc1ced19cb64da1feeec5fea47cc0f036946945631a3543c2ac350a951a8afff601d69d61f6add357bcfc3e88be2add161d0ad5108ebc5791aef0f77c6666858a5912736c52bb9bcdd516a40d6cc6c8b69d54f6c1866ac245b37669568dc8677e3c769f3a39f1b40d978243cefde0ed75b8dfedda9fdbad1d6231a4b88204cdaf312770ebfeb13d4a390fe745deae3cbdfdd70d70703f1e2f138ec7d291a7e58614b10ac8a8456fdf1b183b48e2efe72c7615261f84518afc691d20b274124d35c497615a3f32071b4ece51c2cb2009bd7037eb8db35753a849e046227648c2cc5c03bf30b5c2e67f1521dc57523e013f51c005bb9f157c55624b0e5022112b8889d0c83335bb5db160fd6eea75ee7309ff11dd19579bbe4594128b4eb92ed4bb030b1ec26b4e5d23b388f3d8690ff76e84d7536784c56965ca05bde8c6a6eed2b37f14930dbc80f02f5e6b1df1baf4f36ff782f5fdb254106651371f7a68dcdee609eec1c48fb250e845c37b95d865087984dcec630f77e80feafd6c29ee0c01f714790551f81024aeddb224934fc55b33fe909368d1381edbe02819d3667c8a534283ea45eaaf3245cbe632f0e7d1a78550b5c35b16a3230f6c51866a55ab89a634fa197784207e94aaf87916e6a40ee8ac9436e2f51271f6793f9ba90a0ce34036041a62517b6c89dbd919955ddbb1d85c91e29043c3b278bd9b546c470d834c491e5fbead102d48e21ea3df6c7a6132b7a4d5f03ca60dd848505bba8778df89d8769c1160d057dcc5c7f0f30996026c7d4a1a020fdf9ebb81f29090ff4323a3013de4bb2c30e073379c8c92d2819ec011d40fe92fceb975709cfc9991fc65a42ac85faf250317bb646ffd6487ff44aaba15da3efa7974a76927cbd7a384922dab7837b8b3397b0c154e512b7f279c8e5814aa2e91494cf058d1735f126b8f9d3c8a94e085b217a2d62cbcfe7287a10e36ae8f820ec24bd691a0c68a23784350bfc6dfcf7b0410f8edc10d9c57f05d1a0cd08146e51b001fce2aece03eade06007c2f22abded493c971e4f194205b895d5cd1aa08c22d959ff51d73286b297c9067ee639346f2d1e6b89c7027cf538dda4d5f6087991aa33b65c036f6e6835c44e821eeda19aa7ec2c3b33b6c74215152dfbd1b6fbf1de4e597f6b3fafbce3e7a407d0332c47e692837ffd4449ea394c7b671dd8d4b636a839c3198ff4cfcc31fb26aad16f6b685d05ef73a69959d3a885a379eaeed831328cdbac1f435bcb4a3bc5296e74e41adbc7655f996a6c9b67d7642b45c0174cb0b19253d159f56cd18f47c883b37a51546d7006657c08277495a3b5e1d2157ba3a2f5d02d14a2800e0deeb8cdaae6f02ee0a5d22f7d479a736173c9b87a0c2c3b7bbcacc58c2e27f3df92334900bc4e11cf5cc09dc550010dcae80c0c4e3c7e9a68c46e3fb1dcfd316c8b169928c73528ea23ff956a3913d8cb0b5c696446832df36ec0e1f2ca5de97d776b1732e1eff8e653bd6c38d8ff8dc137355243bc95d7588dbdda47a3c464020a9566839fdd8a551412e19e07f0f97bb750644fe031c6500cee508a398851d0b4281201bbed4a93ae6681e272315807cb83fac425db5b89ac1d27a2e399537d51f00d87228a1ff75a4823be7b41e431011f7b084f69d75057e258eaa78804fba69dfae4925f6750da21341adc278c9810fc8135b0ebeb14d14f98b61a002216eeecf15a73416e96a340fb62493e60d6fc113e086075b799e04981b43377a0839fdb8d262a36919cef4091a73d678f58c78f733f55303d67fb3681e76e73f76c4430acc463280f718aff6d3d4293e1e7dd4b3b45dc113a0982938679bff00936a452b76964b5ac8cf5ba9c0925c06149597d4014b8446bc097e5a45da06503271a4a987e753a120e28a7aeb28e58ec4eef166a6eb0c908295c499e2bd7b9caca4b7642d51de0e2903c651661a792f343ad64ec76d65d833b7443c0a9da617bf510a665f40c84ba411b8e0f39f1af16036da3d3f99d914c58b663ca7922236c682559737fe58d781be5a03daff67637325ab099ce66f7b2bd117ca1caa023cc738be145fac4e96cc801599b032338988a46b1357118cb312f99096f6e8340469ed0502557e7cd413db5f57002f12d7dff6c25ed377fc270286661da7f95b3c9c8382921fdf38da3c5c68b8384e471d7a7723812d6b455a659d6f57e79e40a5e6762e7bc4e6f8c7a27c05d5d207010520ead433087d4ff23bd500aa777f22ecfae3786aed976f7fd97ab2d1d6d84ecfeba37b357f1259279d0a7936af2ab962f8df81a189d3d921509d353e52bddd70716acd86166cd2e8998d419322b3367832abf81bf71e9979f07c5748c6878f1c1fafb37136a5b490ae4815799878dd3a84462fe04a4edf19d3f4de3618bf4339379dffb9e2456a398ae9cb569de034562c95fd7bfc6df7e1b2a22581b5c6fb572dda9320894f18a17a2c5a01e8ac90e0ec46948dbb557632808b6956261a70b1a82eb131c6f97fe5f21033d8512793f66f7b9f8dc353daedd3ffb0a019b6faf3b2704d82d4b973038b85646046e0e484301e0db3c9b56fc4451c38094e26fed22cb08a5b086d8b6d2c825c76ac8194a07b027ac461dd26b5b45a54ca3aaddfa9273f292980c14cd066444391094c93e2b426eeab00f11bb7aae4ebb25af1c73365c966ddd953a55cd8b7d40e8f2f143bd22a8143685f79e3e126feaa202adff36d8dd5e25ee1732ce3fce3dcc07260dc307d49100466bc2ef6e0a118ed5b8558a1a6204c90adb9447255afcbef40a2beeb65fa8392905b27b275bfe6b32bed4a58d12f4b9f826a3b52bcfa7e7087e93110159e07917c75482d176879958c7d6408cf8f80c16b9a297f974cde082f1a1cb636e009a69e264b8d14638b4bfa26028d3045d75cf371b8e8bbdd483039fffa553d747cee13afc1bf79ebf701686a2d57bcbd8e97d9e8c8b15305529db09942fd5ce1aa4436742b39988c98d96045f53c40c888558322834cadd24d2f585c7c5a3be397cf2db0aceea38f873a40293303199d53441ba1c464d5c578458a18c8102f9bdbf7afa161fc02787e84c3612bb218aee60de90ee781a8b246e13c6d7c5091f2939d0c01e891fd3088be1c0d48039ebaa32f018a7b31bdaaa99b0d3f3bdf3b1d39f6f747d1dbc47f6716b8f1779c237046a150530d5fee39e9716fe00638b7587cd273bf98a1f59bbed28fd5caeebb613a108249736b66e256abe51cd27899efd9b2a83d1de9a717f12f09207030b27eae3d08c194c027d66ac5c006ea136c0758fa21807c6a57d954849a0e3f10d2859dfe83855fa9b9dbe1563ede8690406bb0dedc3e671adc11482e7efb3a35c94da8c953fa5390dce717caad38dc6cc0c947d092ff0dd6c3059e982698d967e6eae615fd06cf2db6084956013b70f63ce157bf352135240235384669e03fc3437025e679ccfc0b330ee1bbca1838bcaac947e7e39f077017ceef8a3890e5e294065c94fe4ab803585caab1ea6aba46c95d94389e7074c61f2d681f52084e04a0978ff27469b1ad4d829a978f59a3371894520e199d6e3184ec304820c8a08ebec67cee2f381d6132501ebd2fee6d784e8ae6780ffba69c5226b466dabcc5250e486d5fcf85c6469b8eca6a56701de4448c848033b940ec992c9b69daeca7bc57020b5c6eca24f601bf768cbae1d22dc9d5f875045d9b445a78298b9856f22c6fbdcf6d9c50586e37b069445660af989017097c4763aafa4416297494a74748ad612499c5d8593dbbc281abf3901b61a526662f2245063792aaf54038256a98fa4b9bf89c9c038497ed1243cadef1b40e753e585db08601298892beda7eafccecdffb6921e36142995b757bed8a25366f0ab2650f5f3a03e994d7a5b0792cf5e21b6c32d8ac9c2c410066ee534b7bf91c05e995c3d59fc5cb083f42319243ddacf107398328b8bea897d39ade2e8ee4a21a702482dd4338852b7b19ce992a11fcec2d270b5c958a090f81404051c1d15b4de97a732d2a3401d93df77d18db5119aa95f9e2752f1a7bd1ee9f67858fc1cb81a6057576353ba7510f52ca5d9e7cb87a5919fdd71e8f75bd8e621a38a6e35b4256395623e29716155ea2a586a9477a38c0129207704235ae0b3a25e3cdeea2c4fd85edc36f65499c96a7d7937040e065f0d8fcb3349539a8876f80883a30d27d9c887f9cfac02fcea3e15a952d879e6b60f5f4b3469162147c7000d2bd87d791fd8fb143b87f6ba7458080ac979dd2697d4391de4fc6c9156678b3cdea73528f045eb5bbe5f3a616c8e2374c06e31c774e5dd92e1d698fb0a606fc75eb8cee6e5c191e0bc30d1d77a5c8d7d4f3dce6653bea30472c6787249bbcd31a4de06cb04ca7b986e127ecf9f7734d20d0ea6aa879f9edb95ccb10fc30021420985528d650680c7b3fedad48d72566dc527ae05a74db349d5c85c0bc4cb08a7e7ca9f4534849a89529a7d4f001b33c5b09cdfc62c85578d4ada38a12a6cefe2b438f711cb4ea00e8f5cb904e7eb27257fc643b419e378f4791a5d126357481df28067d3d04a2f12114e87d5d0c3f7fd1b3fe15d6877ce41c7527ba7b7215d22f812848be327aa27a2ec8e956e46a5535e03cf1aeb7c2c84b273bf32d3f291052d5d4ba63ab006ef9a2e8e9279e7cc4f491540a36fd4185cacb9de705da59c7302993816378c7b4d08e01ac4434a3c9114cb40469fc9bbcdf75c1dbabbd0d7e1aa6fac1b1fcdff1bf860b32f6836758ab3707cb8882ca0aa0daaa3330fc61fb124988c0f4e39cc98ab4abd4b0cc0c102df37354e626903758b0c2fe2896768e1cff9e9984a5224b903f9816a76c828c09cda17700d1b5cf96c1a37fc28d6f7b42382a73afdfa0663373a483148efd2e27ae938e982b744fc295d078ae53959607e7ab22fdcdafd86feffe5ff915c21ebf820655ee78646b78c1516f4387dd099907a54cdb94362cad9dd686c14ebc2bab19552fb17867f98745b5bb006db5fab53cbad47914ceca3e787eea9fcbe465d52a8ab55c4271611607e434adefdc67ea4d673d2a84bff6e7950bd4a78d98b4575dfc420b0ac16f125a09ba40a4f15eb1439858eb1d429a74b5943c48b31d5a02f814a1e42c7353b73c1661b54fe9f5e1960e43dc00d8614737e1dc392b14b2e51a474194d3278329e8da8eb6fbf126f631bf1e972b2d34c532c0dee67886331400e1add7e5ae2f6e8b254856bf294a5462e2a3cfcd68c51505f1b8c20531126613084b7bc54cd810653e53f508d347f8f9121db4368004c772c48a6258f63ef82b26c7a048ba3f789984a51e41f386e3d3b48ca4e50fc0bf12ea7a1dbb200a63c672cd8c99991c62c4da965b8373127dc0259f9a9260ea1af4775dd6ba2d3b8bc52c8867967c1856de0d26bf2150ade67509e9fe42bf417c9eb61d86666ce18a3cc890472a83c9ea32bbef3e798f944e9261f7521c434042aa0fffcebb9cca5454776d2a209a5003e84bfb74f5dfe67fd3627c80046e31bed0c17a8333794e09abc781e280cf0e99eb60a02b0e665b8cf890f970ddc4a5a337d3b2b037b5d2e0e2c9725bec8452d807ecf876fc4b73fef0e12c99cb47b1c6c1c62137eb23b2bcc6184513bd0cb3968fc04bc763782b9f32fcb2a91e30a6e7894287fda0ed2f945c883dfef579db32cf92b8936f48b79a7c9c021ac8dfe7e81528c4be1fbb06200db42f83f088d54117afb1799919d467c6ef4c841d87a7938edafe05f5fc13002bd44fffd61580573917e59fe6d78b7244997a30a9729e09e4dbea2b9d7469742f555987e188e227af563e309e969e804e8e8bcb2b4254fea18d8c0ee7656bb20355bdb57ee4ab3c40889fec8a3ac50be05bf27f16c3c14113245331921ee4983424db2be00aa58ce321a4bc49f92acbcf84676c1ddc699ec6124b08f5cca9ca6d6d294d4e8dac39a9f9500c92c4c7dc63e44960a964fa90425e65940965a53d48e5dac67f22d1004578a762cbdef3e688e8d15aa49987b3339ccbf7c7a2cc3efffbf1a95070b4c82be173284dab3edbd59a88b2817fcad1b0dddd7e37c372097c847d0f5ed8f3f915f2f8658aa43325f37f209826dd82d872118ea95ac0849e000b4b2dc4e6e6b06addf2f3695fc477617cb1eeaa20dc90e94a89b4842f07ae16a0577f260f95cfd60d971704351e4d8bf1f50733ae8726054dbe913397a7f0a0b522c1c01a2e6ff2ad6375879aa0a6120597e694cec1e416ffcaab49e5b3e15ea5f244994a43060f9783c7c791a4ea186266d3cc18c802c4347550b41c384ab401b269b885f533867770f8e545395de5a1bdbcf6e051c094bf849ac91e84402f50498986fa45556c03b838fae1439c87a06b27361f5283c42bc652e66af5011184ba0f17cbfca891b871cfe668266fbc9859d5d43b7e2402bdb0c9f3fe058f03220dd516c8e439bde38ad399adf28e913e9a1aa1f097098ab6814c6c67129650080883a9c2d1e9af5fb61e1629f2bde75bdaac008d72bb457eceb6170ed23eb1ff048caa7fd29c9e8b1ddc5d92768ddc73f75b693bc0437da90d49700fc0c0b75890a0db7b7483684a1d53179acd94cdcdc7876d061743c76565d35baadf216b2971cc84df4f5c7cf5561b023616acf037a368ca653d01bdaeea597a7d74f8278fbf61746f5b6ccbeeff0a77ce38fac69906522df0223e298fd0424c411e738911605705f7834887471f71bbf247add0d4dbfc204f2771df9d86a74c22626fe890fbaaee534787179bdf44f97e4ea20b3f750068adbc503cb08e871aedd9c52620c295d29f1a3ca67c6188e16477c2309c04425eaf4bb1b1f88b38e2f54135d158ef74f1d7d4130f91e68fb2071d8546431a0f3d4c47f45581df883dca702a426f730098b87a24e9bf23d1b314d737daf59d54d491a08d1ec8177c17d1f00df3bb243d74b9abb44fa79ad48080d2b20b289a8e3f682fbcf4973713e8456a68fb3ff2d563d05623bab861a27d7f2432239d9d6856146818953368a01010c598896baa6d14bc672d84be4849e13cc0895a1b71b5be820de056ba870eb28fa24f9d1d3e226c05c56e55e5f5df39c4e9d4a120a1ab8a839ad3e100175f3e9ebf23e350052217d295b4263d8ec2d2d789b18397b6a2b7e23dd8f6a105ea140b20cb31b70b9ddd8cb6c4adbed1aaf59582a1d122e623791e83c04286271fc4d4a26eae14a6c6b0216d1370b82af38e2413a6cde3bb6dcfa6cddf98142c9197dc3cf28b229c510dd47133a4e775c92218b56d371c42675507f2272fd7f338f4c1cf820ffd71170a13a5d497e47bcc1e93de6390d83153302b93afb7b48dce0f2a5d8db2c89c8e92c3a4c669392c43b6c1c795b0dbe9036026deafd3223ab0db447390de154bb75126c610c147db64730ac9aa25520e5d213adb45927e94833fade9ce19e319227a02318b6f3aaa1036faf8065fc8486eccde272904da542db83c770b50c53f23275b690ee8b2b62e7078a95b93e48a5158d224a2000e3fd37ca45349dfc0bef706accdeaac85ce427116d724f8eb30a174ccdaf409abdb399249b1580440f098bb5d45878114f199151a05d7b8f5ba8d030c042ee761f0b61847c1dfe019260c9a002914b81a800010a04d157255b6d833bf501b0ca923db65358819f17f9788195c209b4c84c4132b8227465b2341576397c07704e1aa4d710bf8127a1b7a31c5c525de5d147a1edb3de744513dbecc9e028764dae8c18a20a61888cd27bf25d0cfaf970b2cee85cc6f7b8829e1964ac9b22e7eb6f9506d9ca06f03133750644f59e56dfe70b9cb7d98280d11e1a794777f7331c6f8bd35f8c5ebf3210ba7cf445ee89dba41aa2c8849422c2af6a93341bebe8d8cd203b210bb5ce786479f1158e2501b674fcd8c0d374d95ca2085ea1bc1b9bfb6f05211d221d198b4b03657b875ba4ab8398cdbf84dc3dd6e083620aa8770a665789619963433262ad1a58605f2ecfe4bb52f299d8a6fbd07483d18f2a12fdddad5c7c21546d7c16ebd5f364aef228433e5b26a49cd3c5b7c0fa7310ddedc66b753956d99ca87cfc2860763866bd441532970f1743a7a70f3074cc6dea62342d7d03dc4d9705a92ff1bfbebcbc4381ba059e6b81114dc80ba9b2395e3ea31eb439841ce480e8912cb8e4ce97ff7ddb45e86f635a4184b20fa0852553f8ae56a9b7399c2912e29e48725899e5c5769801ad94b7be259f19901d1f4640ac2e977f306c2f124520d40cdfb9416c684109b9966ec8edccfeba6c5bdfbeaa0f5336a1c5c6af5f35293d3b487b69e7a61356a7ec7719e98f77332e5683e5ef1cd620723aa195a43e78c435d9ca68cf7c06310d84cf7e03f67df426ccdaa72da585da640682dc660b3e5f87eaf19ff6d5403b2c2b28ff0d55065d7c0114c8992308f46aa053b9b4294d4701f59e2061ece3865274b0c54a2a3c1d2e2dc8ff03596174050cac1e2e6b3b813bb2c3a856fbc34481140fa7fa91b8260ff3a1ebef0c8827c60b1af4aee284f32fd780461f1ce9d095951388fe722dbbc6e70f23c250d1214a1e6d4540f3e3f0bba012bd6b9c9366c19ac102c8599a94c8a7dfbcd38a186633169a948bb3514fb04f8f416eeacba3937307145f9a7bd33d3d1001142e1c8f6b32533790a04fd42fc250eed1e845292bc51ebeffe0394ef0a9764746b4fae4355a4e32ece5988258e85bcedc2bb85bdf6cf7cc7e36f18751a7ace9a7404cddaebaed24d65d3f2c239328545d47017bb681e68b6c5a1127facc05a4509ef1e87ecba1946e514e8957112e03e15cb0ceb471351bd72a7fe1292e859069deb6136ac9f5f6acf7e0e38231351e7fac561cb4b9da46858cf9545cc43a41fd8af9b8905446dd924f7655664b2a54426ca0060f89912549bdc2c90eea14e88f33d7fb1048480bd6e9bc5991cebf612a4ecc052367aa85da6f2ac014e8441204c8ddd5a465f9bb24a30b100dcb671db7e1401f032f58d98056fce4d8c9459364e61aca591c2ff9611cc3252779fb0f37491912e685ef54af0a3b86cad30f6706fe368ca375113dff6697f65f9b3155618d18a80885a39152b309b42d12a430069961d400851ecadee0a39c6f4016ee11c49f87cdd88b79ad3c9294dc8fc05e69a22d81a72ea7512ffed23c6819774afd2559b14da96a40f77b6411fdea458df34b8dfb247c8144dd6f8972d8492c845c94b3bc7b7332c92bea8bb241420449bdd9507f8f5d2a12eb3425b9c520e1c13b9326060cb1f3d4672adab86423d928928322a25ee9cf7f64a4aa6347bdeccaa4b495b058a486e70bac99d528928d51a446e618b563d5d69a368404e06a0e5f844f377e7b2e720f68beeec29d558edfcbc11fcefada0ca6b432bb4d36eedd10394e0148dc7ae68995ba08a8e38726779ed97ddc3f80900deffdb855d0f9250082df9afba8be25d7cada645ef873626991ef86e8b718f756a241f683206d608cad0b716a52770199ef4f09720257322037b0dbb8b35a1b4cfe0abfeac99450ad435a72967b67045bc265560b66f76d04e65f9938715ee84181d3d62d1f4893f46b632c8b315b4093b5c1aecbbf01cfb166d0dbf4d3ed572c33296746dfafe6b71924bf92573bf752fccaf17f10a96cbd4f9ec5e2aa64e3cd008477ddf1cf7cab7950175e15bb37934e88f279f522a7bc274668fc6e25208bac2278d831f21081c2fd7940f7402ce465f5f1fc4abbc15aa0580d8818f361a9dd3c12deca3ef4e18f3605d6e3a9412582228f812a8d75f5c4644b437229248c7c8d8f0b412602c36a8a25e29b27d513be560f42597a32b7cc04483ca45b511193b368169abf95a92ba9ad001c768460fe0e4961366cbcf6df26d53c8fefdcd3c0788e6c1f2a487eb306e6914f70301bff378ae4092dbf278615e71e0653a83eb5881b375875a5d6c088b1a008a38528b03fc59f59121edd4d909421d3482968becc5396b320d4ae62e7abcab784194a1ebc1fbe87c78216877a9c5611a3882815ce717c4c882d93efcc1e1b1c86b13758142d4411348a8c4f3f64514102cadad231400d0a0c85e9ed23215a5765b7360ffd8a09ede5e665dd686a497e9b85733c33fc0ee8706f15e8d0f6aff100a592f01adba531c18628f4b0f7fa3127e9efd28c368b37f689bd87016f5e3d1f353bb7052fbb7141f159f2f13ec4d2575b8ba015e22c40ef75098637c40036d558d69a9a8b2f684a3e827c90a3165ce96c572fd22641598e183cd4d75e1137164f312f65adcfd5d501cc39530bb846365bef5c0a8f4ce11a48aedc86d07e3e2ab7575e7d609034de8ed6cae07287e738485d8b04da2812ed8ea476d61339a8a3edebfb184334ae4d07ed9ec3dd457eff53f44fa6c46f5dd23669d69f57caa357b955285e13360411d8b7c150087005aaa62083e97080c944de39f05e42b6d63b23b6bae48ca6965c184a4bd2919ee97c849881a4d903b1c748d2ec98042d194b08ce1c4d1a274995b08ccc82ab4e38c5d92d878c2783aada7ab4eaca22f44c6cb086852f53423c87335283a524a59373710831065d7d5c925544e37771efd4be435bcf67515405dc3cb680303ad602cd792d12d89cd9332f3f206415635369e7a0c4091c5a39d2608fbeedadbd0605e7b2695a678edfe27075671ed18868cd3e576dd54d6f2272e6ae509e99ae5a3115e704bee49e8d6cc70dcbb162ea07b254ed55d8246cf85ecd28bf8d335aa9561175cc8879d5542c27d9fffad2fadb3a27b6837e4e1d3f8d42ddeb6ed6e3b7e6473dc62537a17751b15ed2f179f3a54de66182e92e2d8dde5d3f1136860f4cdad49d1a7e02dc7db56213d7e6a09554d61e770ee0eb62bad224657334dcc3f0c2ddb554e00c878aebffae8482a509b6a80e30ca534890cd58c436d85d27c683bdeebaaf4c5462536931eda5998ff10fa3cec289dcfb8d9bf7c99bfd1f7936216c6cb98231fb26257a0a47f89688044321f3ad88bcd57bad26e0faa54039b412533b2ec01ec3d847f9760f35ecfb51463d581318262fcf9e3b1d2af90dc12e1c8341a2e9fe15aa40300aa4dc6dbcf9a1ea138f374849e622868b642ad31e2c4685e02a8c870afb527ae022c2e1cf5b2125ce5ea5911e7fb916f54bc641f6111856bf36769b40c6d5bc96e2927a3dba5539298042fb4912d68e96a429130a87b0825088309c0f25f4a1e55031e48061267a970f2db919916aca148ede269de10bfa74bd6ddd15b01284fe78c9167e11783173864a70fd432cb775d1cfcd6c7f32e0d093f2d57261bd430e5ae8a669d9c4b69e5fa9045f78b6bb82d49f28e0a5eb65561df622e23400f988a57333b1c5333cb21a616bb8ee9637a3ce40fe3af27e52f5da18b16532df0aeea832c29ab3f85e7f358416d19440f387d544f0748601400da00f829edf31cc8ffbafddbd5a5d64ed8be9e1abeee6e7e20db696fc6f7cd8d25bc5ed4dec716953df1fdfbf545710125e1bb09c2d34f1c0f70f5544ee5429315b8e8c38815a9db7c4b0fc2566bd6d90eefbbbb4a67a8065e67f15ec72a117cae03ae4bfef893c8ff00744ba69220c8f6cea07eb2870d958eef927d4c563f190b0219d732d40d4d944a1e78a94804ad5c2338889954a7e384a4f61e5835d473be6a7dab7e24437af003d941facb9274261a6164ce077e5411d9ffe99283c235b90207087f2186e862a46cd4bda406d09b04b01d3938691bf98da22eb45846227f0bf23b451712f50635770cfe90a0715828416e27fe58480c9a1a1ea5ac7410b4dbe2ced2a928ae77c35f803e539205d00a9489f5af0b99374a538e5a2fd0f307d4167a6a964010715a3001b4bd6d90bb11bf2246fee0ea86e97aee701f4cc8dbd525edc7eb64a8e6715c0c03f04c898035922320f1469b246e1238fac3ee70b9d27e6ccfb79ae5340426025d0440b63d36ab1a1e7e68160cbe44dff59f90480409e3ebf7e495de7c36e632dc49edb2d8e8e9dc43dc560c1e78b85cabd1bd2d037bb9887841f0a3afd1c33c05dee21d906c6fb5c99b7fd15b13e7460c9ecef986ae4ed4421718a2b419f752cb8e93cbf7b6beeb6bd92dd603b335eaa4413e77da62f23e53aba88801bdac51c0e343f06e5a36ac591b90879ec4b921ad41cbcac3817186c04fd8bbb5cdc69d86c271739bbb6ea949c4d7edc24b3d40ea3ca606c5478b39c9c03dfd2d2ab4f055f9574803073bbe621b5b796de648b7e168fb32c061fcb66f3b8801e739bc282385e2077135d3326c1cba9362ce2c1491b20c34e006173d19401cac064ded92f6cb204705d788899134da94c9052771df36e860373f7a44c68c57a2bbf9f52bb92cbc90dc16689cae909de816f353808b953b783416f94944fd9dd97cf4972e13d3cc80b2718002119664a2ba5de1888b6c55e15a7deafb4abdf75f5381fc626b066c9ce180b140add4fbf123ac7b2e8e2acc461d398b90fa178530fc097f0f43fd02ed70f25a0ffc398b8702aa9cca5358240f4047440ba43164a44b81df500497eb1b50a3d0382adee779493fca959375a9889c211227f25d8f47d86ab25ed070b76b2d6891dcac25aedef375c5c132bf7166678482e7199edcb6ff2ddc2b4611584746ab3ad19a75fdf741447876a0b32868644f3a17610030f007cd168e358e9c21a09fa0c0a8742d6753ac51d25260466cb0cd6f78c1b74452297bd959f7c1ef4f1225d18e581d250170bc25141c203dfb935b9f45d0b801128eb3ead43fbcea043cc7e26604a5282fb22688b0c57a2dab700229056dd3a4c7e97d06429c1788529f7012575aef3fbc70cc7210ae068a6b8d12118bbbccb8b3afad31bac10da19787c7ffd3e685603c3bad74b514731a132f74c41f6828def39bf561a84099a13c3bdc79e1c9b95deb27a3aa4ad2d89e40cdba694e9ab4aa541ba706996ac76235709a44965e4535926ad602966c69865cc5a74edc93db63833d5cd935a2c3126ae6f131445fd8a438e5e6c1a4554cf212d7a6de235b94352e3c29acb95ccabff45fbdd8a6a50978912d1b87d58cf2f9ffc44234695d6a8cc1d87929cd33bb188333e4c8121ec7a9cb83e4ef6eae923514ed895b9fc214f8f21cf2086a11b13e9c9c4ea77d70486026e52c4d4a4844fc363a485f43eb3c18732468e542e2d8c44165f0d6b77114655fa817ff0e65e7ccbcaee8beb52796ac1d4a235a6f9adb615b974ddba53acfdaf3c5635c3a28bbd61054d1d65f4d5572b17493c2450866ef58bc54b29c5bc8f1138df3aad265f26ebfc5db844dd0e50264b7852378a31a58e683fb6ced251b0ad8fab1f17e2452748979e640de1ed6b9310c5a36223158ce72c406c22819e6237637a171035a90e97f78a81c1b346ad188e8bb5fad32a3eaf8a1fec7ec7326c746509f0d1a0468dc00816bdf8dd19d4c7f2e97077d27cbcfb5051f5fcd758d06a8713f9ac010d1844930faf269a949f3887440f0b1bf523b6882c84e51781e36118359cc311ec73c15f4fc05ed979d9ff137d9c8ad41a841f5db4f8772afaa9b59d43d1d08033495d37d688f72a86fbc54db4400653509dfc1964e7f3e9a3779242d32180c2f0058c67e1279365c6dc1eb1fdeb765a2496efa3c909de30cbdf6266e37ebab12b03463858c2745792cdf805a4f2fe28316455fcf0596a6fe8bb04be7a4f76fc75417b9c142f76f63657dd5ac2326db023c6a9e8211439de7856b2864e1976bec40ea3e1c58d21688275a016af82a432bd446ffb71f986d8618708e50e8d298449dfe19453bc891f02aeb1c668c59f61c4b8863e85ecae8bc7e0527920bfaa27099381319681093e257852b0346b55b643a5686bf383a93b5228d89f40b47d4f2c4bc42a775527e9261cf657f4af26c752841c8d076443c3098c0dd8a05278cbcf8982e2efbe9c1a32ea5e83270086d22ffb72fb7796d2b19dbb5bba67280f1090d54204d21746ce5e5594797992eaf39d775cc34b880d2954015f7a6856cc65be28ebccb43b622b8b6081698883d695f8fc582299b2a5a0ee53180a226c13d0ae6a4cd9b5a92f4f350e9e7de30641b50896abcfa97e640f877a47b8e4f6819dd0b80adf3bbce7b874306697f0b835d1ad9a0a9f1d3099580e8a7158b280b2be562aa4cfeb0848ae60675c8f97f8506dc36cc191b526e8d7a0b7024cc0cc4a8494beecabc19265606f1182364da8e1800d9635ae0b401de81c3fe428c1ba1d1ccb1eedcecc675f0b8ad8f5d7fee8c3229485479c967d130e2fe36eb8932db2b120249f564feada35ed4fcd9ea7d06f06f6dbbf14c33e644df4c701bee88d6485b49622b27c72899644861915dc97a152b82293704fc1e311325120b0c937727e4de52680293fbcac2a07e52eeb7f790de9270f1cf7987f095dd5b59f82913e71a7b872c2284432c4192febd5292edc52820294011e2bf6ecfcf63fd5169d83169112e3923f72adfd0b6207593a962baa1bb77cc9ff9d55975e43350e8f4e15e9cc520348a61ca4ac5de4d559769dafe348343e53b7e78ea143fe6ed618ace864b974aa1b5ca92e43d3feed30ea897614384e7fe90630aa5a51a976562ab888110cf4526a9b90a3c27b3433733b2772bfbd97540404a582299c128a9ee87efea67d54f19e45c981a61b48e2f5fa0b9f4374e63f469492d2bb21c3eeebbbea21aee75d4b39785576f028137d4179d5e21c36e7c7ca3ac6935f5244281bb8c30e6c3a28a7654c5e618f05d999133de6663127a49ce8224e1861fc0630021dba09de943d30dbf8f59e692bf96be998b588708dd3809e74dbe91767737e5b24edf46c7a5ef4855e8874db8867520715a33f9f373b8609dc94241c0984656c22a2c4ad6c46b851c91fcf7381391b90c245869fe10e31da513718843bdd526f25d017b7dfa17aece2d8657d7fd1a4d79d4384956d3c3a61ed98a035695aace4d8d11c1adbda562b8a651476433bf78b25c22d04bd3ac2f2e5e841f5ae5b10b030296182ef73a703e2d637aa09ab3d6d1a9cf62d943124cafccfbde61f39ab4e02ce9d3d468e7557c33f010f7d8a68fdb0c865f1de5ba31f843fca4b76f66a96fc9bbcabe6b2f1db5eaf9b75fc1a1e42c87a61e7531483b693ef9b3aaa5163fc3c1382c5888b8d654fb162b81235f4a8cccce0669ad84a58fcbd0f9585476d7bfce073ce0be2f11042cd9c2e7440fab18839745e44a5e38973f0c63c767962f94fcacc4b201d493be4c326d4926a7598fdb070306b2a6754220589eb59cf26f61b13c5c7fd0863b117cf4cd1e2cf51e9cf86a86de8e0a879926b6b006be6bd7e5ca338d8b488d10ac082ad817e78c78307f903a3b8ade390a7580f8003ef522c8c5d5e6b61f4cc87b952436f0950ef86dbff848773f29ff0bcf596c34beb2b37d81afef5f94f0f4afcb4432d267ff57a8862f6f4fcd41d4e7677355b894ba1f41863124adb6f39c4b1ca94742f584754762cb60c2514f972c598dc90245cb51e3b071aaa066c6753ae9128d8e2bf39c015e34e38df001f7ca97c38916e5fc65d0ca9a2cac02bde0592ee3cdc4ce72ce5b50fdedabbeec318da63aff21bf64d9ff9a8ecf8a37f6c7026e676ce30be8787c7eb2b6b66d75d9aa21edbde34410a81ae167d9aae108e347ae98a5417e3f4d590155871b7e71b9bf07d09858d0cdc1265f60324b0bf3fcf6d8bb394bb038730b0cbb05833fa25bccfdb7eb6e79dd37ebe65b79a647ed7117282c1603f575db30569216ba2ccc1f30736db55afa6c59a1e24cd075d3044ff74ebcd37466ac271506e6b775d769a384cb41defabc32b6ae0c65c1d8194bc190318f174e879'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|
package/scripts/shell/publish.sh
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Protected Shell Script - Devicely
|
|
3
|
-
# This script is encrypted for code protection
|
|
4
|
-
|
|
5
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
-
NODE_BIN="node"
|
|
7
|
-
|
|
8
|
-
# Check if node is available
|
|
9
|
-
if ! command -v node &> /dev/null; then
|
|
10
|
-
echo "Error: Node.js is required to run Devicely"
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
|
|
14
|
-
# Decrypt and execute
|
|
15
|
-
$NODE_BIN -e "
|
|
16
|
-
const crypto = require('crypto');
|
|
17
|
-
const pkg = require('$SCRIPT_DIR/../../package.json');
|
|
18
|
-
|
|
19
|
-
function generateKey() {
|
|
20
|
-
return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function decrypt(iv, content) {
|
|
24
|
-
const key = generateKey();
|
|
25
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
|
|
26
|
-
let decrypted = decipher.update(content, 'hex', 'utf8');
|
|
27
|
-
decrypted += decipher.final('utf8');
|
|
28
|
-
return decrypted;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const encrypted = {
|
|
32
|
-
iv: '3f91941cdda081232ccf1b06883f2415',
|
|
33
|
-
content: '801a598e373ae7e9073a59f119fdc34494d38284ba66c47622150c40a496f07acefd2a87a998de0bd61e9ce275de9fdc1ed387098c0ed395c507523b5ce143c0f2c11400f42ae17edc74693849a6059ad9b4273448d33631c72e43a422132c2284a2259915c86fec98d0b74817132f2bec15b70bab6e620eed066a61ba78555f7cea3269fd82d29c2b62409192796304b71f541ce6895d1e5c72589dd3c0af04cb2e8eb73a31a11b5532747e7facad3b369c402794238d11f635d8c87682cf0d6682186afc4b83799ff9d89064bbced45735c85b2f694e3061ce30730ccb555efa2d1b44d8edfc7df360ebb5576c9975eab709ed7de55a50d5e61d04e4548ad83dd8d9bf0718c693c134b4ed81c8355b50f99e4b68cec4a3afee24775aa0ecde06ddc1e9cc8d268047003b22d05e4c9e421e7e13ffd0e1c26230a0a056645c3a8c5a37ffd760c9a6c261867aaedb9830abce92fdf2c9476f284fa2c303cb94b1801af849ec3cdde21413ad97db1880d9d827f59d41d500503f3cd614b825a2b674422ecfd9899ed5355cd4fcf5c5e23483461529a8fc0cf8d1c59fda2c0518994910e9c7ae08ecf791a0c917b9c7d34216c9f36d355ad7ebf58500957b353866ecec02883955d114c63ed137e84fe330a8c4b003bf0d450ea48a1c35f61b43ca9761862c3028c7ecd85d4cb632797ea358dcbde21ca4e6c8da26c3b1e140acacf9e159da1ae533c2ed8c77f4a428fac1ff2f976d4a7d909592f0615b7be4b133ff0d9007eddaf3c1e8e5924f0ed1178f0ac210342656e8f6e1c6ef060807003c85edccbec7f3bd672507e7686d3de636071542ce7bfb34bb7154c02041eb7e17a9bbfcbf7a2cc66577d8132e1baeaa74ee983e3ab4a5cabfa1458574e9e4e20874c9f219f031587f5d53537be2769b80df0e7d9ddba18985b66bc63471366ede292c240dbbc948a378ee76bd58c606a410d1663b7fc4917eeee192b475c568ea6636bd79696dc7b52486f1275a84a1001467f543009fab6bfde49588d5869ca04f2dc8a42231afacef854a1f98b4c0d881c63ddefa9b4f24a09bffaaf141908b96429fe1bfb0d096f15062f2f5a124b7ddb4f8c97e08c9599106a00d4fac559c538caf5d7b7cf484606de8326a291c8464699ce193dc186e830f0a77319098e0fd3ddf5b131e62a82d1884afa39bd2ba1b52655d35c891e74fa1d8756d5c6bfd07ea8d0528863edac0de234f40678f5ba7f26d7505fb8179c8de497bed78ea49fc83b87f8ef8bc5461904c223567ca0cf1f1bde637190e5e69fb0d5c2dcef29d1c812e58629d271cd83ca6affa6e35ee1c1ea4f524f392746298818b04474c99cfb6722565b59a7bf0b2f064489ba89e41bb577543a49e8482580286ff1c4f101242412e54b083499671291e1e6ff33eec3671b6ce6ab63b4ef67faab3852640134a83815acfa5e2eaae8f38dba77675e7a98f28c7125ab3ddcdae0db9f0f1d48e165e6a05fdd27dc21a975ca5bc1aced08aaf42514fdc79791171712a7d5986a0df78ac263775371965510485c6de9239499a91e071b2f8fbcc8ba9dfbd0d2fb5a2097e9ec1247aa3f92a33cb671d76fdcfbb1510078e181f6692ae0a4f9c8c148b54271b29a83ac41736703e86300ecde3d485e8187085dd4977c9e23567ebe9be5e6e1bf95aad8d482bbcb3e782574a805fe14973bc1110cb103b7d04b14e0d6a04ca900a85ab4e65006d552edb72e45e4d13907755c1a9ab3ce0c62484913490a1c4c25a0cd22e227ba660d9bcb2785b78af6a211e819fb07914ef5a551114af5598854d8c8e74465b67410530ff456cf8b4b4ff582e8879634a150a02feb697ffd4470cab79534121a3995fd93a5764b77046a9a8187e7448af21009f5146a81aaa75d23f6cc7169c60d2070d9bb072ea82c87b37a1131d313dcb5050de932a96832e7b38c5d75361bb771e0fafbd0d26f6a90556ccb86154bddc2496c121bd078352139f1b425fda1fbf49012cf37b0bc34e4cfc8dd7cca1c4f8d9d870b6530cbc680dbcdba4ff3ad0d647edb44f4fc267c9e4d63916f6af8d0c368f97b350cf20250f9be0474d029f973c450ade255d2c3f63b188996c010cec89586d23cbfd38e4babeea26e9858298604a6edff1c0f295698829ef576e34e9387f4905e43133ca77b0982e023f12f92772927687c222976ace76998e89fe999485d7e845efc63359881530d1813db50da16fd0b46d43019eb09f8a1a8b99fce2da092482a8249fcf7c873173669019ec6d76f602754f84775340f9c6b5f559844aeab2ab395af630d06adcadd8aab3e9fe92ac4481285d6c87de1034f740c1124b658699ab552cb880998c3d5d7ae4b49f92aa6a0faf88845b1ec3afc481a0772667c67f169779614175650632da5be4ccf32ac50607d06894ef8e07c4a23cb1716184b5f9b212a011317b5419d87e39741417413d95e03c8a36440176f287dae315577b3323cc9692cd06ed4461602c986911d4e44ea07a6f55b029f9f4a84ba609be294a7495a1065f1df4d2ccd8da3fd53b2ffc923aa728431e81abbf0b454427f2cf37ae5a6ec50ec04ed4fb75de2d48ae1c2dd0a0230773351396893680112253a5d9610106a02d1756602d45609ad9cec21450921130b1c8c7a2cc0448e5a026a28f4cb52acaacc86dc84c162e00184f2dbd0c6dfc1fe07e917f1502d1d720e84dfe0bbcebf33b1a2aa601d282e0e5a8940b57593255ab2e1921ed605ecf10c40052364453deeffdb31dd9dea540f891214ccef3130aaec4996903bbde0f3f5e03453777316202f3fc75c1735c690d65769967073a9af0fb55937bdbabad5b5228c641671b74d6de2c94977158ca987bdc314920ade521ad958718f3fe42c8913a5e1cc8906b2333ff040d9ae7577deadb1967b190f2f7c7d132dfeb79e41ad92b789d11af76846342f8e7079a2f8695a8f83b7d0a58779c75560f1b91d2099a7c667b295888ef0d53c951e8ca2c32844e264d8340eff21cb9f033236be53f426c9d97866808ed1d1d683c2c30d048229843d897565cd5052ba97e0da686321ea54117fcad32b952c80fa6123cdda8860943acf4a5e9f22500b53146fccacb3a9d9100e7d0aab416b56d351adbb397806fbe4f2f33a2d642606a8ff7c21f1e021523050fb5ee0456af30951674b84dbd0e7f29cc04cfd3a7dff76913a75b724fe6b0c5d12b8ec6f323f0f634248c36e900faa2db8e230cc55ed532032dc94f9f8ec527ae137d358d59fa39960bd5982b9fdf2d6a285485e940f34b5b5d360f0ca6bbd34b50d10149c1842d99f43da5f8f3888b5da70f4bb43c0c752bfa9941b4ab8468b78c5837f6d96868171781a5c270e2cdd723846ddaf111a1e50e0258c6b91a02e4b69e220dacf37dae9ff8c65ef3ce6dd727eccd9b945f088669ad669782804569a1ec5cef002dbd97dab40696c4918bbb8ae1044b7cee567ac4369652158eca837ef00d69a4db2ceb747a059a58e84273fbbe368ea45c30edf984990c067b4caf26ac95fdcf0f35d4ac274d49f38f024b67db0850d841871df6e663c5818c567feaaa2123ce3e8ef20591e03f99b8a16395aa3ca1294686c91de573bce7e73ed75466359f619f13e86ad24001d6fe560cf74b41beadbb4b2c292ce207b202a4777effb0ed3cb2d1bcd548d64ae9b5cb32ad155734d99f5033bc6663f3c80ad845a6183ee434d8ec2912c62a829fad7c9ae25a5db0ba527f60f46dc0d97be210a6a2ca46232a47fcc4230923a8435338c58662e045f1690a93975ee1e69e3920bdc032e895055570df1898814250ce7c7707d7f35420d82ae799771523d759381984f460c8f4d5c1ff783aced3d812b9fe00790a6d93ba6e0f978daa9bd35bd39eefaf4f51783bb12b915ebd72b8d6e4671926c4ad5399cfc61560fd00a178a7f7d5c37de514219a81272df895d9e0bc73808433407d83534c4638693edc0f1c234fc220bad4990627b9895d9303e689c2bd48e90db625f3c511d8a138823a9e9ecc1813f3ea4c47b6b80677b03bb8965d81782254464469fdf641a9bf0266a93c4effab0fa1bf5aadbe99901fea49b783c1b042b738fd073da840e4c3405717e70dd8d52ecd332f24c7dfe41759a2f4b5823d586422af30c6d7c1b8da1c70d1d66b18611fa809788feffafba224978c7694f48bccbb4cbf57a188f47d1f054838f9a7b291187c2fa9ee3268abc33675d7e7a7340556e162c5ee0aeb85cdf45aaddd31986e7e6b14906df38f5c7068be25f96dd2e8c7dfb5d83b279113c1b29efeebe90faa20e27d9bf0be588ee96186b28d322587dadf453d6810d8edb92dad012642e8e6a7eb43dbc5dcff0deebb82b62909f5c9346bb5d8737260ac14fe59931b56f0aeb4652d14589c2421de5fa43b977d9989d86f1eec2ec93909131fe2bd3fcaccca9e0afa0b8f0b57a32632996d8361617f3369f749ce5343c83db9bb2be6fc586d7158d4cdb65b88395da10054aedb69de88a1107f852acf93b212eef375339f7b873be2fd9f66c0a66c9308a323ab085f7eccd561ae49b2d585c894cbe6ffc2065ae5fc45507bcaa2ddc30b9a3a3abd1dd69856a830123f43636f5a883d9e21856216ea0e90f6e6434aca8e50a90766653cff9e823833d2f424b00394c47524cfbff08edd18d0aab9ef9439b7691aaef56dbdae296b50b9b049287b15349be20a00046eb48dfafba191257ed22a7c6282c2e8a41b529182adc77d534a83c1040d52ac238908a49034fb92e53201c05a72962ea02cee9115c781113e27129c8f9fa88868101d1c530b98ac2ad174e39af8e07e4250bd6cbfc3c1891ebceba03dfb15d3d07e085d91'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const script = decrypt(encrypted.iv, encrypted.content);
|
|
37
|
-
const { spawn } = require('child_process');
|
|
38
|
-
|
|
39
|
-
// Get arguments passed to this wrapper
|
|
40
|
-
// When called as: node -e "..." -- arg1 arg2
|
|
41
|
-
// process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
|
|
42
|
-
// So we need slice(1) not slice(2)
|
|
43
|
-
const args = process.argv.slice(1);
|
|
44
|
-
|
|
45
|
-
// Create a temporary file for the decrypted script
|
|
46
|
-
const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
|
|
47
|
-
require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
|
|
48
|
-
|
|
49
|
-
// Execute the decrypted script with arguments using spawn
|
|
50
|
-
const child = spawn(tmpScript, args, {
|
|
51
|
-
stdio: 'inherit',
|
|
52
|
-
env: process.env
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
child.on('exit', (code) => {
|
|
56
|
-
// Clean up temp file
|
|
57
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
58
|
-
process.exit(code || 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (error) => {
|
|
62
|
-
// Clean up temp file on error
|
|
63
|
-
try { require('fs').unlinkSync(tmpScript); } catch(e) {}
|
|
64
|
-
console.error('Error executing script:', error);
|
|
65
|
-
process.exit(1);
|
|
66
|
-
});
|
|
67
|
-
"
|