unsuccessful(unstable and dirty) proxy solution
This commit is contained in:
		@@ -1,18 +0,0 @@
 | 
				
			|||||||
CREATE TABLE IF NOT EXISTS captchas (
 | 
					 | 
				
			||||||
    id SERIAL PRIMARY KEY,
 | 
					 | 
				
			||||||
    proxy_id INTEGER REFERENCES proxies(id),
 | 
					 | 
				
			||||||
    hash CHAR(32),
 | 
					 | 
				
			||||||
    solution CHAR(6)
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CREATE TYPE IF NOT EXISTS protocol_type AS ENUM ('http', 'https');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CREATE TABLE IF NOT EXISTS proxies (
 | 
					 | 
				
			||||||
    id SERIAL PRIMARY KEY,
 | 
					 | 
				
			||||||
    proto protocol_type,
 | 
					 | 
				
			||||||
    claimed BOOLEAN DEFAULT FALSE,
 | 
					 | 
				
			||||||
    host INET NOT NULL,
 | 
					 | 
				
			||||||
    port SMALLINT NOT NULL,
 | 
					 | 
				
			||||||
    username VARCHAR(16),
 | 
					 | 
				
			||||||
    password VARCHAR(32)
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
							
								
								
									
										3
									
								
								migrate.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								migrate.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					source .env
 | 
				
			||||||
 | 
					DATABASE_URL=postgres://$DBUSER:$DBPASS@$DBHOST:$DBPORT npx node-pg-migrate $*
 | 
				
			||||||
							
								
								
									
										23
									
								
								migrations/1745667860234_captchas.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								migrations/1745667860234_captchas.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					export const shorthands = undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @param pgm {import('node-pg-migrate').MigrationBuilder}
 | 
				
			||||||
 | 
					 * @param run {() => void | undefined}
 | 
				
			||||||
 | 
					 * @returns {Promise<void> | void}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function up(pgm) {
 | 
				
			||||||
 | 
					    pgm.createTable('captchas', {
 | 
				
			||||||
 | 
					        id: 'id',
 | 
				
			||||||
 | 
					        hash: {type: 'char(32)'},
 | 
				
			||||||
 | 
					        solution: {type: 'char(6)'}
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @param pgm {import('node-pg-migrate').MigrationBuilder}
 | 
				
			||||||
 | 
					 * @param run {() => void | undefined}
 | 
				
			||||||
 | 
					 * @returns {Promise<void> | void}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function down(pgm) {
 | 
				
			||||||
 | 
					    pgm.dropTable('captchas')
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										33
									
								
								migrations/1745668334604_proxies.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								migrations/1745668334604_proxies.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					export const shorthands = undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @param pgm {import('node-pg-migrate').MigrationBuilder}
 | 
				
			||||||
 | 
					 * @param run {() => void | undefined}
 | 
				
			||||||
 | 
					 * @returns {Promise<void> | void}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function up(pgm) {
 | 
				
			||||||
 | 
					    pgm.createType('protocol_type', ['http', 'https']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pgm.createTable('proxies', {
 | 
				
			||||||
 | 
					        id: 'id',
 | 
				
			||||||
 | 
					        proto: {type: 'protocol_type', notNull: true},
 | 
				
			||||||
 | 
					        claimed: {type: 'boolean', default: false},
 | 
				
			||||||
 | 
					        host: {type: 'inet', notNull: true},
 | 
				
			||||||
 | 
					        port: {type: 'smallint', notNull: true},
 | 
				
			||||||
 | 
					        username: {type: 'varchar(16)'},
 | 
				
			||||||
 | 
					        password: {type: 'varchar(32)'}
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pgm.addColumn('captchas', {proxy_id: {type: 'integer', references: 'proxies(id)'}})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @param pgm {import('node-pg-migrate').MigrationBuilder}
 | 
				
			||||||
 | 
					 * @param run {() => void | undefined}
 | 
				
			||||||
 | 
					 * @returns {Promise<void> | void}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function down(pgm) {
 | 
				
			||||||
 | 
					    pgm.dropType('protocol_type');
 | 
				
			||||||
 | 
					    pgm.dropTable('proxies');
 | 
				
			||||||
 | 
					    pgm.dropColumn('captchas', 'proxy_id');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										750
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										750
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -12,9 +12,11 @@
 | 
				
			|||||||
        "dotenv": "^16.5.0",
 | 
					        "dotenv": "^16.5.0",
 | 
				
			||||||
        "express": "^5.1.0",
 | 
					        "express": "^5.1.0",
 | 
				
			||||||
        "pg": "^8.15.5",
 | 
					        "pg": "^8.15.5",
 | 
				
			||||||
        "pug": "^3.0.3"
 | 
					        "pug": "^3.0.3",
 | 
				
			||||||
 | 
					        "undici": "^7.8.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "devDependencies": {
 | 
					      "devDependencies": {
 | 
				
			||||||
 | 
					        "node-pg-migrate": "^7.9.1",
 | 
				
			||||||
        "nodemon": "^3.1.10"
 | 
					        "nodemon": "^3.1.10"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -64,6 +66,24 @@
 | 
				
			|||||||
        "node": ">=6.9.0"
 | 
					        "node": ">=6.9.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@isaacs/cliui": {
 | 
				
			||||||
 | 
					      "version": "8.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "string-width": "^5.1.2",
 | 
				
			||||||
 | 
					        "string-width-cjs": "npm:string-width@^4.2.0",
 | 
				
			||||||
 | 
					        "strip-ansi": "^7.0.1",
 | 
				
			||||||
 | 
					        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
 | 
				
			||||||
 | 
					        "wrap-ansi": "^8.1.0",
 | 
				
			||||||
 | 
					        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/accepts": {
 | 
					    "node_modules/accepts": {
 | 
				
			||||||
      "version": "2.0.0",
 | 
					      "version": "2.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
 | 
				
			||||||
@@ -89,6 +109,32 @@
 | 
				
			|||||||
        "node": ">=0.4.0"
 | 
					        "node": ">=0.4.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/ansi-regex": {
 | 
				
			||||||
 | 
					      "version": "6.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/ansi-styles": {
 | 
				
			||||||
 | 
					      "version": "6.2.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/anymatch": {
 | 
					    "node_modules/anymatch": {
 | 
				
			||||||
      "version": "3.1.3",
 | 
					      "version": "3.1.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
 | 
				
			||||||
@@ -263,6 +309,120 @@
 | 
				
			|||||||
        "fsevents": "~2.3.2"
 | 
					        "fsevents": "~2.3.2"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/cliui": {
 | 
				
			||||||
 | 
					      "version": "8.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "string-width": "^4.2.0",
 | 
				
			||||||
 | 
					        "strip-ansi": "^6.0.1",
 | 
				
			||||||
 | 
					        "wrap-ansi": "^7.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/cliui/node_modules/ansi-regex": {
 | 
				
			||||||
 | 
					      "version": "5.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/cliui/node_modules/ansi-styles": {
 | 
				
			||||||
 | 
					      "version": "4.3.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "color-convert": "^2.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/cliui/node_modules/emoji-regex": {
 | 
				
			||||||
 | 
					      "version": "8.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/cliui/node_modules/string-width": {
 | 
				
			||||||
 | 
					      "version": "4.2.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "emoji-regex": "^8.0.0",
 | 
				
			||||||
 | 
					        "is-fullwidth-code-point": "^3.0.0",
 | 
				
			||||||
 | 
					        "strip-ansi": "^6.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/cliui/node_modules/strip-ansi": {
 | 
				
			||||||
 | 
					      "version": "6.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ansi-regex": "^5.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/cliui/node_modules/wrap-ansi": {
 | 
				
			||||||
 | 
					      "version": "7.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ansi-styles": "^4.0.0",
 | 
				
			||||||
 | 
					        "string-width": "^4.1.0",
 | 
				
			||||||
 | 
					        "strip-ansi": "^6.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/color-convert": {
 | 
				
			||||||
 | 
					      "version": "2.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "color-name": "~1.1.4"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=7.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/color-name": {
 | 
				
			||||||
 | 
					      "version": "1.1.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/concat-map": {
 | 
					    "node_modules/concat-map": {
 | 
				
			||||||
      "version": "0.0.1",
 | 
					      "version": "0.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
				
			||||||
@@ -319,6 +479,21 @@
 | 
				
			|||||||
        "node": ">=6.6.0"
 | 
					        "node": ">=6.6.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/cross-spawn": {
 | 
				
			||||||
 | 
					      "version": "7.0.6",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "path-key": "^3.1.0",
 | 
				
			||||||
 | 
					        "shebang-command": "^2.0.0",
 | 
				
			||||||
 | 
					        "which": "^2.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/debug": {
 | 
					    "node_modules/debug": {
 | 
				
			||||||
      "version": "4.4.0",
 | 
					      "version": "4.4.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
 | 
				
			||||||
@@ -377,12 +552,26 @@
 | 
				
			|||||||
        "node": ">= 0.4"
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/eastasianwidth": {
 | 
				
			||||||
 | 
					      "version": "0.2.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/ee-first": {
 | 
					    "node_modules/ee-first": {
 | 
				
			||||||
      "version": "1.1.1",
 | 
					      "version": "1.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
 | 
					      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/emoji-regex": {
 | 
				
			||||||
 | 
					      "version": "9.2.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/encodeurl": {
 | 
					    "node_modules/encodeurl": {
 | 
				
			||||||
      "version": "2.0.0",
 | 
					      "version": "2.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
 | 
				
			||||||
@@ -422,6 +611,16 @@
 | 
				
			|||||||
        "node": ">= 0.4"
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/escalade": {
 | 
				
			||||||
 | 
					      "version": "3.2.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=6"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/escape-html": {
 | 
					    "node_modules/escape-html": {
 | 
				
			||||||
      "version": "1.0.3",
 | 
					      "version": "1.0.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 | 
				
			||||||
@@ -509,6 +708,23 @@
 | 
				
			|||||||
        "node": ">= 0.8"
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/foreground-child": {
 | 
				
			||||||
 | 
					      "version": "3.3.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "cross-spawn": "^7.0.6",
 | 
				
			||||||
 | 
					        "signal-exit": "^4.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=14"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/isaacs"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/forwarded": {
 | 
					    "node_modules/forwarded": {
 | 
				
			||||||
      "version": "0.2.0",
 | 
					      "version": "0.2.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
 | 
				
			||||||
@@ -551,6 +767,16 @@
 | 
				
			|||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/get-caller-file": {
 | 
				
			||||||
 | 
					      "version": "2.0.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": "6.* || 8.* || >= 10.*"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/get-intrinsic": {
 | 
					    "node_modules/get-intrinsic": {
 | 
				
			||||||
      "version": "1.3.0",
 | 
					      "version": "1.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
 | 
				
			||||||
@@ -588,6 +814,30 @@
 | 
				
			|||||||
        "node": ">= 0.4"
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/glob": {
 | 
				
			||||||
 | 
					      "version": "11.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "foreground-child": "^3.1.0",
 | 
				
			||||||
 | 
					        "jackspeak": "^4.0.1",
 | 
				
			||||||
 | 
					        "minimatch": "^10.0.0",
 | 
				
			||||||
 | 
					        "minipass": "^7.1.2",
 | 
				
			||||||
 | 
					        "package-json-from-dist": "^1.0.0",
 | 
				
			||||||
 | 
					        "path-scurry": "^2.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "bin": {
 | 
				
			||||||
 | 
					        "glob": "dist/esm/bin.mjs"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": "20 || >=22"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/isaacs"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/glob-parent": {
 | 
					    "node_modules/glob-parent": {
 | 
				
			||||||
      "version": "5.1.2",
 | 
					      "version": "5.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
 | 
				
			||||||
@@ -601,6 +851,32 @@
 | 
				
			|||||||
        "node": ">= 6"
 | 
					        "node": ">= 6"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/glob/node_modules/brace-expansion": {
 | 
				
			||||||
 | 
					      "version": "2.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "balanced-match": "^1.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/glob/node_modules/minimatch": {
 | 
				
			||||||
 | 
					      "version": "10.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "brace-expansion": "^2.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": "20 || >=22"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/isaacs"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/gopd": {
 | 
					    "node_modules/gopd": {
 | 
				
			||||||
      "version": "1.2.0",
 | 
					      "version": "1.2.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
 | 
				
			||||||
@@ -760,6 +1036,16 @@
 | 
				
			|||||||
        "node": ">=0.10.0"
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/is-fullwidth-code-point": {
 | 
				
			||||||
 | 
					      "version": "3.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/is-glob": {
 | 
					    "node_modules/is-glob": {
 | 
				
			||||||
      "version": "4.0.3",
 | 
					      "version": "4.0.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
 | 
				
			||||||
@@ -807,6 +1093,29 @@
 | 
				
			|||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/isexe": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/jackspeak": {
 | 
				
			||||||
 | 
					      "version": "4.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "BlueOak-1.0.0",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "@isaacs/cliui": "^8.0.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": "20 || >=22"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/isaacs"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/js-stringify": {
 | 
					    "node_modules/js-stringify": {
 | 
				
			||||||
      "version": "1.0.2",
 | 
					      "version": "1.0.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
 | 
				
			||||||
@@ -823,6 +1132,16 @@
 | 
				
			|||||||
        "promise": "^7.0.1"
 | 
					        "promise": "^7.0.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/lru-cache": {
 | 
				
			||||||
 | 
					      "version": "11.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": "20 || >=22"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/math-intrinsics": {
 | 
					    "node_modules/math-intrinsics": {
 | 
				
			||||||
      "version": "1.1.0",
 | 
					      "version": "1.1.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
 | 
				
			||||||
@@ -887,6 +1206,16 @@
 | 
				
			|||||||
        "node": "*"
 | 
					        "node": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/minipass": {
 | 
				
			||||||
 | 
					      "version": "7.1.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=16 || 14 >=14.17"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/ms": {
 | 
					    "node_modules/ms": {
 | 
				
			||||||
      "version": "2.1.3",
 | 
					      "version": "2.1.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
 | 
				
			||||||
@@ -902,6 +1231,34 @@
 | 
				
			|||||||
        "node": ">= 0.6"
 | 
					        "node": ">= 0.6"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/node-pg-migrate": {
 | 
				
			||||||
 | 
					      "version": "7.9.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/node-pg-migrate/-/node-pg-migrate-7.9.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-6z4OSN27ye8aYdX9ZU7NN2PTI5pOp34hTr+22Ej12djIYECq++gT7LPLZVOQXEeVCBOZQLqf87kC3Y36G434OQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "glob": "~11.0.0",
 | 
				
			||||||
 | 
					        "yargs": "~17.7.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "bin": {
 | 
				
			||||||
 | 
					        "node-pg-migrate": "bin/node-pg-migrate.js",
 | 
				
			||||||
 | 
					        "node-pg-migrate-cjs": "bin/node-pg-migrate.js",
 | 
				
			||||||
 | 
					        "node-pg-migrate-esm": "bin/node-pg-migrate.mjs"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=18.19.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "peerDependencies": {
 | 
				
			||||||
 | 
					        "@types/pg": ">=6.0.0 <9.0.0",
 | 
				
			||||||
 | 
					        "pg": ">=4.3.0 <9.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "peerDependenciesMeta": {
 | 
				
			||||||
 | 
					        "@types/pg": {
 | 
				
			||||||
 | 
					          "optional": true
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/nodemon": {
 | 
					    "node_modules/nodemon": {
 | 
				
			||||||
      "version": "3.1.10",
 | 
					      "version": "3.1.10",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz",
 | 
				
			||||||
@@ -983,6 +1340,13 @@
 | 
				
			|||||||
        "wrappy": "1"
 | 
					        "wrappy": "1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/package-json-from-dist": {
 | 
				
			||||||
 | 
					      "version": "1.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "BlueOak-1.0.0"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/parseurl": {
 | 
					    "node_modules/parseurl": {
 | 
				
			||||||
      "version": "1.3.3",
 | 
					      "version": "1.3.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
 | 
				
			||||||
@@ -992,12 +1356,39 @@
 | 
				
			|||||||
        "node": ">= 0.8"
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/path-key": {
 | 
				
			||||||
 | 
					      "version": "3.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/path-parse": {
 | 
					    "node_modules/path-parse": {
 | 
				
			||||||
      "version": "1.0.7",
 | 
					      "version": "1.0.7",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
 | 
				
			||||||
      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
 | 
					      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/path-scurry": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "BlueOak-1.0.0",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "lru-cache": "^11.0.0",
 | 
				
			||||||
 | 
					        "minipass": "^7.1.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": "20 || >=22"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/isaacs"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/path-to-regexp": {
 | 
					    "node_modules/path-to-regexp": {
 | 
				
			||||||
      "version": "8.2.0",
 | 
					      "version": "8.2.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
 | 
				
			||||||
@@ -1353,6 +1744,16 @@
 | 
				
			|||||||
        "node": ">=8.10.0"
 | 
					        "node": ">=8.10.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/require-directory": {
 | 
				
			||||||
 | 
					      "version": "2.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/resolve": {
 | 
					    "node_modules/resolve": {
 | 
				
			||||||
      "version": "1.22.10",
 | 
					      "version": "1.22.10",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
 | 
				
			||||||
@@ -1477,6 +1878,29 @@
 | 
				
			|||||||
      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
 | 
					      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
 | 
				
			||||||
      "license": "ISC"
 | 
					      "license": "ISC"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/shebang-command": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "shebang-regex": "^3.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/shebang-regex": {
 | 
				
			||||||
 | 
					      "version": "3.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/side-channel": {
 | 
					    "node_modules/side-channel": {
 | 
				
			||||||
      "version": "1.1.0",
 | 
					      "version": "1.1.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
 | 
				
			||||||
@@ -1549,6 +1973,19 @@
 | 
				
			|||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/signal-exit": {
 | 
				
			||||||
 | 
					      "version": "4.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=14"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/isaacs"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/simple-update-notifier": {
 | 
					    "node_modules/simple-update-notifier": {
 | 
				
			||||||
      "version": "2.0.0",
 | 
					      "version": "2.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
 | 
				
			||||||
@@ -1580,6 +2017,110 @@
 | 
				
			|||||||
        "node": ">= 0.8"
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/string-width": {
 | 
				
			||||||
 | 
					      "version": "5.1.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "eastasianwidth": "^0.2.0",
 | 
				
			||||||
 | 
					        "emoji-regex": "^9.2.2",
 | 
				
			||||||
 | 
					        "strip-ansi": "^7.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/string-width-cjs": {
 | 
				
			||||||
 | 
					      "name": "string-width",
 | 
				
			||||||
 | 
					      "version": "4.2.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "emoji-regex": "^8.0.0",
 | 
				
			||||||
 | 
					        "is-fullwidth-code-point": "^3.0.0",
 | 
				
			||||||
 | 
					        "strip-ansi": "^6.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/string-width-cjs/node_modules/ansi-regex": {
 | 
				
			||||||
 | 
					      "version": "5.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/string-width-cjs/node_modules/emoji-regex": {
 | 
				
			||||||
 | 
					      "version": "8.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/string-width-cjs/node_modules/strip-ansi": {
 | 
				
			||||||
 | 
					      "version": "6.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ansi-regex": "^5.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/strip-ansi": {
 | 
				
			||||||
 | 
					      "version": "7.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ansi-regex": "^6.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/strip-ansi-cjs": {
 | 
				
			||||||
 | 
					      "name": "strip-ansi",
 | 
				
			||||||
 | 
					      "version": "6.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ansi-regex": "^5.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
 | 
				
			||||||
 | 
					      "version": "5.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/supports-color": {
 | 
					    "node_modules/supports-color": {
 | 
				
			||||||
      "version": "5.5.0",
 | 
					      "version": "5.5.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
 | 
				
			||||||
@@ -1664,6 +2205,15 @@
 | 
				
			|||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/undici": {
 | 
				
			||||||
 | 
					      "version": "7.8.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/undici/-/undici-7.8.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-vFv1GA99b7eKO1HG/4RPu2Is3FBTWBrmzqzO0mz+rLxN3yXkE4mqRcb8g8fHxzX4blEysrNZLqg5RbJLqX5buA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=20.18.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/unpipe": {
 | 
					    "node_modules/unpipe": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
 | 
				
			||||||
@@ -1691,6 +2241,22 @@
 | 
				
			|||||||
        "node": ">=0.10.0"
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/which": {
 | 
				
			||||||
 | 
					      "version": "2.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "isexe": "^2.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "bin": {
 | 
				
			||||||
 | 
					        "node-which": "bin/node-which"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/with": {
 | 
					    "node_modules/with": {
 | 
				
			||||||
      "version": "7.0.2",
 | 
					      "version": "7.0.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
 | 
				
			||||||
@@ -1706,6 +2272,104 @@
 | 
				
			|||||||
        "node": ">= 10.0.0"
 | 
					        "node": ">= 10.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/wrap-ansi": {
 | 
				
			||||||
 | 
					      "version": "8.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ansi-styles": "^6.1.0",
 | 
				
			||||||
 | 
					        "string-width": "^5.0.1",
 | 
				
			||||||
 | 
					        "strip-ansi": "^7.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/wrap-ansi-cjs": {
 | 
				
			||||||
 | 
					      "name": "wrap-ansi",
 | 
				
			||||||
 | 
					      "version": "7.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ansi-styles": "^4.0.0",
 | 
				
			||||||
 | 
					        "string-width": "^4.1.0",
 | 
				
			||||||
 | 
					        "strip-ansi": "^6.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
 | 
				
			||||||
 | 
					      "version": "5.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
 | 
				
			||||||
 | 
					      "version": "4.3.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "color-convert": "^2.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
 | 
				
			||||||
 | 
					      "version": "8.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/wrap-ansi-cjs/node_modules/string-width": {
 | 
				
			||||||
 | 
					      "version": "4.2.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "emoji-regex": "^8.0.0",
 | 
				
			||||||
 | 
					        "is-fullwidth-code-point": "^3.0.0",
 | 
				
			||||||
 | 
					        "strip-ansi": "^6.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
 | 
				
			||||||
 | 
					      "version": "6.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ansi-regex": "^5.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/wrappy": {
 | 
					    "node_modules/wrappy": {
 | 
				
			||||||
      "version": "1.0.2",
 | 
					      "version": "1.0.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
 | 
				
			||||||
@@ -1720,6 +2384,90 @@
 | 
				
			|||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">=0.4"
 | 
					        "node": ">=0.4"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/y18n": {
 | 
				
			||||||
 | 
					      "version": "5.0.8",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/yargs": {
 | 
				
			||||||
 | 
					      "version": "17.7.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "cliui": "^8.0.1",
 | 
				
			||||||
 | 
					        "escalade": "^3.1.1",
 | 
				
			||||||
 | 
					        "get-caller-file": "^2.0.5",
 | 
				
			||||||
 | 
					        "require-directory": "^2.1.1",
 | 
				
			||||||
 | 
					        "string-width": "^4.2.3",
 | 
				
			||||||
 | 
					        "y18n": "^5.0.5",
 | 
				
			||||||
 | 
					        "yargs-parser": "^21.1.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/yargs-parser": {
 | 
				
			||||||
 | 
					      "version": "21.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "ISC",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/yargs/node_modules/ansi-regex": {
 | 
				
			||||||
 | 
					      "version": "5.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/yargs/node_modules/emoji-regex": {
 | 
				
			||||||
 | 
					      "version": "8.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/yargs/node_modules/string-width": {
 | 
				
			||||||
 | 
					      "version": "4.2.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "emoji-regex": "^8.0.0",
 | 
				
			||||||
 | 
					        "is-fullwidth-code-point": "^3.0.0",
 | 
				
			||||||
 | 
					        "strip-ansi": "^6.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/yargs/node_modules/strip-ansi": {
 | 
				
			||||||
 | 
					      "version": "6.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ansi-regex": "^5.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,15 +11,18 @@
 | 
				
			|||||||
  "type": "module",
 | 
					  "type": "module",
 | 
				
			||||||
  "main": "src/index.js",
 | 
					  "main": "src/index.js",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "start": "node src/index.js"
 | 
					    "start": "node src/index.js",
 | 
				
			||||||
 | 
					    "migrate": "bash migrate.sh"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "dotenv": "^16.5.0",
 | 
					    "dotenv": "^16.5.0",
 | 
				
			||||||
    "express": "^5.1.0",
 | 
					    "express": "^5.1.0",
 | 
				
			||||||
    "pg": "^8.15.5",
 | 
					    "pg": "^8.15.5",
 | 
				
			||||||
    "pug": "^3.0.3"
 | 
					    "pug": "^3.0.3",
 | 
				
			||||||
 | 
					    "undici": "^7.8.0"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
 | 
					    "node-pg-migrate": "^7.9.1",
 | 
				
			||||||
    "nodemon": "^3.1.10"
 | 
					    "nodemon": "^3.1.10"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,9 @@
 | 
				
			|||||||
window.onload = async () => {
 | 
					window.onload = async () => {
 | 
				
			||||||
    let id = (await (await fetch("/api/captcha", {method: "POST"})).json()).id
 | 
					    let id = (await (await fetch("/api/captcha", {method: "POST"})).json()).id
 | 
				
			||||||
 | 
					    if (id == undefined) {
 | 
				
			||||||
 | 
					        alert("Service is unavailable now. Please, try again later.");
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    console.log(id);
 | 
					    console.log(id);
 | 
				
			||||||
    fetch(`/api/captcha/${id}`).then(response => response.blob())
 | 
					    fetch(`/api/captcha/${id}`).then(response => response.blob())
 | 
				
			||||||
        .then(blob => {
 | 
					        .then(blob => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,11 +7,15 @@ class CaptchaController {
 | 
				
			|||||||
    async new(req, res) {
 | 
					    async new(req, res) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            const proxy = await ProxyService.take();
 | 
					            const proxy = await ProxyService.take();
 | 
				
			||||||
 | 
					            console.log("Using proxy: " + JSON.stringify(proxy));
 | 
				
			||||||
 | 
					            if (proxy == undefined) {
 | 
				
			||||||
 | 
					                return res.status(503).send({"message":"No active proxy. please, try again later"});
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            const id = await CaptchaService.new(proxy);
 | 
					            const id = await CaptchaService.new(proxy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return res.status(200).send({"id": id});
 | 
					            return res.status(200).send({"id": id});
 | 
				
			||||||
        }  catch (e) {
 | 
					        }  catch (e) {
 | 
				
			||||||
            console.log(e)
 | 
					            console.log(e);
 | 
				
			||||||
            return res.status(500).send({"message": "Unknown server error"});
 | 
					            return res.status(500).send({"message": "Unknown server error"});
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -19,11 +23,12 @@ class CaptchaController {
 | 
				
			|||||||
    async get(req, res) {
 | 
					    async get(req, res) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            const id = req.params.id;
 | 
					            const id = req.params.id;
 | 
				
			||||||
        
 | 
					            if (id == undefined || parseInt(id) == NaN) {
 | 
				
			||||||
            const hash = await CaptchaService.get(id);
 | 
					 | 
				
			||||||
            if (hash == undefined) {
 | 
					 | 
				
			||||||
                return res.status(404).send({"message": "captcha not found"});
 | 
					                return res.status(404).send({"message": "captcha not found"});
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            const hash = await CaptchaService.get(id);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
            const image = await fs.readFile(`${config.data_dir}/${hash}.jpeg`);
 | 
					            const image = await fs.readFile(`${config.data_dir}/${hash}.jpeg`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return res.status(200).send(image)
 | 
					            return res.status(200).send(image)
 | 
				
			||||||
@@ -40,12 +45,12 @@ class CaptchaController {
 | 
				
			|||||||
            if (solution == undefined || solution.length != 6) {
 | 
					            if (solution == undefined || solution.length != 6) {
 | 
				
			||||||
                return res.status(400).send({"message": 'please, send a valid solution. Example: {"solution":"123456"}'});
 | 
					                return res.status(400).send({"message": 'please, send a valid solution. Example: {"solution":"123456"}'});
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            let proxy = await CaptchaService.get_assigned_proxy(id);
 | 
				
			||||||
            if (!await CaptchaService.check_and_save_solution(id, solution))
 | 
					            if (!await CaptchaService.check_and_save_solution(id, solution, proxy))
 | 
				
			||||||
                return res.status(409).send({"message": "Solution is not correct"});
 | 
					                return res.status(409).send({"message": "Solution is not correct"});
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            let proxy_id = await CaptchaService.get_assigned_proxy(id);
 | 
					            
 | 
				
			||||||
            await ProxyService.give_back(id);
 | 
					            await ProxyService.give_back(proxy.id);
 | 
				
			||||||
            return res.status(200).send({"message": "Successful"});
 | 
					            return res.status(200).send({"message": "Successful"});
 | 
				
			||||||
        }  catch (e) {
 | 
					        }  catch (e) {
 | 
				
			||||||
            console.log(e)
 | 
					            console.log(e)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,10 +3,10 @@ import ProxyService from '../services/proxy.js';
 | 
				
			|||||||
class CaptchaController {
 | 
					class CaptchaController {
 | 
				
			||||||
    async add(req, res) {
 | 
					    async add(req, res) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            const { host, port, user: username, password } = req.body;
 | 
					            const { proto, host, port, username, password } = req.body;
 | 
				
			||||||
            if (!host || !port) return res.status(400).send({"message":"You must specify host and port!"});
 | 
					            if (!proto || !host || !port) return res.status(400).send({"message":"You must specify proto, host and port!"});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const id = await ProxyService.add(host, port, username, password);
 | 
					            const id = await ProxyService.add(proto, host, port, username, password);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return res.status(200).send({"id": id});
 | 
					            return res.status(200).send({"id": id});
 | 
				
			||||||
        }  catch (e) {
 | 
					        }  catch (e) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,4 @@ const pool = new Pool({
 | 
				
			|||||||
    port: config.dbport
 | 
					    port: config.dbport
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pool.query(fs.readFileSync('./db_schema.psql').toString());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default pool;
 | 
					export default pool;
 | 
				
			||||||
@@ -8,14 +8,9 @@ import { createHash } from 'crypto';
 | 
				
			|||||||
class CaptchaService {
 | 
					class CaptchaService {
 | 
				
			||||||
    async new(proxy) {
 | 
					    async new(proxy) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            let dispatcher;
 | 
					            let dispatcher = new ProxyAgent(`${proxy.proto}://${proxy.username? proxy.username + "@" + proxy.password + ":" : ""}${proxy.host}:${proxy.port}`);
 | 
				
			||||||
            if (proxy.username) {
 | 
					 | 
				
			||||||
                dispatcher = new ProxyAgent(`${proxy.proto}://${proxy.username}:${proxy.password}@${proxy.host}:${proxy.port}`)
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                dispatcher = new ProxyAgent(`${proxy.proto}://${proxy.host}:${proxy.port}`)
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            const captcha = await (await fetch(config.captcha_source_url, dispatcher)).blob();
 | 
					            const captcha = await (await fetch(config.captcha_source_url, {dispatcher})).blob();
 | 
				
			||||||
            const buffer = Buffer.from(await captcha.arrayBuffer());
 | 
					            const buffer = Buffer.from(await captcha.arrayBuffer());
 | 
				
			||||||
            const hash = createHash('md5').update(buffer).digest('hex');
 | 
					            const hash = createHash('md5').update(buffer).digest('hex');
 | 
				
			||||||
            await fs.writeFile(`${config.data_dir}/${hash}.jpeg`, buffer);
 | 
					            await fs.writeFile(`${config.data_dir}/${hash}.jpeg`, buffer);
 | 
				
			||||||
@@ -28,7 +23,8 @@ class CaptchaService {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async check_solution(solution) {
 | 
					    async check_solution(solution, proxy) {
 | 
				
			||||||
 | 
					        let dispatcher = new ProxyAgent(`${proxy.proto}://${proxy.username? proxy.username + "@" + proxy.password + ":" : ""}${proxy.host}:${proxy.port}`);
 | 
				
			||||||
        const body = {
 | 
					        const body = {
 | 
				
			||||||
            "TotalSum": "78278",
 | 
					            "TotalSum": "78278",
 | 
				
			||||||
            "FnNumber": "9960440301173139",
 | 
					            "FnNumber": "9960440301173139",
 | 
				
			||||||
@@ -42,6 +38,7 @@ class CaptchaService {
 | 
				
			|||||||
            "headers": {
 | 
					            "headers": {
 | 
				
			||||||
                "Content-Type": "application/json;charset=utf-8"
 | 
					                "Content-Type": "application/json;charset=utf-8"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
					            dispatcher,
 | 
				
			||||||
            "body": JSON.stringify(body),
 | 
					            "body": JSON.stringify(body),
 | 
				
			||||||
            "method": "POST",
 | 
					            "method": "POST",
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@@ -51,13 +48,13 @@ class CaptchaService {
 | 
				
			|||||||
    async get (id) {
 | 
					    async get (id) {
 | 
				
			||||||
        let result = await db.query("SELECT hash FROM captchas WHERE id = $1", [id]) 
 | 
					        let result = await db.query("SELECT hash FROM captchas WHERE id = $1", [id]) 
 | 
				
			||||||
        if (result.rows[0] == undefined) {
 | 
					        if (result.rows[0] == undefined) {
 | 
				
			||||||
            return undefined
 | 
					            return undefined;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return result.rows[0].hash;
 | 
					        return result.rows[0].hash;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async check_and_save_solution (id, solution) {
 | 
					    async check_and_save_solution (id, solution, proxy) {
 | 
				
			||||||
        if (!await this.check_solution(solution)) {
 | 
					        if (!await this.check_solution(solution, proxy)) {
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -66,7 +63,7 @@ class CaptchaService {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async get_assigned_proxy(id) {
 | 
					    async get_assigned_proxy(id) {
 | 
				
			||||||
        return (await db.query("SELECT proxy_id FROM captchas WHERE id = $1", [id])).rows[0].proxy_id;
 | 
					        return (await db.query("select proxies.id, proto, host, port, username, password from proxies JOIN captchas on proxy_id = proxies.id WHERE captchas.id = $1", [id])).rows[0];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
import db from '../db.js';
 | 
					import db from '../db.js';
 | 
				
			||||||
 | 
					import { ProxyAgent } from 'undici';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ProxyService {
 | 
					class ProxyService {
 | 
				
			||||||
    async add(proto, host, port, username, password) {
 | 
					    async add(proto, host, port, username, password) {
 | 
				
			||||||
@@ -6,17 +7,35 @@ class ProxyService {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async take() {
 | 
					    async take() {
 | 
				
			||||||
        let proxy = (await db.query("UPDATE proxies SET claimed = TRUE WHERE id = ( SELECT id FROM proxies WHERE claimed = FALSE ORDER BY id LIMIT 1 ) RETURNING proto, host, port, username, password")).rows[0]
 | 
					        // while (true) {
 | 
				
			||||||
        if (proxy == undefined) return undefined;
 | 
					            let proxy = (await db.query("UPDATE proxies SET claimed = TRUE WHERE id = ( SELECT id FROM proxies WHERE claimed = FALSE ORDER BY id LIMIT 1 ) RETURNING id, proto, host, port, username, password")).rows[0]
 | 
				
			||||||
        return proxy;
 | 
					            return proxy == undefined? undefined : proxy;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            // console.log("testing proxy")
 | 
				
			||||||
 | 
					            // if (await this.check_connection(proxy)) return proxy;
 | 
				
			||||||
 | 
					            // else await this.delete(proxy.id)
 | 
				
			||||||
 | 
					            // console.log("Proxy failed and deleted")
 | 
				
			||||||
 | 
					        // }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // async check_connection(proxy) {
 | 
				
			||||||
 | 
					    //     const dispatcher = new ProxyAgent(`${proxy.proto}://${proxy.username? proxy.username + "@" + proxy.password + ":" : ""}${proxy.host}:${proxy.port}`);
 | 
				
			||||||
 | 
					    //     let response;
 | 
				
			||||||
 | 
					    //     try {
 | 
				
			||||||
 | 
					    //         response = await fetch("https://google.com", {dispatcher})
 | 
				
			||||||
 | 
					    //     } catch (e) {
 | 
				
			||||||
 | 
					    //         console.log(`Error on testing the proxy`)
 | 
				
			||||||
 | 
					    //         return false
 | 
				
			||||||
 | 
					    //     }
 | 
				
			||||||
 | 
					    //     return response.status == 200;
 | 
				
			||||||
 | 
					    // }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async give_back(id) {
 | 
					    async give_back(id) {
 | 
				
			||||||
        await db.query("UPDATE proxies SET claimed = false WHERE id = $1", [id]);
 | 
					        await db.query("UPDATE proxies SET claimed = false WHERE id = $1", [id]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async delete(id) {
 | 
					    async delete(id) {
 | 
				
			||||||
        await db.query("DELETE FRM proxies WHERE id = $1", [id]);
 | 
					        await db.query("DELETE FROM proxies WHERE id = $1", [id]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user