@agent-cards/sdk 0.23.20 → 0.23.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +55 -2
  2. package/PREFLIGHT.md +6 -0
  3. package/README.md +169 -5
  4. package/dist/amadeus-checkout.generated.d.ts +6 -1
  5. package/dist/amadeus-checkout.generated.js +26 -2
  6. package/dist/card-fields.generated.js +2341 -127
  7. package/dist/cdp.js +199 -28
  8. package/dist/client.d.ts +177 -9
  9. package/dist/client.js +387 -37
  10. package/dist/comgate.d.ts +50 -0
  11. package/dist/comgate.js +80 -0
  12. package/dist/creditguard.generated.js +4 -2
  13. package/dist/cse-body.js +11 -0
  14. package/dist/cybersource-secure-acceptance.generated.d.ts +1 -1
  15. package/dist/ebanx.d.ts +1 -1
  16. package/dist/ebanx.js +1 -1
  17. package/dist/eprotect.generated.d.ts +1 -1
  18. package/dist/eximbay.d.ts +46 -0
  19. package/dist/eximbay.js +69 -0
  20. package/dist/gmo.generated.js +7 -3
  21. package/dist/hipay.generated.d.ts +5 -5
  22. package/dist/hipay.generated.js +5 -2
  23. package/dist/hold.d.ts +1 -1
  24. package/dist/hold.js +10 -4
  25. package/dist/hosted-entry.d.ts +4 -0
  26. package/dist/hosted-entry.js +32 -0
  27. package/dist/index.d.ts +1 -0
  28. package/dist/lifecycle.d.ts +9 -4
  29. package/dist/lifecycle.js +16 -4
  30. package/dist/paddle-tokenex.generated.js +7 -3
  31. package/dist/paygent.generated.d.ts +60 -0
  32. package/dist/paygent.generated.js +425 -0
  33. package/dist/payrails.generated.js +7 -3
  34. package/dist/payrexx.d.ts +91 -0
  35. package/dist/payrexx.generated.d.ts +91 -0
  36. package/dist/payrexx.generated.js +536 -0
  37. package/dist/payrexx.js +141 -0
  38. package/dist/pre-claim.d.ts +30 -1
  39. package/dist/pre-claim.js +257 -39
  40. package/dist/preflight-catalog.json +58 -0
  41. package/dist/preflight-schemas.json +4 -0
  42. package/dist/preflight.generated.js +26 -2
  43. package/dist/prepared-processor.d.ts +7 -2
  44. package/dist/prepared-processor.js +16 -2
  45. package/dist/primer.generated.js +2469 -255
  46. package/dist/przelewy24.d.ts +47 -0
  47. package/dist/przelewy24.js +88 -0
  48. package/dist/registry.d.ts +6 -5
  49. package/dist/registry.js +27 -7
  50. package/dist/shiji-sts.generated.js +7 -3
  51. package/dist/stripe-checkout.generated.js +896 -19
  52. package/dist/toast-seal.generated.d.ts +37 -0
  53. package/dist/toast-seal.generated.js +625 -0
  54. package/dist/toast.generated.d.ts +41 -0
  55. package/dist/toast.generated.js +113 -0
  56. package/dist/tokenex-iframe.d.ts +93 -0
  57. package/dist/tokenex-iframe.generated.d.ts +81 -0
  58. package/dist/tokenex-iframe.generated.js +403 -0
  59. package/dist/tokenex-iframe.js +195 -0
  60. package/dist/transbank.d.ts +45 -0
  61. package/dist/transbank.js +73 -0
  62. package/dist/twoc2p.generated.js +7 -3
  63. package/examples/preflight/kernel-native/inventory.json +1 -1
  64. package/package.json +3 -3
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  // Generated from @agent-cards/payment-core. Do not edit.
3
- // artifact-sha256: abafbcce1536643bd38817e2332c0e107e93b04bc347051096c6e031cda00722
3
+ // artifact-sha256: 360d9805357acc5244c3beafbb16a6da782e933b506db49c2d63df06ac23f7b4
4
4
  // src/deep-freeze.js
5
5
  function deepFreeze(value) {
6
6
  if (value && typeof value === "object" && !Object.isFrozen(value)) {
@@ -600,6 +600,102 @@ var PROCESSOR_DEFINITIONS = deepFreeze([
600
600
  dedupe: ["checkout-account", "checkout-transaction-id"]
601
601
  }
602
602
  },
603
+ {
604
+ psp: "eximbay",
605
+ // Eximbay's payment window, the Korean gateway that takes foreign cards for Korean merchants selling
606
+ // abroad. The merchant's page posts a
607
+ // signed ENTRY form, top-level or into a popup, to https://secureapi.eximbay.com/Gateway/BasicProcessor.krp
608
+ // (Eximbay's integration v230, which its JavaScript SDK submits too): the amount, the merchant's mid, its
609
+ // order reference, its return and status URLs and an fgkey, a SHA-256 over every field under the
610
+ // merchant's secret key, and no card. Eximbay answers with a page that posts itself, with a paramkey, into
611
+ // its window under a JSESSIONID cookie, so a card form rebuilt away from that session has no payment to pay
612
+ // (processors/eximbay.js). The paused request is therefore the entry, a Document navigation that carries no
613
+ // card: the cardholder's device repeats it over the end-to-end TLS relay, fills the card into the window
614
+ // Eximbay returns to it and posts it back in that same session, and the runtime resolves the paused
615
+ // navigation with the hosted_form notice. Only the entry path is matched, exactly (processors/eximbay.js
616
+ // isEximbayEntryUrl: a query would reach Eximbay's servlet as fields beside the signed body). The window's
617
+ // card lookup (checkCardBin.do) and its card post (checkApprv.jsp) carry a card and are never paused, and
618
+ // the agent's browser never loads the window while the entry waits. The SDK's Eximbay gate refuses those
619
+ // two posts in the agent's browser, with every other post to these hosts but the entry
620
+ // (checkout/src/pre-claim.ts eximbayPreClaim), so no dummy card reaches Eximbay. Eximbay's test host serves
621
+ // the same window for test merchants, so a live row reaches the live host only and a test row the test host
622
+ // only. Dark: served only to a client that declares the capability, and gated off for every org the operator
623
+ // has not allowlisted.
624
+ capability: "eximbay_hosted_payment_page",
625
+ match: "secureapi\\.(?:test\\.)?eximbay\\.com/Gateway/BasicProcessor\\.krp",
626
+ hosts: ["^secureapi\\.eximbay\\.com$", "^secureapi\\.test\\.eximbay\\.com$"],
627
+ sandboxHosts: ["^secureapi\\.test\\.eximbay\\.com$"],
628
+ hostEnvironmentPinned: true,
629
+ encoding: "form",
630
+ passthroughHeaders: [],
631
+ mode: "hosted_form",
632
+ hostedForm: {
633
+ // The card goes into the window Eximbay returns to the device, not into the paused entry, which must
634
+ // carry none (processors/eximbay.js checkEximbayEntry). The device never posts a form of its own: the
635
+ // Vault's form-action policy leaves these hosts out.
636
+ cardIn: "processor_page",
637
+ // The entry's own rules (processors/eximbay.js checkEximbayEntry), the reviewed merchants among them: the
638
+ // create runs them, and naming them here makes the cardholder's device run them again on the entry it is
639
+ // about to repeat (forms.js hostedFormTemplateRefusal).
640
+ policy: "eximbay",
641
+ required: ["ver", "mid", "txntype", "ref", "cur", "amt", "buyer", "email", "lang", "returnurl", "statusurl", "fgkey"],
642
+ // The window's own card fields, which the device fills in the window (never in the entry). The window's
643
+ // script also splits the number into cardno1 to cardno4 beside cardNum.
644
+ card: { number: "cardNum", month: "month", year: "year", cvc: "cvc" },
645
+ // The merchant, its order reference and the amount name one payment.
646
+ dedupe: ["mid", "ref", "amt", "cur"]
647
+ }
648
+ },
649
+ {
650
+ psp: "barion",
651
+ // Barion's Smart Gateway (Barion Payment Zrt.), where Hungarian, Czech and Slovak shops send a buyer who pays
652
+ // by card as a guest. The merchant's SERVER starts the payment (POST api.barion.com/v2/Payment/Start under its
653
+ // POSKey: the amount, the shop, its RedirectUrl) and sends the buyer's browser to
654
+ // secure.barion.com/Pay?Id={PaymentId}, a GET. That ENTRY is the payment's id alone: no card, no amount and no
655
+ // merchant, all of which Barion bound to the id on its own server. Barion answers with the gateway under a
656
+ // session of its own (an ASP.NET session and an anti-forgery token), whose script posts the card to
657
+ // /Pay/PrepareCardPaymentForGuest and /Pay/CompletePaymentAsGuestWithCard on the same host in that session, so a
658
+ // card post made away from that session has no payment to pay (processors/barion.js). The paused request is
659
+ // therefore the entry, a Document navigation that carries no card: the cardholder's device repeats it over the
660
+ // end-to-end TLS relay and makes the gateway's posts itself in that same session, and the runtime resolves the
661
+ // paused navigation with the hosted_form notice. Only the entry is matched, exactly (processors/barion.js
662
+ // isBarionEntryUrl: the path /Pay and one Id or id parameter, since the gateway acts on others): the card posts,
663
+ // the email check and the 3-D Secure steps share the host, and none of them is the entry. secure.test.barion.com
664
+ // runs the same gateway for Barion's test shops: a live row reaches only the live host and a test row only the
665
+ // test host, which takes only Barion's test cards. Dark: served only to a client that declares the capability,
666
+ // and gated off for every org the operator has not allowlisted.
667
+ capability: "barion_hosted_payment_page",
668
+ match: "secure(?:\\.test)?\\.barion\\.com/Pay",
669
+ hosts: ["^secure\\.barion\\.com$", "^secure\\.test\\.barion\\.com$"],
670
+ sandboxHosts: ["^secure\\.test\\.barion\\.com$"],
671
+ hostEnvironmentPinned: true,
672
+ // `encoding` describes the gateway's own posts, which the device makes as the gateway's script does, since the
673
+ // entry has no body. No captured header is ever replayed.
674
+ encoding: "form",
675
+ passthroughHeaders: [],
676
+ // The entry is the GET the merchant's redirect makes, and it carries no card: the card goes into the gateway's
677
+ // own posts on the device. A client that pauses a GET only for a processor whose request it checks (the
678
+ // checkout SDK's isRecognizerRequest) never pauses this one until it learns the entry.
679
+ request: { method: "GET", cardIn: "none", response: "html_page" },
680
+ mode: "hosted_form",
681
+ hostedForm: {
682
+ // The card goes into the gateway's posts the device makes, never into the paused entry, which carries no
683
+ // body at all (processors/barion.js checkBarionEntry). The device never posts a form of its own: the Vault's
684
+ // form-action policy leaves these hosts out.
685
+ cardIn: "processor_page",
686
+ // The entry's own rules (processors/barion.js checkBarionEntry): the create runs them, and naming them here
687
+ // makes the cardholder's device run them again on the entry it is about to repeat (forms.js
688
+ // hostedFormTemplateRefusal).
689
+ policy: "barion",
690
+ // The entry is a bodiless GET, so no form field is required of it.
691
+ required: [],
692
+ // The fields of the gateway's charge post, which the device fills there (never in the entry).
693
+ card: { number: "CardNumber", expiry: "CardExpiration", cvc: "CardCVC" },
694
+ // The payment id in the entry's URL names one payment Barion started; the policy reads it there
695
+ // (checkBarionEntry's dedupe), since no form field holds it.
696
+ dedupe: ["(paymentId)"]
697
+ }
698
+ },
603
699
  // ── Verified tokenizers (plaintext PAN in the body) ───────────────────────
604
700
  // Each entry below was checked against the PSP's own shipped browser SDK or a
605
701
  // live probe, then run through resolveRecognizerForUrl with positive, sibling
@@ -2024,13 +2120,14 @@ var PROCESSOR_DEFINITIONS = deepFreeze([
2024
2120
  // approves. paygent.js holds the rule the pause decision and the device read: the exact URL, the
2025
2121
  // script's content type, and createToken's seven keys in its order and spelling with the token key
2026
2122
  // held to the host's environment; createCvcToken (a stored card's code) is refused. The script
2027
- // abandons the XHR after 35 s; the preparation that moves the approval before the press comes with
2028
- // the API's Paygent change, which sets `preparationRequired` with it.
2123
+ // abandons the XHR after 35 s, too soon for an approval after the press that sends it, so the
2124
+ // lane is prepared only (`preparationRequired`): the cardholder approves before the press, and the
2125
+ // press's request binds that approval (paygent.js isPreparedPaygentRequest). On the live host it
2126
+ // binds only the merchant_id a reviewed pin lists for the approved origin and merchant
2127
+ // (PAYGENT_MERCHANT_PINS), and one approval binds one request, so a second card request is sent nowhere.
2029
2128
  // Paygent's hosted payment page (link.paygent.co.jp) carries the card on other paths and is not paused.
2030
2129
  // Paygent answers a refused card inside HTTP 200, so its own judge reads every answer by its body
2031
- // (paygent.js paygentAnswerOutcome), never the shared status rule. No operator lists an org before the
2032
- // API's Paygent change lands: the amount the request does not name, the merchant pin per checkout
2033
- // origin, the refusal of a second card request on one checkout, and the preparation for the 35 s window.
2130
+ // (paygent.js paygentAnswerOutcome), never the shared status rule.
2034
2131
  // Ships dark: served only to a client that declares `paygent_token`, gated off for every org until an
2035
2132
  // operator lists one (`paygent:<org>`), and autopilot never sends this request (autopilot.js
2036
2133
  // DEVICE_REPLAY_REFUSED_OPERATIONS). The environment is pinned (S7): sandbox.paygent.co.jp only on
@@ -2040,6 +2137,7 @@ var PROCESSOR_DEFINITIONS = deepFreeze([
2040
2137
  hosts: ["^token\\.paygent\\.co\\.jp$", "^sandbox\\.paygent\\.co\\.jp$"],
2041
2138
  sandboxHosts: ["^sandbox\\.paygent\\.co\\.jp$"],
2042
2139
  hostEnvironmentPinned: true,
2140
+ preparationRequired: true,
2043
2141
  // The body's shape is a form's (key=value pairs); its wire type stays the script's text/plain
2044
2142
  // (request-policy.js contentTypeFor). No header but the content type rides.
2045
2143
  encoding: "form",
@@ -2106,16 +2204,17 @@ var PROCESSOR_DEFINITIONS = deepFreeze([
2106
2204
  psp: "sumup",
2107
2205
  // SumUp's online payments (UK, EEA, US, Latin America): the Payment Widget
2108
2206
  // (gateway.sumup.com/gateway/ecom/card/v2/sdk.js) that SumUp's WooCommerce plugin, its Payment Links, Online
2109
- // Store and invoices all mount (its hosted checkout page too, which this lane refuses: that page serves every
2110
- // merchant from one origin). Each card field is a frame on gateway.sumup.com, and a
2207
+ // Store and invoices all mount (its hosted checkout page too, which this lane refuses: that page sends a body
2208
+ // nobody has reviewed). Each card field is a frame on gateway.sumup.com, and a
2111
2209
  // hidden form frame there sends the card in one PUT to https://api.sumup.com/v0.2/checkouts/<checkout id>:
2112
2210
  // JSON {"payment_type":"card","device_information":..,"card":{"name","number","expiry_month":"MM",
2113
2211
  // "expiry_year":"YY" or "YYYY","cvv"},"installments":1,..}, unencrypted, with X-Sumup-Correlation-Id naming
2114
2212
  // the same checkout. sumup.js holds the request rule the pause decision, the API's create and the device all
2115
2213
  // read: exactly that URL, a JSON Content-Type, the correlation id, and the widget's body byte for byte, with
2116
2214
  // a body that carries a recurring mandate, which keeps the card at SumUp, refused. The body names no
2117
- // amount and no merchant: the checkout the merchant's server created holds both, so a live request is taken
2118
- // only for a checkout origin a reviewed pin lists. The request carries no cookie and no Authorization
2215
+ // amount and no merchant: the checkout the merchant's server created holds both, so the API reads the checkout
2216
+ // from SumUp by its id and takes a live request only for a merchant code a reviewed pin lists (sumup.js
2217
+ // SUMUP_MERCHANT_PINS). The request carries no cookie and no Authorization
2119
2218
  // header (the checkout id is its credential), and the API answers any browser origin's preflight with
2120
2219
  // credentials omitted. The answer is the checkout: PAID, FAILED, or PENDING with a 3-D Secure step the
2121
2220
  // widget then runs in the page. SumUp's sandbox merchants share the live host, so no sandbox host is
@@ -2227,6 +2326,432 @@ var PROCESSOR_DEFINITIONS = deepFreeze([
2227
2326
  passthroughHeaders: ["^origin$", "^referer$"],
2228
2327
  cardFields: ["card_number"],
2229
2328
  passWithoutCard: "(?:sb)?checkout\\.payfort\\.com/FortAPI/paymentPage"
2329
+ },
2330
+ {
2331
+ psp: "paypal",
2332
+ // PayPal Card Fields (Advanced Credit and Debit Card Payments) on Orders v2: one JSON POST from a
2333
+ // PayPal-owned frame to confirm-payment-source for the order the merchant's server created. Card
2334
+ // Fields v5 (www.paypal.com/smart/card-field) sends it to its own origin, v6 to api-m.paypal.com.
2335
+ // PAN@ payment_source.card.number, expiry YYYY-MM @ .expiry, CVC @ .security_code; a Bearer token
2336
+ // PayPal minted into the frame; no amount, no encryption. paypal.js holds the rule the pause
2337
+ // decision, the API's create and the device all read: exactly the confirm URL with an upper-case
2338
+ // order id, and the frames' own new-card body. The same URL confirms a PayPal wallet, a saved card
2339
+ // or a token with no number, which continues untouched (jsonCardFields, passWithoutCard). Not here: legacy Hosted
2340
+ // Fields on cors.api.paypal.com and PayPal's guest card form, which the checkout SDK refuses for
2341
+ // every company, the order's other calls, subscriptions and /v2/payments/find-bin-details.
2342
+ // PayPal-Auth-Assertion is a server-side header and never rides.
2343
+ // Ships dark: served only to a client that declares `paypal_card_fields`, gated off for every org
2344
+ // until an operator lists one (`paypal:<org>`), and autopilot never sends this request
2345
+ // (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS). The environment is pinned (S7): the sandbox
2346
+ // hosts only on test rows and only with documented test cards, the live hosts only on live rows.
2347
+ capability: "paypal_card_fields",
2348
+ match: "(?:www|api-m)(?:\\.sandbox)?\\.paypal\\.com/v2/checkout/orders/[A-Z0-9]{1,36}/confirm-payment-source(?![\\w/-])",
2349
+ hosts: ["^www\\.paypal\\.com$", "^www\\.sandbox\\.paypal\\.com$", "^api-m\\.paypal\\.com$", "^api-m\\.sandbox\\.paypal\\.com$"],
2350
+ sandboxHosts: ["^www\\.sandbox\\.paypal\\.com$", "^api-m\\.sandbox\\.paypal\\.com$"],
2351
+ hostEnvironmentPinned: true,
2352
+ encoding: "json",
2353
+ passthroughHeaders: [
2354
+ "^authorization$",
2355
+ "^prefer$",
2356
+ "^paypal-client-metadata-id$",
2357
+ "^paypal-partner-attribution-id$",
2358
+ "^paypal-integration-artifact$",
2359
+ "^fn_sync_data$"
2360
+ ],
2361
+ jsonCardFields: [["payment_source", "card", "number"]],
2362
+ passWithoutCard: "(?:www|api-m)(?:\\.sandbox)?\\.paypal\\.com/v2/checkout/orders/[A-Z0-9]{1,36}/confirm-payment-source"
2363
+ },
2364
+ {
2365
+ psp: "clover",
2366
+ // Clover (a Fiserv company), North America. Clover's card frame (the INTERMEDIATE frame of
2367
+ // checkout.clover.com/widget.html, which checkout.clover.com/sdk.js mounts on Clover's payment links, Hosted
2368
+ // Checkout and Online Ordering and on every merchant site that embeds Clover's iframe) sends the card to Clover's
2369
+ // token API, which answers with a single-use clv_ token the merchant's server charges afterwards. One JSON POST
2370
+ // to exactly https://token.clover.com/v1/tokens (token-sandbox.dev.clover.com on Clover's sandbox), under the
2371
+ // merchant's public Ecommerce key in the apikey header and X-Clover-Client-Type HOSTED_IFRAME, with the card in
2372
+ // `card`: the number as encrypted_pan, RSA-OAEP under Clover's published TransArmor key, and the code, expiry,
2373
+ // first six, last four and brand in plain text. clover.js holds the request rule the pause decision and the
2374
+ // device read, and the API's create once its Clover branch lands: exactly that URL, the frame's three headers,
2375
+ // and the frame's single-use card body with nothing the frame does not write. The body names no amount, so a
2376
+ // live request is taken only for a store and key a reviewed pin names together. As for GMO, the paused body
2377
+ // holds the agent's placeholder ciphertext and nothing can be written into it: injectCard and
2378
+ // prepareDeviceReplay refuse this psp, and the cardholder's device builds the request with the real card under
2379
+ // the key payment-core pins and sends it itself (the token API answers the Vault's origin), with no relay. A
2380
+ // multi-pay token, the frame's reCAPTCHA variant, a number sent in the clear and every gift card, ACH or wallet
2381
+ // token request to the same URL are refused. token-sandbox.dev.clover.com is Clover's sandbox: pinned (S7) to
2382
+ // test rows, which send only Clover's test cards.
2383
+ // Ships dark: served only to a client that declares `clover_card_token`, gated off for every org until an
2384
+ // operator lists one (`clover:<org>`), and autopilot never sends this request (autopilot.js
2385
+ // DEVICE_REPLAY_REFUSED_OPERATIONS). `(?![\w/.%-])` keeps /v1/tokens/<id> and /v1/tokens.json out of `match`;
2386
+ // every consumer anchors it, and recognition.js takes only the exact URL (isCloverTokenUrl).
2387
+ capability: "clover_card_token",
2388
+ match: "token(?:-sandbox\\.dev)?\\.clover\\.com/v1/tokens(?![\\w/.%-])",
2389
+ hosts: ["^token\\.clover\\.com$", "^token-sandbox\\.dev\\.clover\\.com$"],
2390
+ sandboxHosts: ["^token-sandbox\\.dev\\.clover\\.com$"],
2391
+ hostEnvironmentPinned: true,
2392
+ encoding: "json",
2393
+ // The merchant's key and the frame's client type are what the token API reads beside the body, and the Accept
2394
+ // rides as the frame sent it; origin, referer and cookies never do.
2395
+ passthroughHeaders: ["^apikey$", "^x-clover-client-type$", "^accept$"],
2396
+ jsonCardFields: [["card", "encrypted_pan"]]
2397
+ },
2398
+ {
2399
+ psp: "tap_payments",
2400
+ // Tap Payments' Card SDK v2 frame (sdk.tap.company/v2/card/index.html), the card form of Tap's hosted
2401
+ // checkout (checkout.tap.company) and of every merchant embedding the Card SDK, in Kuwait, Saudi
2402
+ // Arabia, the UAE, Bahrain, Qatar and Oman. The frame encrypts the card itself: JSEncrypt
2403
+ // (RSAES-PKCS1-v1_5, base64) of JSON.stringify({cvc, exp_month, exp_year, name, number}) under the
2404
+ // merchant's own RSA key, sent as encryptedData in one JSON POST to /v2/card/token with the merchant's
2405
+ // publishable key as Authorization. Tap answers a token (tok_...); 3-D Secure and the charge follow,
2406
+ // card free. tap-payments.js holds the request rule the pause decision, the API, the device and the
2407
+ // swap read: the exact URL, the frame's body, a one-time purpose, and a publishable key a reviewed pin
2408
+ // lists with the merchant's key (TAP_PAYMENTS_MERCHANT_PINS). cse mode, as GMO, Shiji STS and Paddle
2409
+ // TokenEx ship: the cardholder's device encrypts the real card under the pinned key, the runtime swaps
2410
+ // encryptedData (substituteTapPayments), and the agent's frame sends the request (the token endpoint
2411
+ // answers no preflight from the Vault's origin). A save purpose, a consent to keep the card and a
2412
+ // payment agreement are refused. Test and live keys share the host, and a key's own prefix names its
2413
+ // environment, so no sandbox host is marked.
2414
+ // Ships dark: served only to a client that declares `tap_card_sdk_token`, gated off for every org
2415
+ // until an operator lists one (`tap_payments:<org>`), and autopilot never sends this request
2416
+ // (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS).
2417
+ capability: "tap_card_sdk_token",
2418
+ match: "sdk\\.tap\\.company/v2/card/token(?![\\w/.-])",
2419
+ hosts: ["^sdk\\.tap\\.company$"],
2420
+ encoding: "json",
2421
+ // The publishable key names the merchant the card is encrypted for; the frame's other headers (mdn,
2422
+ // application) ride on the page's own request and are never recorded.
2423
+ passthroughHeaders: ["^authorization$"],
2424
+ // The one ciphertext, by the role the client table names, so it carries the same encrypted-field set
2425
+ // the approve leg accepts (vault-allowlist-drift). The generic Adyen substitution refuses it (RSA
2426
+ // base64, not a JWE): only substituteTapPayments writes this body, dispatched by psp.
2427
+ encryptedCardFields: { number: "encryptedData" },
2428
+ clientSideEncrypted: true,
2429
+ mode: "cse",
2430
+ cse: { scheme: "rsa-pkcs1v15", at: "", fields: ["encryptedData"] }
2431
+ },
2432
+ {
2433
+ psp: "conekta",
2434
+ // Conekta (Mexico) through Conekta.js, the tokenizer a merchant's own page loads from cdn.conekta.io or hosts
2435
+ // itself: on Pay it posts the card with one XHR, in clear JSON, to https://api.conekta.io/tokens under the
2436
+ // merchant's public key (Basic authorization) and Accept application/vnd.conekta-v0.3.0+json, as
2437
+ // {"card":{<the page's members>,"device_fingerprint"}}: card.number, card.cvc, card.exp_month, card.exp_year and
2438
+ // card.name, in the page's order. The answer is a single-use token the merchant's server charges later; the request
2439
+ // names no amount, so the agent's amount is the price the cardholder approves. conekta.js holds the rules the pause
2440
+ // decision, the API's create and the device read: the exact URL, the tokenizer's headers, and the page's card body
2441
+ // member by member, with the tokenizer's fingerprint last. Conekta's Component (pay.conekta.com/api/tokens, the
2442
+ // frame behind the WooCommerce plugin 5.x and 6.x, the Shopify app, hosted checkout and payment links) seals its
2443
+ // token form in the page, so its two token URLs are named here only to be refused: its POST by name
2444
+ // (conekta_component_unsupported) at the pause, the API's create and the device; its PUT, not this recognizer's
2445
+ // method, continues untouched with the agent's placeholder, and the create refuses it as a method no Conekta card
2446
+ // request uses. Conekta's API answers any browser origin, so the card leaves the cardholder's
2447
+ // device by a direct fetch. Test and live share api.conekta.io and Conekta's keys name no mode, so no sandbox host
2448
+ // is marked and the lane takes live rows alone: a live request pays only an origin and a key one reviewed pin lists
2449
+ // together (conekta.js conektaMerchantRefusal), and none is listed yet. Conekta can answer a refusal inside a 2xx,
2450
+ // so its own judge reads every answer (conekta.js conektaAnswerOutcome), never the shared status rule.
2451
+ // Ships dark: served only to a client that declares `conekta_tokenizer`, gated off for every org until an
2452
+ // operator lists `conekta:<org>`, and autopilot never sends it (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS).
2453
+ // `(?![\w/.-])` ends the path for a consumer that tests `match` unanchored.
2454
+ capability: "conekta_tokenizer",
2455
+ match: "(?:api\\.conekta\\.io/tokens|pay\\.conekta\\.com/api/tokens/?)(?![\\w/.-])",
2456
+ hosts: ["^api\\.conekta\\.io$", "^pay\\.conekta\\.com$"],
2457
+ encoding: "json",
2458
+ // Conekta.js's public key, its API version and the four headers beside them. Origin, Referer and cookies never ride.
2459
+ passthroughHeaders: ["^authorization$", "^accept$", "^accept-language$", "^conekta-client-user-agent$", "^raisehtmlerror$", "^x-tokenization-source$"],
2460
+ jsonCardFields: [["card", "number"]]
2461
+ },
2462
+ {
2463
+ psp: "makecommerce",
2464
+ // MakeCommerce (Maksekeskus AS; Estonia, Latvia, Lithuania, Finland), which takes the card in its own card frame
2465
+ // (https://cc.maksekeskus.ee/card) over the shop's order page. On Pay the frame posts the card in clear JSON to its
2466
+ // own origin, https://cc.maksekeskus.ee/card-payment, under the shop's publishable key (Basic authorization):
2467
+ // card.number, card.exp_month (MM), card.exp_year (YY), card.cvc and card.name, beside the transaction's id, the
2468
+ // shop's id and host, and the "Remember my card" and subscription boxes. makecommerce.js holds the request rule
2469
+ // the pause decision, the API's create and the device all read: exactly the card endpoint URL, the JSON type,
2470
+ // the body's own key under Basic, and the frame's body byte for byte, with either box ticked refused (it keeps
2471
+ // the card on file). The body names no amount: MakeCommerce's transaction holds it, in EUR. The endpoint answers
2472
+ // no browser origin, so the card leaves the cardholder's device only through the checkout relay, and only the
2473
+ // publishable key rides beside the card. cc-test.maksekeskus.ee is MakeCommerce's TEST environment: pinned (S7)
2474
+ // to test rows, which send only its published test cards.
2475
+ // Ships dark: served only to a client that declares `makecommerce_card_frame`, gated off for every org until an
2476
+ // operator lists one (`makecommerce:<org>`), and autopilot never sends this request (autopilot.js
2477
+ // DEVICE_REPLAY_REFUSED_OPERATIONS). `(?![\w/.%-])` ends the path for a consumer that tests `match` unanchored.
2478
+ capability: "makecommerce_card_frame",
2479
+ match: "cc(?:-test)?\\.maksekeskus\\.ee/card-payment(?![\\w/.%-])",
2480
+ hosts: ["^cc\\.maksekeskus\\.ee$", "^cc-test\\.maksekeskus\\.ee$"],
2481
+ sandboxHosts: ["^cc-test\\.maksekeskus\\.ee$"],
2482
+ hostEnvironmentPinned: true,
2483
+ encoding: "json",
2484
+ // The frame's publishable key. Origin, Referer and cookies never ride.
2485
+ passthroughHeaders: ["^authorization$"],
2486
+ jsonCardFields: [["card", "number"]]
2487
+ },
2488
+ {
2489
+ psp: "tokenex_iframe",
2490
+ // TokenEx hosted iframe v3 (v3.min.js?version=latest, read 2026-10-18) in PCI mode
2491
+ // with its CVV frame: JetBlue's booking checkout (TokenExID 9014311640612780, Origin
2492
+ // https://www.jetblue.com). PAN@ Data, CVV@ CvvValue (json). TokenEx's own card-number iframe document
2493
+ // on htp.tokenex.com reads the CVV from its same-origin CVV frame and posts the whole card as one XHR
2494
+ // to its own document URL, query included: application/json, with TokenExID, Origin, the
2495
+ // AuthenticationKey the merchant's server minted, Timestamp and TokenScheme (each echoed in the
2496
+ // query), the frame's flags, and no amount, cookie or merchant session. The cardholder name and the
2497
+ // expiry stay on the merchant's page. tokenex-iframe.js judges the whole request (the exact URL and
2498
+ // its query, the body's keys in order and their types, the query and body agreeing), refuses a
2499
+ // cvvOnly or PCI-only frame, a placeholder of another brand than the card, and an account it has not
2500
+ // reviewed, and writes only Data and CvvValue. BinLookup and Forter post to their own paths under
2501
+ // /iframe/v3 and never match (the right-edge boundary and the exact-URL rule in
2502
+ // resolveRecognizerForUrl); a post with an empty Data carries no card and continues untouched
2503
+ // (passWithoutCard). Hosts are the two literal labels (never *.tokenex.com: api. and test-api. are
2504
+ // TokenEx's server API, which carries merchant credentials); the test host is pinned (S7): it takes
2505
+ // only documented test cards, and a live row never points at it.
2506
+ // Ships dark: served only to a client that declares `tokenex_iframe_tokenize`, gated off for every
2507
+ // org until an operator allowlists one, and autopilot never sends this request (autopilot.js
2508
+ // DEVICE_REPLAY_REFUSED_OPERATIONS). Not paddle_tokenex: that lane is Paddle's own frame, which
2509
+ // encrypts the card for TokenEx inside Paddle's /pay.
2510
+ capability: "tokenex_iframe_tokenize",
2511
+ match: "(?:test-)?htp\\.tokenex\\.com/iframe/v3(?:[?#]|$)",
2512
+ hosts: ["^htp\\.tokenex\\.com$", "^test-htp\\.tokenex\\.com$"],
2513
+ sandboxHosts: ["^test-htp\\.tokenex\\.com$"],
2514
+ hostEnvironmentPinned: true,
2515
+ encoding: "json",
2516
+ passthroughHeaders: [],
2517
+ // only the content type rides: no cookie, origin or referer
2518
+ jsonCardFields: [["Data"]],
2519
+ passWithoutCard: "(?:test-)?htp\\.tokenex\\.com/iframe/v3"
2520
+ },
2521
+ {
2522
+ psp: "poynt",
2523
+ // GoDaddy Payments' card frame, Poynt Collect (cdn.poynt.net/collect/payment-form), on a GoDaddy
2524
+ // Online Store checkout: one JSON POST to generate-nonce for the store the URL names. PAN@
2525
+ // card.number, with expirationMonth ("MM"), expirationYear ("20YY") and the network the frame read
2526
+ // (type) beside it, and the security code outside the card, at verificationData.cvData. poynt.js
2527
+ // holds the request rule the pause decision, the API's create and the device all read: exactly the
2528
+ // URL, the frame's headers and the frame's body byte for byte. Poynt answers with a nonce that
2529
+ // GoDaddy's server charges. services.poynt.net refuses every browser origin but the frame's, so the
2530
+ // card leaves the cardholder's device only through the checkout relay. The frame's open-tokenize
2531
+ // path, for a page that names no store, is not matched, so it continues untouched. No sandbox host.
2532
+ // Ships dark: served only to a client that declares `poynt_collect_nonce`, gated off for every org
2533
+ // until an operator lists one (`poynt:<org>`), held to the stores poynt.js pins per checkout
2534
+ // origin, and autopilot never sends this request (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS).
2535
+ capability: "poynt_collect_nonce",
2536
+ match: "services\\.poynt\\.net/v1/commerce/stores/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/payment-tokens/generate-nonce",
2537
+ hosts: ["^services\\.poynt\\.net$"],
2538
+ encoding: "json",
2539
+ // The frame's own session, request and version ids, Sardine's session and the reCAPTCHA Enterprise
2540
+ // token Poynt checks; never the page's Authorization, which GoDaddy's checkout does not pass.
2541
+ passthroughHeaders: [
2542
+ "^poynt-session-id$",
2543
+ "^poynt-request-id$",
2544
+ "^poynt-collect-version$",
2545
+ "^poynt-sardine-session-id$",
2546
+ "^recaptcha-token$",
2547
+ "^recaptcha-type$"
2548
+ ]
2549
+ },
2550
+ {
2551
+ psp: "cardcom",
2552
+ // Cardcom (Israel), whose own payment page (https://secure.cardcom.solutions/EA/EA5/<page id>, Cardcom's Vue app)
2553
+ // posts the whole page state on Process, as same-origin JSON, to https://secure.cardcom.solutions/api/EA5/SubmitPayment:
2554
+ // the bot check's token, the page's seven stores and a 3-D Secure block. The card sits in clear text twice,
2555
+ // Store.PaymentStore.{CardNumberField, MonthsField, YearsField, CvvField, CardOwnerNameField}.Value and
2556
+ // _3DSecureReq.{CardNumber, CardExpireMonth, CardExpireYear, CVV, CardholderFullName}; the page id, the terminal and
2557
+ // the amount ride beside it. cardcom.js holds the request rule the pause decision, the API's create and the device
2558
+ // all read: exactly that URL, the page's one JSON Content-Type, and the page's own body for a one-time charge of one
2559
+ // product, its two copies of the card the same; a standing order, installments, a kept card, 3-D Secure, an
2560
+ // Israeli ID and a Turnstile or reCAPTCHA v2 page are refused by name. The endpoint answers any browser origin, so
2561
+ // the device sends it by a direct fetch, with no cookie, and the bot check's token rides inside the paused body as
2562
+ // the person's press minted it. Cardcom's test terminal shares the live host, so no sandbox host is marked and the
2563
+ // lane takes live rows alone, each under a reviewed page pin (cardcom.js cardcomMerchantRefusal). Cardcom answers
2564
+ // inside HTTP 200 whether it charged or not, so its own judge reads every answer (cardcom.js cardcomAnswerOutcome).
2565
+ // The LowProfile pages' /api/LPC6/SubmitPayment, the wallets' posts and the legacy EA4 pages are not this lane's.
2566
+ // Ships dark: served only to a client that declares `cardcom_payment_page`, gated off for every org until an
2567
+ // operator lists one (`cardcom:<org>`), and autopilot never sends this request (autopilot.js
2568
+ // DEVICE_REPLAY_REFUSED_OPERATIONS). `(?![\w/.%-])` ends the path for a consumer that tests `match` unanchored.
2569
+ capability: "cardcom_payment_page",
2570
+ match: "secure\\.cardcom\\.solutions/api/EA5/SubmitPayment(?![\\w/.%-])",
2571
+ hosts: ["^secure\\.cardcom\\.solutions$"],
2572
+ encoding: "json",
2573
+ // The device writes the JSON Content-Type itself; Origin, Referer and the page's cookies never ride.
2574
+ passthroughHeaders: [],
2575
+ jsonCardFields: [["Store", "PaymentStore", "CardNumberField", "Value"], ["_3DSecureReq", "CardNumber"]]
2576
+ },
2577
+ {
2578
+ psp: "nexi_checkout",
2579
+ // Nexi Checkout (formerly Nets Easy; Denmark, Norway, Sweden, Finland), which takes the card in its own card frame,
2580
+ // https://checkout.dibspayment.eu/v1/, embedded in the merchant's page by checkout.js or mounted by Nexi's hosted
2581
+ // payment page. On Pay the frame posts the card in clear JSON to its own origin, https://checkout.dibspayment.eu/
2582
+ // api/v1/pay, with the merchant's checkout key and the payment's id as headers: paymentType.card.cardNumber,
2583
+ // expiryMonth (MM), expiryYear (YY), cardVerificationCode and cardholderName, beside the payment's amount in minor
2584
+ // units, the card fee and the "save my card" and "remember me" flags. nexi-checkout.js holds the request rule the
2585
+ // pause decision, the API's create and the device all read: exactly the pay endpoint URL, the JSON type, the frame's
2586
+ // session headers and the card form's body byte for byte, with "save my card", "remember me" or a card fee refused
2587
+ // by name. The endpoint answers no browser origin, so the card leaves the cardholder's device only through the
2588
+ // checkout relay, and only the frame's four session headers ride beside the card. test.checkout.dibspayment.eu is
2589
+ // Nexi's test environment: pinned (S7) to test rows, which send only Nexi's published test cards.
2590
+ // Ships dark: served only to a client that declares `nexi_checkout_pay`, gated off for every org until an operator
2591
+ // lists one (`nexi_checkout:<org>`), and autopilot never sends this request (autopilot.js
2592
+ // DEVICE_REPLAY_REFUSED_OPERATIONS). `(?![\w/.%-])` ends the path for a consumer that tests `match` unanchored.
2593
+ capability: "nexi_checkout_pay",
2594
+ match: "(?:test\\.)?checkout\\.dibspayment\\.eu/api/v1/pay(?![\\w/.%-])",
2595
+ hosts: ["^checkout\\.dibspayment\\.eu$", "^test\\.checkout\\.dibspayment\\.eu$"],
2596
+ sandboxHosts: ["^test\\.checkout\\.dibspayment\\.eu$"],
2597
+ hostEnvironmentPinned: true,
2598
+ encoding: "json",
2599
+ // The frame's checkout key, payment id, partner merchant number and API version. Origin, Referer and cookies never ride.
2600
+ passthroughHeaders: ["^checkoutkey$", "^paymentid$", "^partnermerchantnumber$", "^api-version$"],
2601
+ jsonCardFields: [["paymentType", "card", "cardNumber"]]
2602
+ },
2603
+ {
2604
+ psp: "openpay_bbva",
2605
+ // Openpay (BBVA México's online acquiring platform; Openpay Colombia and Openpay Perú) through openpay.js, the
2606
+ // tokenizer a merchant's own page loads: on Pay it posts the card with one XHR, in clear JSON, to
2607
+ // https://api.openpay.mx/v1/<merchant id>/tokens (api.openpay.co, api.openpay.pe) under the merchant's public key
2608
+ // (Basic authorization), as {card_number, holder_name, cvv2, expiration_month, expiration_year[, address]} in the
2609
+ // caller's own order and types. The answer is a single-use token the merchant's server charges later; the request
2610
+ // names no amount, so the agent's amount is the price the cardholder approves. openpay.js holds the rules the pause
2611
+ // decision, the API's create, the prepared bind and the device read: the exact token URL, openpay.js's three
2612
+ // headers and the caller's body member by member. openpay.js abandons the request 40 s after Pay, so the lane is
2613
+ // prepared only (preparationRequired). Openpay's API answers any browser origin, so the card leaves the
2614
+ // cardholder's device by a direct fetch. A production request pays only an origin whose reviewed pin names its
2615
+ // host, merchant id and key (openpay.js openpayMerchantRefusal). sandbox-api.openpay.<tld> is Openpay's sandbox:
2616
+ // pinned (S7) to test rows, which send only Openpay's documented test cards. Openpay can answer a refusal inside a
2617
+ // 2xx, so its own judge reads every answer (openpay.js openpayAnswerOutcome), never the shared status rule.
2618
+ // Ships dark: served only to a client that declares `openpay_tokenizer`, gated off for every org until an operator
2619
+ // lists `openpay_bbva:<org>`, and autopilot never sends it (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS).
2620
+ // `(?![\w/.%-])` ends the path for a consumer that tests `match` unanchored.
2621
+ capability: "openpay_tokenizer",
2622
+ match: "(?:sandbox-)?api\\.openpay\\.(?:mx|co|pe)/v1/[a-z0-9]{10,40}/tokens(?![\\w/.%-])",
2623
+ hosts: [
2624
+ "^api\\.openpay\\.mx$",
2625
+ "^api\\.openpay\\.co$",
2626
+ "^api\\.openpay\\.pe$",
2627
+ "^sandbox-api\\.openpay\\.mx$",
2628
+ "^sandbox-api\\.openpay\\.co$",
2629
+ "^sandbox-api\\.openpay\\.pe$"
2630
+ ],
2631
+ sandboxHosts: ["^sandbox-api\\.openpay\\.mx$", "^sandbox-api\\.openpay\\.co$", "^sandbox-api\\.openpay\\.pe$"],
2632
+ hostEnvironmentPinned: true,
2633
+ preparationRequired: true,
2634
+ encoding: "json",
2635
+ // openpay.js's public key and its JSON Accept. Origin, Referer and cookies never ride.
2636
+ passthroughHeaders: ["^authorization$", "^accept$"],
2637
+ jsonCardFields: [["card_number"]]
2638
+ },
2639
+ {
2640
+ psp: "toast",
2641
+ // Toast's payments frame (payments.toasttab.com), the card leg of every Toast online-ordering and
2642
+ // e-gift checkout: one POST to /v1/payment-methods with the card sealed in card.cardData, RSA-OAEP
2643
+ // with SHA-1 over a JSON object under a 2048-bit key the frame hardcodes. toast.js holds the one
2644
+ // request rule the pause decision, the API's create, the approve leg and the device read: exactly
2645
+ // that URL and the frame's guest card body byte for byte, under the key id toast.js pins. The device
2646
+ // seals the real card under that pinned key (never one from a row, a request or a page), and the
2647
+ // agent's browser continues its own request with only cardData rewritten, so the frame's bearer,
2648
+ // its restaurant and intent headers and the session secret stay the page's and none is stored. Apple
2649
+ // Pay and Google Pay payment methods share the URL, carry no card the Vault holds, and continue
2650
+ // untouched (passWithoutCard); `jsonCardFields` names where the card sits, and toast.js's own gate
2651
+ // answers before it (card-fields.js). Toast's sandbox needs a partner account, so only the live host is
2652
+ // named and a test row is refused at create. Ships dark: served only to a client that declares
2653
+ // `toast_pinned_key`, off for every org until an operator lists `toast:<org>`, and autopilot never
2654
+ // sends it (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS). `(?![\w/.-])` ends the path, so a
2655
+ // consumer that tests `match` unanchored never takes /v1/payment-methods/x for a card request.
2656
+ capability: "toast_pinned_key",
2657
+ match: "payments\\.toasttab\\.com/v1/payment-methods(?![\\w/.-])",
2658
+ hosts: ["^payments\\.toasttab\\.com$"],
2659
+ encoding: "json",
2660
+ passthroughHeaders: [],
2661
+ jsonCardFields: [["card", "cardData"]],
2662
+ passWithoutCard: "payments\\.toasttab\\.com/v1/payment-methods",
2663
+ clientSideEncrypted: true,
2664
+ mode: "cse",
2665
+ cse: { scheme: "rsa-oaep-sha1-json", at: "card", fields: ["cardData"] }
2666
+ },
2667
+ {
2668
+ psp: "fastspring",
2669
+ // FastSpring's checkout, the merchant of record for every FastSpring store: the popup (Store Builder
2670
+ // Library), embedded and web storefronts all run FastSpring's one checkout app, and its Pay posts the
2671
+ // card as one JSON XHR to <store>.onfastspring.com[/popup-<name>|/embedded-<name>]/session/<id>/payment
2672
+ // (<store>.test.onfastspring.com in a store's test mode) under the session's X-Session-Token. PAN@
2673
+ // card.number, in FastSpring's groups of four or as digits, with card.month, card.year and
2674
+ // card.security beside it. fastspring.js holds the request rule the pause decision, the API's create and
2675
+ // the device all read: exactly a session's /payment URL, a JSON Content-Type, the token, and the card
2676
+ // body (a card FastSpring saved, a renewal, a gift, a tax id's EBANX route and a CAPTCHA answer each
2677
+ // refused by name). The request names no amount and no seller: the store in the host is the payee,
2678
+ // so a live payment goes only to a store fastspring.js pins, and the session's own document names
2679
+ // the total. PayPal, wallets and bank methods post the same URL with no card and continue untouched
2680
+ // (passWithoutCard). The checkout answers no other origin's preflight, so the card leaves the
2681
+ // cardholder's device only through the checkout relay. Ships dark: served only to a client that
2682
+ // declares `fastspring_card_payment`, gated off for every org until an operator lists one
2683
+ // (`fastspring:<org>`), and autopilot never sends this request (autopilot.js
2684
+ // DEVICE_REPLAY_REFUSED_OPERATIONS). The environment is pinned (S7): a test store's host only on test
2685
+ // rows and only with documented test cards. `(?![\w/.%;-])` ends the path for a consumer that tests
2686
+ // `match` unanchored. Not here: FastSpring Classic (sites.fastspring.com), a separate application
2687
+ // whose card step is a session-bound form navigation.
2688
+ capability: "fastspring_card_payment",
2689
+ match: "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.test)?\\.onfastspring\\.com(?:/(?:popup|embedded)-[A-Za-z0-9_-]{1,64})?/session/[A-Za-z0-9_-]{16,64}/payment(?![\\w/.%;-])",
2690
+ hosts: ["^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.onfastspring\\.com$", "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.test\\.onfastspring\\.com$"],
2691
+ sandboxHosts: ["^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.test\\.onfastspring\\.com$"],
2692
+ hostEnvironmentPinned: true,
2693
+ encoding: "json",
2694
+ // The session's token, which FastSpring's interceptor writes on every call of the page. Origin,
2695
+ // Referer and cookies never ride: the session id and the token are the whole binding.
2696
+ passthroughHeaders: ["^x-session-token$"],
2697
+ jsonCardFields: [["card", "number"]],
2698
+ passWithoutCard: "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.test)?\\.onfastspring\\.com(?:/(?:popup|embedded)-[A-Za-z0-9_-]{1,64})?/session/[A-Za-z0-9_-]{16,64}/payment"
2699
+ },
2700
+ {
2701
+ psp: "omise",
2702
+ // Omise's card token (Opn Payments; Thailand, Japan, Singapore and Malaysia): every Omise card form, the card
2703
+ // frame cdn.omise.co/pay.html that the official WooCommerce plugin, Omise's hosted checkout page and Payment
2704
+ // Links+ load, and a merchant's own form calling Omise.js 2.16.0, posts the card in one JSON body to Omise's
2705
+ // vault under the merchant's public key (Basic): PAN@ card.number, the expiry @ card.expiration_month and
2706
+ // .expiration_year in the form's own spelling, the code @ card.security_code, beside the holder's name and
2707
+ // address. Unencrypted, and it names no amount: the merchant's server charges the token for its own order
2708
+ // afterwards. omise.js holds the rule the pause decision, the API's create and the device all read: exactly
2709
+ // this URL, a public key and Omise.js's own headers, and the card form's token body as JSON.stringify writes
2710
+ // it, with a wallet's tokenization on the same URL refused. vault.omise.co answers the Vault's origin
2711
+ // (Access-Control-Allow-Origin *), so the cardholder's device sends it itself. Test mode shares the host
2712
+ // under a pkey_test_ key, so no sandbox host is marked: the device sends a test key only Omise's documented
2713
+ // test cards (omise.js OMISE_TEST_CARDS). 3-D Secure, where the merchant's account runs it, follows the
2714
+ // merchant's charge on 3dsms.omise.co with no card.
2715
+ // Ships dark: served only to a client that declares `omise_card_token`, gated off for every org until an
2716
+ // operator lists one (`omise:<org>`), and the backend's gate serves only Agentcard's own company until the
2717
+ // token's public key is bound to the merchant (backend config.ts OMISE_KEY_BOUND_TO_MERCHANT). Autopilot never
2718
+ // sends this request (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS).
2719
+ capability: "omise_card_token",
2720
+ match: "vault\\.omise\\.co/tokens",
2721
+ hosts: ["^vault\\.omise\\.co$"],
2722
+ encoding: "json",
2723
+ // Omise.js's own headers: the public key and its client's name. Origin, Referer and cookies never ride.
2724
+ passthroughHeaders: ["^authorization$", "^x-user-agent$"],
2725
+ jsonCardFields: [["card", "number"]]
2726
+ },
2727
+ {
2728
+ psp: "xendit",
2729
+ // Xendit's hosted invoice checkout (checkout.xendit.co/web/<invoice id>), which every Xendit Invoice API
2730
+ // merchant, dashboard payment link and donation link, Shopify's Xendit app and the older WooCommerce plugin
2731
+ // open: its Pay Now hands the card to Xendit.js 2.6.1, which posts it as one JSON body to Xendit's own API
2732
+ // under the business's publishable key (Basic). PAN@ card_data.account_number, the expiry as "MM" and
2733
+ // "YYYY" @ card_data.exp_month and .exp_year, the code @ card_data.cvn and again @ card_cvn, beside the
2734
+ // invoice's amount and currency. Unencrypted. xendit.js holds the rule the pause decision, the API's create
2735
+ // and the device all read: exactly this URL, the publishable key and Xendit.js's own headers, and the card
2736
+ // form's single-use token body byte for byte, with a multi-use token (the card kept on file, and the
2737
+ // checkout's Safe Acceptance mode) refused by its own code, and a token that skips 3-D Secure or names a
2738
+ // xenPlatform sub-account refused too. storeCVN posts a code alone to the same URL
2739
+ // and is refused like any other body. api.xendit.co answers the Vault's origin (Access-Control-Allow-Origin
2740
+ // *), so the cardholder's device sends it itself. Test mode shares the host under an xnd_public_development_
2741
+ // key, so no sandbox host is marked: the device sends a test-mode key only Xendit's documented test cards
2742
+ // (xendit.js XENDIT_TEST_CARDS). 3-D Secure follows the answer on redirect.xendit.co with no card.
2743
+ // Ships dark: served only to a client that declares `xendit_card_token`, gated off for every org until an
2744
+ // operator lists one (`xendit:<org>`), and the backend's gate serves only Agentcard's own company until the
2745
+ // token's publishable key is bound to the merchant (backend config.ts XENDIT_KEY_BOUND_TO_MERCHANT). Autopilot
2746
+ // never sends this request (autopilot.js DEVICE_REPLAY_REFUSED_OPERATIONS).
2747
+ capability: "xendit_card_token",
2748
+ match: "api\\.xendit\\.co/v2/credit_card_tokens",
2749
+ hosts: ["^api\\.xendit\\.co$"],
2750
+ encoding: "json",
2751
+ // Xendit.js's own headers: the publishable key, and the client's type, version and id (the invoice). Origin,
2752
+ // Referer and cookies never ride.
2753
+ passthroughHeaders: ["^authorization$", "^client-type$", "^client-version$", "^client-id$"],
2754
+ jsonCardFields: [["card_data", "account_number"]]
2230
2755
  }
2231
2756
  ]);
2232
2757
  var PSP_RECOGNIZERS = deepFreeze(PROCESSOR_DEFINITIONS.map(({ compose, encryptedCardFields, deviceSteps, deviceEncrypt, ...definition }) => definition));
@@ -2407,6 +2932,10 @@ var WIX_PAYMENTS_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2407
2932
  // src/paymongo.js
2408
2933
  var PAYMONGO_CHECKOUT_HOST = "checkout.paymongo.com";
2409
2934
  var ORIGIN = `https://${PAYMONGO_CHECKOUT_HOST}/`;
2935
+ // src/gopay.js
2936
+ var GOPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2937
+ Object.freeze({ id: "caramilla", merchant: "Caramilla.cz", origins: Object.freeze(["https://www.caramilla.cz"]) })
2938
+ ]);
2410
2939
  // src/payrexx.js
2411
2940
  var PAYREXX_FOLLOW_UP_WINDOW_MS = 15 * 60 * 1e3;
2412
2941
  var PAYREXX_FOLLOW_UP_IDLE_MS = 60 * 1e3;
@@ -2418,6 +2947,17 @@ var PAYGENT_TOKEN_HOSTS = /* @__PURE__ */ Object.freeze({
2418
2947
  sandbox: Object.freeze(["sandbox.paygent.co.jp"])
2419
2948
  });
2420
2949
  var PAYGENT_CONTENT_TYPE = "text/plain;charset=UTF-8";
2950
+ var pin4 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]) });
2951
+ var PAYGENT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2952
+ pin4({
2953
+ id: "fundex_tcs_eng",
2954
+ merchant: "Tokyo Chinese School",
2955
+ merchantId: "60362",
2956
+ keySha256: "6073dee112b1e4089025d1c1f3c4cfad818c314a81943ffa55b839cb2df51018",
2957
+ origins: ["https://fundexapp.jp"],
2958
+ currency: "jpy"
2959
+ })
2960
+ ]);
2421
2961
  // src/multipart-form.js
2422
2962
  var BOUNDARY_CHARACTERS = "[A-Za-z0-9'+_.-]{1,70}";
2423
2963
  var BOUNDARY = new RegExp(`^${BOUNDARY_CHARACTERS}$`);
@@ -2427,9 +2967,9 @@ function multipartBoundary(contentType) {
2427
2967
  return match ? match[1] : null;
2428
2968
  }
2429
2969
  // src/pay-nl.js
2430
- var pin4 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), serviceIds: Object.freeze([...fields.serviceIds]) });
2970
+ var pin5 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), serviceIds: Object.freeze([...fields.serviceIds]) });
2431
2971
  var PAY_NL_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2432
- pin4({ id: "weeztix", merchant: "Weeztix", origins: ["https://shop.weeztix.com"], serviceIds: ["SL-6399-2740"] })
2972
+ pin5({ id: "weeztix", merchant: "Weeztix", origins: ["https://shop.weeztix.com"], serviceIds: ["SL-6399-2740"] })
2433
2973
  ]);
2434
2974
  var ERROR_KEYS = /* @__PURE__ */ Object.freeze(["errorId", "errorTag", "errorMessage", "errorFieldName"]);
2435
2975
  var REQUEST_KEYS = /* @__PURE__ */ Object.freeze(["result", ...ERROR_KEYS]);
@@ -2446,9 +2986,235 @@ var TWOC2P_KEYS = /* @__PURE__ */ Object.freeze({
2446
2986
  script: Object.freeze({ url: "https://demo2.2c2p.com/2C2PFrontEnd/SecurePayment/api/my2c2p.1.7.6.min.js", sha256: "435723d92bfefb00607a56851967e0b745d52b8d49443de5f0000f0583fde5cc" })
2447
2987
  })
2448
2988
  });
2989
+ // src/hipay.js
2990
+ var pin6 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), usernames: Object.freeze([...fields.usernames]) });
2991
+ var HIPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2992
+ pin6({ id: "happybulle", merchant: "HappyBulle", origins: ["https://www.happybulle.com"], usernames: ["94683309.secure-gateway.hipay-tpp.com"] })
2993
+ ]);
2449
2994
  // src/amazon-payment-services.js
2450
2995
  var BODY_LIMIT = 32 * 1024;
2451
2996
  var ANSWER_LIMIT = 64 * 1024;
2997
+ // src/clover.js
2998
+ var REQUIRED_KEYS = /* @__PURE__ */ Object.freeze(["encrypted_pan", "exp_month", "exp_year", "cvv", "first6", "last4", "brand"]);
2999
+ var OPTIONAL_KEYS = /* @__PURE__ */ Object.freeze(["address_line1", "phone_numbers", "email_address", "name", "address_zip"]);
3000
+ var CARD_ORDER = /* @__PURE__ */ Object.freeze([...REQUIRED_KEYS, ...OPTIONAL_KEYS]);
3001
+ // src/tap-payments.js
3002
+ var pin7 = (fields) => Object.freeze({
3003
+ ...fields,
3004
+ origins: Object.freeze([...fields.origins]),
3005
+ sessions: Object.freeze({ ...fields.sessions }),
3006
+ key: Object.freeze({ ...fields.key })
3007
+ });
3008
+ var TAP_PAYMENTS_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
3009
+ pin7({
3010
+ id: "casefilegame",
3011
+ merchant: "Casefilegame",
3012
+ tapMerchantId: "67977048",
3013
+ publishableKey: "pk_live_ydlRjrWcLXaVvpsSBQKOie86",
3014
+ environment: "production",
3015
+ origins: ["https://checkout.tap.company"],
3016
+ // The WooCommerce plugin's redirect (Plugin-WooCommerce-All-in-one tap.php 567-586, read 2026-10-17)
3017
+ // creates the src_all charge with save_card false and names no agreement, subscription or destinations.
3018
+ sessions: { saveCard: false, agreement: false, subscription: false, destinations: false },
3019
+ key: {
3020
+ spki: "MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAzja2vB+Iyafj2Mm3pFg65z7Yvj9ZeoFLdMBgWFyyjF020r5HSPKVhuZ39uJkjs0U/kWgEpKDzHZAKdtGv36dS33NjMAzYpgFkD8j+9/YWqpvAGRj5nv1b/q7NaiZk3b1wm7aXHJOx5L6rPQf2qDQxhcSNHocU+Uy8wGmGxRRu6QRKN3khaz4o4jJDzqxns4h/ShzHjdZeWIVfpCAyVoED0IESBYrvGEhJeyKnga5XdHdBU2yP8P1huO4RbSKcZv00ZgxVHAQQ9CqArW3TE8SyLLnJPkSpSHHBnIPSQS1z3ld1mImy/zqTd4ltkV6XHpYqVvoPmys2EuZX3pMvCcPGwIBEQ==",
3021
+ sha256: "6eb4e89a1e05a06a39d631f6fb450c052a9cad9935edc1921e84e80207470552",
3022
+ // The shared parser takes exponent 17 only under a pin that names it (rsa-pkcs1v15.js).
3023
+ exponent: 17
3024
+ }
3025
+ })
3026
+ ]);
3027
+ // src/conekta.js
3028
+ var LETTERS = "A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u017F";
3029
+ var PAGE_NAME = new RegExp(`^[${LETTERS} .'-]{1,64}$`);
3030
+ var HAS_LETTER = new RegExp(`[${LETTERS}]`);
3031
+ var ADDRESS_VALUE = new RegExp(`^[\\x20-\\x7e\\u00a0-\\u017f]{0,128}$`);
3032
+ var PAN_LIKE = new RegExp(`(?:[0-9][^0-9${LETTERS}]*){12,}`);
3033
+ var HOLDER = new RegExp(`^[${LETTERS}](?:[${LETTERS} .'-]{0,62}[${LETTERS}.])?$`);
3034
+ var ERROR_TYPE_STATUS = /* @__PURE__ */ Object.freeze({
3035
+ malformed_request_error: 400,
3036
+ authentication_error: 401,
3037
+ processing_error: 402,
3038
+ resource_not_found_error: 404,
3039
+ conflict_error: 409,
3040
+ precondition_required_error: 412,
3041
+ parameter_validation_error: 422
3042
+ });
3043
+ var CONEKTA_ANSWER_ERROR_TYPES = /* @__PURE__ */ Object.freeze(Object.keys(ERROR_TYPE_STATUS));
3044
+ // src/tokenex-iframe.js
3045
+ var TOKENEX_IFRAME_HOSTS = Object.freeze(["htp.tokenex.com", "test-htp.tokenex.com"]);
3046
+ var TOKENEX_IFRAME_REFUSAL_REASONS = Object.freeze(["unsupported", "brand_mismatch", "unreviewed_account"]);
3047
+ var TOKENEX_IFRAME_BODY_KEYS = Object.freeze([
3048
+ "TokenExID",
3049
+ "Origin",
3050
+ "AuthenticationKey",
3051
+ "Timestamp",
3052
+ "Data",
3053
+ "CvvValue",
3054
+ "TokenScheme",
3055
+ "CvvOnly",
3056
+ "PCI",
3057
+ "ReturnHash",
3058
+ "use3DS",
3059
+ "ThreeDSMethodNotificationUrl",
3060
+ "kountSessionId",
3061
+ "fraudMerchantId",
3062
+ "UseKount",
3063
+ "kountMode",
3064
+ "kountAnId",
3065
+ "FraudServicesRiskRequestModel",
3066
+ "EnforceLuhnCompliance",
3067
+ "CustomDataLuhnCheck"
3068
+ ]);
3069
+ var TOKENEX_IFRAME_TOKEN_SCHEMES = Object.freeze(["sixTOKENfour"]);
3070
+ var TOKENEX_IFRAME_REVIEWED_ACCOUNTS = Object.freeze({
3071
+ "htp.tokenex.com": Object.freeze({}),
3072
+ "test-htp.tokenex.com": Object.freeze({})
3073
+ });
3074
+ var TOKENEX_IFRAME_ACCOUNT_NAMES = Object.freeze({
3075
+ "htp.tokenex.com": Object.freeze({}),
3076
+ "test-htp.tokenex.com": Object.freeze({})
3077
+ });
3078
+ var exact = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
3079
+ var text = (value, max) => typeof value === "string" && value.length <= max && !/[\u0000-\u001f\u007f]/.test(value);
3080
+ var digits = (value, min, max) => typeof value === "string" && value.length >= min && value.length <= max && !/[^0-9]/.test(value);
3081
+ var panLike = (value) => (value.match(/\p{Nd}/gu) ?? []).length >= 12;
3082
+ var plain = (value, max) => text(value, max) && !panLike(value);
3083
+ var TOKENEX_ID = /^[0-9]{16}$/;
3084
+ var AUTHENTICATION_KEY = /^[A-Za-z0-9+/]{43}=$/;
3085
+ var TIMESTAMP = /^20[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12][0-9]|3[01])(?:[01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]$/;
3086
+ function isOrigin(value) {
3087
+ if (typeof value !== "string" || value.length > 255 || !value.startsWith("https://"))
3088
+ return false;
3089
+ try {
3090
+ return new URL(value).origin === value;
3091
+ }
3092
+ catch {
3093
+ return false;
3094
+ }
3095
+ }
3096
+ var BOUND = {
3097
+ TokenExID: (value) => exact(TOKENEX_ID, value),
3098
+ Origin: isOrigin,
3099
+ AuthenticationKey: (value) => exact(AUTHENTICATION_KEY, value),
3100
+ Timestamp: (value) => exact(TIMESTAMP, value),
3101
+ TokenScheme: (value) => TOKENEX_IFRAME_TOKEN_SCHEMES.includes(value)
3102
+ };
3103
+ var BOUND_KEYS = Object.keys(BOUND);
3104
+ var BOOLEAN = /^(?:true|false)$/i;
3105
+ var QUERY_RULES = {
3106
+ ...BOUND,
3107
+ Mode: (value) => value === "Data",
3108
+ PCI: (value) => exact(/^true$/i, value),
3109
+ CVV: (value) => exact(/^true$/i, value),
3110
+ Container: (value) => exact(/^[A-Za-z][A-Za-z0-9_-]{0,63}$/, value),
3111
+ CvvContainer: (value) => exact(/^[A-Za-z][A-Za-z0-9_-]{0,63}$/, value),
3112
+ EnforceLuhnCompliance: (value) => exact(BOOLEAN, value),
3113
+ CustomDataLabel: (value) => plain(value, 64),
3114
+ CustomCvvDataLabel: (value) => plain(value, 64),
3115
+ ExpiresInSeconds: (value) => exact(/^[1-9][0-9]{0,3}$/, value),
3116
+ ReturnAutoCompleteValues: (value) => exact(BOOLEAN, value)
3117
+ };
3118
+ var QUERY_REQUIRED = [...BOUND_KEYS, "Mode", "PCI", "CVV"];
3119
+ var PLACEHOLDER = /^[0-9]{1,19}(?: [0-9]{1,19}){0,5}$/;
3120
+ var placeholderDigits = (value) => exact(PLACEHOLDER, value) && value.length <= 23 ? value.replace(/ /g, "") : null;
3121
+ var RULES = {
3122
+ ...BOUND,
3123
+ Data: (value) => {
3124
+ const pan = placeholderDigits(value);
3125
+ return pan !== null && pan.length >= 13 && pan.length <= 19;
3126
+ },
3127
+ CvvValue: (value) => digits(value, 3, 4),
3128
+ CvvOnly: (value) => value === "False",
3129
+ PCI: (value) => value === "True",
3130
+ ReturnHash: (value) => value === null,
3131
+ use3DS: (value) => value === "False",
3132
+ ThreeDSMethodNotificationUrl: (value) => value === "",
3133
+ kountSessionId: (value) => value === "",
3134
+ fraudMerchantId: (value) => value === "",
3135
+ UseKount: (value) => value === "False",
3136
+ kountMode: (value) => value === "",
3137
+ kountAnId: (value) => value === "",
3138
+ FraudServicesRiskRequestModel: (value) => value === "",
3139
+ EnforceLuhnCompliance: (value) => value === "true" || value === "false",
3140
+ CustomDataLuhnCheck: (value) => value === true
3141
+ };
3142
+ var TOKENEX_IFRAME_GATE_CODES = Object.freeze(["tokenex_iframe_url_refused", "tokenex_iframe_body_unsupported", "tokenex_iframe_query_mismatch"]);
3143
+ var SUCCESS_RULES = {
3144
+ token: (value) => digits(value, 13, 19),
3145
+ firstSix: (value) => digits(value, 6, 6),
3146
+ lastFour: (value) => digits(value, 4, 4),
3147
+ referenceNumber: (value) => exact(/^[A-Za-z0-9-]{1,64}$/, value),
3148
+ tokenHMAC: (value) => exact(/^[A-Za-z0-9+/]{1,128}={0,2}$/, value),
3149
+ cvvIncluded: (value) => typeof value === "boolean"
3150
+ };
3151
+ var SUCCESS_KEYS = Object.keys(SUCCESS_RULES);
3152
+ // src/openpay.js
3153
+ var LETTERS2 = "A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u017F";
3154
+ var PAGE_NAME2 = new RegExp(`^[${LETTERS2} .'-]{1,64}$`);
3155
+ var HAS_LETTER2 = new RegExp(`[${LETTERS2}]`);
3156
+ var ADDRESS_VALUE2 = new RegExp(`^[\\x20-\\x7e\\u00a0-\\u017f]{0,128}$`);
3157
+ var PAN_LIKE2 = new RegExp(`(?:[0-9][^0-9${LETTERS2}]*){12,}`);
3158
+ var pin8 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), publicKeys: Object.freeze([...fields.publicKeys]) });
3159
+ var OPENPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
3160
+ pin8({
3161
+ id: "diario_de_yucatan",
3162
+ merchant: "Diario de Yucatán",
3163
+ origins: ["https://www.yucatan.com.mx"],
3164
+ host: "api.openpay.mx",
3165
+ merchantId: "mqyloyrm8tsvtsgcrj0d",
3166
+ publicKeys: ["pk_260aa43616a445bb98472e6ca51da968"]
3167
+ })
3168
+ ]);
3169
+ // src/poynt.js
3170
+ var UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
3171
+ var NONCE_URL = new RegExp(`^https://services\\.poynt\\.net/v1/commerce/stores/(${UUID})/payment-tokens/generate-nonce$`);
3172
+ var STORE_ID = new RegExp(`^${UUID}$`);
3173
+ var APPLICATION_ID = new RegExp(`^urn:aid:${UUID}$`);
3174
+ var pin9 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), storeIds: Object.freeze([...fields.storeIds]) });
3175
+ var POYNT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
3176
+ pin9({
3177
+ id: "yearning_for_learning",
3178
+ merchant: "Yearning for Learning Publishing & Coaching",
3179
+ origins: ["https://ff305485-ba6c-423a-87b0-cebe3f83ffe9.mysimplestore.com"],
3180
+ storeIds: ["71ac12ed-e61f-4318-95db-db0e7c649d6f"]
3181
+ }),
3182
+ pin9({
3183
+ id: "timber_ridge_bookkeeping",
3184
+ merchant: "Timber Ridge Bookkeeping",
3185
+ origins: ["https://d7d64ac3-0352-4e53-af9a-f6d8e7b5fb71.mysimplestore.com"],
3186
+ storeIds: ["27be984a-0a03-4a54-8675-e64bbbe1c43e"]
3187
+ })
3188
+ ]);
3189
+ var MAX_ANSWER_CHARS = 16 * 1024;
3190
+ // src/cardcom.js
3191
+ var CARDCOM_ORIGIN = "https://secure.cardcom.solutions";
3192
+ var CARDCOM_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
3193
+ Object.freeze({
3194
+ id: "machon_alte_usd",
3195
+ merchant: "Machon Alte",
3196
+ origins: Object.freeze([CARDCOM_ORIGIN]),
3197
+ page: "kzR5pTyr0kC3oqjpGbCMiQ",
3198
+ terminal: 162226,
3199
+ products: Object.freeze([Object.freeze({ uid: "JoQrlcuGCUWYM4I66eX7pw", currency: "usd", price: null })]),
3200
+ settings: "e38d7c7abce83a3a994a707e345595cf6ec2a15d77794a8eea70c0d5ce4773ab"
3201
+ })
3202
+ ]);
3203
+ // src/toast.js
3204
+ var TOAST_SUBSTITUTION = /* @__PURE__ */ Object.freeze({ at: "card", fields: Object.freeze(["cardData"]) });
3205
+ // src/fastspring.js
3206
+ var FASTSPRING_STORE_PINS = /* @__PURE__ */ Object.freeze([
3207
+ Object.freeze({ environment: "production", store: "daisydisk", storefront: "", merchant: "DaisyDisk" })
3208
+ ]);
3209
+ var STORE = "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?";
3210
+ var CARD_URL = new RegExp(`^https://(${STORE})(\\.test)?\\.onfastspring\\.com((?:/(?:popup|embedded)-[A-Za-z0-9_-]{1,64})?)/session/([A-Za-z0-9_-]{16,64})/payment$`);
3211
+ // src/omise.js
3212
+ var pin10 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), keys: Object.freeze([...fields.keys]) });
3213
+ var OMISE_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
3214
+ pin10({ id: "taejai", merchant: "Taejai", origins: ["https://taejai.com"], keys: ["pkey_53q6mm66esjr563ob0h"] }),
3215
+ pin10({ id: "socialgiver", merchant: "Socialgiver", origins: ["https://www.socialgiver.com"], keys: ["pkey_5d5o2iahksmyrkybemg"] }),
3216
+ pin10({ id: "thireq_pecko_links", merchant: "Thireq Pecko", origins: ["https://linksplus.omise.co"], keys: ["pkey_65w70xniwsinf0gm680"] })
3217
+ ]);
2452
3218
  // src/cybersource-secure-acceptance.js
2453
3219
  var SA_BODY_LIMIT = 32 * 1024;
2454
3220
  var SA_REPLY_LIMIT = 64 * 1024;
@@ -2469,6 +3235,10 @@ var AMADEUS_CARD_URLS = Object.freeze({
2469
3235
  dcp: Object.freeze([])
2470
3236
  })
2471
3237
  });
3238
+ var AMADEUS_RELAY_HOSTS = /* @__PURE__ */ Object.freeze({
3239
+ production: Object.freeze(["paypages.payment.amadeus.com"]),
3240
+ sandbox: Object.freeze(["paypages.test.payment.amadeus.com"])
3241
+ });
2472
3242
  var AMADEUS_MERCHANT_EXPIRY_POLICIES = Object.freeze(["refuse", "fill"]);
2473
3243
  var AMADEUS_REFUSAL_REASONS = Object.freeze([
2474
3244
  "unsupported",
@@ -2739,7 +3509,9 @@ var COMGATE_GATEWAY_HOSTS = Object.freeze({
2739
3509
  "pay3.comgate.cz": "payments-gcp.comgate.cz",
2740
3510
  "pay4.comgate.cz": "payments-gcp.comgate.cz"
2741
3511
  });
2742
- var COMGATE_MERCHANTS = Object.freeze([]);
3512
+ var COMGATE_MERCHANTS = Object.freeze([
3513
+ Object.freeze({ merchant: "Dárek pro Beskydy", origins: Object.freeze(["https://darekprobeskydy.info"]), merchantIds: Object.freeze([]) })
3514
+ ]);
2743
3515
  var MAX_LOAD = 1024 * 1024;
2744
3516
  var MAX_ANSWER = 64 * 1024;
2745
3517
  var HEADER_NAMES = Object.freeze(["content-type", "x-cg-origin", "origin"]);
@@ -2747,7 +3519,9 @@ var COMGATE_REFUSALS = Object.freeze(["comgate_3ds_challenge", "comgate_declined
2747
3519
  // src/processors/przelewy24.js
2748
3520
  var PRZELEWY24_HOSTS = Object.freeze(["secure.przelewy24.pl", "sandbox.przelewy24.pl"]);
2749
3521
  var PRZELEWY24_SANDBOX_HOSTS = Object.freeze(["sandbox.przelewy24.pl"]);
2750
- var PRZELEWY24_MERCHANTS = Object.freeze([]);
3522
+ var PRZELEWY24_MERCHANTS = Object.freeze([
3523
+ Object.freeze({ id: "kupbilet", merchant: "KupBilet.pl", merchantId: null, origins: Object.freeze(["https://www.kupbilet.pl"]) })
3524
+ ]);
2751
3525
  var MAX_PAGE4 = 256 * 1024;
2752
3526
  var CURRENCIES3 = Object.freeze(["PLN", "EUR", "GBP", "USD", "CZK", "CHF", "DKK", "NOK", "SEK", "RON", "BGN", "HUF"]);
2753
3527
  var PRZELEWY24_AJAX_HEADERS = Object.freeze({ Accept: "*/*", "X-Requested-With": "XMLHttpRequest" });
@@ -2770,7 +3544,15 @@ var TRANSBANK_HOSTS = Object.freeze(["webpay3g.transbank.cl", "webpay3gint.trans
2770
3544
  var TRANSBANK_SANDBOX_HOSTS = Object.freeze(["webpay3gint.transbank.cl"]);
2771
3545
  var TOKEN = "[0-9a-f]{64}";
2772
3546
  var ENTRY_QUERY = new RegExp(`^\\?token_ws=(${TOKEN})$`);
2773
- var TRANSBANK_MERCHANTS = Object.freeze([]);
3547
+ var TRANSBANK_MERCHANTS = Object.freeze([
3548
+ Object.freeze({
3549
+ commerceCode: null,
3550
+ fantasyName: null,
3551
+ merchant: "Teleférico Santiago",
3552
+ hosts: Object.freeze(["telefericosantiago.cl"]),
3553
+ returnHost: "telefericosantiago.cl"
3554
+ })
3555
+ ]);
2774
3556
  var MAX_PAGE5 = 64 * 1024;
2775
3557
  var JSON_HEADERS = Object.freeze({ "content-type": "application/json", accept: "application/json, text/plain, */*" });
2776
3558
  var FORM_HEADERS = Object.freeze({ "content-type": "application/x-www-form-urlencoded", accept: "application/json, text/plain, */*" });
@@ -2788,7 +3570,7 @@ var PAYTRAIL_ENTRY_FIELDS = Object.freeze([
2788
3570
  ]);
2789
3571
  var PAYTRAIL_MERCHANTS = Object.freeze([]);
2790
3572
  var UUID_SOURCE = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
2791
- var UUID = new RegExp(`^${UUID_SOURCE}$`);
3573
+ var UUID2 = new RegExp(`^${UUID_SOURCE}$`);
2792
3574
  var ENTRY_PATH = new RegExp(`^/payments/(${UUID_SOURCE})/click-to-pay/loading-and-redirect$`);
2793
3575
  var SIGNATURES = Object.freeze({ sha256: /^[0-9a-f]{64}$/, sha512: /^[0-9a-f]{128}$/ });
2794
3576
  var PAYMENT_HIGHWAY_HOSTS = Object.freeze(["v1.api.paymenthighway.io"]);
@@ -2796,6 +3578,101 @@ var CARD_PAGE_PATH = new RegExp(`^/form/(${UUID_SOURCE})/pay_with_click_to_pay$`
2796
3578
  var MAX_PAGE6 = 256 * 1024;
2797
3579
  var PAYTRAIL_CARD_HEADERS = Object.freeze({ "Content-Type": "application/json", "X-Requested-With": "PH-Form", Accept: "application/json" });
2798
3580
  var PAYTRAIL_REFUSALS = Object.freeze(["paytrail_3ds_challenge", "paytrail_card_refused"]);
3581
+ // src/processors/eximbay.js
3582
+ var EXIMBAY_HOSTS = Object.freeze(["secureapi.eximbay.com", "secureapi.test.eximbay.com"]);
3583
+ var EXIMBAY_MERCHANTS = Object.freeze([]);
3584
+ var MAX_ENTRY4 = 16 * 1024;
3585
+ var REQUIRED4 = Object.freeze(["ver", "mid", "txntype", "ref", "cur", "amt", "buyer", "email", "lang", "returnurl", "statusurl", "fgkey"]);
3586
+ var CURRENCIES4 = Object.freeze({ USD: 2, KRW: 0, JPY: 0, EUR: 2, GBP: 2, SGD: 2, HKD: 2, CAD: 2, AUD: 2, THB: 2 });
3587
+ var MAX_PAGE7 = 512 * 1024;
3588
+ var ATTRS = `(?:[^>"']|"[^"]{0,1024}"|'[^']{0,1024}'){0,512}`;
3589
+ var startTag = (name) => new RegExp(`<${name}(?=[\\t\\n\\f\\r />])${ATTRS}>`, "gi");
3590
+ var FORM_START = startTag("form");
3591
+ var INPUT_START = startTag("input");
3592
+ var SELECT_TAG = startTag("select");
3593
+ var OPTION_TAG = startTag("option");
3594
+ var BUTTON_TAG = startTag("button");
3595
+ var FIELDSET_TAG = startTag("fieldset");
3596
+ var XHR_HEADERS = Object.freeze({ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "X-Requested-With": "XMLHttpRequest" });
3597
+ var FORM_HEADERS2 = Object.freeze({ "Content-Type": "application/x-www-form-urlencoded" });
3598
+ var SKIPPED = Object.freeze([
3599
+ ["<!--", "-->", /<!--[\s\S]*?-->/g],
3600
+ ["<script", "</script", /<script\b[\s\S]*?<\/script\s*>/gi],
3601
+ ["<style", "</style", /<style\b[\s\S]*?<\/style\s*>/gi]
3602
+ ]);
3603
+ var CARD_KEYS_WINDOW = Object.freeze(["cardno1", "cardno2", "cardno3", "cardno4", "cardNum", "month", "year", "cvc"]);
3604
+ var WINDOW_FIELDS = /* @__PURE__ */ new Set([
3605
+ "paramkey",
3606
+ "cardcode",
3607
+ "channelCode",
3608
+ "issuerCountry",
3609
+ ...CARD_KEYS_WINDOW,
3610
+ "tel",
3611
+ "unioncardno",
3612
+ "unionoffcardno",
3613
+ "month_unionpay",
3614
+ "year_unionpay",
3615
+ "firstname",
3616
+ "lastname",
3617
+ "cvc_unionpay",
3618
+ "firstname_unionpay",
3619
+ "lastname_unionpay",
3620
+ "email",
3621
+ "shipTo_country",
3622
+ "shipTo_postalCode",
3623
+ "shipTo_city",
3624
+ "shipTo_street1"
3625
+ ]);
3626
+ var WRITTEN = /* @__PURE__ */ new Set(["cardcode", "issuerCountry", ...CARD_KEYS_WINDOW, "firstname", "lastname"]);
3627
+ var OTHER_CARD = Object.freeze(["unioncardno", "unionoffcardno", "month_unionpay", "year_unionpay", "cvc_unionpay"]);
3628
+ var BRANDS = Object.freeze({
3629
+ C000: /^4\d{15}$/,
3630
+ C001: /^(?:5[1-5]\d{14}|2(?:22[1-9]|2[3-9]\d|[3-6]\d{2}|7[01]\d|720)\d{12})$/,
3631
+ C002: /^3[47]\d{13}$/,
3632
+ C003: /^35(?:2[89]|[3-8]\d)\d{12}$/
3633
+ });
3634
+ var EXIMBAY_REFUSALS = Object.freeze(["eximbay_card_refused", "eximbay_3ds_challenge", "eximbay_declined"]);
3635
+ var RESULT_BINDS = Object.freeze(["mid", "txntype", "ref", "cur", "amt"]);
3636
+ // src/processors/barion.js
3637
+ var BARION_HOSTS = Object.freeze(["secure.barion.com", "secure.test.barion.com"]);
3638
+ var BARION_SANDBOX_HOSTS = Object.freeze(["secure.test.barion.com"]);
3639
+ var BARION_SHOPS = Object.freeze([]);
3640
+ var MAX_PAGE8 = 512 * 1024;
3641
+ var CURRENCIES5 = Object.freeze(["HUF", "EUR", "USD", "CZK", "RON", "PLN"]);
3642
+ var CARD_INPUTS = Object.freeze({ number: "cc-number", expiry: "cc-exp-date", cvc: "CardCVC", holder: "CardHolderName" });
3643
+ var CHECKBOXES = Object.freeze(["RegisterUser", "AcceptedTerms", "HasEmailConsent"]);
3644
+ var OTHER_INPUTS = Object.freeze({ FirstPassword: ["password"], RecaptchaToken: ["hidden"], __RequestVerificationToken: ["hidden"], Identifier: ["hidden"] });
3645
+ var BARION_AJAX_HEADERS = Object.freeze({
3646
+ Accept: "*/*",
3647
+ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
3648
+ "X-Requested-With": "XMLHttpRequest"
3649
+ });
3650
+ var CARD_TYPES2 = Object.freeze([{ prefix: /^4/, type: 20 }, { prefix: /^5[1-5]|^2[2-7]/, type: 10 }, { prefix: /^3[47]/, type: 30 }]);
3651
+ var COLOR_DEPTHS = Object.freeze([1, 4, 8, 15, 16, 24, 32, 48]);
3652
+ var BARION_REFUSALS = Object.freeze(["barion_declined", "barion_3ds_challenge", "barion_sca_soft_decline"]);
3653
+ var MAX_ANSWER2 = 64 * 1024;
3654
+ var DECLINE_CODES = Object.freeze([
3655
+ "CardError",
3656
+ "CardExpired",
3657
+ "MaximumCardPaymentAmountExceeded",
3658
+ "MinimumCardPaymentAmountNotReached",
3659
+ "PaymentExpired",
3660
+ "PaymentCancelled",
3661
+ "PaymentFailed",
3662
+ "ThreeDsNotEnabled",
3663
+ "ThreeDsAuthenticationFailed",
3664
+ "NoSuitableProviderFound",
3665
+ "EmailBelongsToValidUser",
3666
+ "InvalidEmailAddress",
3667
+ "CvcRequired",
3668
+ "CardHolderNameRequired",
3669
+ "CardRegistrationExpired",
3670
+ "StartPaymentError",
3671
+ "TheSourceAndDestinationAccountsAreMatched",
3672
+ "UserIsSuspended",
3673
+ "AccountSuspended"
3674
+ ]);
3675
+ var FRICTIONLESS_STATUSES = Object.freeze([0, 5, 7]);
2799
3676
  // src/recognition.js
2800
3677
  var PATTERN_WITHOUT_CARD_FIELDS = Object.freeze({
2801
3678
  stripe: "api\\.stripe\\.com/v1/(payment_methods|tokens|setup_intents/seti_\\w+/confirm|payment_intents/pi_\\w+/confirm)"
@@ -2986,18 +3863,18 @@ function parseStripeCheckoutContext(request) {
2986
3863
  if (entries.length !== 1 || typeof entries[0][1] !== "string" || !/^[A-Za-z0-9_-]{1,1024}$/.test(entries[0][1]))
2987
3864
  reject("context_invalid");
2988
3865
  const encoded = entries[0][1];
2989
- let text = "", bits = 0, count = 0;
3866
+ let text2 = "", bits = 0, count = 0;
2990
3867
  for (const char of encoded) {
2991
3868
  bits = bits << 6 | alphabet.indexOf(char);
2992
3869
  count += 6;
2993
3870
  if (count >= 8) {
2994
3871
  count -= 8;
2995
- text += String.fromCharCode(bits >>> count & 255);
3872
+ text2 += String.fromCharCode(bits >>> count & 255);
2996
3873
  }
2997
3874
  }
2998
3875
  let value;
2999
3876
  try {
3000
- value = context(JSON.parse(text));
3877
+ value = context(JSON.parse(text2));
3001
3878
  }
3002
3879
  catch {
3003
3880
  reject("context_invalid");