মূল বিষয়বস্তুতে যান

Moatgator Vault

আপনার ব্যাকএন্ড, CI ও মোবাইল অ্যাপের সিক্রেটের জন্য একটি জায়গা

যেখানে আগে মান থাকত, সেখানে একটি mg:// রেফারেন্স বসান। CLI, GitHub Actions ও মোবাইল SDK চালানোর সময় এটিকে মানে রূপান্তর করে, আর আপনার অ্যাপ সিক্রেট পায় শুধু এমন ডিভাইসে যা Attest পাস করেছে।

Startup প্ল্যান থেকে অন্তর্ভুক্ত।

terminalউদাহরণ
$ moatgator secrets run --env-file .env.tpl -- npm start$ moatgator secrets inject -i .env.tpl -o .env$ moatgator secrets get mg://api/prod/DATABASE_URL

mg:// রেফারেন্স

মান নয়, রেফারেন্স কমিট করুন

একটি রেফারেন্স একটি প্রজেক্ট, একটি এনভায়রনমেন্ট ও একটি সিক্রেট নির্দেশ করে, যেমন mg://api/prod/DATABASE_URL। এটি Git-এ রাখা নিরাপদ: শুধু অ্যাক্সেস থাকা কোনো আইডেন্টিটিই এটিকে মানে রূপান্তর করতে পারে।

  1. 01

    আপনার রিপোজিটরিতে একটি .env.tpl

    রেফারেন্সসহ একটি টেমপ্লেট রাখুন। moatgator secrets inject 0600 পারমিশন দিয়ে .env লেখে এবং --force ছাড়া বিদ্যমান ফাইল ওভাররাইট করে না।

    .env.tplউদাহরণ
    # .env.tpl: safe to commitDATABASE_URL=mg://api/prod/DATABASE_URLSTRIPE_KEY=mg://api/prod/STRIPE_KEYSENTRY_DSN=mg://api/prod/SENTRY_DSN
  2. 02

    moatgator secrets run

    সিক্রেটগুলোকে এনভায়রনমেন্ট ভেরিয়েবল হিসেবে দিয়ে আপনার কমান্ড চালায় এবং কমান্ডের আউটপুটে সেগুলোর মান লুকিয়ে রাখে। moatgator secrets get একটিমাত্র রেফারেন্স পড়ে।

    terminalউদাহরণ
    $ moatgator secrets run --env-file .env.tpl -- npm start$ moatgator secrets inject -i .env.tpl -o .env$ moatgator secrets get mg://api/prod/DATABASE_URL
  3. 03

    অ্যাপেও একই রেফারেন্স

    Android SDK-তে Moatgator.vault.get("mg://mobile/prod/PARTNER_KEY") কনসোলে অ্যাপের সঙ্গে যুক্ত এনভায়রনমেন্ট থেকে পড়ে। মানটি কখনো APK-তে যায় না।

    Kotlinউদাহরণ
    // Android (Kotlin), off the main threadMoatgator.startSession(playIntegrityProvider)val key = Moatgator.vault.get("mg://mobile/prod/PARTNER_KEY")

প্রজেক্ট, এনভায়রনমেন্ট ও ভার্সন

  • প্রজেক্ট ও এনভায়রনমেন্ট

    প্রতিটি প্রজেক্ট dev, staging ও prod দিয়ে শুরু হয়। প্রয়োজন হলে নিজের এনভায়রনমেন্ট যোগ করুন।

  • ইনহেরিটেন্স ও ওভাররাইড

    একটি এনভায়রনমেন্ট আরেকটি থেকে ইনহেরিট করতে পারে, সর্বোচ্চ তিন স্তর পর্যন্ত। একই নামের সিক্রেট ইনহেরিট করা সিক্রেটকে ওভাররাইড করে।

  • সুরক্ষিত এনভায়রনমেন্ট

    prod শুরু থেকেই সুরক্ষিত: শুধু মালিক ও অ্যাডমিনরা এর মান পড়তে বা এতে লিখতে পারেন।

  • ভার্সন ও রোলব্যাক

    প্রতিটি পরিবর্তন ইতিহাসসহ একটি ভার্সন তৈরি করে। রোলব্যাক একটি নতুন ভার্সন তৈরি করে, তাই ইতিহাস কখনো নতুন করে লেখা হয় না।

  • তাৎক্ষণিক প্রত্যাহার

    একটি সিক্রেট বা সার্ভিস টোকেন প্রত্যাহার করুন, পরের বার পড়ার অনুরোধ প্রত্যাখ্যাত হবে, মেয়াদ শেষ হওয়ার অপেক্ষা ছাড়াই।

  • রোল

    মালিক, অ্যাডমিন, ডেভেলপার ও রিডার রোল ঠিক করে কে মান দেখতে পাবে আর কে সেগুলো বদলাতে পারবে।

শুধু অ্যাটেস্ট করা ডিভাইসে

একই সিক্রেট, আপনার মোবাইল অ্যাপে পৌঁছায় শুধু এমন ডিভাইসে যা Attest পাস করেছে

সিক্রেট ম্যানেজার সাধারণত সার্ভার, ডেভেলপার ও CI-এর কাজে লাগে। Vault আপনার ব্যবহারকারীদের হাতে থাকা অ্যাপকেও সেবা দেয়: SDK রানটাইমে অনুরোধ করে, API ডিভাইসের Attest যাচাই করে (Play Integrity বা App Attest, সঙ্গে Moatgator RASP-এর সংকেত) এবং মানটি সেই সেশনের একটি ক্ষণস্থায়ী কী-এর জন্য এনক্রিপ্ট করে পাঠায়। বাইনারিতে কিছুই যায় না।

SDK মানটি শুধু মেমোরিতে রাখে, কখনো ডিস্কে বা লগে নয়। mg:// রেফারেন্স Android SDK-তে পাওয়া যায়।

প্রতিটি সিক্রেটের জন্য নীতি

  • ন্যূনতম ভার্ডিক্টপ্রতিটি সিক্রেট পেতে Attest-এর সর্বনিম্ন কোন ভার্ডিক্ট লাগবে তা বেছে নিন।
  • প্ল্যাটফর্ম অ্যাটেস্টেশন বাধ্যতামূলকশুধু SDK-এর নিজস্ব সংকেত নয়, প্ল্যাটফর্ম অ্যাটেস্টেশনের ফলাফলও আবশ্যক করুন।
  • অ্যাটেস্টেশনের সর্বোচ্চ বয়সডিভাইসের অ্যাটেস্টেশন আপনার অনুমোদিত সময়ের চেয়ে পুরোনো হলে সিক্রেট দিতে অস্বীকার করুন।

CI ও সার্ভার

আপনার CI-তে কোনো দীর্ঘমেয়াদি টোকেন সংরক্ষিত থাকে না

GitHub Action moatgator-hq/github-action/vault জবের OIDC টোকেনের বিনিময়ে 15 মিনিট মেয়াদি একটি রিড টোকেন নেয়। Pull request কখনো টোকেন পায় না। যেখানে OIDC নেই, সেখানে সার্ভিস টোকেন ব্যবহার করুন।

  • সার্ভিস টোকেন (mgvt_…) শুধু পড়ার জন্য এবং একটি প্রজেক্ট ও আপনার বেছে নেওয়া এনভায়রনমেন্টে সীমাবদ্ধ।
  • মেয়াদ বাধ্যতামূলক: ডিফল্ট 90 দিন, সর্বোচ্চ এক বছর।
  • জব লগে মানগুলো মাস্ক করা থাকে এবং কখনো স্টেপের আউটপুট হয় না।
  • কোনো রেফারেন্স রিজলভ না হলে স্টেপটি কিছু এক্সপোর্ট না করেই ব্যর্থ হয়।
.github/workflows/deploy.ymlউদাহরণ
permissions: { contents: read, id-token: write }steps:  - uses: moatgator-hq/github-action/vault@v1    with:      project-id: vpj_…      secrets: |        DATABASE_URL=mg://api/prod/DATABASE_URL  - run: ./deploy.sh   # $DATABASE_URL, *** in the log

সিঙ্ক ও রোটেশন

যেখানে ডিপ্লয় করেন সেখানে সিক্রেট পাঠান, আর নির্ধারিত সময়ে সেগুলো রোটেট করুন

একটি সিঙ্ক একটি এনভায়রনমেন্টকে, ইনহেরিটেন্সসহ, GitHub Actions সিক্রেট, Railway বা Vercel-এ কপি করে রাখে। এটি তৈরির সময় চলে, এবং সেই এনভায়রনমেন্টে বা যে এনভায়রনমেন্ট থেকে সেটি ইনহেরিট করে তাতে প্রতিটি পরিবর্তনের পর আবার চলে।

  • GitHub Actions সিক্রেট

    একটি রিপোজিটরি বা একটি GitHub এনভায়রনমেন্টে সিঙ্ক করুন। প্রতিটি মান Moatgator থেকে বের হওয়ার আগে রিপোজিটরির পাবলিক কী দিয়ে এনক্রিপ্ট করা হয়।

  • Railway

    একটি Railway প্রজেক্ট ও এনভায়রনমেন্টের ভেরিয়েবলে, বা একটি নির্দিষ্ট সার্ভিসের ভেরিয়েবলে সিঙ্ক করুন।

  • Vercel

    একটি Vercel প্রজেক্টের production, preview বা development ভেরিয়েবলে সিঙ্ক করুন, যা এনক্রিপ্ট করা ভেরিয়েবল হিসেবে সংরক্ষিত হয়।

  • স্পষ্ট অনুমতি ও স্ট্যাটাস

    আপনি প্রতিটি গন্তব্য নিশ্চিত করেন এবং শুধু সেই গন্তব্যের জন্য একটি টোকেন দেন, যা এনক্রিপ্ট করে সংরক্ষিত থাকে। প্রতিটি সিঙ্ক দেখায় সেটি শেষবার কখন চলেছে, কতগুলো সিক্রেট লিখেছে এবং কোনো ত্রুটি হয়েছে কি না।

নির্ধারিত রোটেশন

  • নির্ধারিত সময়ে নতুন র‍্যান্ডম মানযেসব সিক্রেট শুধু আপনার কোম্পানি ব্যবহার করে, যেমন HMAC কী ও সেশন সিক্রেট: Moatgator একটি নতুন মান তৈরি করে, একটি ভার্সন বানায় এবং সিঙ্কগুলো চালায়।
  • অন্য প্রোভাইডারের কী-এর জন্য রিমাইন্ডারঅন্য কোনো সার্ভিসের ইস্যু করা কী-এর ক্ষেত্রে, মেয়াদ এলে মালিক ও অ্যাডমিনরা একটি ইমেল পান, আর নতুন মান সংরক্ষণ না হওয়া পর্যন্ত কনসোল রোটেশনটিকে বকেয়া হিসেবে দেখায়।

একটি সিঙ্ক গন্তব্যে শুধু লেখে, আর সেখানে শুধু সেই সিক্রেটগুলোই মোছে যেগুলো এটি নিজে লিখেছে। একটি সিঙ্ক মুছে ফেললে গন্তব্য যেমন আছে তেমনই থাকে।

প্রতিটি সংস্থার জন্য আলাদা এনক্রিপশন, প্রতিটি রিডের অডিট

  • টেন্যান্টভিত্তিক এনভেলপ এনক্রিপশন

    প্রতিটি সংস্থার নিজস্ব কী আছে, যা একটি মাস্টার কী দিয়ে র‍্যাপ করা।

  • সাইফারটেক্সট নিজের জায়গায় বাঁধা

    প্রতিটি সাইফারটেক্সট তার প্রজেক্ট, এনভায়রনমেন্ট, নাম ও ভার্সনের সঙ্গে বাঁধা, তাই এটিকে অন্য সিক্রেটে সরানো যায় না।

  • মান লগের বাইরে থাকে

    সিক্রেটের মান কখনো আমাদের লগে লেখা হয় না, আর CLI ও Action আপনার আউটপুটে সেগুলো লুকিয়ে রাখে।

  • প্রতিটি রিডের অডিট ট্রেইল

    প্রতিটি রিডের জন্য: কে পড়েছে, কোথা থেকে, কোন ভার্সন এবং ফলাফল কী।

তুলনা

Moatgator Vault, 1Password ও Doppler

1Password ও Doppler প্রতিষ্ঠিত সিক্রেট ম্যানেজার, আর দুটিই Vault-এর অনেক কাজ করে। টেবিলে দেখানো হয়েছে কোনটি কোথায় দাঁড়িয়ে, আর তাদের নিয়ে প্রতিটি ঘরে একটি পাবলিক সূত্র ও আমরা যে তারিখে যাচাই করেছি তা দেওয়া আছে। Vault মানুষের জন্য পাসওয়ার্ড ম্যানেজার নয়: এর ফোকাস অ্যাপ, CI ও মোবাইল ডিভাইস।

সিক্রেট ম্যানেজমেন্টের সক্ষমতা, পাশাপাশি
সক্ষমতাMoatgator Vault1PasswordDoppler
মানের বদলে রেফারেন্স

mg://project/environment/NAME, মোবাইল SDK-তেও

1

op://vault/item/field

আংশিক23

Doppler-এর ভেতরে ${…} রেফারেন্স; ফাইলের জন্য {{.NAME}} টেমপ্লেট

সিক্রেটকে এনভায়রনমেন্ট ভেরিয়েবল হিসেবে দিয়ে কমান্ড চালানো

আউটপুটে মান লুকানো থাকে

4

op run, ডিফল্টভাবে আউটপুটে মান মাস্ক করা

56

doppler run; CLI-এর আউটপুট মাস্কিং ডকুমেন্টেড নয়

টেমপ্লেট থেকে ফাইল তৈরি

ফাইল 0600 পারমিশনে লেখা হয়

7

op inject

3

secrets substitute ও --mount

ইনহেরিটেন্সসহ এনভায়রনমেন্ট

সর্বোচ্চ 3 স্তর, নাম ধরে ওভাররাইড

আংশিক8

Environments আছে, একটি অন্যটি থেকে স্বাধীন

910

branch configs রুট config থেকে ইনহেরিট করে; Team ও Enterprise-এ config ইনহেরিটেন্স

ভার্সন ইতিহাস ও রোলব্যাক

রোলব্যাক নতুন ভার্সন তৈরি করে

11

আইটেমের ইতিহাস ও রিস্টোর

12

লগ থেকে রোলব্যাক

মেয়াদসহ সীমিত-স্কোপের মেশিন টোকেন

শুধু পড়া, প্রজেক্ট ও এনভায়রনমেন্টভিত্তিক, মেয়াদ বাধ্যতামূলক

1314

প্রতি vault পারমিশন ও ঐচ্ছিক মেয়াদসহ service accounts

15

প্রতি config-এ service tokens, মেয়াদ ঐচ্ছিক

টোকেনের তাৎক্ষণিক প্রত্যাহার1615
OIDC-সহ CI, সংরক্ষিত টোকেন ছাড়া

GitHub Actions, 15 মিনিটের টোকেন

আংশিক1718

load-secrets-action সংরক্ষিত টোকেন ব্যবহার করে; OIDC-সহ Credential Broker পাবলিক প্রিভিউতে

196

service account identities, Team ও Enterprise প্ল্যান

GitHub Actions, Railway ও Vercel-এ সিঙ্ক

প্রতিটি পরিবর্তনের পর; শুধু লেখে, শুধু নিজের লেখা জিনিস মোছে

আংশিক820

Environments-এর AWS Secrets Manager-এ সিঙ্ক (beta); GitHub, Railway ও Vercel পাওয়া যায়নি

2122

GitHub, Vercel ও Railway ইন্টিগ্রেশন স্বয়ংক্রিয়ভাবে সিক্রেট পাঠায়

নির্ধারিত রোটেশনআংশিক

নিজের সিক্রেটের জন্য নতুন র‍্যান্ডম মান; থার্ড-পার্টি কী-এর জন্য ইমেল রিমাইন্ডার

পাবলিক ডকুমেন্টেশনে পাওয়া যায়নি2316

service account টোকেন হাতে রোটেট করতে হয়; সংরক্ষিত সিক্রেটের নির্ধারিত রোটেশন পাওয়া যায়নি

24

Team ও Enterprise-এ সমর্থিত সার্ভিসের, যেমন ডেটাবেসের, স্বয়ংক্রিয় রোটেশন

রোল ও সুরক্ষিত প্রোডাকশন

মালিক, অ্যাডমিন, ডেভেলপার ও রিডার; prod সুরক্ষিত

258

vault ও Environment পারমিশন

26

প্রজেক্ট ও এনভায়রনমেন্ট রোল

প্রতিটি সিক্রেট রিডের অডিট

কে, কোথা থেকে, ভার্সন ও ফলাফল

27

1Password Business-এ ব্যবহারের রিপোর্ট

আংশিক28

অ্যাক্সেস লগে প্রতিটি অ্যাক্টরের প্রথম ও সর্বশেষ রিড থাকে

মোবাইল অ্যাপে ডেলিভারি শুধু অ্যাটেস্ট করা ডিভাইসে

Attest ও RASP, প্রতিটি সেশনের জন্য এনক্রিপ্ট করা

পাবলিক ডকুমেন্টেশনে পাওয়া যায়নি2930

SDK ও Connect ডকুমেন্টেশনে পাওয়া যায়নি

পাবলিক ডকুমেন্টেশনে পাওয়া যায়নি3121

SDK ও ইন্টিগ্রেশন ডকুমেন্টেশনে পাওয়া যায়নি

1Password যেখানে শক্তিশালী

  • এন্ড-টু-এন্ড এনক্রিপশন, এমন একটি Secret Key-সহ যা কখনো 1Password-এ পাঠানো হয় না।3233
  • op run ডিফল্টভাবে কমান্ডের আউটপুটে সিক্রেটের মান মাস্ক করে।4
  • Go, JavaScript ও Python-এর জন্য অফিশিয়াল SDK।29

Doppler যেখানে শক্তিশালী

  • ক্লাউড ও CI প্ল্যাটফর্মের সঙ্গে নেটিভ ইন্টিগ্রেশনের একটি ডকুমেন্টেড তালিকা।21
  • doppler run --mount ডিস্কের ফাইলের বদলে একটি ক্ষণস্থায়ী named pipe দিয়ে সিক্রেট দেয়।5
  • প্রতিটি workplace-এর জন্য একটি এনক্রিপশন কী, আর Enterprise প্ল্যানে গ্রাহক-নিয়ন্ত্রিত কী (EKM)।3435

সূত্র

  1. 1. 1Password CLI — Secret references · যাচাইয়ের তারিখ
  2. 2. Doppler — Secrets (referencing) · যাচাইয়ের তারিখ
  3. 3. Doppler — Secret injection with templates · যাচাইয়ের তারিখ
  4. 4. 1Password CLI — op run · যাচাইয়ের তারিখ
  5. 5. Doppler — Accessing secrets (run, --mount) · যাচাইয়ের তারিখ
  6. 6. Doppler — GitHub OIDC examples · যাচাইয়ের তারিখ
  7. 7. 1Password — Load secrets into config files (op inject) · যাচাইয়ের তারিখ
  8. 8. 1Password Environments · যাচাইয়ের তারিখ
  9. 9. Doppler — Branch configs · যাচাইয়ের তারিখ
  10. 10. Doppler — Config inheritance · যাচাইয়ের তারিখ
  11. 11. 1Password — View and restore previous versions of items · যাচাইয়ের তারিখ
  12. 12. Doppler — Versioning · যাচাইয়ের তারিখ
  13. 13. 1Password CLI — op service-account · যাচাইয়ের তারিখ
  14. 14. 1Password CLI — op connect · যাচাইয়ের তারিখ
  15. 15. Doppler — Service tokens · যাচাইয়ের তারিখ
  16. 16. 1Password — Manage service accounts · যাচাইয়ের তারিখ
  17. 17. 1Password — GitHub Actions (load-secrets-action) · যাচাইয়ের তারিখ
  18. 18. 1Password Credential Broker — GitHub Actions (public preview) · যাচাইয়ের তারিখ
  19. 19. Doppler — Service account identities (OIDC) · যাচাইয়ের তারিখ
  20. 20. 1Password — Sync Environments to AWS Secrets Manager (beta) · যাচাইয়ের তারিখ
  21. 21. Doppler — Integrations · যাচাইয়ের তারিখ
  22. 22. Doppler — GitHub Actions integration · যাচাইয়ের তারিখ
  23. 23. 1Password Secrets Automation · যাচাইয়ের তারিখ
  24. 24. Doppler — Secrets rotation · যাচাইয়ের তারিখ
  25. 25. 1Password — Create, share, and manage vaults · যাচাইয়ের তারিখ
  26. 26. Doppler — Project permissions · যাচাইয়ের তারিখ
  27. 27. 1Password — Reports (usage reports) · যাচাইয়ের তারিখ
  28. 28. Doppler — Access logs · যাচাইয়ের তারিখ
  29. 29. 1Password SDKs · যাচাইয়ের তারিখ
  30. 30. 1Password Connect · যাচাইয়ের তারিখ
  31. 31. Doppler — Future SDKs and integration roadmap · যাচাইয়ের তারিখ
  32. 32. 1Password — About the 1Password security model · যাচাইয়ের তারিখ
  33. 33. 1Password — About your Secret Key · যাচাইয়ের তারিখ
  34. 34. Doppler — Security fact sheet · যাচাইয়ের তারিখ
  35. 35. Doppler — Pricing · যাচাইয়ের তারিখ

1Password ও Doppler তাদের মালিকদের ট্রেডমার্ক; শুধু তুলনা করা প্রোডাক্টগুলো চিহ্নিত করতে নাম উল্লেখ করা হয়েছে। তাদের সম্পর্কে আমরা যা বলি তা উল্লিখিত তারিখে তাদের পাবলিক ডকুমেন্টেশন থেকে নেওয়া। “পাওয়া যায়নি” মানে আমরা উদ্ধৃত পেজগুলোতে তা পাইনি, এর মানে এই নয় যে প্রোডাক্টে তা নেই। কিছু বদলে থাকলে আমাদের লিখুন, আমরা সংশোধন করব।

প্ল্যান

Vault Startup, Scale ও Enterprise প্ল্যানে অন্তর্ভুক্ত।

প্ল্যানপ্রতি সংস্থায় প্রজেক্টপ্রতি এনভায়রনমেন্টে সিক্রেট
Startup5100
Scale50500
Enterprise2001,000
সব প্ল্যান দেখুন

সচরাচর জিজ্ঞাসিত প্রশ্ন

Vault ব্যবহার করতে কি আমার কোড বদলাতে হবে?

সার্ভার ও CI-তে নয়: আপনার কোড আগের মতোই এনভায়রনমেন্ট ভেরিয়েবল পড়ে, আর আপনি moatgator secrets run বা GitHub Action দিয়ে প্রসেস চালু করেন। Android অ্যাপে রেফারেন্স দিয়ে Moatgator.vault.get কল করুন।

আমার APK যার কাছে আছে, সে কি Vault-এর কোনো সিক্রেট পড়তে পারবে?

মানটি APK-তে নেই। API এটি শুধু এমন ডিভাইসে পাঠায় যা সিক্রেটের নীতি অনুযায়ী Attest পাস করেছে, সেই সেশনের জন্য এনক্রিপ্ট করে, আর SDK এটি শুধু মেমোরিতে রাখে। পাস করার পরেও কোনো ডিভাইস আপস হতে পারে, তাই টাকা লেনদেনের সঙ্গে জড়িত যেকোনো কাজে সার্ভার-সাইড যাচাই রাখুন।

সার্ভিস টোকেন ফাঁস হলে কী হবে?

কনসোলে এটি প্রত্যাহার করুন, পরের অনুরোধ প্রত্যাখ্যাত হবে। সার্ভিস টোকেন শুধু পড়ার জন্য, একটি প্রজেক্ট ও আপনার বেছে নেওয়া এনভায়রনমেন্টে সীমাবদ্ধ, এবং ডিফল্টভাবে 90 দিনে মেয়াদ শেষ হয়।

Vault কি 1Password বা Doppler-এর জায়গা নেয়?

সবসময় নয়। আপনি যদি সার্ভার ও CI-এর জন্য এদের একটি আগে থেকেই ব্যবহার করেন, সেটি থাকতে পারে। Vault অ্যাটেস্ট করা ডিভাইসে আপনার মোবাইল অ্যাপে ডেলিভারি যোগ করে, আর আপনি একটিমাত্র টুল পছন্দ করলে সার্ভার ও CI-ও সামলাতে পারে।

কোন কোন প্ল্যানে Vault আছে?

Startup, Scale ও Enterprise। প্রতি সংস্থায় প্রজেক্ট: 5, 50 ও 200। প্রতি এনভায়রনমেন্টে সিক্রেট: 100, 500 ও 1,000।

একটি সিক্রেট দিয়ে শুরু করুন

একটি প্রজেক্ট তৈরি করুন, একটি সিক্রেট যোগ করুন এবং CLI, আপনার CI বা আপনার অ্যাপ থেকে সেটি রিজলভ করুন।