├── .gitignore
├── renderer
├── public
│ ├── favicon.ico
│ ├── icons
│ │ ├── favicon.ico
│ │ ├── apple-icon.png
│ │ ├── icon-96x96.png
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ ├── favicon-96x96.png
│ │ ├── ms-icon-70x70.png
│ │ ├── apple-icon-57x57.png
│ │ ├── apple-icon-60x60.png
│ │ ├── apple-icon-72x72.png
│ │ ├── apple-icon-76x76.png
│ │ ├── ms-icon-144x144.png
│ │ ├── ms-icon-150x150.png
│ │ ├── ms-icon-310x310.png
│ │ ├── android-icon-36x36.png
│ │ ├── android-icon-48x48.png
│ │ ├── android-icon-72x72.png
│ │ ├── android-icon-96x96.png
│ │ ├── apple-icon-114x114.png
│ │ ├── apple-icon-120x120.png
│ │ ├── apple-icon-144x144.png
│ │ ├── apple-icon-152x152.png
│ │ ├── apple-icon-180x180.png
│ │ ├── android-icon-144x144.png
│ │ ├── android-icon-192x192.png
│ │ └── apple-icon-precomposed.png
│ ├── sw.js
│ └── manifest.json
├── src
│ ├── assets
│ │ ├── bg.png
│ │ ├── logo.png
│ │ ├── duck_jump.gif
│ │ ├── card_black.jpg
│ │ ├── up_diamond.png
│ │ ├── card_backside.png
│ │ ├── card_diamond.jpg
│ │ └── svelte.svg
│ ├── vite-env.d.ts
│ ├── lib
│ │ ├── Counter.svelte
│ │ └── Card.svelte
│ ├── main.ts
│ ├── app.css
│ ├── App.svelte
│ └── styles
│ │ └── mymk.css
├── vite.config.ts
├── tsconfig.node.json
├── svelte.config.js
├── .gitignore
├── package.json
├── tsconfig.json
├── README.md
├── index.html
└── pnpm-lock.yaml
├── scraper
├── Gemfile
├── data.json
├── Gemfile.lock
├── main.rb
└── history.ndjson
├── README.md
└── .github
└── workflows
└── scrape.yml
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/renderer/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/favicon.ico
--------------------------------------------------------------------------------
/renderer/src/assets/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/bg.png
--------------------------------------------------------------------------------
/renderer/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/logo.png
--------------------------------------------------------------------------------
/renderer/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 |
--------------------------------------------------------------------------------
/renderer/public/icons/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/favicon.ico
--------------------------------------------------------------------------------
/renderer/src/assets/duck_jump.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/duck_jump.gif
--------------------------------------------------------------------------------
/renderer/src/assets/card_black.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/card_black.jpg
--------------------------------------------------------------------------------
/renderer/src/assets/up_diamond.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/up_diamond.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon.png
--------------------------------------------------------------------------------
/renderer/public/icons/icon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/icon-96x96.png
--------------------------------------------------------------------------------
/renderer/src/assets/card_backside.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/card_backside.png
--------------------------------------------------------------------------------
/renderer/src/assets/card_diamond.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/card_diamond.jpg
--------------------------------------------------------------------------------
/renderer/public/icons/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/favicon-16x16.png
--------------------------------------------------------------------------------
/renderer/public/icons/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/favicon-32x32.png
--------------------------------------------------------------------------------
/renderer/public/icons/favicon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/favicon-96x96.png
--------------------------------------------------------------------------------
/renderer/public/icons/ms-icon-70x70.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/ms-icon-70x70.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon-57x57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-57x57.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon-60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-60x60.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-72x72.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon-76x76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-76x76.png
--------------------------------------------------------------------------------
/renderer/public/icons/ms-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/ms-icon-144x144.png
--------------------------------------------------------------------------------
/renderer/public/icons/ms-icon-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/ms-icon-150x150.png
--------------------------------------------------------------------------------
/renderer/public/icons/ms-icon-310x310.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/ms-icon-310x310.png
--------------------------------------------------------------------------------
/renderer/public/icons/android-icon-36x36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-36x36.png
--------------------------------------------------------------------------------
/renderer/public/icons/android-icon-48x48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-48x48.png
--------------------------------------------------------------------------------
/renderer/public/icons/android-icon-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-72x72.png
--------------------------------------------------------------------------------
/renderer/public/icons/android-icon-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-96x96.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon-114x114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-114x114.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon-120x120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-120x120.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-144x144.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon-152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-152x152.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon-180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-180x180.png
--------------------------------------------------------------------------------
/renderer/public/icons/android-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-144x144.png
--------------------------------------------------------------------------------
/renderer/public/icons/android-icon-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-192x192.png
--------------------------------------------------------------------------------
/renderer/public/icons/apple-icon-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-precomposed.png
--------------------------------------------------------------------------------
/scraper/Gemfile:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | source "https://rubygems.org"
4 |
5 | gem 'debug'
6 | gem 'playwright-ruby-client', require: "playwright"
7 | gem 'rubocop'
8 |
--------------------------------------------------------------------------------
/renderer/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import { svelte } from '@sveltejs/vite-plugin-svelte'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [svelte()],
7 | })
8 |
--------------------------------------------------------------------------------
/renderer/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "skipLibCheck": true,
5 | "module": "ESNext",
6 | "moduleResolution": "bundler"
7 | },
8 | "include": ["vite.config.ts"]
9 | }
10 |
--------------------------------------------------------------------------------
/renderer/src/lib/Counter.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
11 |
--------------------------------------------------------------------------------
/scraper/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "มนัสศานติ์ มนูญชัย",
3 | "card_number": "5325531097527638",
4 | "expire_date": "2026-12-31",
5 | "today_points": 0,
6 | "redeemable_points": 8517,
7 | "acc_points": 622,
8 | "updated_at": "2025-12-19T00:36:14+00:00"
9 | }
--------------------------------------------------------------------------------
/renderer/svelte.config.js:
--------------------------------------------------------------------------------
1 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
2 |
3 | export default {
4 | // Consult https://svelte.dev/docs#compile-time-svelte-preprocess
5 | // for more information about preprocessors
6 | preprocess: vitePreprocess(),
7 | }
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # emkay
2 |
3 | Share your member card without hassle
4 |
5 |
6 |
7 | ## Usage
8 |
9 | - Prepare environment variables `MK_USERNAME`, and `MK_PASSWORD`
10 | - Run scraper to update `data.json`
11 | - Build renderer to create a website
12 |
--------------------------------------------------------------------------------
/renderer/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/renderer/src/main.ts:
--------------------------------------------------------------------------------
1 | // import './app.css'
2 | import "./styles/app.css"
3 | import "./styles/mymk.css"
4 | // import "./styles/all.min.css"
5 | // import "./styles/splide.min.css"
6 |
7 | import App from "./App.svelte"
8 | import { mount } from "svelte";
9 |
10 | const app = mount(App, {
11 | target: document.getElementById("app"),
12 | })
13 |
14 | export default app
15 |
--------------------------------------------------------------------------------
/renderer/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "renderer",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "preview": "vite preview",
10 | "check": "svelte-check --tsconfig ./tsconfig.json"
11 | },
12 | "devDependencies": {
13 | "@sveltejs/vite-plugin-svelte": "^5.0.3",
14 | "@tsconfig/svelte": "^5.0.4",
15 | "canvas-circular-countdown": "^1.8.0",
16 | "svelte": "^5.28.2",
17 | "svelte-check": "^4.1.6",
18 | "tslib": "^2.8.1",
19 | "typescript": "^5.8.3",
20 | "vite": "^6.3.3"
21 | },
22 | "dependencies": {
23 | "date-fns": "^4.1.0",
24 | "qrcode": "^1.5.4"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/renderer/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tsconfig/svelte/tsconfig.json",
3 | "compilerOptions": {
4 | "target": "ESNext",
5 | "useDefineForClassFields": true,
6 | "module": "ESNext",
7 | "resolveJsonModule": true,
8 | /**
9 | * Typecheck JS in `.svelte` and `.js` files by default.
10 | * Disable checkJs if you'd like to use dynamic types in JS.
11 | * Note that setting allowJs false does not prevent the use
12 | * of JS in `.svelte` files.
13 | */
14 | "allowJs": true,
15 | "checkJs": true,
16 | "isolatedModules": true
17 | },
18 | "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
19 | "references": [{ "path": "./tsconfig.node.json" }]
20 | }
21 |
--------------------------------------------------------------------------------
/renderer/public/sw.js:
--------------------------------------------------------------------------------
1 | // Minimal Service Worker for eMKay PWA - No Caching
2 | // This service worker does not cache or provide offline functionality
3 | // It only exists to allow PWA installation
4 |
5 | // Skip waiting on install
6 | self.addEventListener("install", (event) => {
7 | self.skipWaiting()
8 | console.log("Service Worker installed")
9 | })
10 |
11 | // Clear any previous caches
12 | self.addEventListener("activate", (event) => {
13 | event.waitUntil(
14 | caches
15 | .keys()
16 | .then((cacheNames) => {
17 | return Promise.all(
18 | cacheNames.map((cacheName) => {
19 | console.log("Deleting cache:", cacheName)
20 | return caches.delete(cacheName)
21 | })
22 | )
23 | })
24 | .then(() => {
25 | console.log("Service Worker activated and caches cleared")
26 | return self.clients.claim()
27 | })
28 | )
29 | })
30 |
31 | // Handle fetch events without caching
32 | self.addEventListener("fetch", (event) => {
33 | // Just pass through to the network
34 | // No caching or offline functionality
35 | })
36 |
--------------------------------------------------------------------------------
/renderer/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "eMKay",
3 | "short_name": "eMKay",
4 | "description": "MK Restaurant Card App",
5 | "start_url": "/",
6 | "display": "standalone",
7 | "background_color": "#ffffff",
8 | "theme_color": "#ffffff",
9 | "icons": [
10 | {
11 | "src": "/icons/android-icon-72x72.png",
12 | "sizes": "72x72",
13 | "type": "image/png"
14 | },
15 | {
16 | "src": "/icons/android-icon-96x96.png",
17 | "sizes": "96x96",
18 | "type": "image/png"
19 | },
20 | {
21 | "src": "/icons/android-icon-128x128.png",
22 | "sizes": "128x128",
23 | "type": "image/png"
24 | },
25 | {
26 | "src": "/icons/android-icon-144x144.png",
27 | "sizes": "144x144",
28 | "type": "image/png"
29 | },
30 | {
31 | "src": "/icons/android-icon-152x152.png",
32 | "sizes": "152x152",
33 | "type": "image/png"
34 | },
35 | {
36 | "src": "/icons/android-icon-192x192.png",
37 | "sizes": "192x192",
38 | "type": "image/png"
39 | },
40 | {
41 | "src": "/icons/icon-384x384.png",
42 | "sizes": "384x384",
43 | "type": "image/png"
44 | },
45 | {
46 | "src": "/icons/icon-512x512.png",
47 | "sizes": "512x512",
48 | "type": "image/png"
49 | }
50 | ]
51 | }
52 |
--------------------------------------------------------------------------------
/.github/workflows/scrape.yml:
--------------------------------------------------------------------------------
1 | name: Scrape
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | workflow_dispatch:
8 | schedule:
9 | - cron: "0 0 * * *"
10 |
11 | permissions:
12 | contents: write
13 |
14 | jobs:
15 | build:
16 | runs-on: ubuntu-latest
17 |
18 | defaults:
19 | run:
20 | working-directory: ./scraper
21 |
22 | steps:
23 | - uses: actions/checkout@v4
24 |
25 | - name: Set up Ruby
26 | uses: ruby/setup-ruby@v1
27 | with:
28 | ruby-version: "3.2"
29 | bundler-cache: true
30 | working-directory: ./scraper
31 |
32 | - uses: actions/setup-node@v4
33 | with:
34 | node-version: 20
35 |
36 | - name: Setup Playwright
37 | run: npx playwright@1.52.0 install
38 |
39 | - name: Scrape
40 | env:
41 | MK_USERNAME: ${{ secrets.MK_USERNAME }}
42 | MK_PASSWORD: ${{ secrets.MK_PASSWORD }}
43 | run: ruby main.rb
44 |
45 | - name: Commit and push
46 | run: |
47 | git diff
48 | git config --global user.email "notbarze@users.noreply.github.com"
49 | git config --global user.name "narze's bot"
50 | git add data.json
51 | git add history.ndjson
52 | git commit -m "Update data" || exit 0
53 | git push
54 |
--------------------------------------------------------------------------------
/renderer/src/app.css:
--------------------------------------------------------------------------------
1 | :root {
2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
3 | line-height: 1.5;
4 | font-weight: 400;
5 |
6 | color-scheme: light dark;
7 | color: rgba(255, 255, 255, 0.87);
8 | background-color: #242424;
9 |
10 | font-synthesis: none;
11 | text-rendering: optimizeLegibility;
12 | -webkit-font-smoothing: antialiased;
13 | -moz-osx-font-smoothing: grayscale;
14 | -webkit-text-size-adjust: 100%;
15 | }
16 |
17 | a {
18 | font-weight: 500;
19 | color: #646cff;
20 | text-decoration: inherit;
21 | }
22 | a:hover {
23 | color: #535bf2;
24 | }
25 |
26 | body {
27 | margin: 0;
28 | display: flex;
29 | place-items: center;
30 | min-width: 320px;
31 | min-height: 100vh;
32 | }
33 |
34 | h1 {
35 | font-size: 3.2em;
36 | line-height: 1.1;
37 | }
38 |
39 | .card {
40 | padding: 2em;
41 | }
42 |
43 | #app {
44 | max-width: 1280px;
45 | margin: 0 auto;
46 | padding: 2rem;
47 | text-align: center;
48 | }
49 |
50 | button {
51 | border-radius: 8px;
52 | border: 1px solid transparent;
53 | padding: 0.6em 1.2em;
54 | font-size: 1em;
55 | font-weight: 500;
56 | font-family: inherit;
57 | background-color: #1a1a1a;
58 | cursor: pointer;
59 | transition: border-color 0.25s;
60 | }
61 | button:hover {
62 | border-color: #646cff;
63 | }
64 | button:focus,
65 | button:focus-visible {
66 | outline: 4px auto -webkit-focus-ring-color;
67 | }
68 |
69 | @media (prefers-color-scheme: light) {
70 | :root {
71 | color: #213547;
72 | background-color: #ffffff;
73 | }
74 | a:hover {
75 | color: #747bff;
76 | }
77 | button {
78 | background-color: #f9f9f9;
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/scraper/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | ast (2.4.2)
5 | base64 (0.1.1)
6 | concurrent-ruby (1.2.2)
7 | debug (1.8.0)
8 | irb (>= 1.5.0)
9 | reline (>= 0.3.1)
10 | io-console (0.6.0)
11 | irb (1.8.3)
12 | rdoc
13 | reline (>= 0.3.8)
14 | json (2.6.3)
15 | language_server-protocol (3.17.0.3)
16 | mime-types (3.5.1)
17 | mime-types-data (~> 3.2015)
18 | mime-types-data (3.2023.1003)
19 | parallel (1.23.0)
20 | parser (3.2.2.4)
21 | ast (~> 2.4.1)
22 | racc
23 | playwright-ruby-client (1.38.0)
24 | concurrent-ruby (>= 1.1.6)
25 | mime-types (>= 3.0)
26 | psych (5.1.1)
27 | stringio
28 | racc (1.7.1)
29 | rainbow (3.1.1)
30 | rdoc (6.5.0)
31 | psych (>= 4.0.0)
32 | regexp_parser (2.8.2)
33 | reline (0.3.9)
34 | io-console (~> 0.5)
35 | rexml (3.2.6)
36 | rubocop (1.57.1)
37 | base64 (~> 0.1.1)
38 | json (~> 2.3)
39 | language_server-protocol (>= 3.17.0)
40 | parallel (~> 1.10)
41 | parser (>= 3.2.2.4)
42 | rainbow (>= 2.2.2, < 4.0)
43 | regexp_parser (>= 1.8, < 3.0)
44 | rexml (>= 3.2.5, < 4.0)
45 | rubocop-ast (>= 1.28.1, < 2.0)
46 | ruby-progressbar (~> 1.7)
47 | unicode-display_width (>= 2.4.0, < 3.0)
48 | rubocop-ast (1.29.0)
49 | parser (>= 3.2.1.0)
50 | ruby-progressbar (1.13.0)
51 | stringio (3.0.8)
52 | unicode-display_width (2.5.0)
53 |
54 | PLATFORMS
55 | arm64-darwin-22
56 | arm64-darwin-23
57 | arm64-darwin-24
58 | x86_64-linux
59 |
60 | DEPENDENCIES
61 | debug
62 | playwright-ruby-client
63 | rubocop
64 |
65 | BUNDLED WITH
66 | 2.4.20
67 |
--------------------------------------------------------------------------------
/renderer/src/assets/svelte.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/scraper/main.rb:
--------------------------------------------------------------------------------
1 | require 'bundler'
2 | Bundler.require
3 |
4 | require 'date'
5 |
6 | def login!(page)
7 | puts 'Open login page'
8 | page.goto('https://www.thisismymk.com/th/login')
9 |
10 | puts 'Fill username & password'
11 | page.fill('#username', ENV.fetch('MK_USERNAME', 'foo'))
12 | page.fill('#password', ENV.fetch('MK_PASSWORD', 'bar'))
13 |
14 | puts 'Click login button'
15 | page.click('button[type=submit]')
16 |
17 | if page.query_selector('#loginFailed')
18 | puts 'ERROR: Login failed'
19 | exit 1
20 | end
21 |
22 | page.wait_for_load_state
23 | end
24 |
25 | def get_card_data(page)
26 | name = page.query_selector('.card-body h4').inner_text
27 | card_number, expire_date, today_points, redeemable_points = page.query_selector_all('.detail-profile .txt-red').map(&:inner_text).map(&:strip)
28 | acc_points = page.get_by_text("คะแนนปรับระดับสะสม").locator(".txt-red").first.inner_text
29 |
30 | {
31 | name:,
32 | card_number:,
33 | expire_date: Date.parse(expire_date),
34 | today_points: today_points.gsub(',', '').to_i,
35 | redeemable_points: redeemable_points.gsub(',', '').to_i,
36 | acc_points: acc_points.gsub(',', '').to_i,
37 | }
38 | end
39 |
40 | def write_to_file(card_data)
41 | data = card_data.merge(updated_at: DateTime.now.to_s)
42 |
43 | puts "Write to data.json: #{data}"
44 |
45 | File.write('data.json', JSON.pretty_generate(data))
46 |
47 | File.open('history.ndjson', 'a') do |f|
48 | f.puts JSON.generate(data)
49 | end
50 | end
51 |
52 | Playwright.create(playwright_cli_executable_path: 'npx playwright@1.52.0') do |playwright|
53 | # Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright|
54 | playwright.chromium.launch(headless: ENV.has_key?("CI")) do |browser|
55 | context = browser.new_context # Prepare new window.
56 | page = context.new_page # Open new window and new tab here. (about:blank)
57 |
58 | login!(page)
59 | card_data = get_card_data(page)
60 |
61 | write_to_file(card_data)
62 | end
63 | end
64 |
--------------------------------------------------------------------------------
/renderer/README.md:
--------------------------------------------------------------------------------
1 | # Svelte + TS + Vite
2 |
3 | This template should help get you started developing with Svelte and TypeScript in Vite.
4 |
5 | ## Recommended IDE Setup
6 |
7 | [VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode).
8 |
9 | ## Need an official Svelte framework?
10 |
11 | Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more.
12 |
13 | ## Technical considerations
14 |
15 | **Why use this over SvelteKit?**
16 |
17 | - It brings its own routing solution which might not be preferable for some users.
18 | - It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app.
19 |
20 | This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project.
21 |
22 | Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate.
23 |
24 | **Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?**
25 |
26 | Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information.
27 |
28 | **Why include `.vscode/extensions.json`?**
29 |
30 | Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project.
31 |
32 | **Why enable `allowJs` in the TS template?**
33 |
34 | While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant.
35 |
36 | **Why is HMR not preserving my local component state?**
37 |
38 | HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr).
39 |
40 | If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR.
41 |
42 | ```ts
43 | // store.ts
44 | // An extremely simple external store
45 | import { writable } from 'svelte/store'
46 | export default writable(0)
47 | ```
48 |
--------------------------------------------------------------------------------
/renderer/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | MyMK หน้าแรก
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
29 |
34 |
39 |
44 |
49 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
68 |
73 |
78 |
83 |
88 |
93 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
124 |
125 |
126 |
--------------------------------------------------------------------------------
/renderer/src/lib/Card.svelte:
--------------------------------------------------------------------------------
1 |
115 |
116 |
117 |
118 |
119 |
120 |

121 |
122 |
123 |
124 |
125 |

126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |

136 |
137 |
138 |
139 |
144 |
145 |
146 |
147 |
{card_number}
148 |
149 |
150 |
154 | ไม่รับ QR Code ที่ได้มาจากการ Screen Capture
155 |
156 |
157 | {timestamp_display}
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |

172 |
173 |
174 |
175 |
180 |
181 |
182 |
183 |
184 | {card_number}
185 |
186 |
187 |
188 |
192 | ไม่รับ QR Code ที่ได้มาจากการ Screen Capture
193 |
194 |
198 | {timestamp_display}
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
--------------------------------------------------------------------------------
/renderer/src/App.svelte:
--------------------------------------------------------------------------------
1 |
147 |
148 | {#if !hide}
149 |
150 |
236 |
237 |
242 |
243 |
244 |
252 |
253 |
261 |
267 |
268 |
269 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
คลิกที่บัตรสมาชิกเพื่อสแกนบัตร
282 |
283 |
284 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
MK DIAMOND CARD
296 |
297 |
298 |
302 |
305 |
314 |
318 | {progress}% Complete
321 |
322 |
323 |
324 |
325 |

330 |
331 |
332 |
333 |
334 |
338 |
339 | คะแนนปรับระดับสะสม {(acc_points ?? 0).toLocaleString()}/1,200 คะแนน
344 |
345 |
346 | สะสมภายใน {expire_date_display}
348 |
349 |
354 |
355 |
356 |
{name}
357 |
358 |
370 |
371 |
375 |
376 |
377 | หมายเลขบัตรสมาชิก:
378 | {card_number}
379 |
380 |
381 |
382 | บัตรสมาชิกหมดอายุ:
383 | {expire_date_display}
384 |
385 |
386 |
387 | คะแนนสะสมวันนี้:
388 | {today_points}
389 | คะแนน
390 |
391 |
392 | คะแนนแลกของรางวัล:
393 | {redeemable_points}
394 | คะแนน
395 |
396 |
397 | วันหมดอายุ (คะแนนแลกของรางวัล):
398 |
399 | {redeemable_points} คะแนน หมดอายุ - 30/12/2023
400 |
401 |
402 |
403 |
404 |
405 |
408 |
414 | แก้ไขข้อมูลส่วนตัว
415 |
416 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
452 |
453 |
454 |
465 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
552 |
553 |
554 | {#if showInstallPrompt}
555 |
556 |
557 |
558 |
เพิ่ม eMKay ลงหน้าจอหลัก
559 |
เข้าถึงบัตรสมาชิกได้ง่ายขึ้น
560 |
561 |
562 |
565 |
570 |
571 |
572 |
573 | {/if}
574 |
575 | {/if}
576 |
577 |
627 |
--------------------------------------------------------------------------------
/renderer/src/styles/mymk.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'NotoSansThai';
3 | src: url('/fonts/NotoSansThai-Regular.ttf');
4 | font-weight: normal;
5 | font-style: normal;
6 | }
7 | .logo {
8 | position: relative;
9 | top: 15%;
10 | left: 50%;
11 | /* transform: translate(-50%, -50%); */
12 | }
13 |
14 | .bottom-shadow{
15 | box-shadow: 0 4px 2px -2px rgba(0,0,0,0.12);;
16 | }
17 |
18 | .bg-footer {
19 | background-image: url("/imgs/home-bg.png");
20 | /* background-color: #cccccc; */
21 | }
22 | .bg-grey {
23 | background: linear-gradient(to bottom, #ffffff 49%, #A9A9A9 108%);
24 | background: -moz-linear-gradient(to bottom, #ffffff 49%, #A9A9A9 108%);
25 | background: -webkit-linear-gradient(to bottom, #ffffff 49%, #A9A9A9 108%);
26 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cfddac', endColorstr='#ffffff');
27 | background: -o-linear-gradient(rgb(255,255,255),rgb(169,169,169));
28 | }
29 | .bg-main {
30 | background-image: url("/imgs/bg-main.png");
31 | background-repeat: repeat;
32 | }
33 | .footer-images img{
34 | vertical-align:bottom;
35 | border:0;
36 | }
37 |
38 | .loginfm {
39 | background-color: #f1f1f1;
40 | }
41 | .pdpafm {
42 | background-color: #737373;
43 | }
44 | .historyfm {
45 | background-color: #dfdfdf;
46 | }
47 |
48 | /* #wrap{
49 | background:url("/imgs/home-bg.png") no-repeat center bottom;
50 | } */
51 |
52 | .bt-home {
53 | font-size:14px;
54 | color: #fff;
55 | background-color: #ec1c24;
56 | border-radius:20px;
57 | box-shadow: 0 2px 2px #A9A9A9;
58 | font-weight: lighter;
59 | width: 200px;
60 | /* padding: 3px 10px; */
61 | /* background-image: linear-gradient(#335b71 45%, #03324c 55%); */
62 | }
63 |
64 |
65 | /* #footer {
66 | background-repeat: no-repeat;
67 | background-color: #e6e6e6;
68 | background-size: contain;
69 | background-position: bottom right;
70 | background:url("/imgs/home-bg.png");
71 | } */
72 | /* #footer {
73 | position: absolute;
74 | bottom: 0;
75 | left: 0;
76 | width: 50%;
77 | height: 100%;
78 | z-index: -1;
79 | background:url("/imgs/home-bg.png") no-repeat center bottom;
80 | } */
81 |
82 | /* .footer {
83 | position: absolute;
84 | bottom: 0;
85 | width: 100%;
86 | height: 60px;
87 | background-color: #f5f5f5;
88 | z-index: -1;
89 | } */
90 |
91 | input:not(:placeholder-shown):not(input[type=checkbox]):not(input[type=text]:disabled) {
92 | background-color: #f1f1f1!important;
93 | }
94 | input:placeholder-shown:not(input[type=checkbox]):not(input[type=text]:disabled) {
95 | background-color: #f1f1f1!important;
96 | }
97 |
98 | select:not(:placeholder-shown) {
99 | background-color: #f1f1f1!important;
100 | }
101 |
102 | select:placeholder-shown {
103 | background-color: #f1f1f1!important;
104 | }
105 |
106 | .btn-login {
107 | font-size:14px;
108 | color: #fff;
109 | background-color: #00a551;
110 | border-radius:20px;
111 | box-shadow: 0 2px 2px #A9A9A9;
112 | font-weight: lighter;
113 | width: 230px;
114 | }
115 |
116 | .popup-paymentsuccess {
117 | font-size:14px;
118 | color: #fff;
119 | background-color: #00a551;
120 | border-radius:20px;
121 | box-shadow: 0 2px 2px #A9A9A9;
122 | font-weight: lighter;
123 | width: 140px;
124 | }
125 |
126 | .btn-back-paymentsuccess {
127 | font-size:14px;
128 | border-color: #000;
129 | border-radius:20px;
130 | font-weight: lighter;
131 | width: 140px;
132 | }
133 |
134 | .btn-back {
135 | font-size:14px;
136 | border-color: #000;
137 | border-radius:20px;
138 | font-weight: lighter;
139 | width: 230px;
140 | }
141 |
142 | .btn-pdpa {
143 | font-size:14px;
144 | color: #00a551;
145 | font-weight: bold;
146 | background-color: #fff;
147 | border-color: #00a551;
148 | border-radius:20px;
149 | box-shadow: 0 2px 2px #A9A9A9;
150 | width: 230px;
151 | }
152 |
153 | .btn-pdpa:disabled {
154 | font-size:14px;
155 | color: #A9A9A9;
156 | font-weight: bold;
157 | background-color: #fff;
158 | border-color: #A9A9A9;
159 | border-radius:20px;
160 | box-shadow: 0 2px 2px #A9A9A9;
161 | width: 230px;
162 | }
163 |
164 | a {
165 | text-decoration: none;
166 | color: #000;
167 | }
168 | .nav-item .active {
169 | color: red !important;
170 | }
171 | .footer-font {
172 | font-size: 12px;
173 | }
174 | #nav-icon1, #nav-icon2, #nav-icon3, #nav-icon4 {
175 | width: 60px;
176 | height: 45px;
177 | position: relative;
178 | margin: 50px auto;
179 | -webkit-transform: rotate(0deg);
180 | -moz-transform: rotate(0deg);
181 | -o-transform: rotate(0deg);
182 | transform: rotate(0deg);
183 | -webkit-transition: .5s ease-in-out;
184 | -moz-transition: .5s ease-in-out;
185 | -o-transition: .5s ease-in-out;
186 | transition: .5s ease-in-out;
187 | cursor: pointer;
188 | }
189 |
190 | #nav-icon1 span, #nav-icon3 span, #nav-icon4 span {
191 | display: block;
192 | position: absolute;
193 | height: 9px;
194 | width: 100%;
195 | background: #d3531a;
196 | border-radius: 9px;
197 | opacity: 1;
198 | left: 0;
199 | -webkit-transform: rotate(0deg);
200 | -moz-transform: rotate(0deg);
201 | -o-transform: rotate(0deg);
202 | transform: rotate(0deg);
203 | -webkit-transition: .25s ease-in-out;
204 | -moz-transition: .25s ease-in-out;
205 | -o-transition: .25s ease-in-out;
206 | transition: .25s ease-in-out;
207 | }
208 |
209 | #nav-icon1 span:nth-child(1) {
210 | top: 0px;
211 | }
212 |
213 | #nav-icon1 span:nth-child(2) {
214 | top: 18px;
215 | }
216 |
217 | #nav-icon1 span:nth-child(3) {
218 | top: 36px;
219 | }
220 |
221 | #nav-icon1.open span:nth-child(1) {
222 | top: 18px;
223 | -webkit-transform: rotate(135deg);
224 | -moz-transform: rotate(135deg);
225 | -o-transform: rotate(135deg);
226 | transform: rotate(135deg);
227 | }
228 |
229 | #nav-icon1.open span:nth-child(2) {
230 | opacity: 0;
231 | left: -60px;
232 | }
233 |
234 | #nav-icon1.open span:nth-child(3) {
235 | top: 18px;
236 | -webkit-transform: rotate(-135deg);
237 | -moz-transform: rotate(-135deg);
238 | -o-transform: rotate(-135deg);
239 | transform: rotate(-135deg);
240 | }
241 |
242 | /* Icon 2 */
243 |
244 | #nav-icon2 {
245 | }
246 |
247 | #nav-icon2 span {
248 | display: block;
249 | position: absolute;
250 | height: 9px;
251 | width: 50%;
252 | background: #d3531a;
253 | opacity: 1;
254 | -webkit-transform: rotate(0deg);
255 | -moz-transform: rotate(0deg);
256 | -o-transform: rotate(0deg);
257 | transform: rotate(0deg);
258 | -webkit-transition: .25s ease-in-out;
259 | -moz-transition: .25s ease-in-out;
260 | -o-transition: .25s ease-in-out;
261 | transition: .25s ease-in-out;
262 | }
263 |
264 | #nav-icon2 span:nth-child(even) {
265 | left: 50%;
266 | border-radius: 0 9px 9px 0;
267 | }
268 |
269 | #nav-icon2 span:nth-child(odd) {
270 | left:0px;
271 | border-radius: 9px 0 0 9px;
272 | }
273 |
274 | #nav-icon2 span:nth-child(1), #nav-icon2 span:nth-child(2) {
275 | top: 0px;
276 | }
277 |
278 | #nav-icon2 span:nth-child(3), #nav-icon2 span:nth-child(4) {
279 | top: 18px;
280 | }
281 |
282 | #nav-icon2 span:nth-child(5), #nav-icon2 span:nth-child(6) {
283 | top: 36px;
284 | }
285 |
286 | #nav-icon2.open span:nth-child(1),#nav-icon2.open span:nth-child(6) {
287 | -webkit-transform: rotate(45deg);
288 | -moz-transform: rotate(45deg);
289 | -o-transform: rotate(45deg);
290 | transform: rotate(45deg);
291 | }
292 |
293 | #nav-icon2.open span:nth-child(2),#nav-icon2.open span:nth-child(5) {
294 | -webkit-transform: rotate(-45deg);
295 | -moz-transform: rotate(-45deg);
296 | -o-transform: rotate(-45deg);
297 | transform: rotate(-45deg);
298 | }
299 |
300 | #nav-icon2.open span:nth-child(1) {
301 | left: 5px;
302 | top: 7px;
303 | }
304 |
305 | #nav-icon2.open span:nth-child(2) {
306 | left: calc(50% - 5px);
307 | top: 7px;
308 | }
309 |
310 | #nav-icon2.open span:nth-child(3) {
311 | left: -50%;
312 | opacity: 0;
313 | }
314 |
315 | #nav-icon2.open span:nth-child(4) {
316 | left: 100%;
317 | opacity: 0;
318 | }
319 |
320 | #nav-icon2.open span:nth-child(5) {
321 | left: 5px;
322 | top: 29px;
323 | }
324 |
325 | #nav-icon2.open span:nth-child(6) {
326 | left: calc(50% - 5px);
327 | top: 29px;
328 | }
329 |
330 | /* Icon 3 */
331 |
332 | #nav-icon3 span:nth-child(1) {
333 | top: 0px;
334 | }
335 |
336 | #nav-icon3 span:nth-child(2),#nav-icon3 span:nth-child(3) {
337 | top: 18px;
338 | }
339 |
340 | #nav-icon3 span:nth-child(4) {
341 | top: 36px;
342 | }
343 |
344 | #nav-icon3.open span:nth-child(1) {
345 | top: 18px;
346 | width: 0%;
347 | left: 50%;
348 | }
349 |
350 | #nav-icon3.open span:nth-child(2) {
351 | -webkit-transform: rotate(45deg);
352 | -moz-transform: rotate(45deg);
353 | -o-transform: rotate(45deg);
354 | transform: rotate(45deg);
355 | }
356 |
357 | #nav-icon3.open span:nth-child(3) {
358 | -webkit-transform: rotate(-45deg);
359 | -moz-transform: rotate(-45deg);
360 | -o-transform: rotate(-45deg);
361 | transform: rotate(-45deg);
362 | }
363 |
364 | #nav-icon3.open span:nth-child(4) {
365 | top: 18px;
366 | width: 0%;
367 | left: 50%;
368 | }
369 |
370 | /* Icon 4 */
371 |
372 | #nav-icon4 {
373 | }
374 |
375 | #nav-icon4 span:nth-child(1) {
376 | top: 0px;
377 | -webkit-transform-origin: left center;
378 | -moz-transform-origin: left center;
379 | -o-transform-origin: left center;
380 | transform-origin: left center;
381 | }
382 |
383 | #nav-icon4 span:nth-child(2) {
384 | top: 18px;
385 | -webkit-transform-origin: left center;
386 | -moz-transform-origin: left center;
387 | -o-transform-origin: left center;
388 | transform-origin: left center;
389 | }
390 |
391 | #nav-icon4 span:nth-child(3) {
392 | top: 36px;
393 | -webkit-transform-origin: left center;
394 | -moz-transform-origin: left center;
395 | -o-transform-origin: left center;
396 | transform-origin: left center;
397 | }
398 |
399 | #nav-icon4.open span:nth-child(1) {
400 | -webkit-transform: rotate(45deg);
401 | -moz-transform: rotate(45deg);
402 | -o-transform: rotate(45deg);
403 | transform: rotate(45deg);
404 | top: -3px;
405 | left: 8px;
406 | }
407 |
408 | #nav-icon4.open span:nth-child(2) {
409 | width: 0%;
410 | opacity: 0;
411 | }
412 |
413 | #nav-icon4.open span:nth-child(3) {
414 | -webkit-transform: rotate(-45deg);
415 | -moz-transform: rotate(-45deg);
416 | -o-transform: rotate(-45deg);
417 | transform: rotate(-45deg);
418 | top: 39px;
419 | left: 8px;
420 | }
421 |
422 | /* Custom Bootstrap Css */
423 | .modal-backdrop {
424 | position: fixed;
425 | top: 0;
426 | left: 0;
427 | z-index: 1040;
428 | width: 100vw;
429 | height: 100vh;
430 | background-color: #000;
431 | }
432 |
433 | .offcanvas-end {
434 | top: 0;
435 | right: 0;
436 | width: 250px;
437 | border-left: 1px solid rgba(0, 0, 0, 0.2);
438 | transform: translateX(100%);
439 | }
440 |
441 | #card {
442 | border: none !important;
443 | }
444 |
445 | #input-group {
446 | margin-left: -30px !important;
447 | border-top-left-radius: 0;
448 | border-bottom-left-radius: 0;
449 | z-index: 1;
450 | }
451 |
452 | /* End Custom Bootstrap Css */
453 |
454 | .digit-group input {
455 | width: 50px;
456 | height: 50px;
457 | border-radius: 0.25rem;
458 | border: 1px solid #ced4da;
459 | line-height: 50px;
460 | text-align: center;
461 | font-size: 24px;
462 | font-family: 'Raleway', sans-serif;
463 | font-weight: 200;
464 | color: #000;
465 | margin: 0 2px;
466 | }
467 |
468 | .digit-group .splitter {
469 | padding: 0 5px;
470 | color: white;
471 | font-size: 24px;
472 | }
473 |
474 | .scrollable{
475 | overflow-y: auto;
476 | max-height: 500px;
477 | }
478 |
479 | /* ::-webkit-scrollbar {
480 | width: 3px;
481 | } */
482 |
483 | /* Track */
484 | /* ::-webkit-scrollbar-track {
485 | background: #f1f1f1;
486 | } */
487 |
488 | /* Handle */
489 | /* ::-webkit-scrollbar-thumb {
490 | background: red;
491 | } */
492 |
493 | /* Handle on hover */
494 | /* ::-webkit-scrollbar-thumb:hover {
495 | background: #555;
496 | } */
497 |
498 | .carousel-indicators {
499 | bottom: 67%;
500 | }
501 |
502 | .carousel-inner {
503 | margin-bottom:50px;
504 | }
505 |
506 | .carousel-indicators .active{
507 | background-color: #f00;
508 | }
509 |
510 | .carousel-indicators > button {
511 | height: 30px;
512 | width: 30px;
513 | border-radius: 15px;
514 | }
515 |
516 | /* div > label {
517 | font-size: 14px !important;
518 | } */
519 |
520 | input[type='radio']:checked:after {
521 | width: 15px;
522 | height: 15px;
523 | border-radius: 15px;
524 | top: -2px;
525 | left: -1px;
526 | position: relative;
527 | background-color: red;
528 | content: '';
529 | display: inline-block;
530 | visibility: visible;
531 | border: 2px solid white;
532 | }
533 |
534 | .title-second {
535 | font-size: 18px;
536 | }
537 |
538 | .avatar {
539 | width: 300px;
540 | margin-top: -60px;
541 | }
542 | .card-radius {
543 | border-top-left-radius: 40px !important;
544 | border-top-right-radius: 40px !important;
545 | }
546 | @media only screen and (min-width:491px) and (max-width: 540px) {
547 | .numpoint {
548 | position: relative;
549 | text-align: right;
550 | bottom: 0px;
551 | right: 0px;
552 | margin-right: 22.5% !important;
553 | margin-top: -60px !important;
554 | }
555 | .txtpoint {
556 | position: relative;
557 | text-align: right;
558 | bottom: 0px;
559 | right:0px;
560 | margin-right: 23% !important;
561 | margin-top: -8px !important;
562 | font-size: 8px !important;
563 | }
564 | .txtnext {
565 | position: relative;
566 | text-align: right;
567 | bottom: 0px;
568 | right:0px;
569 | margin-right: 22% !important;
570 | margin-top: 0px !important;
571 | font-size: 6px !important;
572 | }
573 | .carousel-indicators {
574 | bottom: 69% !important;
575 | }
576 | }
577 |
578 | @media only screen and (max-width: 490px) {
579 | .numpoint {
580 | position: relative;
581 | text-align: right;
582 | bottom: 0px;
583 | right: 0px;
584 | margin-right: 15% !important;
585 | margin-top: -60px !important;
586 | }
587 | .txtpoint {
588 | position: relative;
589 | text-align: right;
590 | bottom: 0px;
591 | right:0px;
592 | margin-right: 52px !important;
593 | margin-top: -8px !important;
594 | font-size: 8px !important;
595 | }
596 | .txtnext {
597 | position: relative;
598 | text-align: right;
599 | bottom: 0px;
600 | right:0px;
601 | margin-right: 14% !important;
602 | margin-top: 0px !important;
603 | font-size: 6px !important;
604 | }
605 | .carousel-indicators {
606 | bottom: 69% !important;
607 | }
608 | }
609 | /* @media (max-width:540px) {
610 | .carousel-indicators {
611 | bottom: 69% !important;
612 | }
613 | } */
614 | @media (max-width:768px) {
615 | .avatar {
616 | width: 260px;
617 | margin-top: -60px;
618 | }
619 | .back-card {
620 | margin-top: -100px;
621 | }
622 | /* .carousel-indicators {
623 | bottom: 74%;
624 | } */
625 | .carousel-indicators .newcard {
626 | bottom: 20% !important;
627 | }
628 | .coupon-valid, .coupon-use, .coupon-expire {
629 | width: 250px;
630 | margin: 0.1rem;
631 | }
632 | .contact-bg {
633 | background-image: url("/imgs/contact-bg.png");
634 | background-repeat: no-repeat;
635 | background-size:contain;
636 | margin-top:86px;
637 | /* background-position:center; */
638 | /* margin-top:85px; */
639 | /* background-image:url('https://www.mkrestaurant.com/public/assets/img/bg/bg__contact.jpg');
640 | background-repeat:no-repeat;
641 | background-size:contain;
642 | background-position:center; */
643 | }
644 | .numpoint {
645 | position: relative;
646 | text-align: right;
647 | bottom: 0px;
648 | right:0px;
649 | margin-right: 25%;
650 | margin-top: -60px;
651 | }
652 | .txtpoint {
653 | position: relative;
654 | text-align: right;
655 | bottom: 0px;
656 | right:0px;
657 | margin-right: 123px;
658 | margin-top: -8px;
659 | font-size: 8px;
660 | }
661 | .txtnext {
662 | position: relative;
663 | text-align: right;
664 | bottom: 0px;
665 | right:0px;
666 | margin-right: 112px;
667 | margin-top: 0px;
668 | font-size: 8px;
669 | }
670 | }
671 |
672 | @media (min-width:768px) {
673 | .avatar {
674 | width: 500px;
675 | margin-top: -60px;
676 | }
677 |
678 | .back-card {
679 | margin-top: -255px;
680 | }
681 | .carousel-indicators {
682 | bottom: 55%;
683 | }
684 | .carousel-indicators .newcard {
685 | /* bottom:645px; */
686 | bottom: 20% !important;
687 | }
688 | .coupon-valid, .coupon-use, .coupon-expire {
689 | width: 350px;
690 | margin: 0.1rem;
691 | }
692 | .contact-bg {
693 | background-image: url("/imgs/contact-bg.png");
694 | background-repeat: no-repeat;
695 | background-size:contain;
696 | margin-top:86px;
697 | /* background-position:center; */
698 | /* margin-top:85px; */
699 | /* background-image:url('https://www.mkrestaurant.com/public/assets/img/bg/bg__contact.jpg');
700 | background-repeat:no-repeat;
701 | background-size:contain;
702 | background-position:center; */
703 | }
704 | .numpoint {
705 | position: relative;
706 | text-align: right;
707 | bottom: 0px;
708 | right:0px;
709 | margin-right: 25%;
710 | margin-top: -60px;
711 | }
712 | .txtpoint {
713 | position: relative;
714 | text-align: right;
715 | bottom: 0px;
716 | right:0px;
717 | margin-right: 123px;
718 | margin-top: -8px;
719 | font-size: 8px;
720 | }
721 | .txtnext {
722 | position: relative;
723 | text-align: right;
724 | bottom: 0px;
725 | right:0px;
726 | margin-right: 117px;
727 | margin-top: 0px;
728 | font-size: 8px;
729 | }
730 | }
731 |
732 | .area1 {
733 | border-top-left-radius: 14px !important;
734 | border-top-right-radius: 14px !important;
735 | padding-top: 70px !important
736 | }
737 |
738 | .list-inline .p-divider {
739 | border-right:2px solid grey;
740 | margin:0px 20px;
741 | padding-right:25px;
742 | }
743 | .txt-red {
744 | color: #FF0000;
745 | }
746 |
747 | .centered {
748 | position: absolute;
749 | top: 50%;
750 | left: 50%;
751 | transform: translate(-50%, -50%);
752 | }
753 |
754 | .detail-profile {
755 | border: 1px solid #000;
756 | border-radius: 15px;
757 | margin: 5px;
758 | }
759 |
760 | #backdrop {
761 | position:absolute;
762 | top:0;
763 | width: 100%;
764 | height: 100%;
765 | z-index: 999;
766 | background-color: rgb(0,0,0,0.2);
767 | }
768 |
769 | .flip-card {
770 | background-color: transparent;
771 | perspective: 1000px;
772 | }
773 |
774 | .flip-card-inner {
775 | position: relative;
776 | width: 100%;
777 | height: 100%;
778 | transition: transform 0.6s;
779 | transform-style: preserve-3d;
780 | /* box-shadow: 0 8px 10px 0 rgba(90,90,90,0.2) */
781 | }
782 |
783 |
784 | .flip-card.flipped .flip-card-inner {
785 | transform: rotateY(180deg);
786 | }
787 |
788 | .flip-card-front {
789 | /* position: absolute; */
790 | width: 100%;
791 | height: 100%;
792 | /* backface-visibility: hidden; */
793 | -webkit-backface-visibility: hidden;
794 | backface-visibility: hidden;
795 | }
796 | .flip-card-back {
797 | position: absolute;
798 | width: 100%;
799 | height: 100%;
800 | backface-visibility: hidden;
801 | -webkit-backface-visibility: hidden;
802 | /* backface-visibility: hidden; */
803 | }
804 |
805 | .flip-card-back {
806 | transform: rotateY(180deg);
807 | }
808 |
809 | .mycoupon-fm {
810 | background-color: #FFF;
811 | border-top-left-radius: 40px !important;
812 | border-top-right-radius: 40px !important;
813 | }
814 | .redeem-fm {
815 | background-color: #f1f1f1;
816 | border-top-left-radius: 40px !important;
817 | border-top-right-radius: 40px !important;
818 | }
819 | .list-item-fm {
820 | background-color: #FFF;
821 | border-radius: 20px !important;
822 | border-radius: 20px !important;
823 | }
824 | .redeem-pot {
825 | margin-top:-80px;
826 | }
827 | .mycoupon-bg {
828 | background-image: url("/imgs/red-white2.png");
829 | /* background-repeat: repeat-x; */
830 | background-size: 400px 250px;
831 | }
832 | .redeem-bg {
833 | background-image: url("/imgs/red-white2.png");
834 | /* background-repeat: repeat-x; */
835 | background-size: 400px 250px;
836 | }
837 |
838 | .expired {
839 | position: absolute;
840 | background-image: url("/imgs/mk/expired.png");
841 | }
842 |
843 | #fixedbutton {
844 | position: fixed;
845 | top: 120px;
846 | right: 20px;
847 | display: none;
848 | border-color:#A9A9A9;
849 |
850 | }
851 |
852 | .btn-circle.btn-lg {
853 | width: 50px;
854 | height: 50px;
855 | padding: 5px 5px;
856 | /* font-size: 8px; */
857 | line-height: 1;
858 | border-radius: 25px;
859 | color: #FF0000;
860 | }
861 |
862 | .btn-circle.btn-xl {
863 | width: 70px;
864 | height: 70px;
865 | padding: 10px 16px;
866 | font-size: 34px;
867 | line-height: 1.33;
868 | border-radius: 35px;
869 | color: #FF0000;
870 | }
871 | #txt-small {
872 | font-size:0.6rem;
873 | color: #000;
874 | }
875 |
876 | .minus:hover{
877 | background-color: #717fe0 !important;
878 | }
879 | .plus:hover{
880 | background-color: #717fe0 !important;
881 | }
882 | #count {
883 | width: 110px;
884 | padding: 0.25rem 0.5rem;
885 | font-size: 0.7875rem;
886 | }
887 | input[type=text]:disabled {
888 | background: #c2c2c2;
889 | }
890 | .contact-bottom {
891 | background-color: #cecece;
892 | }
893 |
894 | .loader {
895 | width: 48px;
896 | height: 48px;
897 | border: 5px solid #FFF;
898 | border-bottom-color: #FF3D00;
899 | border-radius: 50%;
900 | display: inline-block;
901 | box-sizing: border-box;
902 | animation: rotation 1s linear infinite;
903 | }
904 |
905 | @keyframes rotation {
906 | 0% {
907 | transform: rotate(0deg);
908 | }
909 | 100% {
910 | transform: rotate(360deg);
911 | }
912 | }
913 |
914 | .myspinner {
915 | position: absolute;
916 | height: 100vh;
917 | display:flex;
918 | flex-direction: column;
919 | justify-content: center;
920 | align-items: center;
921 | }
922 |
923 | .close-right {
924 | position: absolute;
925 | right:0;
926 | padding: 20px 12px;
927 | font-size: 18px;
928 | }
929 |
930 | #img-fluid {
931 | max-width: 80%;
932 | height: auto;
933 | }
934 |
935 | .timecout-d {
936 | position: absolute;
937 | top:0;
938 | right: 0;
939 | margin: -10px 50px;
940 | }
941 |
942 | .timecout-m {
943 | position: absolute;
944 | top:0;
945 | right: 0;
946 | margin: -10px 30px;
947 | }
948 |
949 | #countdown-container {
950 | width: 100%;
951 | max-width: 500px;
952 | }
953 |
954 | .pot-icon-value {
955 | position: absolute;
956 | left:0;
957 | right:0;
958 | margin-top:-80px;
959 | font-size:22px;
960 | color:red;
961 | }
962 |
963 | .pot-icon-txt {
964 | position: absolute;
965 | left:0;
966 | right:0;
967 | margin-top:-50px;
968 | font-size:15px;
969 | }
970 |
971 | #outer {
972 | width: 500px;
973 | height: 150px;
974 | vertical-align: bottom;
975 | }
976 | /* .numpoint {
977 | position: relative;
978 | text-align: right;
979 | bottom: 0px;
980 | right:0px;
981 | margin-right: 52px;
982 | margin-top: -60px;
983 | }
984 | .txtpoint {
985 | position: relative;
986 | text-align: right;
987 | bottom: 0px;
988 | right:0px;
989 | margin-right: 52px;
990 | margin-top: -8px;
991 | font-size: 8px;
992 | }
993 | .txtnext {
994 | position: relative;
995 | text-align: right;
996 | bottom: 0px;
997 | right:0px;
998 | margin-right: 40px;
999 | margin-top: 0px;
1000 | font-size: 8px;
1001 | } */
1002 |
1003 | .carousel-control-prev,
1004 | .carousel-control-next{
1005 | bottom: 75%;
1006 | }
1007 |
1008 | .order-price {
1009 | position: absolute !important;
1010 | right: 0;
1011 | bottom: 0;
1012 | margin-right: 15px;
1013 | margin-bottom: 80px;
1014 | font-size: 14px;
1015 | }
1016 |
1017 | .btn-orderhistory {
1018 | font-size:14px;
1019 | color: #fff;
1020 | background-color: #00a551;
1021 | border-radius:20px;
1022 | box-shadow: 0 2px 2px #A9A9A9;
1023 | font-weight: lighter;
1024 | width: 150px;
1025 | position: absolute;
1026 | right: 0;
1027 | bottom: 0;
1028 | margin-right: 15px;
1029 | margin-bottom: 15px;
1030 | }
1031 |
1032 | .invoice {
1033 | box-shadow: 0px 3px 6px #00000029 !important;
1034 | }
1035 | .invoice-st {
1036 | background-color: #f1f1f1;
1037 | border: none !important;
1038 | }
1039 | .invoice-font {
1040 | font-size: 12px;
1041 | }
1042 | .btn-invoice-download {
1043 | font-size:14px;
1044 | color: #fff;
1045 | background-color: #ec1c24;
1046 | border-radius:20px;
1047 | box-shadow: 0 2px 2px #A9A9A9;
1048 | font-weight: lighter;
1049 | width: 230px;
1050 | }
1051 | .btn-invoice-data {
1052 | font-size:14px;
1053 | color: #fff;
1054 | background-color: #00a551;
1055 | border-radius:20px;
1056 | box-shadow: 0 2px 2px #A9A9A9;
1057 | font-weight: lighter;
1058 | width: 170px;
1059 | }
1060 | .logo-line {
1061 | background-image: url("/imgs/line_h.png");
1062 | background-repeat: repeat-x;
1063 | background-position: center bottom 40 !important;
1064 |
1065 | /* background-size:100%; */
1066 | margin: 15px 0 0 0;
1067 | }
1068 | .head-landing {
1069 | font-size: 1.5rem;
1070 | font-weight:500;
1071 | }
1072 |
1073 | .landing-control {
1074 | bottom: 0% !important;
1075 | }
1076 |
1077 | .forgot-form {
1078 | width: 560px;
1079 | border-radius: 10px;
1080 | -webkit-box-shadow: 0 3px 6px rgb(0 0 0 / 16%);
1081 | box-shadow: 0 3px 6pxrgba(0,0,0,.16);
1082 | border: 1px solidrgba(0,0,0,.125) !important;
1083 | }
1084 |
1085 | .term-form {
1086 | border-radius: 10px;
1087 | -webkit-box-shadow: 0 3px 6px rgb(0 0 0 / 16%);
1088 | box-shadow: 0 3px 6pxrgba(0,0,0,.16);
1089 | border: 1px solidrgba(0,0,0,.125) !important;
1090 | }
1091 |
1092 | .overlay {
1093 | position: fixed;
1094 | width: 100%;
1095 | height: 100%;
1096 | z-index: 1000;
1097 | top: 0;
1098 | left: 0px;
1099 | opacity: 0.5;
1100 | filter: alpha(opacity=50);
1101 | background-color: #EFEFEF;
1102 |
1103 | /* height: 100%;
1104 | width: 100%;
1105 | position: fixed;
1106 | z-index: 1000;
1107 | left: 0;
1108 | top: 0;
1109 | opacity: 0.5;
1110 | filter: alpha(opacity=50);
1111 | background-color: #EFEFEF; */
1112 |
1113 |
1114 | }
--------------------------------------------------------------------------------
/scraper/history.ndjson:
--------------------------------------------------------------------------------
1 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7633,"acc_points":12504,"updated_at":"2025-07-04T17:21:58+00:00"}
2 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7633,"acc_points":12504,"updated_at":"2025-07-05T00:33:14+00:00"}
3 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7678,"acc_points":12549,"updated_at":"2025-07-06T00:38:47+00:00"}
4 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7678,"acc_points":12549,"updated_at":"2025-07-07T00:37:53+00:00"}
5 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7199,"acc_points":12670,"updated_at":"2025-07-08T00:34:54+00:00"}
6 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7227,"acc_points":12698,"updated_at":"2025-07-09T00:35:55+00:00"}
7 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7252,"acc_points":12723,"updated_at":"2025-07-10T00:35:14+00:00"}
8 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7332,"acc_points":12803,"updated_at":"2025-07-11T00:35:34+00:00"}
9 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7379,"acc_points":12850,"updated_at":"2025-07-12T00:35:55+00:00"}
10 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7426,"acc_points":12897,"updated_at":"2025-07-13T00:39:53+00:00"}
11 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7453,"acc_points":12924,"updated_at":"2025-07-14T00:38:24+00:00"}
12 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7515,"acc_points":12986,"updated_at":"2025-07-15T00:36:59+00:00"}
13 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7515,"acc_points":12986,"updated_at":"2025-07-16T00:36:11+00:00"}
14 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7515,"acc_points":12986,"updated_at":"2025-07-17T00:36:25+00:00"}
15 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7564,"acc_points":13035,"updated_at":"2025-07-18T00:36:00+00:00"}
16 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7578,"acc_points":13049,"updated_at":"2025-07-19T00:35:40+00:00"}
17 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7714,"acc_points":13185,"updated_at":"2025-07-20T00:40:48+00:00"}
18 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7714,"acc_points":13185,"updated_at":"2025-07-21T00:39:24+00:00"}
19 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7738,"acc_points":13209,"updated_at":"2025-07-22T00:36:49+00:00"}
20 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7764,"acc_points":13235,"updated_at":"2025-07-23T00:37:01+00:00"}
21 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7764,"acc_points":13235,"updated_at":"2025-07-24T00:36:58+00:00"}
22 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7799,"acc_points":13270,"updated_at":"2025-07-25T00:36:44+00:00"}
23 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7799,"acc_points":13270,"updated_at":"2025-07-26T00:35:19+00:00"}
24 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7893,"acc_points":13364,"updated_at":"2025-07-27T00:40:45+00:00"}
25 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7958,"acc_points":13429,"updated_at":"2025-07-28T00:39:48+00:00"}
26 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7980,"acc_points":13451,"updated_at":"2025-07-29T00:40:19+00:00"}
27 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8038,"acc_points":13509,"updated_at":"2025-07-30T00:37:15+00:00"}
28 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8060,"acc_points":13531,"updated_at":"2025-07-31T00:36:53+00:00"}
29 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8070,"acc_points":13541,"updated_at":"2025-08-01T00:42:15+00:00"}
30 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7331,"acc_points":13602,"updated_at":"2025-08-02T00:35:28+00:00"}
31 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7331,"acc_points":13602,"updated_at":"2025-08-03T00:41:24+00:00"}
32 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7424,"acc_points":13695,"updated_at":"2025-08-04T00:40:43+00:00"}
33 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7447,"acc_points":13718,"updated_at":"2025-08-05T00:37:55+00:00"}
34 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7467,"acc_points":13738,"updated_at":"2025-08-06T00:37:56+00:00"}
35 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7491,"acc_points":13762,"updated_at":"2025-08-07T00:41:55+00:00"}
36 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7502,"acc_points":13773,"updated_at":"2025-08-08T00:37:23+00:00"}
37 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7580,"acc_points":13851,"updated_at":"2025-08-09T00:34:04+00:00"}
38 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7637,"acc_points":13908,"updated_at":"2025-08-10T00:40:17+00:00"}
39 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7637,"acc_points":13908,"updated_at":"2025-08-11T00:38:54+00:00"}
40 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7637,"acc_points":13908,"updated_at":"2025-08-12T00:34:36+00:00"}
41 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7672,"acc_points":13943,"updated_at":"2025-08-13T00:35:37+00:00"}
42 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7672,"acc_points":13943,"updated_at":"2025-08-14T00:34:55+00:00"}
43 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7700,"acc_points":13971,"updated_at":"2025-08-15T00:35:49+00:00"}
44 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7780,"acc_points":14051,"updated_at":"2025-08-16T00:33:13+00:00"}
45 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7780,"acc_points":14051,"updated_at":"2025-08-17T00:38:23+00:00"}
46 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7797,"acc_points":14068,"updated_at":"2025-08-18T00:38:02+00:00"}
47 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7877,"acc_points":14148,"updated_at":"2025-08-19T00:34:10+00:00"}
48 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7877,"acc_points":14148,"updated_at":"2025-08-20T00:32:30+00:00"}
49 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7877,"acc_points":14148,"updated_at":"2025-08-21T00:32:05+00:00"}
50 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7930,"acc_points":14201,"updated_at":"2025-08-22T00:33:02+00:00"}
51 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7930,"acc_points":14201,"updated_at":"2025-08-23T00:32:03+00:00"}
52 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7940,"acc_points":14211,"updated_at":"2025-08-24T00:36:57+00:00"}
53 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8032,"acc_points":14303,"updated_at":"2025-08-25T00:34:49+00:00"}
54 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8063,"acc_points":14334,"updated_at":"2025-08-26T00:33:18+00:00"}
55 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8063,"acc_points":14334,"updated_at":"2025-08-27T00:32:48+00:00"}
56 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8133,"acc_points":14404,"updated_at":"2025-08-28T00:32:31+00:00"}
57 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8198,"acc_points":14469,"updated_at":"2025-08-29T00:32:32+00:00"}
58 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8198,"acc_points":14469,"updated_at":"2025-08-30T00:30:45+00:00"}
59 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8281,"acc_points":14552,"updated_at":"2025-08-31T00:35:27+00:00"}
60 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8320,"acc_points":14591,"updated_at":"2025-09-01T00:40:12+00:00"}
61 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8324,"acc_points":14595,"updated_at":"2025-09-02T00:32:42+00:00"}
62 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8324,"acc_points":14595,"updated_at":"2025-09-03T00:30:35+00:00"}
63 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8357,"acc_points":14628,"updated_at":"2025-09-04T00:30:55+00:00"}
64 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8508,"acc_points":14779,"updated_at":"2025-09-05T00:31:50+00:00"}
65 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7608,"acc_points":14879,"updated_at":"2025-09-06T00:30:23+00:00"}
66 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7608,"acc_points":14879,"updated_at":"2025-09-06T16:51:42+00:00"}
67 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7608,"acc_points":14879,"updated_at":"2025-09-07T00:35:05+00:00"}
68 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7655,"acc_points":14926,"updated_at":"2025-09-08T00:34:13+00:00"}
69 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7722,"acc_points":14993,"updated_at":"2025-09-09T00:32:08+00:00"}
70 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7781,"acc_points":15052,"updated_at":"2025-09-10T00:31:18+00:00"}
71 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7806,"acc_points":15077,"updated_at":"2025-09-11T00:31:44+00:00"}
72 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7806,"acc_points":15077,"updated_at":"2025-09-12T00:31:08+00:00"}
73 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7953,"acc_points":15224,"updated_at":"2025-09-13T00:29:02+00:00"}
74 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8008,"acc_points":15279,"updated_at":"2025-09-14T00:34:06+00:00"}
75 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8008,"acc_points":15279,"updated_at":"2025-09-15T00:34:40+00:00"}
76 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8094,"acc_points":15365,"updated_at":"2025-09-16T00:31:11+00:00"}
77 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8160,"acc_points":15431,"updated_at":"2025-09-17T00:31:36+00:00"}
78 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8230,"acc_points":15501,"updated_at":"2025-09-18T00:30:39+00:00"}
79 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8261,"acc_points":15532,"updated_at":"2025-09-19T00:31:57+00:00"}
80 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8355,"acc_points":15626,"updated_at":"2025-09-20T00:30:05+00:00"}
81 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8355,"acc_points":15626,"updated_at":"2025-09-21T00:35:06+00:00"}
82 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8355,"acc_points":15626,"updated_at":"2025-09-22T00:35:34+00:00"}
83 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8355,"acc_points":15626,"updated_at":"2025-09-23T00:31:38+00:00"}
84 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":6802,"acc_points":15673,"updated_at":"2025-09-24T00:32:28+00:00"}
85 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":6865,"acc_points":15736,"updated_at":"2025-09-25T00:32:18+00:00"}
86 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":6972,"acc_points":15843,"updated_at":"2025-09-26T00:31:35+00:00"}
87 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":6975,"acc_points":15846,"updated_at":"2025-09-27T00:30:38+00:00"}
88 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7042,"acc_points":15913,"updated_at":"2025-09-28T00:36:02+00:00"}
89 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7141,"acc_points":16012,"updated_at":"2025-09-29T00:33:30+00:00"}
90 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7286,"acc_points":16157,"updated_at":"2025-09-30T00:32:33+00:00"}
91 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7346,"acc_points":16217,"updated_at":"2025-10-01T00:36:46+00:00"}
92 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7459,"acc_points":16330,"updated_at":"2025-10-02T00:31:01+00:00"}
93 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7459,"acc_points":16330,"updated_at":"2025-10-03T00:31:00+00:00"}
94 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7459,"acc_points":16330,"updated_at":"2025-10-04T00:29:54+00:00"}
95 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7554,"acc_points":16425,"updated_at":"2025-10-05T00:35:18+00:00"}
96 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7554,"acc_points":16425,"updated_at":"2025-10-06T00:32:47+00:00"}
97 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7697,"acc_points":16568,"updated_at":"2025-10-07T00:31:38+00:00"}
98 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7723,"acc_points":16594,"updated_at":"2025-10-08T00:31:29+00:00"}
99 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7723,"acc_points":16594,"updated_at":"2025-10-09T00:31:41+00:00"}
100 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7723,"acc_points":16594,"updated_at":"2025-10-10T00:31:54+00:00"}
101 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7736,"acc_points":16607,"updated_at":"2025-10-11T00:30:27+00:00"}
102 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7821,"acc_points":16692,"updated_at":"2025-10-12T00:33:59+00:00"}
103 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7934,"acc_points":16805,"updated_at":"2025-10-13T00:34:54+00:00"}
104 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8050,"acc_points":16921,"updated_at":"2025-10-14T00:31:17+00:00"}
105 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8050,"acc_points":16921,"updated_at":"2025-10-15T00:33:17+00:00"}
106 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8110,"acc_points":16981,"updated_at":"2025-10-16T00:33:15+00:00"}
107 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8182,"acc_points":17053,"updated_at":"2025-10-17T00:32:47+00:00"}
108 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8182,"acc_points":17053,"updated_at":"2025-10-18T00:30:34+00:00"}
109 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8220,"acc_points":17091,"updated_at":"2025-10-19T00:36:40+00:00"}
110 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8267,"acc_points":17138,"updated_at":"2025-10-20T00:35:42+00:00"}
111 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8292,"acc_points":17163,"updated_at":"2025-10-21T00:33:23+00:00"}
112 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8292,"acc_points":17163,"updated_at":"2025-10-22T00:34:18+00:00"}
113 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8315,"acc_points":17186,"updated_at":"2025-10-23T00:33:03+00:00"}
114 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8315,"acc_points":17186,"updated_at":"2025-10-24T00:30:45+00:00"}
115 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8318,"acc_points":17189,"updated_at":"2025-10-25T00:32:10+00:00"}
116 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8366,"acc_points":17237,"updated_at":"2025-10-26T00:35:36+00:00"}
117 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8394,"acc_points":17265,"updated_at":"2025-10-27T00:36:29+00:00"}
118 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8394,"acc_points":17265,"updated_at":"2025-10-28T00:32:23+00:00"}
119 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8394,"acc_points":17265,"updated_at":"2025-10-29T00:34:34+00:00"}
120 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8525,"acc_points":17396,"updated_at":"2025-10-30T00:34:27+00:00"}
121 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8579,"acc_points":17450,"updated_at":"2025-10-31T00:33:15+00:00"}
122 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8625,"acc_points":17496,"updated_at":"2025-11-01T00:36:10+00:00"}
123 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8660,"acc_points":17531,"updated_at":"2025-11-02T00:36:40+00:00"}
124 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8660,"acc_points":17531,"updated_at":"2025-11-03T00:36:12+00:00"}
125 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8739,"acc_points":17610,"updated_at":"2025-11-04T00:33:26+00:00"}
126 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8768,"acc_points":17639,"updated_at":"2025-11-05T00:34:41+00:00"}
127 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8947,"acc_points":17818,"updated_at":"2025-11-06T00:33:56+00:00"}
128 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8947,"acc_points":17818,"updated_at":"2025-11-07T00:33:57+00:00"}
129 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8947,"acc_points":17818,"updated_at":"2025-11-08T00:31:56+00:00"}
130 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9196,"acc_points":18067,"updated_at":"2025-11-09T00:36:42+00:00"}
131 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8506,"acc_points":18177,"updated_at":"2025-11-10T00:36:12+00:00"}
132 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8535,"acc_points":18206,"updated_at":"2025-11-11T00:34:43+00:00"}
133 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8535,"acc_points":18206,"updated_at":"2025-11-12T00:34:17+00:00"}
134 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8535,"acc_points":18206,"updated_at":"2025-11-13T00:34:02+00:00"}
135 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8570,"acc_points":18241,"updated_at":"2025-11-14T00:34:20+00:00"}
136 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8570,"acc_points":18241,"updated_at":"2025-11-15T00:33:22+00:00"}
137 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8610,"acc_points":18281,"updated_at":"2025-11-16T00:37:18+00:00"}
138 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8610,"acc_points":18281,"updated_at":"2025-11-17T00:35:54+00:00"}
139 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8660,"acc_points":18331,"updated_at":"2025-11-18T00:34:07+00:00"}
140 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8718,"acc_points":18389,"updated_at":"2025-11-19T00:34:52+00:00"}
141 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8718,"acc_points":18389,"updated_at":"2025-11-20T00:33:40+00:00"}
142 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8795,"acc_points":18466,"updated_at":"2025-11-21T00:34:16+00:00"}
143 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8809,"acc_points":18480,"updated_at":"2025-11-22T00:33:08+00:00"}
144 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8846,"acc_points":18517,"updated_at":"2025-11-23T00:39:35+00:00"}
145 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8846,"acc_points":18517,"updated_at":"2025-11-24T00:37:15+00:00"}
146 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8942,"acc_points":18613,"updated_at":"2025-11-25T00:33:23+00:00"}
147 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9029,"acc_points":18700,"updated_at":"2025-11-26T00:34:43+00:00"}
148 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9315,"acc_points":18986,"updated_at":"2025-11-27T00:34:11+00:00"}
149 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9495,"acc_points":19166,"updated_at":"2025-11-28T00:33:40+00:00"}
150 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9495,"acc_points":19166,"updated_at":"2025-11-29T00:33:11+00:00"}
151 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9495,"acc_points":19166,"updated_at":"2025-11-30T00:39:08+00:00"}
152 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9495,"acc_points":0,"updated_at":"2025-12-01T00:42:48+00:00"}
153 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9504,"acc_points":9,"updated_at":"2025-12-02T00:35:41+00:00"}
154 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9504,"acc_points":9,"updated_at":"2025-12-03T00:35:09+00:00"}
155 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9559,"acc_points":64,"updated_at":"2025-12-04T00:35:38+00:00"}
156 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9599,"acc_points":104,"updated_at":"2025-12-05T00:35:56+00:00"}
157 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9721,"acc_points":226,"updated_at":"2025-12-06T00:33:30+00:00"}
158 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9776,"acc_points":281,"updated_at":"2025-12-07T00:39:28+00:00"}
159 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9878,"acc_points":383,"updated_at":"2025-12-08T00:36:07+00:00"}
160 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9922,"acc_points":427,"updated_at":"2025-12-09T00:35:36+00:00"}
161 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9922,"acc_points":427,"updated_at":"2025-12-10T00:36:29+00:00"}
162 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9972,"acc_points":477,"updated_at":"2025-12-11T00:36:16+00:00"}
163 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9972,"acc_points":477,"updated_at":"2025-12-12T00:36:20+00:00"}
164 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":10003,"acc_points":508,"updated_at":"2025-12-13T00:34:31+00:00"}
165 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8418,"acc_points":523,"updated_at":"2025-12-14T00:39:36+00:00"}
166 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8454,"acc_points":559,"updated_at":"2025-12-15T00:38:49+00:00"}
167 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8454,"acc_points":559,"updated_at":"2025-12-16T00:36:33+00:00"}
168 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8454,"acc_points":559,"updated_at":"2025-12-17T00:34:59+00:00"}
169 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8493,"acc_points":598,"updated_at":"2025-12-18T00:32:58+00:00"}
170 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8517,"acc_points":622,"updated_at":"2025-12-19T00:36:14+00:00"}
171 |
--------------------------------------------------------------------------------
/renderer/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | dependencies:
11 | date-fns:
12 | specifier: ^4.1.0
13 | version: 4.1.0
14 | qrcode:
15 | specifier: ^1.5.4
16 | version: 1.5.4
17 | devDependencies:
18 | '@sveltejs/vite-plugin-svelte':
19 | specifier: ^5.0.3
20 | version: 5.0.3(svelte@5.28.2)(vite@6.3.3)
21 | '@tsconfig/svelte':
22 | specifier: ^5.0.4
23 | version: 5.0.4
24 | canvas-circular-countdown:
25 | specifier: ^1.8.0
26 | version: 1.8.0
27 | svelte:
28 | specifier: ^5.28.2
29 | version: 5.28.2
30 | svelte-check:
31 | specifier: ^4.1.6
32 | version: 4.1.6(picomatch@4.0.2)(svelte@5.28.2)(typescript@5.8.3)
33 | tslib:
34 | specifier: ^2.8.1
35 | version: 2.8.1
36 | typescript:
37 | specifier: ^5.8.3
38 | version: 5.8.3
39 | vite:
40 | specifier: ^6.3.3
41 | version: 6.3.3
42 |
43 | packages:
44 |
45 | '@ampproject/remapping@2.3.0':
46 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
47 | engines: {node: '>=6.0.0'}
48 |
49 | '@esbuild/aix-ppc64@0.25.3':
50 | resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==}
51 | engines: {node: '>=18'}
52 | cpu: [ppc64]
53 | os: [aix]
54 |
55 | '@esbuild/android-arm64@0.25.3':
56 | resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==}
57 | engines: {node: '>=18'}
58 | cpu: [arm64]
59 | os: [android]
60 |
61 | '@esbuild/android-arm@0.25.3':
62 | resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==}
63 | engines: {node: '>=18'}
64 | cpu: [arm]
65 | os: [android]
66 |
67 | '@esbuild/android-x64@0.25.3':
68 | resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==}
69 | engines: {node: '>=18'}
70 | cpu: [x64]
71 | os: [android]
72 |
73 | '@esbuild/darwin-arm64@0.25.3':
74 | resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==}
75 | engines: {node: '>=18'}
76 | cpu: [arm64]
77 | os: [darwin]
78 |
79 | '@esbuild/darwin-x64@0.25.3':
80 | resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==}
81 | engines: {node: '>=18'}
82 | cpu: [x64]
83 | os: [darwin]
84 |
85 | '@esbuild/freebsd-arm64@0.25.3':
86 | resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==}
87 | engines: {node: '>=18'}
88 | cpu: [arm64]
89 | os: [freebsd]
90 |
91 | '@esbuild/freebsd-x64@0.25.3':
92 | resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==}
93 | engines: {node: '>=18'}
94 | cpu: [x64]
95 | os: [freebsd]
96 |
97 | '@esbuild/linux-arm64@0.25.3':
98 | resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==}
99 | engines: {node: '>=18'}
100 | cpu: [arm64]
101 | os: [linux]
102 |
103 | '@esbuild/linux-arm@0.25.3':
104 | resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==}
105 | engines: {node: '>=18'}
106 | cpu: [arm]
107 | os: [linux]
108 |
109 | '@esbuild/linux-ia32@0.25.3':
110 | resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==}
111 | engines: {node: '>=18'}
112 | cpu: [ia32]
113 | os: [linux]
114 |
115 | '@esbuild/linux-loong64@0.25.3':
116 | resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==}
117 | engines: {node: '>=18'}
118 | cpu: [loong64]
119 | os: [linux]
120 |
121 | '@esbuild/linux-mips64el@0.25.3':
122 | resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==}
123 | engines: {node: '>=18'}
124 | cpu: [mips64el]
125 | os: [linux]
126 |
127 | '@esbuild/linux-ppc64@0.25.3':
128 | resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==}
129 | engines: {node: '>=18'}
130 | cpu: [ppc64]
131 | os: [linux]
132 |
133 | '@esbuild/linux-riscv64@0.25.3':
134 | resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==}
135 | engines: {node: '>=18'}
136 | cpu: [riscv64]
137 | os: [linux]
138 |
139 | '@esbuild/linux-s390x@0.25.3':
140 | resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==}
141 | engines: {node: '>=18'}
142 | cpu: [s390x]
143 | os: [linux]
144 |
145 | '@esbuild/linux-x64@0.25.3':
146 | resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==}
147 | engines: {node: '>=18'}
148 | cpu: [x64]
149 | os: [linux]
150 |
151 | '@esbuild/netbsd-arm64@0.25.3':
152 | resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==}
153 | engines: {node: '>=18'}
154 | cpu: [arm64]
155 | os: [netbsd]
156 |
157 | '@esbuild/netbsd-x64@0.25.3':
158 | resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==}
159 | engines: {node: '>=18'}
160 | cpu: [x64]
161 | os: [netbsd]
162 |
163 | '@esbuild/openbsd-arm64@0.25.3':
164 | resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==}
165 | engines: {node: '>=18'}
166 | cpu: [arm64]
167 | os: [openbsd]
168 |
169 | '@esbuild/openbsd-x64@0.25.3':
170 | resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==}
171 | engines: {node: '>=18'}
172 | cpu: [x64]
173 | os: [openbsd]
174 |
175 | '@esbuild/sunos-x64@0.25.3':
176 | resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==}
177 | engines: {node: '>=18'}
178 | cpu: [x64]
179 | os: [sunos]
180 |
181 | '@esbuild/win32-arm64@0.25.3':
182 | resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==}
183 | engines: {node: '>=18'}
184 | cpu: [arm64]
185 | os: [win32]
186 |
187 | '@esbuild/win32-ia32@0.25.3':
188 | resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==}
189 | engines: {node: '>=18'}
190 | cpu: [ia32]
191 | os: [win32]
192 |
193 | '@esbuild/win32-x64@0.25.3':
194 | resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==}
195 | engines: {node: '>=18'}
196 | cpu: [x64]
197 | os: [win32]
198 |
199 | '@jridgewell/gen-mapping@0.3.8':
200 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
201 | engines: {node: '>=6.0.0'}
202 |
203 | '@jridgewell/resolve-uri@3.1.2':
204 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
205 | engines: {node: '>=6.0.0'}
206 |
207 | '@jridgewell/set-array@1.2.1':
208 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
209 | engines: {node: '>=6.0.0'}
210 |
211 | '@jridgewell/sourcemap-codec@1.5.0':
212 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
213 |
214 | '@jridgewell/trace-mapping@0.3.25':
215 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
216 |
217 | '@rollup/rollup-android-arm-eabi@4.40.0':
218 | resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==}
219 | cpu: [arm]
220 | os: [android]
221 |
222 | '@rollup/rollup-android-arm64@4.40.0':
223 | resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==}
224 | cpu: [arm64]
225 | os: [android]
226 |
227 | '@rollup/rollup-darwin-arm64@4.40.0':
228 | resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==}
229 | cpu: [arm64]
230 | os: [darwin]
231 |
232 | '@rollup/rollup-darwin-x64@4.40.0':
233 | resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==}
234 | cpu: [x64]
235 | os: [darwin]
236 |
237 | '@rollup/rollup-freebsd-arm64@4.40.0':
238 | resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==}
239 | cpu: [arm64]
240 | os: [freebsd]
241 |
242 | '@rollup/rollup-freebsd-x64@4.40.0':
243 | resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==}
244 | cpu: [x64]
245 | os: [freebsd]
246 |
247 | '@rollup/rollup-linux-arm-gnueabihf@4.40.0':
248 | resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==}
249 | cpu: [arm]
250 | os: [linux]
251 |
252 | '@rollup/rollup-linux-arm-musleabihf@4.40.0':
253 | resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==}
254 | cpu: [arm]
255 | os: [linux]
256 |
257 | '@rollup/rollup-linux-arm64-gnu@4.40.0':
258 | resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==}
259 | cpu: [arm64]
260 | os: [linux]
261 |
262 | '@rollup/rollup-linux-arm64-musl@4.40.0':
263 | resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==}
264 | cpu: [arm64]
265 | os: [linux]
266 |
267 | '@rollup/rollup-linux-loongarch64-gnu@4.40.0':
268 | resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==}
269 | cpu: [loong64]
270 | os: [linux]
271 |
272 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.0':
273 | resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==}
274 | cpu: [ppc64]
275 | os: [linux]
276 |
277 | '@rollup/rollup-linux-riscv64-gnu@4.40.0':
278 | resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==}
279 | cpu: [riscv64]
280 | os: [linux]
281 |
282 | '@rollup/rollup-linux-riscv64-musl@4.40.0':
283 | resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==}
284 | cpu: [riscv64]
285 | os: [linux]
286 |
287 | '@rollup/rollup-linux-s390x-gnu@4.40.0':
288 | resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==}
289 | cpu: [s390x]
290 | os: [linux]
291 |
292 | '@rollup/rollup-linux-x64-gnu@4.40.0':
293 | resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==}
294 | cpu: [x64]
295 | os: [linux]
296 |
297 | '@rollup/rollup-linux-x64-musl@4.40.0':
298 | resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==}
299 | cpu: [x64]
300 | os: [linux]
301 |
302 | '@rollup/rollup-win32-arm64-msvc@4.40.0':
303 | resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==}
304 | cpu: [arm64]
305 | os: [win32]
306 |
307 | '@rollup/rollup-win32-ia32-msvc@4.40.0':
308 | resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==}
309 | cpu: [ia32]
310 | os: [win32]
311 |
312 | '@rollup/rollup-win32-x64-msvc@4.40.0':
313 | resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==}
314 | cpu: [x64]
315 | os: [win32]
316 |
317 | '@sveltejs/acorn-typescript@1.0.5':
318 | resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==}
319 | peerDependencies:
320 | acorn: ^8.9.0
321 |
322 | '@sveltejs/vite-plugin-svelte-inspector@4.0.1':
323 | resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==}
324 | engines: {node: ^18.0.0 || ^20.0.0 || >=22}
325 | peerDependencies:
326 | '@sveltejs/vite-plugin-svelte': ^5.0.0
327 | svelte: ^5.0.0
328 | vite: ^6.0.0
329 |
330 | '@sveltejs/vite-plugin-svelte@5.0.3':
331 | resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==}
332 | engines: {node: ^18.0.0 || ^20.0.0 || >=22}
333 | peerDependencies:
334 | svelte: ^5.0.0
335 | vite: ^6.0.0
336 |
337 | '@tsconfig/svelte@5.0.4':
338 | resolution: {integrity: sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==}
339 |
340 | '@types/estree@1.0.7':
341 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
342 |
343 | acorn@8.14.1:
344 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
345 | engines: {node: '>=0.4.0'}
346 | hasBin: true
347 |
348 | ansi-regex@5.0.1:
349 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
350 | engines: {node: '>=8'}
351 |
352 | ansi-styles@4.3.0:
353 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
354 | engines: {node: '>=8'}
355 |
356 | aria-query@5.3.2:
357 | resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
358 | engines: {node: '>= 0.4'}
359 |
360 | axobject-query@4.1.0:
361 | resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
362 | engines: {node: '>= 0.4'}
363 |
364 | camelcase@5.3.1:
365 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
366 | engines: {node: '>=6'}
367 |
368 | canvas-circular-countdown@1.8.0:
369 | resolution: {integrity: sha512-LKZCfTdp3qkC6VqBt2lBfEYf/xGuPGn6aHcIKp9sIVE1DD0GPVFcnsd+EUJrZ4V79Y//aJ2fKqfASag8ZfJDSg==}
370 |
371 | chokidar@4.0.3:
372 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
373 | engines: {node: '>= 14.16.0'}
374 |
375 | cliui@6.0.0:
376 | resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
377 |
378 | clsx@2.1.1:
379 | resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
380 | engines: {node: '>=6'}
381 |
382 | color-convert@2.0.1:
383 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
384 | engines: {node: '>=7.0.0'}
385 |
386 | color-name@1.1.4:
387 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
388 |
389 | date-fns@4.1.0:
390 | resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
391 |
392 | debug@4.4.0:
393 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
394 | engines: {node: '>=6.0'}
395 | peerDependencies:
396 | supports-color: '*'
397 | peerDependenciesMeta:
398 | supports-color:
399 | optional: true
400 |
401 | decamelize@1.2.0:
402 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
403 | engines: {node: '>=0.10.0'}
404 |
405 | deepmerge@4.3.1:
406 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
407 | engines: {node: '>=0.10.0'}
408 |
409 | dijkstrajs@1.0.3:
410 | resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
411 |
412 | emoji-regex@8.0.0:
413 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
414 |
415 | esbuild@0.25.3:
416 | resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==}
417 | engines: {node: '>=18'}
418 | hasBin: true
419 |
420 | esm-env@1.2.2:
421 | resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
422 |
423 | esrap@1.4.6:
424 | resolution: {integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==}
425 |
426 | fdir@6.4.4:
427 | resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==}
428 | peerDependencies:
429 | picomatch: ^3 || ^4
430 | peerDependenciesMeta:
431 | picomatch:
432 | optional: true
433 |
434 | find-up@4.1.0:
435 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
436 | engines: {node: '>=8'}
437 |
438 | fsevents@2.3.3:
439 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
440 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
441 | os: [darwin]
442 |
443 | get-caller-file@2.0.5:
444 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
445 | engines: {node: 6.* || 8.* || >= 10.*}
446 |
447 | is-fullwidth-code-point@3.0.0:
448 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
449 | engines: {node: '>=8'}
450 |
451 | is-reference@3.0.3:
452 | resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==}
453 |
454 | kleur@4.1.5:
455 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
456 | engines: {node: '>=6'}
457 |
458 | locate-character@3.0.0:
459 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
460 |
461 | locate-path@5.0.0:
462 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
463 | engines: {node: '>=8'}
464 |
465 | magic-string@0.30.17:
466 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
467 |
468 | mri@1.2.0:
469 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
470 | engines: {node: '>=4'}
471 |
472 | ms@2.1.3:
473 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
474 |
475 | nanoid@3.3.11:
476 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
477 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
478 | hasBin: true
479 |
480 | p-limit@2.3.0:
481 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
482 | engines: {node: '>=6'}
483 |
484 | p-locate@4.1.0:
485 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
486 | engines: {node: '>=8'}
487 |
488 | p-try@2.2.0:
489 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
490 | engines: {node: '>=6'}
491 |
492 | path-exists@4.0.0:
493 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
494 | engines: {node: '>=8'}
495 |
496 | picocolors@1.1.1:
497 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
498 |
499 | picomatch@4.0.2:
500 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
501 | engines: {node: '>=12'}
502 |
503 | pngjs@5.0.0:
504 | resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
505 | engines: {node: '>=10.13.0'}
506 |
507 | postcss@8.5.3:
508 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
509 | engines: {node: ^10 || ^12 || >=14}
510 |
511 | qrcode@1.5.4:
512 | resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
513 | engines: {node: '>=10.13.0'}
514 | hasBin: true
515 |
516 | readdirp@4.1.2:
517 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
518 | engines: {node: '>= 14.18.0'}
519 |
520 | require-directory@2.1.1:
521 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
522 | engines: {node: '>=0.10.0'}
523 |
524 | require-main-filename@2.0.0:
525 | resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
526 |
527 | rollup@4.40.0:
528 | resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==}
529 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
530 | hasBin: true
531 |
532 | sade@1.8.1:
533 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
534 | engines: {node: '>=6'}
535 |
536 | set-blocking@2.0.0:
537 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
538 |
539 | source-map-js@1.2.1:
540 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
541 | engines: {node: '>=0.10.0'}
542 |
543 | string-width@4.2.3:
544 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
545 | engines: {node: '>=8'}
546 |
547 | strip-ansi@6.0.1:
548 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
549 | engines: {node: '>=8'}
550 |
551 | svelte-check@4.1.6:
552 | resolution: {integrity: sha512-P7w/6tdSfk3zEVvfsgrp3h3DFC75jCdZjTQvgGJtjPORs1n7/v2VMPIoty3PWv7jnfEm3x0G/p9wH4pecTb0Wg==}
553 | engines: {node: '>= 18.0.0'}
554 | hasBin: true
555 | peerDependencies:
556 | svelte: ^4.0.0 || ^5.0.0-next.0
557 | typescript: '>=5.0.0'
558 |
559 | svelte@5.28.2:
560 | resolution: {integrity: sha512-FbWBxgWOpQfhKvoGJv/TFwzqb4EhJbwCD17dB0tEpQiw1XyUEKZJtgm4nA4xq3LLsMo7hu5UY/BOFmroAxKTMg==}
561 | engines: {node: '>=18'}
562 |
563 | tinyglobby@0.2.13:
564 | resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==}
565 | engines: {node: '>=12.0.0'}
566 |
567 | tslib@2.8.1:
568 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
569 |
570 | typescript@5.8.3:
571 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
572 | engines: {node: '>=14.17'}
573 | hasBin: true
574 |
575 | vite@6.3.3:
576 | resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==}
577 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
578 | hasBin: true
579 | peerDependencies:
580 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
581 | jiti: '>=1.21.0'
582 | less: '*'
583 | lightningcss: ^1.21.0
584 | sass: '*'
585 | sass-embedded: '*'
586 | stylus: '*'
587 | sugarss: '*'
588 | terser: ^5.16.0
589 | tsx: ^4.8.1
590 | yaml: ^2.4.2
591 | peerDependenciesMeta:
592 | '@types/node':
593 | optional: true
594 | jiti:
595 | optional: true
596 | less:
597 | optional: true
598 | lightningcss:
599 | optional: true
600 | sass:
601 | optional: true
602 | sass-embedded:
603 | optional: true
604 | stylus:
605 | optional: true
606 | sugarss:
607 | optional: true
608 | terser:
609 | optional: true
610 | tsx:
611 | optional: true
612 | yaml:
613 | optional: true
614 |
615 | vitefu@1.0.6:
616 | resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==}
617 | peerDependencies:
618 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
619 | peerDependenciesMeta:
620 | vite:
621 | optional: true
622 |
623 | which-module@2.0.1:
624 | resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
625 |
626 | wrap-ansi@6.2.0:
627 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
628 | engines: {node: '>=8'}
629 |
630 | y18n@4.0.3:
631 | resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
632 |
633 | yargs-parser@18.1.3:
634 | resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
635 | engines: {node: '>=6'}
636 |
637 | yargs@15.4.1:
638 | resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
639 | engines: {node: '>=8'}
640 |
641 | zimmerframe@1.1.2:
642 | resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==}
643 |
644 | snapshots:
645 |
646 | '@ampproject/remapping@2.3.0':
647 | dependencies:
648 | '@jridgewell/gen-mapping': 0.3.8
649 | '@jridgewell/trace-mapping': 0.3.25
650 |
651 | '@esbuild/aix-ppc64@0.25.3':
652 | optional: true
653 |
654 | '@esbuild/android-arm64@0.25.3':
655 | optional: true
656 |
657 | '@esbuild/android-arm@0.25.3':
658 | optional: true
659 |
660 | '@esbuild/android-x64@0.25.3':
661 | optional: true
662 |
663 | '@esbuild/darwin-arm64@0.25.3':
664 | optional: true
665 |
666 | '@esbuild/darwin-x64@0.25.3':
667 | optional: true
668 |
669 | '@esbuild/freebsd-arm64@0.25.3':
670 | optional: true
671 |
672 | '@esbuild/freebsd-x64@0.25.3':
673 | optional: true
674 |
675 | '@esbuild/linux-arm64@0.25.3':
676 | optional: true
677 |
678 | '@esbuild/linux-arm@0.25.3':
679 | optional: true
680 |
681 | '@esbuild/linux-ia32@0.25.3':
682 | optional: true
683 |
684 | '@esbuild/linux-loong64@0.25.3':
685 | optional: true
686 |
687 | '@esbuild/linux-mips64el@0.25.3':
688 | optional: true
689 |
690 | '@esbuild/linux-ppc64@0.25.3':
691 | optional: true
692 |
693 | '@esbuild/linux-riscv64@0.25.3':
694 | optional: true
695 |
696 | '@esbuild/linux-s390x@0.25.3':
697 | optional: true
698 |
699 | '@esbuild/linux-x64@0.25.3':
700 | optional: true
701 |
702 | '@esbuild/netbsd-arm64@0.25.3':
703 | optional: true
704 |
705 | '@esbuild/netbsd-x64@0.25.3':
706 | optional: true
707 |
708 | '@esbuild/openbsd-arm64@0.25.3':
709 | optional: true
710 |
711 | '@esbuild/openbsd-x64@0.25.3':
712 | optional: true
713 |
714 | '@esbuild/sunos-x64@0.25.3':
715 | optional: true
716 |
717 | '@esbuild/win32-arm64@0.25.3':
718 | optional: true
719 |
720 | '@esbuild/win32-ia32@0.25.3':
721 | optional: true
722 |
723 | '@esbuild/win32-x64@0.25.3':
724 | optional: true
725 |
726 | '@jridgewell/gen-mapping@0.3.8':
727 | dependencies:
728 | '@jridgewell/set-array': 1.2.1
729 | '@jridgewell/sourcemap-codec': 1.5.0
730 | '@jridgewell/trace-mapping': 0.3.25
731 |
732 | '@jridgewell/resolve-uri@3.1.2': {}
733 |
734 | '@jridgewell/set-array@1.2.1': {}
735 |
736 | '@jridgewell/sourcemap-codec@1.5.0': {}
737 |
738 | '@jridgewell/trace-mapping@0.3.25':
739 | dependencies:
740 | '@jridgewell/resolve-uri': 3.1.2
741 | '@jridgewell/sourcemap-codec': 1.5.0
742 |
743 | '@rollup/rollup-android-arm-eabi@4.40.0':
744 | optional: true
745 |
746 | '@rollup/rollup-android-arm64@4.40.0':
747 | optional: true
748 |
749 | '@rollup/rollup-darwin-arm64@4.40.0':
750 | optional: true
751 |
752 | '@rollup/rollup-darwin-x64@4.40.0':
753 | optional: true
754 |
755 | '@rollup/rollup-freebsd-arm64@4.40.0':
756 | optional: true
757 |
758 | '@rollup/rollup-freebsd-x64@4.40.0':
759 | optional: true
760 |
761 | '@rollup/rollup-linux-arm-gnueabihf@4.40.0':
762 | optional: true
763 |
764 | '@rollup/rollup-linux-arm-musleabihf@4.40.0':
765 | optional: true
766 |
767 | '@rollup/rollup-linux-arm64-gnu@4.40.0':
768 | optional: true
769 |
770 | '@rollup/rollup-linux-arm64-musl@4.40.0':
771 | optional: true
772 |
773 | '@rollup/rollup-linux-loongarch64-gnu@4.40.0':
774 | optional: true
775 |
776 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.0':
777 | optional: true
778 |
779 | '@rollup/rollup-linux-riscv64-gnu@4.40.0':
780 | optional: true
781 |
782 | '@rollup/rollup-linux-riscv64-musl@4.40.0':
783 | optional: true
784 |
785 | '@rollup/rollup-linux-s390x-gnu@4.40.0':
786 | optional: true
787 |
788 | '@rollup/rollup-linux-x64-gnu@4.40.0':
789 | optional: true
790 |
791 | '@rollup/rollup-linux-x64-musl@4.40.0':
792 | optional: true
793 |
794 | '@rollup/rollup-win32-arm64-msvc@4.40.0':
795 | optional: true
796 |
797 | '@rollup/rollup-win32-ia32-msvc@4.40.0':
798 | optional: true
799 |
800 | '@rollup/rollup-win32-x64-msvc@4.40.0':
801 | optional: true
802 |
803 | '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)':
804 | dependencies:
805 | acorn: 8.14.1
806 |
807 | '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.3))(svelte@5.28.2)(vite@6.3.3)':
808 | dependencies:
809 | '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.2)(vite@6.3.3)
810 | debug: 4.4.0
811 | svelte: 5.28.2
812 | vite: 6.3.3
813 | transitivePeerDependencies:
814 | - supports-color
815 |
816 | '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.3)':
817 | dependencies:
818 | '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.3))(svelte@5.28.2)(vite@6.3.3)
819 | debug: 4.4.0
820 | deepmerge: 4.3.1
821 | kleur: 4.1.5
822 | magic-string: 0.30.17
823 | svelte: 5.28.2
824 | vite: 6.3.3
825 | vitefu: 1.0.6(vite@6.3.3)
826 | transitivePeerDependencies:
827 | - supports-color
828 |
829 | '@tsconfig/svelte@5.0.4': {}
830 |
831 | '@types/estree@1.0.7': {}
832 |
833 | acorn@8.14.1: {}
834 |
835 | ansi-regex@5.0.1: {}
836 |
837 | ansi-styles@4.3.0:
838 | dependencies:
839 | color-convert: 2.0.1
840 |
841 | aria-query@5.3.2: {}
842 |
843 | axobject-query@4.1.0: {}
844 |
845 | camelcase@5.3.1: {}
846 |
847 | canvas-circular-countdown@1.8.0: {}
848 |
849 | chokidar@4.0.3:
850 | dependencies:
851 | readdirp: 4.1.2
852 |
853 | cliui@6.0.0:
854 | dependencies:
855 | string-width: 4.2.3
856 | strip-ansi: 6.0.1
857 | wrap-ansi: 6.2.0
858 |
859 | clsx@2.1.1: {}
860 |
861 | color-convert@2.0.1:
862 | dependencies:
863 | color-name: 1.1.4
864 |
865 | color-name@1.1.4: {}
866 |
867 | date-fns@4.1.0: {}
868 |
869 | debug@4.4.0:
870 | dependencies:
871 | ms: 2.1.3
872 |
873 | decamelize@1.2.0: {}
874 |
875 | deepmerge@4.3.1: {}
876 |
877 | dijkstrajs@1.0.3: {}
878 |
879 | emoji-regex@8.0.0: {}
880 |
881 | esbuild@0.25.3:
882 | optionalDependencies:
883 | '@esbuild/aix-ppc64': 0.25.3
884 | '@esbuild/android-arm': 0.25.3
885 | '@esbuild/android-arm64': 0.25.3
886 | '@esbuild/android-x64': 0.25.3
887 | '@esbuild/darwin-arm64': 0.25.3
888 | '@esbuild/darwin-x64': 0.25.3
889 | '@esbuild/freebsd-arm64': 0.25.3
890 | '@esbuild/freebsd-x64': 0.25.3
891 | '@esbuild/linux-arm': 0.25.3
892 | '@esbuild/linux-arm64': 0.25.3
893 | '@esbuild/linux-ia32': 0.25.3
894 | '@esbuild/linux-loong64': 0.25.3
895 | '@esbuild/linux-mips64el': 0.25.3
896 | '@esbuild/linux-ppc64': 0.25.3
897 | '@esbuild/linux-riscv64': 0.25.3
898 | '@esbuild/linux-s390x': 0.25.3
899 | '@esbuild/linux-x64': 0.25.3
900 | '@esbuild/netbsd-arm64': 0.25.3
901 | '@esbuild/netbsd-x64': 0.25.3
902 | '@esbuild/openbsd-arm64': 0.25.3
903 | '@esbuild/openbsd-x64': 0.25.3
904 | '@esbuild/sunos-x64': 0.25.3
905 | '@esbuild/win32-arm64': 0.25.3
906 | '@esbuild/win32-ia32': 0.25.3
907 | '@esbuild/win32-x64': 0.25.3
908 |
909 | esm-env@1.2.2: {}
910 |
911 | esrap@1.4.6:
912 | dependencies:
913 | '@jridgewell/sourcemap-codec': 1.5.0
914 |
915 | fdir@6.4.4(picomatch@4.0.2):
916 | optionalDependencies:
917 | picomatch: 4.0.2
918 |
919 | find-up@4.1.0:
920 | dependencies:
921 | locate-path: 5.0.0
922 | path-exists: 4.0.0
923 |
924 | fsevents@2.3.3:
925 | optional: true
926 |
927 | get-caller-file@2.0.5: {}
928 |
929 | is-fullwidth-code-point@3.0.0: {}
930 |
931 | is-reference@3.0.3:
932 | dependencies:
933 | '@types/estree': 1.0.7
934 |
935 | kleur@4.1.5: {}
936 |
937 | locate-character@3.0.0: {}
938 |
939 | locate-path@5.0.0:
940 | dependencies:
941 | p-locate: 4.1.0
942 |
943 | magic-string@0.30.17:
944 | dependencies:
945 | '@jridgewell/sourcemap-codec': 1.5.0
946 |
947 | mri@1.2.0: {}
948 |
949 | ms@2.1.3: {}
950 |
951 | nanoid@3.3.11: {}
952 |
953 | p-limit@2.3.0:
954 | dependencies:
955 | p-try: 2.2.0
956 |
957 | p-locate@4.1.0:
958 | dependencies:
959 | p-limit: 2.3.0
960 |
961 | p-try@2.2.0: {}
962 |
963 | path-exists@4.0.0: {}
964 |
965 | picocolors@1.1.1: {}
966 |
967 | picomatch@4.0.2: {}
968 |
969 | pngjs@5.0.0: {}
970 |
971 | postcss@8.5.3:
972 | dependencies:
973 | nanoid: 3.3.11
974 | picocolors: 1.1.1
975 | source-map-js: 1.2.1
976 |
977 | qrcode@1.5.4:
978 | dependencies:
979 | dijkstrajs: 1.0.3
980 | pngjs: 5.0.0
981 | yargs: 15.4.1
982 |
983 | readdirp@4.1.2: {}
984 |
985 | require-directory@2.1.1: {}
986 |
987 | require-main-filename@2.0.0: {}
988 |
989 | rollup@4.40.0:
990 | dependencies:
991 | '@types/estree': 1.0.7
992 | optionalDependencies:
993 | '@rollup/rollup-android-arm-eabi': 4.40.0
994 | '@rollup/rollup-android-arm64': 4.40.0
995 | '@rollup/rollup-darwin-arm64': 4.40.0
996 | '@rollup/rollup-darwin-x64': 4.40.0
997 | '@rollup/rollup-freebsd-arm64': 4.40.0
998 | '@rollup/rollup-freebsd-x64': 4.40.0
999 | '@rollup/rollup-linux-arm-gnueabihf': 4.40.0
1000 | '@rollup/rollup-linux-arm-musleabihf': 4.40.0
1001 | '@rollup/rollup-linux-arm64-gnu': 4.40.0
1002 | '@rollup/rollup-linux-arm64-musl': 4.40.0
1003 | '@rollup/rollup-linux-loongarch64-gnu': 4.40.0
1004 | '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0
1005 | '@rollup/rollup-linux-riscv64-gnu': 4.40.0
1006 | '@rollup/rollup-linux-riscv64-musl': 4.40.0
1007 | '@rollup/rollup-linux-s390x-gnu': 4.40.0
1008 | '@rollup/rollup-linux-x64-gnu': 4.40.0
1009 | '@rollup/rollup-linux-x64-musl': 4.40.0
1010 | '@rollup/rollup-win32-arm64-msvc': 4.40.0
1011 | '@rollup/rollup-win32-ia32-msvc': 4.40.0
1012 | '@rollup/rollup-win32-x64-msvc': 4.40.0
1013 | fsevents: 2.3.3
1014 |
1015 | sade@1.8.1:
1016 | dependencies:
1017 | mri: 1.2.0
1018 |
1019 | set-blocking@2.0.0: {}
1020 |
1021 | source-map-js@1.2.1: {}
1022 |
1023 | string-width@4.2.3:
1024 | dependencies:
1025 | emoji-regex: 8.0.0
1026 | is-fullwidth-code-point: 3.0.0
1027 | strip-ansi: 6.0.1
1028 |
1029 | strip-ansi@6.0.1:
1030 | dependencies:
1031 | ansi-regex: 5.0.1
1032 |
1033 | svelte-check@4.1.6(picomatch@4.0.2)(svelte@5.28.2)(typescript@5.8.3):
1034 | dependencies:
1035 | '@jridgewell/trace-mapping': 0.3.25
1036 | chokidar: 4.0.3
1037 | fdir: 6.4.4(picomatch@4.0.2)
1038 | picocolors: 1.1.1
1039 | sade: 1.8.1
1040 | svelte: 5.28.2
1041 | typescript: 5.8.3
1042 | transitivePeerDependencies:
1043 | - picomatch
1044 |
1045 | svelte@5.28.2:
1046 | dependencies:
1047 | '@ampproject/remapping': 2.3.0
1048 | '@jridgewell/sourcemap-codec': 1.5.0
1049 | '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1)
1050 | '@types/estree': 1.0.7
1051 | acorn: 8.14.1
1052 | aria-query: 5.3.2
1053 | axobject-query: 4.1.0
1054 | clsx: 2.1.1
1055 | esm-env: 1.2.2
1056 | esrap: 1.4.6
1057 | is-reference: 3.0.3
1058 | locate-character: 3.0.0
1059 | magic-string: 0.30.17
1060 | zimmerframe: 1.1.2
1061 |
1062 | tinyglobby@0.2.13:
1063 | dependencies:
1064 | fdir: 6.4.4(picomatch@4.0.2)
1065 | picomatch: 4.0.2
1066 |
1067 | tslib@2.8.1: {}
1068 |
1069 | typescript@5.8.3: {}
1070 |
1071 | vite@6.3.3:
1072 | dependencies:
1073 | esbuild: 0.25.3
1074 | fdir: 6.4.4(picomatch@4.0.2)
1075 | picomatch: 4.0.2
1076 | postcss: 8.5.3
1077 | rollup: 4.40.0
1078 | tinyglobby: 0.2.13
1079 | optionalDependencies:
1080 | fsevents: 2.3.3
1081 |
1082 | vitefu@1.0.6(vite@6.3.3):
1083 | optionalDependencies:
1084 | vite: 6.3.3
1085 |
1086 | which-module@2.0.1: {}
1087 |
1088 | wrap-ansi@6.2.0:
1089 | dependencies:
1090 | ansi-styles: 4.3.0
1091 | string-width: 4.2.3
1092 | strip-ansi: 6.0.1
1093 |
1094 | y18n@4.0.3: {}
1095 |
1096 | yargs-parser@18.1.3:
1097 | dependencies:
1098 | camelcase: 5.3.1
1099 | decamelize: 1.2.0
1100 |
1101 | yargs@15.4.1:
1102 | dependencies:
1103 | cliui: 6.0.0
1104 | decamelize: 1.2.0
1105 | find-up: 4.1.0
1106 | get-caller-file: 2.0.5
1107 | require-directory: 2.1.1
1108 | require-main-filename: 2.0.0
1109 | set-blocking: 2.0.0
1110 | string-width: 4.2.3
1111 | which-module: 2.0.1
1112 | y18n: 4.0.3
1113 | yargs-parser: 18.1.3
1114 |
1115 | zimmerframe@1.1.2: {}
1116 |
--------------------------------------------------------------------------------