Remini

by ☘️

18
Raw



const crypto = require("node:crypto");
const FormData = require("form-data");
const fake = require("fake-useragent");

const BASE_URL = "https://app.remini.ai";
const URL_USER = "/api/v1/web/users";
const URL_BULK = "/api/v1/web/tasks/bulk-upload";
const URL_APPROVAL = "/api/v1/web/tasks/bulk-upload/BULK_UPLOAD_ID/process";
const URL_TASK = "/api/v1/web/tasks/bulk-upload/";

const BASE_URL_WM = "https://api.watermarkremover.io";
const URL_REMOVE_WM = "/service/public/transformation/v1.0/predictions/wm/remove";
const URL_SECRET = "https://api.pixelbin.io/service/public/transformation/v1.0/predictions/wm/remove";
const SIGN_KEY = "A4nzUYcDOZ";

const shaderTypes = ["FRAGMENT_SHADER", "VERTEX_SHADER"];
const precisionLevels = ["LOW_FLOAT", "MEDIUM_FLOAT", "HIGH_FLOAT", "LOW_INT", "MEDIUM_INT", "HIGH_INT"];
const extensions = [
  "ANGLE_instanced_arrays", "EXT_blend_minmax", "EXT_clip_control",
  "EXT_color_buffer_half_float", "EXT_depth_clamp", "EXT_disjoint_timer_query",
  "OES_texture_float", "OES_texture_half_float", "WEBGL_draw_buffers"
];
const extensionParams = [
  "COLOR_ATTACHMENT0_WEBGL=36064", "COMPRESSED_RGBA_S3TC_DXT1_EXT=33777",
  "DEPTH_CLAMP_EXT=34383", "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT=33296",
  "TEXTURE_MAX_ANISOTROPY_EXT=34046=16"
];

const BULK_PAYLOAD = (settings) => {
  return {
    input_task_list: [
      {
        image_content_type: "image/jpeg",
        output_content_type: "image/jpeg",
        ai_pipeline: settings
      }
    ]
  }
}

let k = [2277735313, 289559509];
let I = [1291169091, 658871167];
let P = [0, 5];
let C = [0, 1390208809];
let A = [0, 944331445];
let E = [4283543511, 3981806797];
let S = [3301882366, 444984403];

let headersListWm = {
  "authority": "api.watermarkremover.io",
  "accept": "application/json, text/plain, */*",
  "accept-language": "id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7,ru;q=0.6",
  "origin": "https://www.watermarkremover.io",
  "pixb-cl-id": "d6b7221dce0eb93bfa9641d48b72bef6",
  "priority": "u=1, i",
  "referer": "https://www.watermarkremover.io/",
  "sec-ch-ua": '"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"',
  "sec-ch-ua-mobile": "?0",
  "sec-ch-ua-platform": '"Windows"',
  "sec-fetch-dest": "empty",
  "sec-fetch-mode": "cors",
  "sec-fetch-site": "same-site",
  "user-agent": fake(),
}

let headersList = {
  "authority": "app.remini.ai",
  "accept": "*/*",
  "accept-encoding": "gzip, deflate, br, zstd",
  "accept-language": "id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7,ru;q=0.6",
  "content-type": "application/json",
  "origin": "https://app.remini.ai",
  "priority": "u=1, i",
  "referer": "https://app.remini.ai/?v=9247d6bf-c36b-49ad-a3f0-a40e1297c3d2-1739612547618",
  "sec-ch-ua": '"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"',
  "sec-ch-ua-mobile": "?0",
  "sec-ch-ua-platform": '"Windows"',
  "sec-fetch-dest": "empty",
  "sec-fetch-mode": "cors",
  "sec-fetch-site": "same-origin",
  "user-agent": fake()
}

function _delay(msec) {
  return new Promise(resolve => setTimeout(resolve, msec));
}

async function req(url, method = "GET", data = null, params = null, head = null) {
  try {
    let pUrl;
    if (params) {
      const cUrl = new URLSearchParams();
      Object.entries(params).forEach(([k, v]) => {
        cUrl.append(k, v);
      })
      pUrl = url + "?" + cUrl.toString();
    } else {
      pUrl = url;
    }

    return await fetch(pUrl, {
      method,
      headers: head ? head : headersList,
      ...(data ? {
        body: data
      } : {})
    })
  } catch (error) {
    console.error(error);
    return null;
  }
}

function randomChar(length = 5) {
  const chr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
  return Array.from({ length }).map(_ => chr.charAt(Math.floor(Math.random() * chr.length))).join("");
}

function generateRandomMathValues() {
  const x = Math.random() * 2 - 1;
  const y = Math.random() * 10;

  return {
    acos: Math.acos(Math.abs(x)),
    acosh: Math.acosh(y + 1),
    acoshPf: Math.acosh(y + 1),
    asin: Math.asin(x),
    asinh: Math.asinh(x),
    asinhPf: Math.asinh(x),
    atanh: Math.atanh(x * 0.9),
    atanhPf: Math.atanh(x * 0.9),
    atan: Math.atan(x),
    sin: Math.sin(y),
    sinh: Math.sinh(y),
    sinhPf: Math.sinh(y * 0.5),
    cos: Math.cos(y),
    cosh: Math.cosh(y),
    coshPf: Math.cosh(y),
    tan: Math.tan(y),
    tanh: Math.tanh(y),
    tanhPf: Math.tanh(y),
    exp: Math.exp(x),
    expm1: Math.expm1(x),
    expm1Pf: Math.expm1(x),
    log1p: Math.log1p(y),
    log1pPf: Math.log1p(y),
    powPI: Math.pow(Math.PI, -y)
  };
}

function getRandomParameter() {
  const keys = [
    "ACTIVE_ATTRIBUTES", "ACTIVE_TEXTURE", "ACTIVE_UNIFORMS", "ALIASED_LINE_WIDTH_RANGE",
    "ALIASED_POINT_SIZE_RANGE", "ALPHA", "ALPHA_BITS", "ALWAYS", "ARRAY_BUFFER",
    "ARRAY_BUFFER_BINDING", "ATTACHED_SHADERS", "BACK", "BLEND", "BLEND_COLOR",
    "BLEND_DST_ALPHA", "BLEND_DST_RGB", "BLEND_EQUATION", "BLEND_EQUATION_ALPHA",
    "BLEND_EQUATION_RGB", "BLEND_SRC_ALPHA", "BLEND_SRC_RGB", "BLUE_BITS",
    "BOOL", "BOOL_VEC2", "BOOL_VEC3", "BOOL_VEC4", "BROWSER_DEFAULT_WEBGL"
  ];

  const key = keys[Math.floor(Math.random() * keys.length)];
  const value = Math.random() > 0.5 ? Math.floor(Math.random() * 50000) : `${Math.floor(Math.random() * 1000)},${Math.floor(Math.random() * 1000)}`;
  return `"${key}=${value}"`;
}

function generateRandomParameters(count = 10) {
  const parameters = [];
  for (let i = 0; i < count; i++) {
    parameters.push(getRandomParameter());
  }
  return `{\n  "parameters": [\n    ${parameters.join(",\n    ")}\n  ]\n}`;
}

const getRandomNumber = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;

const generateShaderPrecisions = () => {
  return shaderTypes.flatMap(type =>
    precisionLevels.map(level => `${type}.${level}=${getRandomNumber(10, 200)},${getRandomNumber(10, 200)},${getRandomNumber(0, 50)}`)
  );
};

const generateExtensions = () => {
  return extensions.sort(() => Math.random() - 0.5).slice(0, getRandomNumber(5, extensions.length));
};

const generateExtensionParameters = () => {
  return extensionParams.sort(() => Math.random() - 0.5).slice(0, getRandomNumber(3, extensionParams.length));
};

const generateDummyData = () => {
  return {
    shaderPrecisions: generateShaderPrecisions(),
    extensions: generateExtensions(),
    extensionParameters: generateExtensionParameters()
  };
};

const COMPONENTS = {
  "applePay": [-1, 1, 0][Math.floor(Math.random() * 2)],
  "architecture": Math.floor(Math.random() * 255),
  "audio": Math.random() * 999.9999,
  "audioBaseLatency": [-1, -2, 1][Math.floor(Math.random() * 2)],
  "canvas": {
    "winding": [false, true][Math.floor(Math.random() * 1)],
    "geometry": "data:image/png;base64,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",
    "text": "data:image/png;base64,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"
  },
  "colorDepth": Math.floor(Math.random() * 24),
  "colorGamut": ["srgb", "rgb", "rgba"][Math.floor(Math.random() * 2)],
  "contrast": Math.floor(Math.random() * 255),
  "cookiesEnabled": true,
  "deviceMemory": Math.floor(Math.random() * 24),
  "fontPreferences": {
    "default": Math.random() * 247.9999,
    "apple": Math.random() * 239.1013,
    "serif": Math.random() * 973.1287,
    "sans": Math.random() * 778.1238,
    "mono": Math.random() * 87.918351,
    "min": Math.random() * 9.23409,
    "system": Math.random() * 999.999999
  },
  "fonts": [
    "Agency FB",
    "Calibri",
    "Century",
    "Century Gothic",
    "Franklin Gothic",
    "Futura Bk BT",
    "Futura Md BT",
    "Haettenschweiler",
    "Humanst521 BT",
    "Leelawadee",
    "Lucida Bright",
    "Lucida Sans",
    "MS Outlook",
    "MS Reference Specialty",
    "MS UI Gothic",
    "MT Extra",
    "Marlett",
    "Microsoft Uighur",
    "Monotype Corsiva",
    "Pristina",
    "Segoe UI Light"
  ].slice(Math.random() * 5, Math.random() * 20),
  "forcedColors": false,
  "hardwareConcurrency": Math.floor(Math.random() * 12),
  "hdr": [false, true, false][Math.floor(Math.random() * 2)],
  "indexedDB": true,
  "languages": [
    [
      "id-ID",
      "en-EN",
      "us-US",
      "eu-EU"
    ][Math.floor(Math.random() * 3)]
  ],
  "localStorage": true,
  "math": generateRandomMathValues(),
  "monochrome": 0,
  "openDatabase": false,
  "pdfViewerEnabled": true,
  "platform": ["Win32", "Win64", "Linux", "MacOS"][Math.floor(Math.random() * 4)],
  "plugins": [
    {
      "name": "PDF Viewer",
      "description": "Portable Document Format",
      "mimeTypes": [
        {
          "type": "application/pdf",
          "suffixes": "pdf"
        },
        {
          "type": "text/pdf",
          "suffixes": "pdf"
        }
      ]
    },
    {
      "name": "Chrome PDF Viewer",
      "description": "Portable Document Format",
      "mimeTypes": [
        {
          "type": "application/pdf",
          "suffixes": "pdf"
        },
        {
          "type": "text/pdf",
          "suffixes": "pdf"
        }
      ]
    },
    {
      "name": "Chromium PDF Viewer",
      "description": "Portable Document Format",
      "mimeTypes": [
        {
          "type": "application/pdf",
          "suffixes": "pdf"
        },
        {
          "type": "text/pdf",
          "suffixes": "pdf"
        }
      ]
    },
    {
      "name": "Microsoft Edge PDF Viewer",
      "description": "Portable Document Format",
      "mimeTypes": [
        {
          "type": "application/pdf",
          "suffixes": "pdf"
        },
        {
          "type": "text/pdf",
          "suffixes": "pdf"
        }
      ]
    },
    {
      "name": "WebKit built-in PDF",
      "description": "Portable Document Format",
      "mimeTypes": [
        {
          "type": "application/pdf",
          "suffixes": "pdf"
        },
        {
          "type": "text/pdf",
          "suffixes": "pdf"
        }
      ]
    }
  ][Math.floor(Math.random() * 5)],
  "reducedMotion": false,
  "reducedTransparency": false,
  "screenFrame": [
    0,
    0,
    50,
    0
  ],
  "screenResolution": [
    Math.random() * 4090,
    Math.random() * 3090
  ],
  "sessionStorage": true,
  "timezone": "Asia/Jakarta",
  "touchSupport": {
    "maxTouchPoints": 0,
    "touchEvent": false,
    "touchStart": false
  },
  "vendor": `${randomChar(10)}`,
  "vendorFlavors": [
    "chrome"
  ],
  "webGlBasics": {
    "version": "WebGL 1.0 (OpenGL ES 2.0 Chromium)",
    "vendor": "WebKit",
    "vendorUnmasked": `${randomChar(10)} (NVIDIA)`,
    "renderer": "WebKit WebGL",
    "rendererUnmasked": `ANGLE (NVIDIA, NVIDIA GeForce RTX ${["3090", "4090", "5090", "360", "450", "720"][Math.floor(Math.random() * 6)]} (0x00001380) Direct3D11 vs_5_0 ps_5_0, D3D11)`,
    "shadingLanguageVersion": "WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)"
  },
  "webGlExtensions": {
    "contextAttributes": [
      `alpha=${Math.random() < 0.5}`,
      `antialias=${Math.random() < 0.5}`,
      `depth=${Math.random() < 0.5}`,
      `desynchronized=${Math.random() < 0.5}`,
      `failIfMajorPerformanceCaveat=${Math.random() < 0.5}`,
      `powerPreference=default`,
      `premultipliedAlpha=${Math.random() < 0.5}`,
      `preserveDrawingBuffer=${Math.random() < 0.5}`,
      `stencil=${Math.random() < 0.5}`,
      `xrCompatible=${Math.random() < 0.5}`
    ],
    "parameters": generateRandomParameters(15),
    ...generateDummyData(),
    "unsupportedExtensions": []
  }
}

function _(e, t) {
  if ((t %= 64) !== 0) {
    if (t < 32) {
      e[0] = e[1] >>> 32 - t;
      e[1] = e[1] << t;
    } else {
      e[0] = e[1] << t - 32;
      e[1] = 0;
    }
  }
}

function b(e, t) {
  let n = e[0] >>> 16;
  let r = e[0] & 65535;
  let o = e[1] >>> 16;
  let i = e[1] & 65535;
  let a = t[0] >>> 16;
  let s = t[0] & 65535;
  let l = t[1] >>> 16;
  let u = t[1] & 65535;
  let c = 0;
  let d = 0;
  let f = 0;
  let p = 0;
  f += (p += i * u) >>> 16;
  p &= 65535;
  d += (f += o * u) >>> 16;
  f &= 65535;
  d += (f += i * l) >>> 16;
  f &= 65535;
  c += (d += r * u) >>> 16;
  d &= 65535;
  c += (d += o * l) >>> 16;
  d &= 65535;
  c += (d += i * s) >>> 16;
  d &= 65535;
  c += n * u + r * l + o * s + i * a;
  c &= 65535;
  e[0] = c << 16 | d;
  e[1] = f << 16 | p;
}

function w(e, t) {
  let n = e[0];
  if ((t %= 64) === 32) {
    e[0] = e[1];
    e[1] = n;
  } else if (t < 32) {
    e[0] = n << t | e[1] >>> 32 - t;
    e[1] = e[1] << t | n >>> 32 - t;
  } else {
    t -= 32;
    e[0] = e[1] << t | n >>> 32 - t;
    e[1] = n << t | e[1] >>> 32 - t;
  }
}

function x(e, t) {
  e[0] ^= t[0];
  e[1] ^= t[1];
}

function y(e, t) {
  let n = e[0] >>> 16;
  let r = e[0] & 65535;
  let o = e[1] >>> 16;
  let i = e[1] & 65535;
  let a = t[0] >>> 16;
  let s = t[0] & 65535;
  let l = t[1] >>> 16;
  let u = 0;
  let c = 0;
  let d = 0;
  let f = 0;
  d += (f += i + (t[1] & 65535)) >>> 16;
  f &= 65535;
  c += (d += o + l) >>> 16;
  d &= 65535;
  u += (c += r + s) >>> 16;
  c &= 65535;
  u += n + a;
  u &= 65535;
  e[0] = u << 16 | c;
  e[1] = d << 16 | f;
}

function O(e) {
  let t = [0, e[0] >>> 1];
  x(e, t);
  b(e, E);
  t[1] = e[0] >>> 1;
  x(e, t);
  b(e, S);
  t[1] = e[0] >>> 1;
  x(e, t);
}

function _encrypt(e) {
  let n = function (e) {
    let t = new Uint8Array(e.length);
    for (let n = 0; n < e.length; n++) {
      let r = e.charCodeAt(n);
      if (r > 127) {
        return new TextEncoder().encode(e);
      }
      t[n] = r;
    }
    return t;
  }(e);
  let t = 0;
  let r;
  let o = [0, n.length];
  let i = o[1] % 16;
  let a = o[1] - i;
  let s = [0, t];
  let l = [0, t];
  let u = [0, 0];
  let c = [0, 0];
  for (r = 0; r < a; r += 16) {
    u[0] = n[r + 4] | n[r + 5] << 8 | n[r + 6] << 16 | n[r + 7] << 24;
    u[1] = n[r] | n[r + 1] << 8 | n[r + 2] << 16 | n[r + 3] << 24;
    c[0] = n[r + 12] | n[r + 13] << 8 | n[r + 14] << 16 | n[r + 15] << 24;
    c[1] = n[r + 8] | n[r + 9] << 8 | n[r + 10] << 16 | n[r + 11] << 24;
    b(u, k);
    w(u, 31);
    b(u, I);
    x(s, u);
    w(s, 27);
    y(s, l);
    b(s, P);
    y(s, C);
    b(c, I);
    w(c, 33);
    b(c, k);
    x(l, c);
    w(l, 31);
    y(l, s);
    b(l, P);
    y(l, A);
  }
  u[0] = 0;
  u[1] = 0;
  c[0] = 0;
  c[1] = 0;
  let d = [0, 0];
  switch (i) {
    case 15:
      d[1] = n[r + 14];
      _(d, 48);
      x(c, d);
    case 14:
      d[1] = n[r + 13];
      _(d, 40);
      x(c, d);
    case 13:
      d[1] = n[r + 12];
      _(d, 32);
      x(c, d);
    case 12:
      d[1] = n[r + 11];
      _(d, 24);
      x(c, d);
    case 11:
      d[1] = n[r + 10];
      _(d, 16);
      x(c, d);
    case 10:
      d[1] = n[r + 9];
      _(d, 8);
      x(c, d);
    case 9:
      d[1] = n[r + 8];
      x(c, d);
      b(c, I);
      w(c, 33);
      b(c, k);
      x(l, c);
    case 8:
      d[1] = n[r + 7];
      _(d, 56);
      x(u, d);
    case 7:
      d[1] = n[r + 6];
      _(d, 48);
      x(u, d);
    case 6:
      d[1] = n[r + 5];
      _(d, 40);
      x(u, d);
    case 5:
      d[1] = n[r + 4];
      _(d, 32);
      x(u, d);
    case 4:
      d[1] = n[r + 3];
      _(d, 24);
      x(u, d);
    case 3:
      d[1] = n[r + 2];
      _(d, 16);
      x(u, d);
    case 2:
      d[1] = n[r + 1];
      _(d, 8);
      x(u, d);
    case 1:
      d[1] = n[r];
      x(u, d);
      b(u, k);
      w(u, 31);
      b(u, I);
      x(s, u);
  }
  x(s, o);
  x(l, o);
  y(s, l);
  y(l, s);
  O(s);
  O(l);
  y(s, l);
  y(l, s);
  return ("00000000" + (s[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (s[1] >>> 0).toString(16)).slice(-8) + ("00000000" + (l[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (l[1] >>> 0).toString(16)).slice(-8);
}

function _objToStr(e) {
  let t = "";
  for (let n = 0, r = Object.keys(e).sort(); n < r.length; n++) {
    const o = r[n];
    const i = e[o];
    const a = typeof i == "string" ? i : JSON.stringify(i);
    t += `${t ? "|" : ""}${o.replace(/([:|\\])/g, "\\$1")}:${a}`;
  }
  return t;
}

function _visitorId() {
  const txt = _objToStr(COMPONENTS);
  const enc = _encrypt(txt.trim());
  return enc;
}

async function _initSignature() {
  const iso = new Date().toISOString();
  const params = Buffer.from(iso).toString("base64");
  const uri = new URL(URL_SECRET);
  const vis = _visitorId()
  const hm = `POST${encodeURI(uri.pathname + uri.search)}${iso}${vis}`;
  const sig = crypto.createHmac("sha256", SIGN_KEY).update(hm).digest("hex");
  headersListWm["x-ebg-param"] = params;
  headersListWm["x-ebg-signature"] = sig;
  headersListWm["pixb-cl-id"] = vis;
}

async function _init() {
  const rs = await req(BASE_URL + URL_USER, "POST");
  const jsn = await rs.json();
  headersList["Authorization"] = `Bearer ${jsn.access_token}`;
  return true;
}

async function _upload(settings) {
  const hh = await req(BASE_URL + URL_BULK, "POST", JSON.stringify(BULK_PAYLOAD(settings)));
  const jsn = await hh.json();
  return jsn;
}

async function _approval(data, settings) {
  const hh = await req(BASE_URL + URL_APPROVAL.replace("BULK_UPLOAD_ID", data.bulk_upload_id), "POST", JSON.stringify(BULK_PAYLOAD(settings)));
  return hh.status;
}

async function _approvalWm() {
  const hh = await req(BASE_URL_WM + URL_REMOVE_WM, "OPTIONS", null, null, headersListWm);
  return hh.status;
}

async function _send(data, buffer) {
  headersList["content-type"] = "image/jpeg";
  headersList["x-goog-custom-time"] = data.task_list[0].upload_headers["x-goog-custom-time"];
  const jj = await req(data.task_list[0].upload_url, "PUT", buffer)
  return jj.status;
}

async function _task(data) {
  headersList["content-type"] = "application/json";
  const jj = await req(BASE_URL + URL_TASK + data.bulk_upload_id);
  return await jj.json();
}

function Remini(img, settings) {
  try {
    let buffer;
    let wm;
    let no_wm;

    return new Promise(async (resolve) => {
      if (Buffer.isBuffer(img)) {
        buffer = img;
      } else {
        const gs = await fetch(img);
        const kb = await gs.arrayBuffer();
        buffer = Buffer.from(kb);
      }
      await _init();
      const data = await _upload(settings);
      const send = await _send(data, buffer);
      if (send == 200) {
        console.log("[ REMINI ] Image sent.")
      } else {
        console.log("[ WARN ] Image failed to send.")
      }
      const status = await _approval(data, settings);
      if (status == 202) {
        console.log("[ REMINI ] Request accepted.")
      } else {
        console.log("[ WARN ] Request denied.")
      }

      while (true) {
        const jdata = await _task(data);
        if (jdata.task_list[0].status == "completed") {
          wm = jdata;
          break;
        }
        await _delay(2_000); // 2 Detik
      }

      if (wm.task_list[0].result.outputs[0].has_watermark) {
        const rm = await Remove(wm.task_list[0].result.outputs[0].url);
        if (rm == null) {
          no_wm = wm.task_list[0].result.outputs[0].url
        } else {
          no_wm = rm.output[0];
        }
      } else {
        no_wm = wm.task_list[0].result.outputs[0].url;
      }
      resolve({
        no_wm,
        wm: wm.task_list[0].result.outputs[0].url
      });
    })
  } catch (error) {
    console.error(error);
    return null
  }
}

async function Remove(image) {
  try {
    let buffer;
    let results = null;

    if (/https\:\/\/|http\:\/\//i.test(image)) {
      const gs = await fetch(image);
      const kb = await gs.arrayBuffer();
      buffer = Buffer.from(kb);
    } else {
      buffer = image;
    }

    const status = await _approvalWm();
    if (status == 204) {
      console.log("[ REMOVE ] Request accepted.")
    } else {
      console.log("[ WARN ] Request denied.")
    }
    
    await _initSignature();
    
    console.log("[ REMOVE ] Image send.")
    const form = new FormData();
    form.append("input.image", buffer, { filename: `${crypto.randomUUID().toString()}.jpg`, contentType: "image/jpeg" });
    form.append("input.rem_text", "false");
    form.append("input.rem_logo", "false");
    form.append("retention", "1d");

    headersListWm = {
      ...headersListWm,
      ...form.getHeaders()
    }

    const ts = await req(BASE_URL_WM + URL_REMOVE_WM, "POST", form.getBuffer(), null, headersListWm);
    const jsn = await ts.json();
    if (jsn.status && jsn.status == "ACCEPTED") {
      const uri = new URL(jsn.urls.get);
      const headOri = {
        origin: "https://" + uri.hostname,
        referer: jsn.urls.get,
        "user-agent": fake()
      }
      while (true) {
        const rm = await req(jsn.urls.get, "GET", null, null, headOri);
        const jj = await rm.json();
        if (jj.status && jj.status == "SUCCESS") {
          results = jj;
          break;
        }
        await _delay(5_000);
      }
    }

    return results;
  } catch (error) {
    console.error(error);
    return null;
  }
}

module.exports = Remini