@zoreal/oauth2-js 0.1.20 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ function unsafeClaims(idToken) {
14
14
 
15
15
  // src/wire.ts
16
16
  var WIRE_VERSION = 1;
17
- var SDK_VERSION = "0.1.20";
17
+ var SDK_VERSION = "0.1.22";
18
18
  var SDK_NAME = "@zoreal/oauth2-js";
19
19
  var DEFAULT_ISSUER = "https://id.zoreal.com";
20
20
  var POLL_INTERVAL_MS = 2e3;
@@ -182,1146 +182,218 @@ function isMobileUserAgent() {
182
182
  return /android|iphone|ipad|ipod/i.test(navigator.userAgent);
183
183
  }
184
184
 
185
- // src/intent.ts
186
- var SIGN_IN_SCOPES = /* @__PURE__ */ new Set(["openid", "email", "profile.name"]);
187
- function resolveIntent(intent, scope, acrValues) {
188
- if (intent) return intent;
189
- const scopes = (scope ?? "openid").split(/\s+/).filter(Boolean);
190
- if (scopes.some((s) => !SIGN_IN_SCOPES.has(s))) return "identify";
191
- const acr = typeof acrValues === "string" ? acrValues.split(/\s+/) : acrValues ?? [];
192
- if (scopes.every((s) => s === "openid") && acr.includes("zoreal.live")) return "presence";
193
- return "sign-in";
185
+ // src/styles.ts
186
+ var PREFIX = "zrl";
187
+ var cx = (name) => `${PREFIX}-${name}`;
188
+ var STYLE_ELEMENT_ID = "zoreal-pairing-styles";
189
+ var LIGHT = `
190
+ --zrl-scrim: rgba(16, 18, 27, 0.45);
191
+ --zrl-surface: #ffffff;
192
+ --zrl-surface-sunken: #f6f7f9;
193
+ --zrl-ink: #16181c;
194
+ --zrl-ink-soft: #4a4f57;
195
+ --zrl-ink-mute: #6b7078;
196
+ --zrl-line: #e4e6ea;
197
+ --zrl-line-soft: #eef0f3;
198
+ --zrl-accent: #00b4d9;
199
+ --zrl-accent-soft: #dcf3fa;
200
+ --zrl-accent-ink: #04698a;
201
+ --zrl-urgent: #b4761a;
202
+ --zrl-qr-bg: #ffffff;
203
+ --zrl-qr-filter: none;
204
+ --zrl-qr-spent-filter: blur(3px);
205
+ --zrl-qr-blend: normal;
206
+ --zrl-shadow: 0 1px 2px rgba(16, 18, 27, 0.06), 0 20px 50px -12px rgba(16, 18, 27, 0.3);
207
+ --zrl-ring: rgba(16, 18, 27, 0.07);
208
+ /* The light on the QR well's edge. Brand blue on both grounds, a lighter
209
+ tint at the head; only its strength is themed, see the dark block. */
210
+ --zrl-beam: #00b4d9;
211
+ --zrl-beam-head: #7fe0f4;
212
+ --zrl-beam-line: 2px;
213
+ --zrl-glow-core: 4px;
214
+ --zrl-glow-reach: 24px;
215
+ --zrl-glow-blur: 8px;
216
+ --zrl-glow-opacity: 0.6;
217
+ `;
218
+ var DARK = `
219
+ --zrl-scrim: rgba(0, 0, 0, 0.62);
220
+ --zrl-surface: #17191d;
221
+ --zrl-surface-sunken: #1f2226;
222
+ --zrl-ink: #f4f5f7;
223
+ --zrl-ink-soft: #b3b8c0;
224
+ --zrl-ink-mute: #8b9199;
225
+ --zrl-line: #2c3036;
226
+ --zrl-line-soft: #24272c;
227
+ --zrl-accent: #34c9e8;
228
+ --zrl-accent-soft: #0d3b47;
229
+ --zrl-accent-ink: #7fdcf0;
230
+ --zrl-urgent: #e0a952;
231
+ /* The code is drawn light on the dark surface: the panel is transparent
232
+ and the image is inverted and screened, so only the modules and the
233
+ mark show. */
234
+ --zrl-qr-bg: transparent;
235
+ --zrl-qr-filter: invert(1);
236
+ --zrl-qr-spent-filter: invert(1) blur(3px);
237
+ --zrl-qr-blend: screen;
238
+ --zrl-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 20px 50px -12px rgba(0, 0, 0, 0.65);
239
+ --zrl-ring: rgba(255, 255, 255, 0.1);
240
+ /* A glow that reads on a white card disappears on a dark one: the light
241
+ here is brighter and wider, and its halo reaches further out. */
242
+ --zrl-beam: #22c8ec;
243
+ --zrl-beam-head: #c2f3fc;
244
+ --zrl-beam-line: 3px;
245
+ --zrl-glow-core: 6px;
246
+ --zrl-glow-reach: 32px;
247
+ --zrl-glow-blur: 10px;
248
+ --zrl-glow-opacity: 0.85;
249
+ `;
250
+ var CSS = `
251
+ .${PREFIX}-root { ${LIGHT} }
252
+ .${PREFIX}-root[data-theme="dark"] { ${DARK} }
253
+ @media (prefers-color-scheme: dark) {
254
+ .${PREFIX}-root[data-theme="auto"] { ${DARK} }
194
255
  }
195
- function titleFor(t, intent) {
196
- if (intent === "identify") return t.titleIdentify;
197
- if (intent === "presence") return t.titlePresence;
198
- return t.title;
256
+
257
+ .${PREFIX}-scrim {
258
+ position: fixed;
259
+ inset: 0;
260
+ z-index: 2147483000;
261
+ display: grid;
262
+ place-items: center;
263
+ overflow-y: auto;
264
+ padding: 16px;
265
+ background: var(--zrl-scrim);
266
+ backdrop-filter: blur(3px);
267
+ -webkit-backdrop-filter: blur(3px);
268
+ font-family: inherit;
269
+ animation: ${PREFIX}-fade 200ms ease-out both;
199
270
  }
200
271
 
201
- // src/return.ts
202
- var PREFIX = "zoreal:oauth2:return:";
203
- var DONE = "zoreal:oauth2:done:";
204
- var MAX_AGE_MS = 10 * 60 * 1e3;
205
- function storage() {
206
- try {
207
- return typeof localStorage === "undefined" ? null : localStorage;
208
- } catch {
209
- return null;
210
- }
272
+ .${PREFIX}-card {
273
+ position: relative;
274
+ box-sizing: border-box;
275
+ width: 100%;
276
+ max-width: 380px;
277
+ border-radius: 16px;
278
+ background: var(--zrl-surface);
279
+ color: var(--zrl-ink);
280
+ box-shadow: var(--zrl-shadow);
281
+ outline: 1px solid var(--zrl-ring);
282
+ outline-offset: -1px;
283
+ text-align: center;
284
+ animation: ${PREFIX}-rise 300ms cubic-bezier(0.23, 1, 0.32, 1) both;
211
285
  }
212
- function saveReturnFlow(flow) {
213
- try {
214
- storage()?.setItem(PREFIX + flow.requestId, JSON.stringify(flow));
215
- } catch {
216
- }
286
+
287
+ .${PREFIX}-body { padding: 28px 24px 20px; }
288
+
289
+ .${PREFIX}-lockup { display: block; margin: 0 auto; color: var(--zrl-ink); }
290
+
291
+ .${PREFIX}-title {
292
+ margin: 18px 0 0;
293
+ font-size: 18px;
294
+ font-weight: 600;
295
+ letter-spacing: -0.01em;
296
+ line-height: 1.3;
297
+ color: var(--zrl-ink);
217
298
  }
218
- function peekReturnFlow(requestId) {
219
- const store = storage();
220
- if (!store) return null;
221
- const raw = store.getItem(PREFIX + requestId);
222
- if (!raw) return null;
223
- try {
224
- const flow = JSON.parse(raw);
225
- if (flow.v !== 1 || flow.requestId !== requestId) return null;
226
- if (Date.now() - flow.createdAt > MAX_AGE_MS) return null;
227
- return flow;
228
- } catch {
229
- return null;
230
- }
299
+
300
+ .${PREFIX}-body-text {
301
+ margin: 6px auto 0;
302
+ max-width: 30ch;
303
+ font-size: 14px;
304
+ line-height: 1.55;
305
+ color: var(--zrl-ink-soft);
231
306
  }
232
- function forgetReturnFlow(requestId) {
233
- try {
234
- storage()?.removeItem(PREFIX + requestId);
235
- } catch {
236
- }
237
- if (pending === requestId) pending = null;
307
+
308
+ .${PREFIX}-qr-well {
309
+ position: relative;
310
+ display: grid;
311
+ place-items: center;
312
+ box-sizing: border-box;
313
+ width: 204px;
314
+ height: 204px;
315
+ margin: 20px auto 0;
316
+ padding: 12px;
317
+ border: 1px solid var(--zrl-line);
318
+ border-radius: var(--zrl-radius);
319
+ background: var(--zrl-qr-bg);
320
+ /* The light on the edge takes its shape from here and its colour and
321
+ strength from the theme tokens above. One lap in 4s on every tier. */
322
+ --zrl-radius: 16px;
323
+ --zrl-beam-time: 4s;
238
324
  }
239
- function markReturnDone(requestId) {
240
- try {
241
- const store = storage();
242
- store?.setItem(DONE + requestId, String(Date.now()));
243
- store?.removeItem(PREFIX + requestId);
244
- } catch {
245
- }
325
+
326
+ /* The light on the well's edge: a short comet running along the border, with
327
+ a soft glow outside it. Three overlays inside the well, each masked so the
328
+ comet can only ever paint where its mask allows, and the white interior lies
329
+ outside every mask: nothing here can reach the quiet zone a camera needs,
330
+ whatever the comet is doing. The mask is the padding box cut out of the
331
+ border box, a transparent layer clipped to the padding box intersected
332
+ with a solid one clipped to the border box. The prefixed form is for Chrome
333
+ before 120 and Safari before 15.4; the unprefixed one, declared after it,
334
+ wins everywhere else.
335
+
336
+ qr-beam keeps a thin ring on the border line: the comet itself.
337
+ qr-beam-glow is the glow: a wide band outside the well that blurs whatever
338
+ is inside it, and inside it qr-beam-glow-band keeps a 3px ring with a
339
+ second copy of the comet. The blur has to sit on the parent because a
340
+ filter is applied before a mask: blurred on the band itself, the glow
341
+ would be cut back to the band's own edge. On the parent it runs after the
342
+ band has clipped the comet thin and before the parent's mask cuts away the
343
+ inward half, which is what makes it fade outward and never over the QR.
344
+ All three share one containing block, the well's padding box, so the two
345
+ comets ride the same path; the spent badge is a later sibling and paints
346
+ above them. */
347
+ .${PREFIX}-qr-beam,
348
+ .${PREFIX}-qr-beam-glow,
349
+ .${PREFIX}-qr-beam-glow-band {
350
+ position: absolute;
351
+ inset: calc(0px - var(--zrl-beam-line));
352
+ border: var(--zrl-beam-line) solid transparent;
353
+ border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-beam-line));
354
+ pointer-events: none;
355
+ -webkit-mask: linear-gradient(transparent, transparent), linear-gradient(#fff, #fff);
356
+ -webkit-mask-clip: padding-box, border-box;
357
+ -webkit-mask-composite: source-in;
358
+ mask: linear-gradient(transparent, transparent), linear-gradient(#fff, #fff);
359
+ mask-clip: padding-box, border-box;
360
+ mask-composite: intersect;
246
361
  }
247
- function isReturnDone(requestId) {
248
- return storage()?.getItem(DONE + requestId) !== null && storage()?.getItem(DONE + requestId) !== void 0;
362
+ .${PREFIX}-qr-beam-glow {
363
+ inset: calc(0px - var(--zrl-glow-reach));
364
+ border-width: var(--zrl-glow-reach);
365
+ border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-glow-reach));
366
+ filter: blur(var(--zrl-glow-blur));
367
+ opacity: var(--zrl-glow-opacity);
368
+ will-change: filter;
249
369
  }
250
- function returnToUrl() {
251
- if (typeof window === "undefined") return void 0;
252
- const { href } = window.location;
253
- const hash = href.indexOf("#");
254
- return hash === -1 ? href : href.slice(0, hash);
370
+ .${PREFIX}-qr-beam-glow-band {
371
+ inset: calc(0px - var(--zrl-glow-core));
372
+ border-width: var(--zrl-glow-core);
373
+ border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-glow-core));
255
374
  }
256
- var RETURN_MARK = /(?:^|[#&])zoreal_return=([A-Za-z0-9]{32})(?:&|$)/;
257
- var pending = null;
258
- function pendingReturnId() {
259
- if (pending) return pending;
260
- if (typeof window === "undefined") return null;
261
- const match = RETURN_MARK.exec(window.location.hash);
262
- if (!match) return null;
263
- pending = match[1];
264
- try {
265
- window.history.replaceState(window.history.state, "", returnToUrl());
266
- } catch {
267
- }
268
- return pending;
269
- }
270
-
271
- // src/i18n.ts
272
- var en = {
273
- title: "Scan to sign in",
274
- titleIdentify: "Scan to verify your identity",
275
- titlePresence: "Scan to prove you are a real human",
276
- titleApprove: "Approve on your phone",
277
- bodyScan: "Scan with your phone camera or the ZOREAL ID app.",
278
- bodyApprove: "Approve the login in your ZOREAL ID app.",
279
- bodyEnrolling: "Finish setting up ZOREAL ID on your phone, then approve the login.",
280
- waiting: "Waiting for scan",
281
- waitingApproval: "Waiting for approval",
282
- expiresIn: "Expires in {time}",
283
- secured: "Proof-of-Human verification by ZOREAL",
284
- noIdTitle: "No ZOREAL ID yet?",
285
- noIdBody: "Scan the same code to download the app and create one for free. It only takes a minute.",
286
- cancel: "Cancel",
287
- close: "Close",
288
- qrAlt: "QR code to sign in with ZOREAL",
289
- buttonContinue: "Continue with ZOREAL"
290
- };
291
- var TRANSLATIONS = {
292
- en,
293
- sv: {
294
- title: "Skanna f\xF6r att logga in",
295
- titleIdentify: "Skanna f\xF6r att verifiera din identitet",
296
- titlePresence: "Skanna f\xF6r att bevisa att du \xE4r en riktig m\xE4nniska",
297
- titleApprove: "Godk\xE4nn p\xE5 telefonen",
298
- bodyScan: "Skanna med telefonens kamera eller ZOREAL ID-appen.",
299
- bodyApprove: "Godk\xE4nn inloggningen i ZOREAL ID-appen.",
300
- bodyEnrolling: "Slutf\xF6r konfigurationen av ZOREAL ID p\xE5 telefonen och godk\xE4nn sedan inloggningen.",
301
- waiting: "V\xE4ntar p\xE5 skanning",
302
- waitingApproval: "V\xE4ntar p\xE5 godk\xE4nnande",
303
- expiresIn: "Upph\xF6r om {time}",
304
- secured: "Proof-of-Human-verifiering av ZOREAL",
305
- noIdTitle: "Har du inget ZOREAL ID?",
306
- noIdBody: "Skanna samma kod f\xF6r att ladda ner appen och skapa ett gratis. Det tar bara en minut.",
307
- cancel: "Avbryt",
308
- close: "St\xE4ng",
309
- qrAlt: "QR-kod f\xF6r att logga in med ZOREAL",
310
- buttonContinue: "Forts\xE4tt med ZOREAL"
311
- },
312
- es: {
313
- title: "Escanea para iniciar sesi\xF3n",
314
- titleIdentify: "Escanea para verificar tu identidad",
315
- titlePresence: "Escanea para demostrar que eres una persona real",
316
- titleApprove: "Apru\xE9balo en tu tel\xE9fono",
317
- bodyScan: "Escanea con la c\xE1mara de tu tel\xE9fono o con la app ZOREAL ID.",
318
- bodyApprove: "Aprueba el inicio de sesi\xF3n en tu app ZOREAL ID.",
319
- bodyEnrolling: "Termina de configurar ZOREAL ID en tu tel\xE9fono y luego aprueba el inicio de sesi\xF3n.",
320
- waiting: "Esperando el escaneo",
321
- waitingApproval: "Esperando aprobaci\xF3n",
322
- expiresIn: "Caduca en {time}",
323
- secured: "Verificaci\xF3n Proof-of-Human de ZOREAL",
324
- noIdTitle: "\xBFA\xFAn no tienes ZOREAL ID?",
325
- noIdBody: "Escanea el mismo c\xF3digo para descargar la app y crear una gratis. Solo toma un minuto.",
326
- cancel: "Cancelar",
327
- close: "Cerrar",
328
- qrAlt: "C\xF3digo QR para iniciar sesi\xF3n con ZOREAL",
329
- buttonContinue: "Continuar con ZOREAL"
330
- },
331
- pt: {
332
- title: "Digitalize para entrar",
333
- titleIdentify: "Digitalize para verificar a sua identidade",
334
- titlePresence: "Digitalize para provar que \xE9 uma pessoa real",
335
- titleApprove: "Aprove no seu telefone",
336
- bodyScan: "Digitalize com a c\xE2mara do seu telefone ou com a app ZOREAL ID.",
337
- bodyApprove: "Aprove o login no app ZOREAL ID.",
338
- bodyEnrolling: "Termine de configurar o ZOREAL ID no seu telefone e depois aprove o login.",
339
- waiting: "Aguardando digitaliza\xE7\xE3o",
340
- waitingApproval: "Aguardando aprova\xE7\xE3o",
341
- expiresIn: "Expira em {time}",
342
- secured: "Verifica\xE7\xE3o Proof-of-Human da ZOREAL",
343
- noIdTitle: "Ainda n\xE3o tem ZOREAL ID?",
344
- noIdBody: "Digitalize o mesmo c\xF3digo para baixar o app e criar uma conta gr\xE1tis. Leva s\xF3 um minuto.",
345
- cancel: "Cancelar",
346
- close: "Fechar",
347
- qrAlt: "C\xF3digo QR para entrar com ZOREAL",
348
- buttonContinue: "Continuar com ZOREAL"
349
- },
350
- fr: {
351
- title: "Scannez pour vous connecter",
352
- titleIdentify: "Scannez pour v\xE9rifier votre identit\xE9",
353
- titlePresence: "Scannez pour prouver que vous \xEAtes bien un humain",
354
- titleApprove: "Approuvez sur votre t\xE9l\xE9phone",
355
- bodyScan: "Scannez avec l'appareil photo de votre t\xE9l\xE9phone ou l'app ZOREAL ID.",
356
- bodyApprove: "Approuvez la connexion dans votre app ZOREAL ID.",
357
- bodyEnrolling: "Terminez la configuration de ZOREAL ID sur votre t\xE9l\xE9phone, puis approuvez la connexion.",
358
- waiting: "En attente du scan",
359
- waitingApproval: "En attente d'approbation",
360
- expiresIn: "Expire dans {time}",
361
- secured: "V\xE9rification Proof-of-Human par ZOREAL",
362
- noIdTitle: "Pas encore de ZOREAL ID ?",
363
- noIdBody: "Scannez le m\xEAme code pour t\xE9l\xE9charger l'app et en cr\xE9er un gratuitement. Cela prend une minute.",
364
- cancel: "Annuler",
365
- close: "Fermer",
366
- qrAlt: "Code QR pour se connecter avec ZOREAL",
367
- buttonContinue: "Continuer avec ZOREAL"
368
- },
369
- de: {
370
- title: "Zum Anmelden scannen",
371
- titleIdentify: "Scannen, um Ihre Identit\xE4t zu verifizieren",
372
- titlePresence: "Scannen, um zu beweisen, dass Sie ein echter Mensch sind",
373
- titleApprove: "Auf dem Handy best\xE4tigen",
374
- bodyScan: "Mit der Handykamera oder der ZOREAL ID App scannen.",
375
- bodyApprove: "Anmeldung in der ZOREAL ID App best\xE4tigen.",
376
- bodyEnrolling: "ZOREAL ID auf dem Handy fertig einrichten und dann die Anmeldung best\xE4tigen.",
377
- waiting: "Warten auf Scan",
378
- waitingApproval: "Warten auf Best\xE4tigung",
379
- expiresIn: "L\xE4uft ab in {time}",
380
- secured: "Proof-of-Human-Verifizierung von ZOREAL",
381
- noIdTitle: "Noch keine ZOREAL ID?",
382
- noIdBody: "Denselben Code scannen, um die App zu laden und kostenlos eine zu erstellen. Dauert nur eine Minute.",
383
- cancel: "Abbrechen",
384
- close: "Schlie\xDFen",
385
- qrAlt: "QR-Code f\xFCr die Anmeldung mit ZOREAL",
386
- buttonContinue: "Weiter mit ZOREAL"
387
- },
388
- ru: {
389
- title: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0432\u043E\u0439\u0442\u0438",
390
- titleIdentify: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u043B\u0438\u0447\u043D\u043E\u0441\u0442\u044C",
391
- titlePresence: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u044C, \u0447\u0442\u043E \u0432\u044B \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0439 \u0447\u0435\u043B\u043E\u0432\u0435\u043A",
392
- titleApprove: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0435",
393
- bodyScan: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u0439 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0447\u0435\u0440\u0435\u0437 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 ZOREAL ID.",
394
- bodyApprove: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0432\u0445\u043E\u0434 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 ZOREAL ID.",
395
- bodyEnrolling: "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0435, \u0437\u0430\u0442\u0435\u043C \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0432\u0445\u043E\u0434.",
396
- waiting: "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u0441\u043A\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
397
- waitingApproval: "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F",
398
- expiresIn: "\u0418\u0441\u0442\u0435\u043A\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 {time}",
399
- secured: "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 Proof-of-Human \u043E\u0442 ZOREAL",
400
- noIdTitle: "\u0415\u0449\u0451 \u043D\u0435\u0442 ZOREAL ID?",
401
- noIdBody: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 \u0442\u043E\u0442 \u0436\u0435 \u043A\u043E\u0434, \u0447\u0442\u043E\u0431\u044B \u0441\u043A\u0430\u0447\u0430\u0442\u044C \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0438 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0435\u0433\u043E \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E. \u042D\u0442\u043E \u0437\u0430\u0439\u043C\u0451\u0442 \u043C\u0438\u043D\u0443\u0442\u0443.",
402
- cancel: "\u041E\u0442\u043C\u0435\u043D\u0430",
403
- close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
404
- qrAlt: "QR-\u043A\u043E\u0434 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 ZOREAL",
405
- buttonContinue: "\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0441 ZOREAL"
406
- },
407
- ja: {
408
- title: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30ED\u30B0\u30A4\u30F3",
409
- titleIdentify: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u672C\u4EBA\u78BA\u8A8D",
410
- titlePresence: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u5B9F\u5728\u306E\u4EBA\u7269\u3067\u3042\u308B\u3053\u3068\u3092\u8A3C\u660E",
411
- titleApprove: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3067\u627F\u8A8D",
412
- bodyScan: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u306E\u30AB\u30E1\u30E9\u307E\u305F\u306FZOREAL ID\u30A2\u30D7\u30EA\u3067\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
413
- bodyApprove: "ZOREAL ID\u30A2\u30D7\u30EA\u3067\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
414
- bodyEnrolling: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3067ZOREAL ID\u306E\u8A2D\u5B9A\u3092\u5B8C\u4E86\u3057\u3001\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
415
- waiting: "\u30B9\u30AD\u30E3\u30F3\u5F85\u3061",
416
- waitingApproval: "\u627F\u8A8D\u5F85\u3061",
417
- expiresIn: "\u6709\u52B9\u671F\u9650\u307E\u3067 {time}",
418
- secured: "ZOREAL\u306B\u3088\u308BProof-of-Human\u8A8D\u8A3C",
419
- noIdTitle: "ZOREAL ID\u3092\u304A\u6301\u3061\u3067\u306A\u3044\u3067\u3059\u304B\uFF1F",
420
- noIdBody: "\u540C\u3058\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30A2\u30D7\u30EA\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3001\u7121\u6599\u3067\u4F5C\u6210\u3067\u304D\u307E\u3059\u30021\u5206\u307B\u3069\u3067\u5B8C\u4E86\u3057\u307E\u3059\u3002",
421
- cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB",
422
- close: "\u9589\u3058\u308B",
423
- qrAlt: "ZOREAL\u3067\u30ED\u30B0\u30A4\u30F3\u3059\u308B\u305F\u3081\u306EQR\u30B3\u30FC\u30C9",
424
- buttonContinue: "ZOREAL\u3067\u7D9A\u884C"
425
- },
426
- hi: {
427
- title: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
428
- titleIdentify: "\u0905\u092A\u0928\u0940 \u092A\u0939\u091A\u093E\u0928 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
429
- titlePresence: "\u092F\u0939 \u0938\u093E\u092C\u093F\u0924 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902 \u0915\u093F \u0906\u092A \u090F\u0915 \u0935\u093E\u0938\u094D\u0924\u0935\u093F\u0915 \u0907\u0902\u0938\u093E\u0928 \u0939\u0948\u0902",
430
- titleApprove: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u092A\u0930 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902",
431
- bodyScan: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u0915\u0947 \u0915\u0948\u092E\u0930\u0947 \u092F\u093E ZOREAL ID \u0910\u092A \u0938\u0947 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902\u0964",
432
- bodyApprove: "\u0905\u092A\u0928\u0947 ZOREAL ID \u0910\u092A \u092E\u0947\u0902 \u0932\u0949\u0917\u093F\u0928 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902\u0964",
433
- bodyEnrolling: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u092A\u0930 ZOREAL ID \u0938\u0947\u091F\u0905\u092A \u092A\u0942\u0930\u093E \u0915\u0930\u0947\u0902, \u092B\u093F\u0930 \u0932\u0949\u0917\u093F\u0928 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902\u0964",
434
- waiting: "\u0938\u094D\u0915\u0948\u0928 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948",
435
- waitingApproval: "\u0938\u094D\u0935\u0940\u0915\u0943\u0924\u093F \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948",
436
- expiresIn: "{time} \u092E\u0947\u0902 \u0938\u092E\u093E\u092A\u094D\u0924",
437
- secured: "ZOREAL \u0926\u094D\u0935\u093E\u0930\u093E Proof-of-Human \u0938\u0924\u094D\u092F\u093E\u092A\u0928",
438
- noIdTitle: "\u0905\u092D\u0940 \u0924\u0915 ZOREAL ID \u0928\u0939\u0940\u0902 \u0939\u0948?",
439
- noIdBody: "\u0910\u092A \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0930\u0928\u0947 \u0914\u0930 \u092E\u0941\u092B\u094D\u0924 \u092E\u0947\u0902 \u090F\u0915 \u092C\u0928\u093E\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0935\u0939\u0940 \u0915\u094B\u0921 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902\u0964 \u0907\u0938\u092E\u0947\u0902 \u092C\u0938 \u090F\u0915 \u092E\u093F\u0928\u091F \u0932\u0917\u0924\u093E \u0939\u0948\u0964",
440
- cancel: "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
441
- close: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
442
- qrAlt: "ZOREAL \u0938\u0947 \u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F QR \u0915\u094B\u0921",
443
- buttonContinue: "ZOREAL \u0915\u0947 \u0938\u093E\u0925 \u091C\u093E\u0930\u0940 \u0930\u0916\u0947\u0902"
444
- },
445
- zhs: {
446
- title: "\u626B\u7801\u767B\u5F55",
447
- titleIdentify: "\u626B\u7801\u9A8C\u8BC1\u8EAB\u4EFD",
448
- titlePresence: "\u626B\u7801\u8BC1\u660E\u60A8\u662F\u771F\u4EBA",
449
- titleApprove: "\u5728\u624B\u673A\u4E0A\u6279\u51C6",
450
- bodyScan: "\u4F7F\u7528\u624B\u673A\u76F8\u673A\u6216 ZOREAL ID \u5E94\u7528\u626B\u63CF\u3002",
451
- bodyApprove: "\u8BF7\u5728 ZOREAL ID \u5E94\u7528\u4E2D\u6279\u51C6\u767B\u5F55\u3002",
452
- bodyEnrolling: "\u8BF7\u5728\u624B\u673A\u4E0A\u5B8C\u6210 ZOREAL ID \u8BBE\u7F6E\uFF0C\u7136\u540E\u6279\u51C6\u767B\u5F55\u3002",
453
- waiting: "\u7B49\u5F85\u626B\u63CF",
454
- waitingApproval: "\u7B49\u5F85\u6279\u51C6",
455
- expiresIn: "{time} \u540E\u5931\u6548",
456
- secured: "\u7531 ZOREAL \u63D0\u4F9B\u7684 Proof-of-Human \u9A8C\u8BC1",
457
- noIdTitle: "\u8FD8\u6CA1\u6709 ZOREAL ID\uFF1F",
458
- noIdBody: "\u626B\u63CF\u540C\u4E00\u4E2A\u4E8C\u7EF4\u7801\u5373\u53EF\u4E0B\u8F7D\u5E94\u7528\u5E76\u514D\u8D39\u521B\u5EFA\uFF0C\u53EA\u9700\u4E00\u5206\u949F\u3002",
459
- cancel: "\u53D6\u6D88",
460
- close: "\u5173\u95ED",
461
- qrAlt: "\u4F7F\u7528 ZOREAL \u767B\u5F55\u7684\u4E8C\u7EF4\u7801",
462
- buttonContinue: "\u4F7F\u7528 ZOREAL \u7EE7\u7EED"
463
- },
464
- zht: {
465
- title: "\u6383\u78BC\u767B\u5165",
466
- titleIdentify: "\u6383\u78BC\u9A57\u8B49\u8EAB\u5206",
467
- titlePresence: "\u6383\u78BC\u8B49\u660E\u60A8\u662F\u771F\u4EBA",
468
- titleApprove: "\u5728\u624B\u6A5F\u4E0A\u6838\u51C6",
469
- bodyScan: "\u4F7F\u7528\u624B\u6A5F\u76F8\u6A5F\u6216 ZOREAL ID \u61C9\u7528\u7A0B\u5F0F\u6383\u63CF\u3002",
470
- bodyApprove: "\u8ACB\u5728 ZOREAL ID \u61C9\u7528\u7A0B\u5F0F\u4E2D\u6838\u51C6\u767B\u5165\u3002",
471
- bodyEnrolling: "\u8ACB\u5728\u624B\u6A5F\u4E0A\u5B8C\u6210 ZOREAL ID \u8A2D\u5B9A\uFF0C\u7136\u5F8C\u6838\u51C6\u767B\u5165\u3002",
472
- waiting: "\u7B49\u5F85\u6383\u63CF",
473
- waitingApproval: "\u7B49\u5F85\u6838\u51C6",
474
- expiresIn: "{time} \u5F8C\u5931\u6548",
475
- secured: "\u7531 ZOREAL \u63D0\u4F9B\u7684 Proof-of-Human \u9A57\u8B49",
476
- noIdTitle: "\u9084\u6C92\u6709 ZOREAL ID\uFF1F",
477
- noIdBody: "\u6383\u63CF\u540C\u4E00\u500B QR code \u5373\u53EF\u4E0B\u8F09\u61C9\u7528\u7A0B\u5F0F\u4E26\u514D\u8CBB\u5EFA\u7ACB\uFF0C\u53EA\u9700\u4E00\u5206\u9418\u3002",
478
- cancel: "\u53D6\u6D88",
479
- close: "\u95DC\u9589",
480
- qrAlt: "\u4F7F\u7528 ZOREAL \u767B\u5165\u7684 QR code",
481
- buttonContinue: "\u4F7F\u7528 ZOREAL \u7E7C\u7E8C"
482
- },
483
- ar: {
484
- title: "\u0627\u0645\u0633\u062D \u0644\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644",
485
- titleIdentify: "\u0627\u0645\u0633\u062D \u0644\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0647\u0648\u064A\u062A\u0643",
486
- titlePresence: "\u0627\u0645\u0633\u062D \u0644\u0625\u062B\u0628\u0627\u062A \u0623\u0646\u0643 \u0625\u0646\u0633\u0627\u0646 \u062D\u0642\u064A\u0642\u064A",
487
- titleApprove: "\u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u0647\u0627\u062A\u0641\u0643",
488
- bodyScan: "\u0627\u0645\u0633\u062D \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0643\u0627\u0645\u064A\u0631\u0627 \u0647\u0627\u062A\u0641\u0643 \u0623\u0648 \u062A\u0637\u0628\u064A\u0642 ZOREAL ID.",
489
- bodyApprove: "\u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0641\u064A \u062A\u0637\u0628\u064A\u0642 ZOREAL ID.",
490
- bodyEnrolling: "\u0623\u0643\u0645\u0644 \u0625\u0639\u062F\u0627\u062F ZOREAL ID \u0639\u0644\u0649 \u0647\u0627\u062A\u0641\u0643\u060C \u062B\u0645 \u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644.",
491
- waiting: "\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u0645\u0633\u062D",
492
- waitingApproval: "\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629",
493
- expiresIn: "\u062A\u0646\u062A\u0647\u064A \u0627\u0644\u0635\u0644\u0627\u062D\u064A\u0629 \u062E\u0644\u0627\u0644 {time}",
494
- secured: "\u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 Proof-of-Human \u0628\u0648\u0627\u0633\u0637\u0629 ZOREAL",
495
- noIdTitle: "\u0644\u064A\u0633 \u0644\u062F\u064A\u0643 ZOREAL ID \u0628\u0639\u062F\u061F",
496
- noIdBody: "\u0627\u0645\u0633\u062D \u0627\u0644\u0631\u0645\u0632 \u0646\u0641\u0633\u0647 \u0644\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u062A\u0637\u0628\u064A\u0642 \u0648\u0625\u0646\u0634\u0627\u0621 \u062D\u0633\u0627\u0628 \u0645\u062C\u0627\u0646\u064A. \u064A\u0633\u062A\u063A\u0631\u0642 \u0627\u0644\u0623\u0645\u0631 \u062F\u0642\u064A\u0642\u0629 \u0648\u0627\u062D\u062F\u0629 \u0641\u0642\u0637.",
497
- cancel: "\u0625\u0644\u063A\u0627\u0621",
498
- close: "\u0625\u063A\u0644\u0627\u0642",
499
- qrAlt: "\u0631\u0645\u0632 QR \u0644\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 ZOREAL",
500
- buttonContinue: "\u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 ZOREAL"
501
- },
502
- ko: {
503
- title: "\uC2A4\uCE94\uD558\uC5EC \uB85C\uADF8\uC778",
504
- titleIdentify: "\uC2A4\uCE94\uD558\uC5EC \uC2E0\uC6D0 \uD655\uC778",
505
- titlePresence: "\uC2A4\uCE94\uD558\uC5EC \uC2E4\uC81C \uC0AC\uB78C\uC784\uC744 \uC99D\uBA85",
506
- titleApprove: "\uD734\uB300\uD3F0\uC5D0\uC11C \uC2B9\uC778",
507
- bodyScan: "\uD734\uB300\uD3F0 \uCE74\uBA54\uB77C \uB610\uB294 ZOREAL ID \uC571\uC73C\uB85C \uC2A4\uCE94\uD558\uC138\uC694.",
508
- bodyApprove: "ZOREAL ID \uC571\uC5D0\uC11C \uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uC138\uC694.",
509
- bodyEnrolling: "\uD734\uB300\uD3F0\uC5D0\uC11C ZOREAL ID \uC124\uC815\uC744 \uC644\uB8CC\uD55C \uD6C4 \uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uC138\uC694.",
510
- waiting: "\uC2A4\uCE94 \uB300\uAE30 \uC911",
511
- waitingApproval: "\uC2B9\uC778 \uB300\uAE30 \uC911",
512
- expiresIn: "{time} \uD6C4 \uB9CC\uB8CC",
513
- secured: "ZOREAL\uC758 Proof-of-Human \uC778\uC99D",
514
- noIdTitle: "\uC544\uC9C1 ZOREAL ID\uAC00 \uC5C6\uC73C\uC2E0\uAC00\uC694?",
515
- noIdBody: "\uAC19\uC740 \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD574 \uC571\uC744 \uB0B4\uB824\uBC1B\uACE0 \uBB34\uB8CC\uB85C \uB9CC\uB4DC\uC138\uC694. 1\uBD84\uC774\uBA74 \uB429\uB2C8\uB2E4.",
516
- cancel: "\uCDE8\uC18C",
517
- close: "\uB2EB\uAE30",
518
- qrAlt: "ZOREAL\uB85C \uB85C\uADF8\uC778\uD558\uAE30 \uC704\uD55C QR \uCF54\uB4DC",
519
- buttonContinue: "ZOREAL\uB85C \uACC4\uC18D"
520
- },
521
- // Български
522
- bg: {
523
- title: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0437\u0430 \u0432\u0445\u043E\u0434",
524
- titleIdentify: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435, \u0437\u0430 \u0434\u0430 \u043F\u043E\u0442\u0432\u044A\u0440\u0434\u0438\u0442\u0435 \u0441\u0430\u043C\u043E\u043B\u0438\u0447\u043D\u043E\u0441\u0442\u0442\u0430 \u0441\u0438",
525
- titlePresence: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435, \u0437\u0430 \u0434\u0430 \u0434\u043E\u043A\u0430\u0436\u0435\u0442\u0435, \u0447\u0435 \u0441\u0442\u0435 \u0438\u0441\u0442\u0438\u043D\u0441\u043A\u0438 \u0447\u043E\u0432\u0435\u043A",
526
- titleApprove: "\u041F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0441\u0438",
527
- bodyScan: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0441 \u043A\u0430\u043C\u0435\u0440\u0430\u0442\u0430 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0441 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E ZOREAL ID.",
528
- bodyApprove: "\u041F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u0432\u0445\u043E\u0434\u0430 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E ZOREAL ID.",
529
- bodyEnrolling: "\u0414\u043E\u0432\u044A\u0440\u0448\u0435\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0442\u0430 \u043D\u0430 ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0441\u0438, \u0441\u043B\u0435\u0434 \u043A\u043E\u0435\u0442\u043E \u043F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u0432\u0445\u043E\u0434\u0430.",
530
- waiting: "\u0418\u0437\u0447\u0430\u043A\u0432\u0430\u043D\u0435 \u043D\u0430 \u0441\u043A\u0430\u043D\u0438\u0440\u0430\u043D\u0435",
531
- waitingApproval: "\u0418\u0437\u0447\u0430\u043A\u0432\u0430\u043D\u0435 \u043D\u0430 \u043F\u043E\u0442\u0432\u044A\u0440\u0436\u0434\u0435\u043D\u0438\u0435",
532
- expiresIn: "\u0418\u0437\u0442\u0438\u0447\u0430 \u0441\u043B\u0435\u0434 {time}",
533
- secured: "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 Proof-of-Human \u043E\u0442 ZOREAL",
534
- noIdTitle: "\u0412\u0441\u0435 \u043E\u0449\u0435 \u043D\u044F\u043C\u0430\u0442\u0435 ZOREAL ID?",
535
- noIdBody: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0441\u044A\u0449\u0438\u044F \u043A\u043E\u0434, \u0437\u0430 \u0434\u0430 \u0438\u0437\u0442\u0435\u0433\u043B\u0438\u0442\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E \u0438 \u0434\u0430 \u0441\u0438 \u0441\u044A\u0437\u0434\u0430\u0434\u0435\u0442\u0435 \u0431\u0435\u0437\u043F\u043B\u0430\u0442\u0435\u043D \u0430\u043A\u0430\u0443\u043D\u0442. \u041E\u0442\u043D\u0435\u043C\u0430 \u0441\u0430\u043C\u043E \u043C\u0438\u043D\u0443\u0442\u0430.",
536
- cancel: "\u041E\u0442\u043A\u0430\u0437",
537
- close: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438",
538
- qrAlt: "QR \u043A\u043E\u0434 \u0437\u0430 \u0432\u0445\u043E\u0434 \u0441\u044A\u0441 ZOREAL",
539
- buttonContinue: "\u041F\u0440\u043E\u0434\u044A\u043B\u0436\u0438 \u0441\u044A\u0441 ZOREAL"
540
- },
541
- // বাংলা
542
- bn: {
543
- title: "\u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
544
- titleIdentify: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AA\u09B0\u09BF\u099A\u09AF\u09BC \u09AF\u09BE\u099A\u09BE\u0987 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
545
- titlePresence: "\u0986\u09AA\u09A8\u09BF \u098F\u0995\u099C\u09A8 \u09AA\u09CD\u09B0\u0995\u09C3\u09A4 \u09AE\u09BE\u09A8\u09C1\u09B7 \u09A4\u09BE \u09AA\u09CD\u09B0\u09AE\u09BE\u09A3 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
546
- titleApprove: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8",
547
- bodyScan: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7\u09B0 \u0995\u09CD\u09AF\u09BE\u09AE\u09C7\u09B0\u09BE \u09AC\u09BE ZOREAL ID \u0985\u09CD\u09AF\u09BE\u09AA \u09A6\u09BF\u09AF\u09BC\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
548
- bodyApprove: "\u0986\u09AA\u09A8\u09BE\u09B0 ZOREAL ID \u0985\u09CD\u09AF\u09BE\u09AA\u09C7 \u09B2\u0997\u0987\u09A8 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
549
- bodyEnrolling: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7 ZOREAL ID \u09B8\u09C7\u099F\u0986\u09AA \u09B8\u09AE\u09CD\u09AA\u09C2\u09B0\u09CD\u09A3 \u0995\u09B0\u09C1\u09A8, \u09A4\u09BE\u09B0\u09AA\u09B0 \u09B2\u0997\u0987\u09A8 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
550
- waiting: "\u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8\u09C7\u09B0 \u0985\u09AA\u09C7\u0995\u09CD\u09B7\u09BE\u09AF\u09BC",
551
- waitingApproval: "\u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8\u09C7\u09B0 \u0985\u09AA\u09C7\u0995\u09CD\u09B7\u09BE\u09AF\u09BC",
552
- expiresIn: "{time} \u09AA\u09B0\u09C7 \u09AE\u09C7\u09AF\u09BC\u09BE\u09A6 \u09B6\u09C7\u09B7 \u09B9\u09AC\u09C7",
553
- secured: "ZOREAL \u09A6\u09CD\u09AC\u09BE\u09B0\u09BE Proof-of-Human \u09AF\u09BE\u099A\u09BE\u0987\u0995\u09B0\u09A3",
554
- noIdTitle: "\u098F\u0996\u09A8\u09CB ZOREAL ID \u09A8\u09C7\u0987?",
555
- noIdBody: "\u0985\u09CD\u09AF\u09BE\u09AA \u09A1\u09BE\u0989\u09A8\u09B2\u09CB\u09A1 \u0995\u09B0\u09C7 \u09AC\u09BF\u09A8\u09BE\u09AE\u09C2\u09B2\u09CD\u09AF\u09C7 \u098F\u0995\u099F\u09BF \u09A4\u09C8\u09B0\u09BF \u0995\u09B0\u09A4\u09C7 \u098F\u0995\u0987 \u0995\u09CB\u09A1 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8\u0964 \u098F\u09A4\u09C7 \u09AE\u09BE\u09A4\u09CD\u09B0 \u098F\u0995 \u09AE\u09BF\u09A8\u09BF\u099F \u09B8\u09AE\u09AF\u09BC \u09B2\u09BE\u0997\u09C7\u0964",
556
- cancel: "\u09AC\u09BE\u09A4\u09BF\u09B2",
557
- close: "\u09AC\u09A8\u09CD\u09A7",
558
- qrAlt: "ZOREAL \u09A6\u09BF\u09AF\u09BC\u09C7 \u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u0995\u09B0\u09BE\u09B0 \u099C\u09A8\u09CD\u09AF QR \u0995\u09CB\u09A1",
559
- buttonContinue: "ZOREAL \u09A6\u09BF\u09AF\u09BC\u09C7 \u099A\u09BE\u09B2\u09BF\u09AF\u09BC\u09C7 \u09AF\u09BE\u09A8"
560
- },
561
- // Bosanski
562
- bs: {
563
- title: "Skenirajte za prijavu",
564
- titleIdentify: "Skenirajte da potvrdite svoj identitet",
565
- titlePresence: "Skenirajte da doka\u017Eete da ste stvarna osoba",
566
- titleApprove: "Odobrite na svom telefonu",
567
- bodyScan: "Skenirajte kamerom svog telefona ili aplikacijom ZOREAL ID.",
568
- bodyApprove: "Odobrite prijavu u aplikaciji ZOREAL ID.",
569
- bodyEnrolling: "Zavr\u0161ite pode\u0161avanje ZOREAL ID-a na svom telefonu, a zatim odobrite prijavu.",
570
- waiting: "\u010Ceka se skeniranje",
571
- waitingApproval: "\u010Ceka se odobrenje",
572
- expiresIn: "Isti\u010De za {time}",
573
- secured: "ZOREAL Proof-of-Human verifikacija",
574
- noIdTitle: "Nemate ZOREAL ID?",
575
- noIdBody: "Skenirajte isti kod da preuzmete aplikaciju i besplatno ga napravite. Traje samo minutu.",
576
- cancel: "Otka\u017Ei",
577
- close: "Zatvori",
578
- qrAlt: "QR kod za prijavu putem ZOREAL-a",
579
- buttonContinue: "Nastavi sa ZOREAL-om"
580
- },
581
- // Čeština
582
- cs: {
583
- title: "P\u0159ihlaste se naskenov\xE1n\xEDm",
584
- titleIdentify: "Naskenujte pro ov\u011B\u0159en\xED toto\u017Enosti",
585
- titlePresence: "Naskenujte a proka\u017Ete, \u017Ee jste skute\u010Dn\xFD \u010Dlov\u011Bk",
586
- titleApprove: "Potvr\u010Fte v telefonu",
587
- bodyScan: "Naskenujte fotoapar\xE1tem telefonu nebo aplikac\xED ZOREAL ID.",
588
- bodyApprove: "Potvr\u010Fte p\u0159ihl\xE1\u0161en\xED v aplikaci ZOREAL ID.",
589
- bodyEnrolling: "Dokon\u010Dete nastaven\xED ZOREAL ID v telefonu a pot\xE9 potvr\u010Fte p\u0159ihl\xE1\u0161en\xED.",
590
- waiting: "\u010Cek\xE1n\xED na naskenov\xE1n\xED",
591
- waitingApproval: "\u010Cek\xE1n\xED na potvrzen\xED",
592
- expiresIn: "Vypr\u0161\xED za {time}",
593
- secured: "Ov\u011B\u0159en\xED Proof-of-Human od ZOREAL",
594
- noIdTitle: "Je\u0161t\u011B nem\xE1te ZOREAL ID?",
595
- noIdBody: "Naskenov\xE1n\xEDm stejn\xE9ho k\xF3du si st\xE1hnete aplikaci a zdarma vytvo\u0159\xEDte ZOREAL ID. Zabere to jen minutu.",
596
- cancel: "Zru\u0161it",
597
- close: "Zav\u0159\xEDt",
598
- qrAlt: "QR k\xF3d pro p\u0159ihl\xE1\u0161en\xED pomoc\xED ZOREAL",
599
- buttonContinue: "Pokra\u010Dovat se ZOREAL"
600
- },
601
- // Dansk
602
- da: {
603
- title: "Scan for at logge ind",
604
- titleIdentify: "Scan for at bekr\xE6fte din identitet",
605
- titlePresence: "Scan for at bevise, at du er et rigtigt menneske",
606
- titleApprove: "Godkend p\xE5 din telefon",
607
- bodyScan: "Scan med telefonens kamera eller ZOREAL ID-appen.",
608
- bodyApprove: "Godkend login i din ZOREAL ID-app.",
609
- bodyEnrolling: "F\xE6rdigg\xF8r ops\xE6tningen af ZOREAL ID p\xE5 din telefon, og godkend derefter login.",
610
- waiting: "Venter p\xE5 scanning",
611
- waitingApproval: "Venter p\xE5 godkendelse",
612
- expiresIn: "Udl\xF8ber om {time}",
613
- secured: "Proof-of-Human-verificering af ZOREAL",
614
- noIdTitle: "Har du ikke et ZOREAL ID endnu?",
615
- noIdBody: "Scan den samme kode for at hente appen og oprette et gratis. Det tager kun et minut.",
616
- cancel: "Annuller",
617
- close: "Luk",
618
- qrAlt: "QR-kode til at logge ind med ZOREAL",
619
- buttonContinue: "Forts\xE6t med ZOREAL"
620
- },
621
- // Ελληνικά
622
- el: {
623
- title: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7",
624
- titleIdentify: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03B5\u03C0\u03B1\u03BB\u03AE\u03B8\u03B5\u03C5\u03C3\u03B7 \u03C4\u03B1\u03C5\u03C4\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2",
625
- titlePresence: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03B4\u03B5\u03AF\u03BE\u03B5\u03C4\u03B5 \u03CC\u03C4\u03B9 \u03B5\u03AF\u03C3\u03C4\u03B5 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03B9\u03BA\u03CC\u03C2 \u03AC\u03BD\u03B8\u03C1\u03C9\u03C0\u03BF\u03C2",
626
- titleApprove: "\u0388\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 \u03B1\u03C0\u03CC \u03C4\u03BF \u03BA\u03B9\u03BD\u03B7\u03C4\u03CC \u03C3\u03B1\u03C2",
627
- bodyScan: "\u03A3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5 \u03BC\u03B5 \u03C4\u03B7\u03BD \u03BA\u03AC\u03BC\u03B5\u03C1\u03B1 \u03C4\u03BF\u03C5 \u03BA\u03B9\u03BD\u03B7\u03C4\u03BF\u03CD \u03C3\u03B1\u03C2 \u03AE \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE ZOREAL ID.",
628
- bodyApprove: "\u0395\u03B3\u03BA\u03C1\u03AF\u03BD\u03B5\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03C3\u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE ZOREAL ID.",
629
- bodyEnrolling: "\u039F\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03C3\u03C4\u03B5 \u03C4\u03B7 \u03C1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 \u03C4\u03BF\u03C5 ZOREAL ID \u03C3\u03C4\u03BF \u03BA\u03B9\u03BD\u03B7\u03C4\u03CC \u03C3\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03AD\u03C0\u03B5\u03B9\u03C4\u03B1 \u03B5\u03B3\u03BA\u03C1\u03AF\u03BD\u03B5\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7.",
630
- waiting: "\u0391\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03C3\u03AC\u03C1\u03C9\u03C3\u03B7\u03C2",
631
- waitingApproval: "\u0391\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03AD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7\u03C2",
632
- expiresIn: "\u039B\u03AE\u03B3\u03B5\u03B9 \u03C3\u03B5 {time}",
633
- secured: "\u0395\u03C0\u03B1\u03BB\u03AE\u03B8\u03B5\u03C5\u03C3\u03B7 Proof-of-Human \u03B1\u03C0\u03CC \u03C4\u03B7 ZOREAL",
634
- noIdTitle: "\u0394\u03B5\u03BD \u03AD\u03C7\u03B5\u03C4\u03B5 \u03B1\u03BA\u03CC\u03BC\u03B1 ZOREAL ID;",
635
- noIdBody: "\u03A3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5 \u03C4\u03BF\u03BD \u03AF\u03B4\u03B9\u03BF \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BA\u03B1\u03C4\u03B5\u03B2\u03AC\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03BA\u03B1\u03B9 \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03B5\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03B4\u03C9\u03C1\u03B5\u03AC\u03BD. \u03A7\u03C1\u03B5\u03B9\u03AC\u03B6\u03B5\u03C4\u03B1\u03B9 \u03BC\u03CC\u03BD\u03BF \u03AD\u03BD\u03B1 \u03BB\u03B5\u03C0\u03C4\u03CC.",
636
- cancel: "\u0386\u03BA\u03C5\u03C1\u03BF",
637
- close: "\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF",
638
- qrAlt: "\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 QR \u03B3\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03BC\u03B5 ZOREAL",
639
- buttonContinue: "\u03A3\u03C5\u03BD\u03AD\u03C7\u03B5\u03B9\u03B1 \u03BC\u03B5 ZOREAL"
640
- },
641
- // Español (LA)
642
- "es-419": {
643
- title: "Escanea para iniciar sesi\xF3n",
644
- titleIdentify: "Escanea para verificar tu identidad",
645
- titlePresence: "Escanea para demostrar que eres una persona real",
646
- titleApprove: "Aprueba desde tu celular",
647
- bodyScan: "Escanea con la c\xE1mara de tu celular o con la app ZOREAL ID.",
648
- bodyApprove: "Aprueba el inicio de sesi\xF3n en tu app ZOREAL ID.",
649
- bodyEnrolling: "Termina de configurar ZOREAL ID en tu celular y luego aprueba el inicio de sesi\xF3n.",
650
- waiting: "Esperando escaneo",
651
- waitingApproval: "Esperando aprobaci\xF3n",
652
- expiresIn: "Expira en {time}",
653
- secured: "Verificaci\xF3n Proof-of-Human de ZOREAL",
654
- noIdTitle: "\xBFTodav\xEDa no tienes ZOREAL ID?",
655
- noIdBody: "Escanea el mismo c\xF3digo para descargar la app y crear uno gratis. Solo toma un minuto.",
656
- cancel: "Cancelar",
657
- close: "Cerrar",
658
- qrAlt: "C\xF3digo QR para iniciar sesi\xF3n con ZOREAL",
659
- buttonContinue: "Continuar con ZOREAL"
660
- },
661
- // Suomi
662
- fi: {
663
- title: "Kirjaudu sis\xE4\xE4n skannaamalla",
664
- titleIdentify: "Vahvista henkil\xF6llisyytesi skannaamalla",
665
- titlePresence: "Todista skannaamalla, ett\xE4 olet oikea ihminen",
666
- titleApprove: "Hyv\xE4ksy puhelimessasi",
667
- bodyScan: "Skannaa puhelimesi kameralla tai ZOREAL ID -sovelluksella.",
668
- bodyApprove: "Hyv\xE4ksy kirjautuminen ZOREAL ID -sovelluksessasi.",
669
- bodyEnrolling: "Viimeistele ZOREAL ID -sovelluksen k\xE4ytt\xF6\xF6notto puhelimellasi ja hyv\xE4ksy sitten kirjautuminen.",
670
- waiting: "Odotetaan skannausta",
671
- waitingApproval: "Odotetaan hyv\xE4ksynt\xE4\xE4",
672
- expiresIn: "Vanhenee {time} kuluttua",
673
- secured: "ZOREALin Proof-of-Human-vahvistus",
674
- noIdTitle: "Eik\xF6 sinulla ole viel\xE4 ZOREAL ID:t\xE4?",
675
- noIdBody: "Skannaa sama koodi ladataksesi sovelluksen ja luodaksesi tunnuksen ilmaiseksi. Se vie vain minuutin.",
676
- cancel: "Peruuta",
677
- close: "Sulje",
678
- qrAlt: "QR-koodi ZOREAL-kirjautumista varten",
679
- buttonContinue: "Jatka ZOREALilla"
680
- },
681
- // עברית
682
- he: {
683
- title: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05EA\u05D7\u05D1\u05E8",
684
- titleIdentify: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D0\u05DE\u05EA \u05D0\u05EA \u05D6\u05D4\u05D5\u05EA\u05DA",
685
- titlePresence: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D5\u05DB\u05D9\u05D7 \u05E9\u05D0\u05EA\u05D4 \u05D0\u05D3\u05DD \u05D0\u05DE\u05D9\u05EA\u05D9",
686
- titleApprove: "\u05D0\u05E9\u05E8 \u05D1\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA",
687
- bodyScan: "\u05E1\u05E8\u05D5\u05E7 \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA \u05DE\u05E6\u05DC\u05DE\u05EA \u05D4\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA \u05D0\u05D5 \u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA ZOREAL ID.",
688
- bodyApprove: "\u05D0\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05D1\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA ZOREAL ID \u05E9\u05DC\u05DA.",
689
- bodyEnrolling: "\u05E1\u05D9\u05D9\u05DD \u05DC\u05D4\u05D2\u05D3\u05D9\u05E8 \u05D0\u05EA ZOREAL ID \u05D1\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA, \u05D5\u05D0\u05D6 \u05D0\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA.",
690
- waiting: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05E1\u05E8\u05D9\u05E7\u05D4",
691
- waitingApproval: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05D0\u05D9\u05E9\u05D5\u05E8",
692
- expiresIn: "\u05D9\u05E4\u05D5\u05D2 \u05D1\u05E2\u05D5\u05D3 {time}",
693
- secured: "\u05D0\u05D9\u05DE\u05D5\u05EA Proof-of-Human \u05DE\u05D1\u05D9\u05EA ZOREAL",
694
- noIdTitle: "\u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05DF \u05DC\u05DA ZOREAL ID?",
695
- noIdBody: "\u05E1\u05E8\u05D5\u05E7 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D5 \u05D4\u05E7\u05D5\u05D3 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D5\u05E8\u05D9\u05D3 \u05D0\u05EA \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05D5\u05DC\u05D9\u05E6\u05D5\u05E8 \u05D0\u05D7\u05D3 \u05D1\u05D7\u05D9\u05E0\u05DD. \u05D6\u05D4 \u05DC\u05D5\u05E7\u05D7 \u05E8\u05E7 \u05D3\u05E7\u05D4.",
696
- cancel: "\u05D1\u05D9\u05D8\u05D5\u05DC",
697
- close: "\u05E1\u05D2\u05D5\u05E8",
698
- qrAlt: "\u05E7\u05D5\u05D3 QR \u05DC\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05E2\u05DD ZOREAL",
699
- buttonContinue: "\u05D4\u05DE\u05E9\u05DA \u05E2\u05DD ZOREAL"
700
- },
701
- // Hrvatski
702
- hr: {
703
- title: "Skenirajte za prijavu",
704
- titleIdentify: "Skenirajte za potvrdu identiteta",
705
- titlePresence: "Skenirajte kako biste dokazali da ste stvarna osoba",
706
- titleApprove: "Odobrite na svom mobitelu",
707
- bodyScan: "Skenirajte kamerom svog mobitela ili aplikacijom ZOREAL ID.",
708
- bodyApprove: "Odobrite prijavu u aplikaciji ZOREAL ID.",
709
- bodyEnrolling: "Dovr\u0161ite postavljanje ZOREAL ID-a na svom mobitelu, a zatim odobrite prijavu.",
710
- waiting: "\u010Ceka se skeniranje",
711
- waitingApproval: "\u010Ceka se odobrenje",
712
- expiresIn: "Isti\u010De za {time}",
713
- secured: "ZOREAL Proof-of-Human provjera",
714
- noIdTitle: "Nemate ZOREAL ID?",
715
- noIdBody: "Skenirajte isti kod da preuzmete aplikaciju i besplatno ga izradite. Traje samo minutu.",
716
- cancel: "Odustani",
717
- close: "Zatvori",
718
- qrAlt: "QR kod za prijavu putem ZOREAL-a",
719
- buttonContinue: "Nastavi sa ZOREAL-om"
720
- },
721
- // Magyar
722
- hu: {
723
- title: "Bejelentkez\xE9s beolvas\xE1ssal",
724
- titleIdentify: "Olvassa be a szem\xE9lyazonoss\xE1ga igazol\xE1s\xE1hoz",
725
- titlePresence: "Olvassa be annak igazol\xE1s\xE1hoz, hogy val\xF3di ember",
726
- titleApprove: "J\xF3v\xE1hagy\xE1s a telefonj\xE1n",
727
- bodyScan: "Olvassa be a telefonja kamer\xE1j\xE1val, vagy a ZOREAL ID alkalmaz\xE1ssal.",
728
- bodyApprove: "Hagyja j\xF3v\xE1 a bejelentkez\xE9st a ZOREAL ID alkalmaz\xE1sban.",
729
- bodyEnrolling: "Fejezze be a ZOREAL ID be\xE1ll\xEDt\xE1s\xE1t a telefonj\xE1n, majd hagyja j\xF3v\xE1 a bejelentkez\xE9st.",
730
- waiting: "V\xE1rakoz\xE1s beolvas\xE1sra",
731
- waitingApproval: "V\xE1rakoz\xE1s j\xF3v\xE1hagy\xE1sra",
732
- expiresIn: "Lej\xE1r {time} m\xFAlva",
733
- secured: "Proof-of-Human hiteles\xEDt\xE9s a ZOREAL-t\xF3l",
734
- noIdTitle: "M\xE9g nincs ZOREAL ID-je?",
735
- noIdBody: "Olvassa be ugyanazt a k\xF3dot az alkalmaz\xE1s let\xF6lt\xE9s\xE9hez, \xE9s hozzon l\xE9tre egyet ingyenesen. Mind\xF6ssze egy percet vesz ig\xE9nybe.",
736
- cancel: "M\xE9gse",
737
- close: "Bez\xE1r\xE1s",
738
- qrAlt: "QR-k\xF3d a ZOREAL-lal val\xF3 bejelentkez\xE9shez",
739
- buttonContinue: "Folytat\xE1s a ZOREAL-lal"
740
- },
741
- // Bahasa Indonesia
742
- id: {
743
- title: "Pindai untuk masuk",
744
- titleIdentify: "Pindai untuk memverifikasi identitas Anda",
745
- titlePresence: "Pindai untuk membuktikan bahwa Anda manusia sungguhan",
746
- titleApprove: "Setujui di ponsel Anda",
747
- bodyScan: "Pindai dengan kamera ponsel atau aplikasi ZOREAL ID.",
748
- bodyApprove: "Setujui proses masuk di aplikasi ZOREAL ID Anda.",
749
- bodyEnrolling: "Selesaikan pengaturan ZOREAL ID di ponsel Anda, lalu setujui proses masuk.",
750
- waiting: "Menunggu pemindaian",
751
- waitingApproval: "Menunggu persetujuan",
752
- expiresIn: "Berakhir dalam {time}",
753
- secured: "Verifikasi Proof-of-Human oleh ZOREAL",
754
- noIdTitle: "Belum punya ZOREAL ID?",
755
- noIdBody: "Pindai kode yang sama untuk mengunduh aplikasi dan membuat akun secara gratis. Hanya butuh waktu satu menit.",
756
- cancel: "Batal",
757
- close: "Tutup",
758
- qrAlt: "Kode QR untuk masuk dengan ZOREAL",
759
- buttonContinue: "Lanjutkan dengan ZOREAL"
760
- },
761
- // Italiano
762
- it: {
763
- title: "Scansiona per accedere",
764
- titleIdentify: "Scansiona per verificare la tua identit\xE0",
765
- titlePresence: "Scansiona per dimostrare di essere una persona reale",
766
- titleApprove: "Approva sul tuo telefono",
767
- bodyScan: "Scansiona con la fotocamera del telefono o con l'app ZOREAL ID.",
768
- bodyApprove: "Approva l'accesso nell'app ZOREAL ID.",
769
- bodyEnrolling: "Completa la configurazione di ZOREAL ID sul telefono, poi approva l'accesso.",
770
- waiting: "In attesa della scansione",
771
- waitingApproval: "In attesa di approvazione",
772
- expiresIn: "Scade tra {time}",
773
- secured: "Verifica Proof-of-Human di ZOREAL",
774
- noIdTitle: "Non hai ancora uno ZOREAL ID?",
775
- noIdBody: "Scansiona lo stesso codice per scaricare l'app e crearne uno gratis. Basta un minuto.",
776
- cancel: "Annulla",
777
- close: "Chiudi",
778
- qrAlt: "Codice QR per accedere con ZOREAL",
779
- buttonContinue: "Continua con ZOREAL"
780
- },
781
- // Bahasa Melayu
782
- ms: {
783
- title: "Imbas untuk log masuk",
784
- titleIdentify: "Imbas untuk mengesahkan identiti anda",
785
- titlePresence: "Imbas untuk membuktikan anda manusia sebenar",
786
- titleApprove: "Luluskan di telefon anda",
787
- bodyScan: "Imbas dengan kamera telefon atau aplikasi ZOREAL ID.",
788
- bodyApprove: "Luluskan log masuk dalam aplikasi ZOREAL ID anda.",
789
- bodyEnrolling: "Selesaikan persediaan ZOREAL ID di telefon anda, kemudian luluskan log masuk.",
790
- waiting: "Menunggu imbasan",
791
- waitingApproval: "Menunggu kelulusan",
792
- expiresIn: "Tamat tempoh dalam {time}",
793
- secured: "Pengesahan Proof-of-Human oleh ZOREAL",
794
- noIdTitle: "Belum ada ZOREAL ID?",
795
- noIdBody: "Imbas kod yang sama untuk memuat turun aplikasi dan cipta satu secara percuma. Hanya mengambil masa seminit.",
796
- cancel: "Batal",
797
- close: "Tutup",
798
- qrAlt: "Kod QR untuk log masuk dengan ZOREAL",
799
- buttonContinue: "Teruskan dengan ZOREAL"
800
- },
801
- // Nederlands
802
- nl: {
803
- title: "Scan om in te loggen",
804
- titleIdentify: "Scan om je identiteit te verifi\xEBren",
805
- titlePresence: "Scan om te bewijzen dat je een echt mens bent",
806
- titleApprove: "Keur goed op je telefoon",
807
- bodyScan: "Scan met de camera van je telefoon of de ZOREAL ID-app.",
808
- bodyApprove: "Keur de aanmelding goed in je ZOREAL ID-app.",
809
- bodyEnrolling: "Rond het instellen van ZOREAL ID op je telefoon af en keur daarna de aanmelding goed.",
810
- waiting: "Wachten op scan",
811
- waitingApproval: "Wachten op goedkeuring",
812
- expiresIn: "Verloopt over {time}",
813
- secured: "Proof-of-Human-verificatie door ZOREAL",
814
- noIdTitle: "Nog geen ZOREAL ID?",
815
- noIdBody: "Scan dezelfde code om de app te downloaden en gratis een account aan te maken. Dit duurt maar een minuut.",
816
- cancel: "Annuleren",
817
- close: "Sluiten",
818
- qrAlt: "QR-code om in te loggen met ZOREAL",
819
- buttonContinue: "Doorgaan met ZOREAL"
820
- },
821
- // Norsk
822
- no: {
823
- title: "Skann for \xE5 logge inn",
824
- titleIdentify: "Skann for \xE5 bekrefte identiteten din",
825
- titlePresence: "Skann for \xE5 bevise at du er et ekte menneske",
826
- titleApprove: "Godkjenn p\xE5 telefonen din",
827
- bodyScan: "Skann med telefonens kamera eller ZOREAL ID-appen.",
828
- bodyApprove: "Godkjenn innloggingen i ZOREAL ID-appen din.",
829
- bodyEnrolling: "Fullf\xF8r oppsettet av ZOREAL ID p\xE5 telefonen din, og godkjenn deretter innloggingen.",
830
- waiting: "Venter p\xE5 skanning",
831
- waitingApproval: "Venter p\xE5 godkjenning",
832
- expiresIn: "Utl\xF8per om {time}",
833
- secured: "Proof-of-Human-verifisering av ZOREAL",
834
- noIdTitle: "Har du ikke ZOREAL ID enn\xE5?",
835
- noIdBody: "Skann den samme koden for \xE5 laste ned appen og opprette en gratis. Det tar bare et minutt.",
836
- cancel: "Avbryt",
837
- close: "Lukk",
838
- qrAlt: "QR-kode for \xE5 logge inn med ZOREAL",
839
- buttonContinue: "Fortsett med ZOREAL"
840
- },
841
- // Polski
842
- pl: {
843
- title: "Zeskanuj, aby si\u0119 zalogowa\u0107",
844
- titleIdentify: "Zeskanuj, aby zweryfikowa\u0107 swoj\u0105 to\u017Csamo\u015B\u0107",
845
- titlePresence: "Zeskanuj, aby udowodni\u0107, \u017Ce jeste\u015B prawdziwym cz\u0142owiekiem",
846
- titleApprove: "Zatwierd\u017A w telefonie",
847
- bodyScan: "Zeskanuj aparatem telefonu lub aplikacj\u0105 ZOREAL ID.",
848
- bodyApprove: "Zatwierd\u017A logowanie w aplikacji ZOREAL ID.",
849
- bodyEnrolling: "Doko\u0144cz konfiguracj\u0119 ZOREAL ID w telefonie, a nast\u0119pnie zatwierd\u017A logowanie.",
850
- waiting: "Czekanie na skan",
851
- waitingApproval: "Czekanie na zatwierdzenie",
852
- expiresIn: "Wygasa za {time}",
853
- secured: "Weryfikacja Proof-of-Human od ZOREAL",
854
- noIdTitle: "Nie masz jeszcze ZOREAL ID?",
855
- noIdBody: "Zeskanuj ten sam kod, aby pobra\u0107 aplikacj\u0119 i bezp\u0142atnie utworzy\u0107 ZOREAL ID. Zajmie to tylko minut\u0119.",
856
- cancel: "Anuluj",
857
- close: "Zamknij",
858
- qrAlt: "Kod QR do logowania za pomoc\u0105 ZOREAL",
859
- buttonContinue: "Kontynuuj z ZOREAL"
860
- },
861
- // Português (BR)
862
- "pt-br": {
863
- title: "Escaneie para entrar",
864
- titleIdentify: "Escaneie para verificar sua identidade",
865
- titlePresence: "Escaneie para provar que voc\xEA \xE9 uma pessoa real",
866
- titleApprove: "Aprove no seu celular",
867
- bodyScan: "Escaneie com a c\xE2mera do seu celular ou com o app ZOREAL ID.",
868
- bodyApprove: "Aprove o login no app ZOREAL ID.",
869
- bodyEnrolling: "Termine de configurar o ZOREAL ID no seu celular e depois aprove o login.",
870
- waiting: "Aguardando escaneamento",
871
- waitingApproval: "Aguardando aprova\xE7\xE3o",
872
- expiresIn: "Expira em {time}",
873
- secured: "Verifica\xE7\xE3o Proof-of-Human da ZOREAL",
874
- noIdTitle: "Ainda n\xE3o tem um ZOREAL ID?",
875
- noIdBody: "Escaneie o mesmo c\xF3digo para baixar o app e criar um de gra\xE7a. Leva s\xF3 um minuto.",
876
- cancel: "Cancelar",
877
- close: "Fechar",
878
- qrAlt: "C\xF3digo QR para entrar com ZOREAL",
879
- buttonContinue: "Continuar com ZOREAL"
880
- },
881
- // Română
882
- ro: {
883
- title: "Scana\u021Bi pentru conectare",
884
- titleIdentify: "Scana\u021Bi pentru a v\u0103 verifica identitatea",
885
- titlePresence: "Scana\u021Bi pentru a dovedi c\u0103 sunte\u021Bi o persoan\u0103 real\u0103",
886
- titleApprove: "Aproba\u021Bi de pe telefon",
887
- bodyScan: "Scana\u021Bi cu camera telefonului sau cu aplica\u021Bia ZOREAL ID.",
888
- bodyApprove: "Aproba\u021Bi conectarea \xEEn aplica\u021Bia ZOREAL ID.",
889
- bodyEnrolling: "Finaliza\u021Bi configurarea ZOREAL ID pe telefon, apoi aproba\u021Bi conectarea.",
890
- waiting: "Se a\u0219teapt\u0103 scanarea",
891
- waitingApproval: "Se a\u0219teapt\u0103 aprobarea",
892
- expiresIn: "Expir\u0103 \xEEn {time}",
893
- secured: "Verificare Proof-of-Human de la ZOREAL",
894
- noIdTitle: "Nu ave\u021Bi \xEEnc\u0103 un ZOREAL ID?",
895
- noIdBody: "Scana\u021Bi acela\u0219i cod pentru a desc\u0103rca aplica\u021Bia \u0219i a crea unul gratuit. Dureaz\u0103 doar un minut.",
896
- cancel: "Anuleaz\u0103",
897
- close: "\xCEnchide",
898
- qrAlt: "Cod QR pentru conectare cu ZOREAL",
899
- buttonContinue: "Continua\u021Bi cu ZOREAL"
900
- },
901
- // Српски
902
- sr: {
903
- title: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443",
904
- titleIdentify: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0434\u0430 \u043F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435 \u0441\u0432\u043E\u0458 \u0438\u0434\u0435\u043D\u0442\u0438\u0442\u0435\u0442",
905
- titlePresence: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0434\u0430 \u0434\u043E\u043A\u0430\u0436\u0435\u0442\u0435 \u0434\u0430 \u0441\u0442\u0435 \u043F\u0440\u0430\u0432\u0430 \u043E\u0441\u043E\u0431\u0430",
906
- titleApprove: "\u041E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043D\u0430 \u0441\u0432\u043E\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443",
907
- bodyScan: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u043C \u0441\u0432\u043E\u0433 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u043E\u043C ZOREAL ID.",
908
- bodyApprove: "\u041E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u0443 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0438 ZOREAL ID.",
909
- bodyEnrolling: "\u0414\u043E\u0432\u0440\u0448\u0438\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 ZOREAL ID-\u0430 \u043D\u0430 \u0441\u0432\u043E\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443, \u043F\u0430 \u043E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0443.",
910
- waiting: "\u0427\u0435\u043A\u0430 \u0441\u0435 \u0441\u043A\u0435\u043D\u0438\u0440\u0430\u045A\u0435",
911
- waitingApproval: "\u0427\u0435\u043A\u0430 \u0441\u0435 \u043E\u0434\u043E\u0431\u0440\u0435\u045A\u0435",
912
- expiresIn: "\u0418\u0441\u0442\u0438\u0447\u0435 \u0437\u0430 {time}",
913
- secured: "ZOREAL Proof-of-Human \u0432\u0435\u0440\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0430",
914
- noIdTitle: "\u041D\u0435\u043C\u0430\u0442\u0435 ZOREAL ID?",
915
- noIdBody: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0438\u0441\u0442\u0438 \u043A\u043E\u0434 \u0434\u0430 \u043F\u0440\u0435\u0443\u0437\u043C\u0435\u0442\u0435 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0443 \u0438 \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E \u0433\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0435. \u0422\u0440\u0430\u0458\u0435 \u0441\u0430\u043C\u043E \u043C\u0438\u043D\u0443\u0442.",
916
- cancel: "\u041E\u0442\u043A\u0430\u0436\u0438",
917
- close: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438",
918
- qrAlt: "QR \u043A\u043E\u0434 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u043F\u0440\u0435\u043A\u043E ZOREAL-\u0430",
919
- buttonContinue: "\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u0441\u0430 ZOREAL-\u043E\u043C"
920
- },
921
- // ไทย
922
- th: {
923
- title: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",
924
- titleIdentify: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E15\u0E31\u0E27\u0E15\u0E19\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
925
- titlePresence: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E1E\u0E34\u0E2A\u0E39\u0E08\u0E19\u0E4C\u0E27\u0E48\u0E32\u0E04\u0E38\u0E13\u0E40\u0E1B\u0E47\u0E19\u0E21\u0E19\u0E38\u0E29\u0E22\u0E4C\u0E08\u0E23\u0E34\u0E07",
926
- titleApprove: "\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E1A\u0E19\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
927
- bodyScan: "\u0E2A\u0E41\u0E01\u0E19\u0E14\u0E49\u0E27\u0E22\u0E01\u0E25\u0E49\u0E2D\u0E07\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E2B\u0E23\u0E37\u0E2D\u0E41\u0E2D\u0E1B ZOREAL ID",
928
- bodyApprove: "\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E43\u0E19\u0E41\u0E2D\u0E1B ZOREAL ID \u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
929
- bodyEnrolling: "\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32 ZOREAL ID \u0E1A\u0E19\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E43\u0E2B\u0E49\u0E40\u0E2A\u0E23\u0E47\u0E08\u0E2A\u0E34\u0E49\u0E19 \u0E41\u0E25\u0E49\u0E27\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",
930
- waiting: "\u0E23\u0E2D\u0E01\u0E32\u0E23\u0E2A\u0E41\u0E01\u0E19",
931
- waitingApproval: "\u0E23\u0E2D\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34",
932
- expiresIn: "\u0E2B\u0E21\u0E14\u0E2D\u0E32\u0E22\u0E38\u0E43\u0E19 {time}",
933
- secured: "\u0E01\u0E32\u0E23\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E15\u0E31\u0E27\u0E15\u0E19 Proof-of-Human \u0E42\u0E14\u0E22 ZOREAL",
934
- noIdTitle: "\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35 ZOREAL ID \u0E43\u0E0A\u0E48\u0E44\u0E2B\u0E21",
935
- noIdBody: "\u0E2A\u0E41\u0E01\u0E19\u0E42\u0E04\u0E49\u0E14\u0E40\u0E14\u0E35\u0E22\u0E27\u0E01\u0E31\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E14\u0E32\u0E27\u0E19\u0E4C\u0E42\u0E2B\u0E25\u0E14\u0E41\u0E2D\u0E1B\u0E41\u0E25\u0E30\u0E2A\u0E23\u0E49\u0E32\u0E07\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E1F\u0E23\u0E35 \u0E43\u0E0A\u0E49\u0E40\u0E27\u0E25\u0E32\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E19\u0E32\u0E17\u0E35\u0E40\u0E14\u0E35\u0E22\u0E27",
936
- cancel: "\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",
937
- close: "\u0E1B\u0E34\u0E14",
938
- qrAlt: "\u0E04\u0E34\u0E27\u0E2D\u0E32\u0E23\u0E4C\u0E42\u0E04\u0E49\u0E14\u0E2A\u0E33\u0E2B\u0E23\u0E31\u0E1A\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E14\u0E49\u0E27\u0E22 ZOREAL",
939
- buttonContinue: "\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23\u0E15\u0E48\u0E2D\u0E14\u0E49\u0E27\u0E22 ZOREAL"
940
- },
941
- // Tagalog
942
- tl: {
943
- title: "I-scan para mag-sign in",
944
- titleIdentify: "I-scan para i-verify ang iyong pagkakakilanlan",
945
- titlePresence: "I-scan para patunayang tunay kang tao",
946
- titleApprove: "I-approve sa iyong telepono",
947
- bodyScan: "I-scan gamit ang camera ng iyong telepono o ang ZOREAL ID app.",
948
- bodyApprove: "I-approve ang login sa iyong ZOREAL ID app.",
949
- bodyEnrolling: "Tapusin muna ang pag-set up ng ZOREAL ID sa iyong telepono, pagkatapos ay i-approve ang login.",
950
- waiting: "Naghihintay ng scan",
951
- waitingApproval: "Naghihintay ng approval",
952
- expiresIn: "Mag-e-expire sa {time}",
953
- secured: "Proof-of-Human verification mula sa ZOREAL",
954
- noIdTitle: "Wala ka pang ZOREAL ID?",
955
- noIdBody: "I-scan ang parehong code para i-download ang app at gumawa ng iyong ZOREAL ID nang libre. Isang minuto lang ito.",
956
- cancel: "Kanselahin",
957
- close: "Isara",
958
- qrAlt: "QR code para mag-sign in gamit ang ZOREAL",
959
- buttonContinue: "Magpatuloy gamit ang ZOREAL"
960
- },
961
- // Türkçe
962
- tr: {
963
- title: "Giri\u015F i\xE7in taray\u0131n",
964
- titleIdentify: "Kimli\u011Finizi do\u011Frulamak i\xE7in taray\u0131n",
965
- titlePresence: "Ger\xE7ek bir insan oldu\u011Funuzu kan\u0131tlamak i\xE7in taray\u0131n",
966
- titleApprove: "Telefonunuzdan onaylay\u0131n",
967
- bodyScan: "Telefonunuzun kameras\u0131yla veya ZOREAL ID uygulamas\u0131yla taray\u0131n.",
968
- bodyApprove: "Giri\u015Fi ZOREAL ID uygulaman\u0131zdan onaylay\u0131n.",
969
- bodyEnrolling: "Telefonunuzda ZOREAL ID kurulumunu tamamlay\u0131n, ard\u0131ndan giri\u015Fi onaylay\u0131n.",
970
- waiting: "Tarama bekleniyor",
971
- waitingApproval: "Onay bekleniyor",
972
- expiresIn: "{time} i\xE7inde sona erer",
973
- secured: "ZOREAL taraf\u0131ndan Proof-of-Human do\u011Frulamas\u0131",
974
- noIdTitle: "Hen\xFCz ZOREAL ID'niz yok mu?",
975
- noIdBody: "Uygulamay\u0131 indirmek ve \xFCcretsiz bir tane olu\u015Fturmak i\xE7in ayn\u0131 kodu taray\u0131n. Sadece bir dakikan\u0131z\u0131 al\u0131r.",
976
- cancel: "\u0130ptal",
977
- close: "Kapat",
978
- qrAlt: "ZOREAL ile giri\u015F yapmak i\xE7in QR kodu",
979
- buttonContinue: "ZOREAL ile devam et"
980
- },
981
- // Українська
982
- uk: {
983
- title: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0443",
984
- titleIdentify: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435, \u0449\u043E\u0431 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438 \u043E\u0441\u043E\u0431\u0443",
985
- titlePresence: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435, \u0449\u043E\u0431 \u0434\u043E\u0432\u0435\u0441\u0442\u0438, \u0449\u043E \u0432\u0438 \u0441\u043F\u0440\u0430\u0432\u0436\u043D\u044F \u043B\u044E\u0434\u0438\u043D\u0430",
986
- titleApprove: "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0456",
987
- bodyScan: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u044E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443 \u0430\u0431\u043E \u0434\u043E\u0434\u0430\u0442\u043A\u043E\u043C ZOREAL ID.",
988
- bodyApprove: "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0432\u0445\u0456\u0434 \u0443 \u0434\u043E\u0434\u0430\u0442\u043A\u0443 ZOREAL ID.",
989
- bodyEnrolling: "\u0417\u0430\u0432\u0435\u0440\u0448\u0456\u0442\u044C \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0456, \u0430 \u043F\u043E\u0442\u0456\u043C \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0432\u0445\u0456\u0434.",
990
- waiting: "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",
991
- waitingApproval: "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F",
992
- expiresIn: "\u0421\u043F\u043B\u0438\u0432\u0430\u0454 \u0447\u0435\u0440\u0435\u0437 {time}",
993
- secured: "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 Proof-of-Human \u0432\u0456\u0434 ZOREAL",
994
- noIdTitle: "\u0429\u0435 \u043D\u0435\u043C\u0430\u0454 ZOREAL ID?",
995
- noIdBody: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u0442\u043E\u0439 \u0441\u0430\u043C\u0438\u0439 \u043A\u043E\u0434, \u0449\u043E\u0431 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0434\u043E\u0434\u0430\u0442\u043E\u043A \u0456 \u0431\u0435\u0437\u043A\u043E\u0448\u0442\u043E\u0432\u043D\u043E \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0439\u043E\u0433\u043E. \u0426\u0435 \u0437\u0430\u0439\u043C\u0435 \u043B\u0438\u0448\u0435 \u0445\u0432\u0438\u043B\u0438\u043D\u0443.",
996
- cancel: "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438",
997
- close: "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
998
- qrAlt: "QR-\u043A\u043E\u0434 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0443 \u0447\u0435\u0440\u0435\u0437 ZOREAL",
999
- buttonContinue: "\u041F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u0437 ZOREAL"
1000
- },
1001
- // اردو
1002
- ur: {
1003
- title: "\u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA",
1004
- titleIdentify: "\u0627\u067E\u0646\u06CC \u0634\u0646\u0627\u062E\u062A \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA",
1005
- titlePresence: "\u06CC\u06C1 \u062B\u0627\u0628\u062A \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA \u06A9\u06C1 \u0622\u067E \u0627\u06CC\u06A9 \u062D\u0642\u06CC\u0642\u06CC \u0627\u0646\u0633\u0627\u0646 \u06C1\u06CC\u06BA",
1006
- titleApprove: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u067E\u0631 \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA",
1007
- bodyScan: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u06A9\u06D2 \u06A9\u06CC\u0645\u0631\u06D2 \u06CC\u0627 ZOREAL ID \u0627\u06CC\u067E \u0633\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA\u06D4",
1008
- bodyApprove: "\u0627\u067E\u0646\u06CC ZOREAL ID \u0627\u06CC\u067E \u0645\u06CC\u06BA \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u06CC \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA\u06D4",
1009
- bodyEnrolling: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u067E\u0631 ZOREAL ID \u06A9\u06CC \u0633\u06CC\u0679 \u0627\u067E \u0645\u06A9\u0645\u0644 \u06A9\u0631\u06CC\u06BA\u060C \u067E\u06BE\u0631 \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u06CC \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA\u06D4",
1010
- waiting: "\u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631",
1011
- waitingApproval: "\u0645\u0646\u0638\u0648\u0631\u06CC \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631",
1012
- expiresIn: "{time} \u0645\u06CC\u06BA \u062E\u062A\u0645 \u06C1\u0648\u06AF\u0627",
1013
- secured: "ZOREAL \u06A9\u06CC \u062C\u0627\u0646\u0628 \u0633\u06D2 Proof-of-Human \u062A\u0635\u062F\u06CC\u0642",
1014
- noIdTitle: "\u0627\u0628\u06BE\u06CC \u062A\u06A9 ZOREAL ID \u0646\u06C1\u06CC\u06BA \u06C1\u06D2\u061F",
1015
- noIdBody: "\u0627\u06CC\u067E \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06A9\u0631\u0646\u06D2 \u0627\u0648\u0631 \u0645\u0641\u062A \u0645\u06CC\u06BA \u0627\u06CC\u06A9 \u0628\u0646\u0627\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0648\u06C1\u06CC \u06A9\u0648\u0688 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA\u06D4 \u0627\u0633 \u0645\u06CC\u06BA \u0635\u0631\u0641 \u0627\u06CC\u06A9 \u0645\u0646\u0679 \u0644\u06AF\u062A\u0627 \u06C1\u06D2\u06D4",
1016
- cancel: "\u0645\u0646\u0633\u0648\u062E \u06A9\u0631\u06CC\u06BA",
1017
- close: "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
1018
- qrAlt: "ZOREAL \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 QR \u06A9\u0648\u0688",
1019
- buttonContinue: "ZOREAL \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u062C\u0627\u0631\u06CC \u0631\u06A9\u06BE\u06CC\u06BA"
1020
- },
1021
- // Tiếng Việt
1022
- vi: {
1023
- title: "Qu\xE9t \u0111\u1EC3 \u0111\u0103ng nh\u1EADp",
1024
- titleIdentify: "Qu\xE9t \u0111\u1EC3 x\xE1c minh danh t\xEDnh c\u1EE7a b\u1EA1n",
1025
- titlePresence: "Qu\xE9t \u0111\u1EC3 ch\u1EE9ng minh b\u1EA1n l\xE0 ng\u01B0\u1EDDi th\u1EADt",
1026
- titleApprove: "Ph\xEA duy\u1EC7t tr\xEAn \u0111i\u1EC7n tho\u1EA1i c\u1EE7a b\u1EA1n",
1027
- bodyScan: "Qu\xE9t b\u1EB1ng camera \u0111i\u1EC7n tho\u1EA1i ho\u1EB7c \u1EE9ng d\u1EE5ng ZOREAL ID.",
1028
- bodyApprove: "Ph\xEA duy\u1EC7t \u0111\u0103ng nh\u1EADp trong \u1EE9ng d\u1EE5ng ZOREAL ID c\u1EE7a b\u1EA1n.",
1029
- bodyEnrolling: "Ho\xE0n t\u1EA5t thi\u1EBFt l\u1EADp ZOREAL ID tr\xEAn \u0111i\u1EC7n tho\u1EA1i, sau \u0111\xF3 ph\xEA duy\u1EC7t \u0111\u0103ng nh\u1EADp.",
1030
- waiting: "\u0110ang ch\u1EDD qu\xE9t m\xE3",
1031
- waitingApproval: "\u0110ang ch\u1EDD ph\xEA duy\u1EC7t",
1032
- expiresIn: "H\u1EBFt h\u1EA1n sau {time}",
1033
- secured: "X\xE1c minh Proof-of-Human b\u1EDFi ZOREAL",
1034
- noIdTitle: "Ch\u01B0a c\xF3 ZOREAL ID?",
1035
- noIdBody: "Qu\xE9t c\xF9ng m\xE3 n\xE0y \u0111\u1EC3 t\u1EA3i \u1EE9ng d\u1EE5ng v\xE0 t\u1EA1o t\xE0i kho\u1EA3n mi\u1EC5n ph\xED. Ch\u1EC9 m\u1EA5t m\u1ED9t ph\xFAt.",
1036
- cancel: "H\u1EE7y",
1037
- close: "\u0110\xF3ng",
1038
- qrAlt: "M\xE3 QR \u0111\u1EC3 \u0111\u0103ng nh\u1EADp b\u1EB1ng ZOREAL",
1039
- buttonContinue: "Ti\u1EBFp t\u1EE5c v\u1EDBi ZOREAL"
1040
- }
1041
- };
1042
- var RTL = /* @__PURE__ */ new Set(["ar", "he", "iw", "ur"]);
1043
- var ALIASES = {
1044
- nb: "no",
1045
- // Bokmål — what we actually wrote
1046
- nn: "no",
1047
- // Nynorsk reader, served Bokmål: closer than English
1048
- fil: "tl",
1049
- // Filipino / Tagalog
1050
- iw: "he",
1051
- // superseded code for Hebrew, still emitted by some platforms
1052
- in: "id"
1053
- // superseded code for Indonesian
1054
- };
1055
- var LATAM = /* @__PURE__ */ new Set([
1056
- "ar",
1057
- "bo",
1058
- "cl",
1059
- "co",
1060
- "cr",
1061
- "cu",
1062
- "do",
1063
- "ec",
1064
- "gt",
1065
- "hn",
1066
- "mx",
1067
- "ni",
1068
- "pa",
1069
- "pe",
1070
- "pr",
1071
- "py",
1072
- "sv",
1073
- "uy",
1074
- "ve",
1075
- "419"
1076
- ]);
1077
- function lookup(locale) {
1078
- const tag = locale.toLowerCase().replace(/_/g, "-");
1079
- const parts = tag.split("-");
1080
- const primary = ALIASES[parts[0]] ?? parts[0];
1081
- const region = parts[1];
1082
- if (primary === "zh") {
1083
- const simplified = /(^|-)(hans|cn|sg|my)(-|$)/.test(tag);
1084
- return TRANSLATIONS[simplified ? "zhs" : "zht"];
1085
- }
1086
- if (primary === "es" && region && LATAM.has(region)) return TRANSLATIONS["es-419"];
1087
- if (primary === "pt" && region === "br") return TRANSLATIONS["pt-br"];
1088
- return TRANSLATIONS[tag] ?? TRANSLATIONS[primary];
1089
- }
1090
- function browserLocales() {
1091
- if (typeof navigator === "undefined") return [];
1092
- const nav = navigator;
1093
- if (nav.languages && nav.languages.length) return [...nav.languages];
1094
- return nav.language ? [nav.language] : [];
1095
- }
1096
- function strings(locale) {
1097
- if (locale) return lookup(locale) ?? en;
1098
- for (const candidate of browserLocales()) {
1099
- const hit = lookup(candidate);
1100
- if (hit) return hit;
1101
- }
1102
- return en;
1103
- }
1104
- function isRtl(locale) {
1105
- const tag = locale ?? browserLocales()[0];
1106
- if (!tag) return false;
1107
- return RTL.has(tag.toLowerCase().replace(/_/g, "-").split("-")[0]);
1108
- }
1109
- function interpolate(template, time) {
1110
- return template.replace("{time}", time);
1111
- }
1112
-
1113
- // src/styles.ts
1114
- var PREFIX2 = "zrl";
1115
- var cx = (name) => `${PREFIX2}-${name}`;
1116
- var STYLE_ELEMENT_ID = "zoreal-pairing-styles";
1117
- var LIGHT = `
1118
- --zrl-scrim: rgba(16, 18, 27, 0.45);
1119
- --zrl-surface: #ffffff;
1120
- --zrl-surface-sunken: #f6f7f9;
1121
- --zrl-ink: #16181c;
1122
- --zrl-ink-soft: #4a4f57;
1123
- --zrl-ink-mute: #6b7078;
1124
- --zrl-line: #e4e6ea;
1125
- --zrl-line-soft: #eef0f3;
1126
- --zrl-accent: #00b4d9;
1127
- --zrl-accent-soft: #dcf3fa;
1128
- --zrl-accent-ink: #04698a;
1129
- --zrl-urgent: #b4761a;
1130
- --zrl-qr-bg: #ffffff;
1131
- --zrl-qr-filter: none;
1132
- --zrl-qr-spent-filter: blur(3px);
1133
- --zrl-qr-blend: normal;
1134
- --zrl-shadow: 0 1px 2px rgba(16, 18, 27, 0.06), 0 20px 50px -12px rgba(16, 18, 27, 0.3);
1135
- --zrl-ring: rgba(16, 18, 27, 0.07);
1136
- /* The light on the QR well's edge. Brand blue on both grounds, a lighter
1137
- tint at the head; only its strength is themed, see the dark block. */
1138
- --zrl-beam: #00b4d9;
1139
- --zrl-beam-head: #7fe0f4;
1140
- --zrl-beam-line: 2px;
1141
- --zrl-glow-core: 4px;
1142
- --zrl-glow-reach: 24px;
1143
- --zrl-glow-blur: 8px;
1144
- --zrl-glow-opacity: 0.6;
1145
- `;
1146
- var DARK = `
1147
- --zrl-scrim: rgba(0, 0, 0, 0.62);
1148
- --zrl-surface: #17191d;
1149
- --zrl-surface-sunken: #1f2226;
1150
- --zrl-ink: #f4f5f7;
1151
- --zrl-ink-soft: #b3b8c0;
1152
- --zrl-ink-mute: #8b9199;
1153
- --zrl-line: #2c3036;
1154
- --zrl-line-soft: #24272c;
1155
- --zrl-accent: #34c9e8;
1156
- --zrl-accent-soft: #0d3b47;
1157
- --zrl-accent-ink: #7fdcf0;
1158
- --zrl-urgent: #e0a952;
1159
- /* The code is drawn light on the dark surface: the panel is transparent
1160
- and the image is inverted and screened, so only the modules and the
1161
- mark show. */
1162
- --zrl-qr-bg: transparent;
1163
- --zrl-qr-filter: invert(1);
1164
- --zrl-qr-spent-filter: invert(1) blur(3px);
1165
- --zrl-qr-blend: screen;
1166
- --zrl-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 20px 50px -12px rgba(0, 0, 0, 0.65);
1167
- --zrl-ring: rgba(255, 255, 255, 0.1);
1168
- /* A glow that reads on a white card disappears on a dark one: the light
1169
- here is brighter and wider, and its halo reaches further out. */
1170
- --zrl-beam: #22c8ec;
1171
- --zrl-beam-head: #c2f3fc;
1172
- --zrl-beam-line: 3px;
1173
- --zrl-glow-core: 6px;
1174
- --zrl-glow-reach: 32px;
1175
- --zrl-glow-blur: 10px;
1176
- --zrl-glow-opacity: 0.85;
1177
- `;
1178
- var CSS = `
1179
- .${PREFIX2}-root { ${LIGHT} }
1180
- .${PREFIX2}-root[data-theme="dark"] { ${DARK} }
1181
- @media (prefers-color-scheme: dark) {
1182
- .${PREFIX2}-root[data-theme="auto"] { ${DARK} }
1183
- }
1184
-
1185
- .${PREFIX2}-scrim {
1186
- position: fixed;
1187
- inset: 0;
1188
- z-index: 2147483000;
1189
- display: grid;
1190
- place-items: center;
1191
- overflow-y: auto;
1192
- padding: 16px;
1193
- background: var(--zrl-scrim);
1194
- backdrop-filter: blur(3px);
1195
- -webkit-backdrop-filter: blur(3px);
1196
- font-family: inherit;
1197
- animation: ${PREFIX2}-fade 200ms ease-out both;
1198
- }
1199
-
1200
- .${PREFIX2}-card {
1201
- position: relative;
1202
- box-sizing: border-box;
1203
- width: 100%;
1204
- max-width: 380px;
1205
- border-radius: 16px;
1206
- background: var(--zrl-surface);
1207
- color: var(--zrl-ink);
1208
- box-shadow: var(--zrl-shadow);
1209
- outline: 1px solid var(--zrl-ring);
1210
- outline-offset: -1px;
1211
- text-align: center;
1212
- animation: ${PREFIX2}-rise 300ms cubic-bezier(0.23, 1, 0.32, 1) both;
1213
- }
1214
-
1215
- .${PREFIX2}-body { padding: 28px 24px 20px; }
1216
-
1217
- .${PREFIX2}-lockup { display: block; margin: 0 auto; color: var(--zrl-ink); }
1218
-
1219
- .${PREFIX2}-title {
1220
- margin: 18px 0 0;
1221
- font-size: 18px;
1222
- font-weight: 600;
1223
- letter-spacing: -0.01em;
1224
- line-height: 1.3;
1225
- color: var(--zrl-ink);
1226
- }
1227
-
1228
- .${PREFIX2}-body-text {
1229
- margin: 6px auto 0;
1230
- max-width: 30ch;
1231
- font-size: 14px;
1232
- line-height: 1.55;
1233
- color: var(--zrl-ink-soft);
1234
- }
1235
-
1236
- .${PREFIX2}-qr-well {
1237
- position: relative;
1238
- display: grid;
1239
- place-items: center;
1240
- box-sizing: border-box;
1241
- width: 204px;
1242
- height: 204px;
1243
- margin: 20px auto 0;
1244
- padding: 12px;
1245
- border: 1px solid var(--zrl-line);
1246
- border-radius: var(--zrl-radius);
1247
- background: var(--zrl-qr-bg);
1248
- /* The light on the edge takes its shape from here and its colour and
1249
- strength from the theme tokens above. One lap in 4s on every tier. */
1250
- --zrl-radius: 16px;
1251
- --zrl-beam-time: 4s;
1252
- }
1253
-
1254
- /* The light on the well's edge: a short comet running along the border, with
1255
- a soft glow outside it. Three overlays inside the well, each masked so the
1256
- comet can only ever paint where its mask allows, and the white interior lies
1257
- outside every mask: nothing here can reach the quiet zone a camera needs,
1258
- whatever the comet is doing. The mask is the padding box cut out of the
1259
- border box, a transparent layer clipped to the padding box intersected
1260
- with a solid one clipped to the border box. The prefixed form is for Chrome
1261
- before 120 and Safari before 15.4; the unprefixed one, declared after it,
1262
- wins everywhere else.
1263
-
1264
- qr-beam keeps a thin ring on the border line: the comet itself.
1265
- qr-beam-glow is the glow: a wide band outside the well that blurs whatever
1266
- is inside it, and inside it qr-beam-glow-band keeps a 3px ring with a
1267
- second copy of the comet. The blur has to sit on the parent because a
1268
- filter is applied before a mask: blurred on the band itself, the glow
1269
- would be cut back to the band's own edge. On the parent it runs after the
1270
- band has clipped the comet thin and before the parent's mask cuts away the
1271
- inward half, which is what makes it fade outward and never over the QR.
1272
- All three share one containing block, the well's padding box, so the two
1273
- comets ride the same path; the spent badge is a later sibling and paints
1274
- above them. */
1275
- .${PREFIX2}-qr-beam,
1276
- .${PREFIX2}-qr-beam-glow,
1277
- .${PREFIX2}-qr-beam-glow-band {
1278
- position: absolute;
1279
- inset: calc(0px - var(--zrl-beam-line));
1280
- border: var(--zrl-beam-line) solid transparent;
1281
- border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-beam-line));
1282
- pointer-events: none;
1283
- -webkit-mask: linear-gradient(transparent, transparent), linear-gradient(#fff, #fff);
1284
- -webkit-mask-clip: padding-box, border-box;
1285
- -webkit-mask-composite: source-in;
1286
- mask: linear-gradient(transparent, transparent), linear-gradient(#fff, #fff);
1287
- mask-clip: padding-box, border-box;
1288
- mask-composite: intersect;
1289
- }
1290
- .${PREFIX2}-qr-beam-glow {
1291
- inset: calc(0px - var(--zrl-glow-reach));
1292
- border-width: var(--zrl-glow-reach);
1293
- border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-glow-reach));
1294
- filter: blur(var(--zrl-glow-blur));
1295
- opacity: var(--zrl-glow-opacity);
1296
- will-change: filter;
1297
- }
1298
- .${PREFIX2}-qr-beam-glow-band {
1299
- inset: calc(0px - var(--zrl-glow-core));
1300
- border-width: var(--zrl-glow-core);
1301
- border-radius: calc(var(--zrl-radius) - 1px + var(--zrl-glow-core));
1302
- }
1303
-
1304
- /* At rest the edge holds a dim, even blue: a 1px line on the border and, from
1305
- the glow band, a soft halo outside it. Hidden while the comet runs, so the
1306
- border reads as the well's own line with a light passing over it; shown
1307
- once the light has stopped. Every path below ends here, which is what
1308
- makes them look the same at rest. */
1309
- .${PREFIX2}-qr-beam::before,
1310
- .${PREFIX2}-qr-beam-glow-band::before {
1311
- content: '';
1312
- position: absolute;
1313
- inset: -50%;
1314
- background: var(--zrl-beam);
1315
- opacity: 0;
1316
- transition: opacity 400ms cubic-bezier(0.23, 1, 0.32, 1);
375
+
376
+ /* At rest the edge holds a dim, even blue: a 1px line on the border and, from
377
+ the glow band, a soft halo outside it. Hidden while the comet runs, so the
378
+ border reads as the well's own line with a light passing over it; shown
379
+ once the light has stopped. Every path below ends here, which is what
380
+ makes them look the same at rest. */
381
+ .${PREFIX}-qr-beam::before,
382
+ .${PREFIX}-qr-beam-glow-band::before {
383
+ content: '';
384
+ position: absolute;
385
+ inset: -50%;
386
+ background: var(--zrl-beam);
387
+ opacity: 0;
388
+ transition: opacity 400ms cubic-bezier(0.23, 1, 0.32, 1);
1317
389
  }
1318
390
 
1319
391
  /* The moving light: an oversized square carrying a conic sweep, rotated
1320
392
  whole. A transform animation runs on the compositor, so the light keeps
1321
393
  moving while the page is busy; animating the gradient angle instead
1322
394
  repaints every frame on the main thread and stutters. */
1323
- .${PREFIX2}-qr-beam::after,
1324
- .${PREFIX2}-qr-beam-glow-band::after {
395
+ .${PREFIX}-qr-beam::after,
396
+ .${PREFIX}-qr-beam-glow-band::after {
1325
397
  content: '';
1326
398
  position: absolute;
1327
399
  inset: -50%;
@@ -1332,7 +404,7 @@ var CSS = `
1332
404
  var(--zrl-beam-head) 348deg,
1333
405
  transparent 356deg 360deg
1334
406
  );
1335
- animation: ${PREFIX2}-orbit var(--zrl-beam-time) linear infinite;
407
+ animation: ${PREFIX}-orbit var(--zrl-beam-time) linear infinite;
1336
408
  will-change: transform;
1337
409
  transition: opacity 400ms cubic-bezier(0.23, 1, 0.32, 1);
1338
410
  }
@@ -1340,15 +412,15 @@ var CSS = `
1340
412
  /* Spent: the light stops where it is and fades, and the edge settles to the
1341
413
  dim glow. Paused rather than removed, so it does not jump back to its start
1342
414
  on the way out. */
1343
- .${PREFIX2}-qr-well[data-spent="true"] .${PREFIX2}-qr-beam::after,
1344
- .${PREFIX2}-qr-well[data-spent="true"] .${PREFIX2}-qr-beam-glow-band::after {
415
+ .${PREFIX}-qr-well[data-spent="true"] .${PREFIX}-qr-beam::after,
416
+ .${PREFIX}-qr-well[data-spent="true"] .${PREFIX}-qr-beam-glow-band::after {
1345
417
  animation-play-state: paused;
1346
418
  opacity: 0;
1347
419
  }
1348
- .${PREFIX2}-qr-well[data-spent="true"] .${PREFIX2}-qr-beam::before { opacity: 0.55; }
1349
- .${PREFIX2}-qr-well[data-spent="true"] .${PREFIX2}-qr-beam-glow-band::before { opacity: 0.7; }
420
+ .${PREFIX}-qr-well[data-spent="true"] .${PREFIX}-qr-beam::before { opacity: 0.55; }
421
+ .${PREFIX}-qr-well[data-spent="true"] .${PREFIX}-qr-beam-glow-band::before { opacity: 0.7; }
1350
422
 
1351
- .${PREFIX2}-qr {
423
+ .${PREFIX}-qr {
1352
424
  display: block;
1353
425
  width: 100%;
1354
426
  height: 100%;
@@ -1363,17 +435,17 @@ var CSS = `
1363
435
  /* Once the code is claimed the QR is spent. Blurring it out rather than
1364
436
  swapping it keeps one object on screen through the state change, so the eye
1365
437
  reads a transformation instead of two things trading places. */
1366
- .${PREFIX2}-qr[data-spent="true"] { opacity: 0.2; filter: var(--zrl-qr-spent-filter); transform: scale(0.96); }
438
+ .${PREFIX}-qr[data-spent="true"] { opacity: 0.2; filter: var(--zrl-qr-spent-filter); transform: scale(0.96); }
1367
439
 
1368
- .${PREFIX2}-qr-overlay {
440
+ .${PREFIX}-qr-overlay {
1369
441
  position: absolute;
1370
442
  inset: 0;
1371
443
  display: grid;
1372
444
  place-items: center;
1373
- animation: ${PREFIX2}-fade 200ms ease-out both;
445
+ animation: ${PREFIX}-fade 200ms ease-out both;
1374
446
  }
1375
447
 
1376
- .${PREFIX2}-qr-badge {
448
+ .${PREFIX}-qr-badge {
1377
449
  display: grid;
1378
450
  place-items: center;
1379
451
  width: 56px;
@@ -1383,7 +455,7 @@ var CSS = `
1383
455
  color: var(--zrl-accent-ink);
1384
456
  }
1385
457
 
1386
- .${PREFIX2}-status {
458
+ .${PREFIX}-status {
1387
459
  display: flex;
1388
460
  align-items: center;
1389
461
  justify-content: center;
@@ -1394,8 +466,8 @@ var CSS = `
1394
466
  color: var(--zrl-ink);
1395
467
  }
1396
468
 
1397
- .${PREFIX2}-dot { position: relative; display: grid; place-items: center; width: 8px; height: 8px; }
1398
- .${PREFIX2}-dot i {
469
+ .${PREFIX}-dot { position: relative; display: grid; place-items: center; width: 8px; height: 8px; }
470
+ .${PREFIX}-dot i {
1399
471
  position: absolute;
1400
472
  width: 8px;
1401
473
  height: 8px;
@@ -1403,25 +475,25 @@ var CSS = `
1403
475
  background: var(--zrl-accent);
1404
476
  font-style: normal;
1405
477
  }
1406
- .${PREFIX2}-dot i:first-child { animation: ${PREFIX2}-ping 1.8s cubic-bezier(0.23, 1, 0.32, 1) infinite; }
478
+ .${PREFIX}-dot i:first-child { animation: ${PREFIX}-ping 1.8s cubic-bezier(0.23, 1, 0.32, 1) infinite; }
1407
479
 
1408
- .${PREFIX2}-timer {
480
+ .${PREFIX}-timer {
1409
481
  margin: 4px 0 0;
1410
482
  font-size: 12px;
1411
483
  font-variant-numeric: tabular-nums;
1412
484
  color: var(--zrl-ink-mute);
1413
485
  transition: color 200ms ease-out;
1414
486
  }
1415
- .${PREFIX2}-timer[data-urgent="true"] { color: var(--zrl-urgent); }
487
+ .${PREFIX}-timer[data-urgent="true"] { color: var(--zrl-urgent); }
1416
488
 
1417
- .${PREFIX2}-help {
489
+ .${PREFIX}-help {
1418
490
  padding: 14px 24px;
1419
491
  border-top: 1px solid var(--zrl-line-soft);
1420
492
  background: var(--zrl-surface-sunken);
1421
493
  border-radius: 0;
1422
494
  }
1423
- .${PREFIX2}-help-title { margin: 0; font-size: 12px; font-weight: 600; color: var(--zrl-ink); }
1424
- .${PREFIX2}-help-body {
495
+ .${PREFIX}-help-title { margin: 0; font-size: 12px; font-weight: 600; color: var(--zrl-ink); }
496
+ .${PREFIX}-help-body {
1425
497
  margin: 4px auto 0;
1426
498
  max-width: 34ch;
1427
499
  font-size: 12px;
@@ -1429,9 +501,9 @@ var CSS = `
1429
501
  color: var(--zrl-ink-soft);
1430
502
  }
1431
503
 
1432
- .${PREFIX2}-footer { padding: 12px; border-top: 1px solid var(--zrl-line-soft); }
504
+ .${PREFIX}-footer { padding: 12px; border-top: 1px solid var(--zrl-line-soft); }
1433
505
 
1434
- .${PREFIX2}-cancel {
506
+ .${PREFIX}-cancel {
1435
507
  display: block;
1436
508
  width: 100%;
1437
509
  padding: 10px;
@@ -1445,10 +517,10 @@ var CSS = `
1445
517
  cursor: pointer;
1446
518
  transition: background-color 150ms ease-out, color 150ms ease-out, transform 150ms ease-out;
1447
519
  }
1448
- .${PREFIX2}-cancel:hover { background: var(--zrl-surface-sunken); color: var(--zrl-ink); }
1449
- .${PREFIX2}-cancel:active { transform: scale(0.99); }
520
+ .${PREFIX}-cancel:hover { background: var(--zrl-surface-sunken); color: var(--zrl-ink); }
521
+ .${PREFIX}-cancel:active { transform: scale(0.99); }
1450
522
 
1451
- .${PREFIX2}-secured {
523
+ .${PREFIX}-secured {
1452
524
  display: flex;
1453
525
  align-items: center;
1454
526
  justify-content: center;
@@ -1460,9 +532,9 @@ var CSS = `
1460
532
  border-radius: 6px;
1461
533
  transition: color 150ms ease-out;
1462
534
  }
1463
- .${PREFIX2}-secured:hover { color: var(--zrl-ink); }
535
+ .${PREFIX}-secured:hover { color: var(--zrl-ink); }
1464
536
 
1465
- .${PREFIX2}-close {
537
+ .${PREFIX}-close {
1466
538
  position: absolute;
1467
539
  top: 12px;
1468
540
  inset-inline-end: 12px;
@@ -1478,25 +550,25 @@ var CSS = `
1478
550
  cursor: pointer;
1479
551
  transition: background-color 150ms ease-out, color 150ms ease-out, transform 150ms ease-out;
1480
552
  }
1481
- .${PREFIX2}-close:hover { background: var(--zrl-surface-sunken); color: var(--zrl-ink); }
1482
- .${PREFIX2}-close:active { transform: scale(0.95); }
553
+ .${PREFIX}-close:hover { background: var(--zrl-surface-sunken); color: var(--zrl-ink); }
554
+ .${PREFIX}-close:active { transform: scale(0.95); }
1483
555
 
1484
- .${PREFIX2}-card :focus-visible {
556
+ .${PREFIX}-card :focus-visible {
1485
557
  outline: 2px solid var(--zrl-accent);
1486
558
  outline-offset: 2px;
1487
559
  }
1488
560
 
1489
- @keyframes ${PREFIX2}-fade { from { opacity: 0 } to { opacity: 1 } }
1490
- @keyframes ${PREFIX2}-rise {
561
+ @keyframes ${PREFIX}-fade { from { opacity: 0 } to { opacity: 1 } }
562
+ @keyframes ${PREFIX}-rise {
1491
563
  from { opacity: 0; transform: translateY(10px) scale(0.98) }
1492
564
  to { opacity: 1; transform: none }
1493
565
  }
1494
- @keyframes ${PREFIX2}-ping {
566
+ @keyframes ${PREFIX}-ping {
1495
567
  0% { transform: scale(1); opacity: 0.5 }
1496
568
  70%, 100% { transform: scale(2.6); opacity: 0 }
1497
569
  }
1498
570
 
1499
- @keyframes ${PREFIX2}-orbit { to { transform: rotate(360deg) } }
571
+ @keyframes ${PREFIX}-orbit { to { transform: rotate(360deg) } }
1500
572
  /* THE BUSY RING. The light of the QR well, around any control that is
1501
573
  waiting on the provider: the button on a phone between the tap and the
1502
574
  hand-over to the app. The well's sweep is a cone from the centre, which is
@@ -1513,13 +585,13 @@ var CSS = `
1513
585
  straight fade from the head to nothing three tenths of the way back; the
1514
586
  component sets each layer's length, offset and opacity. Shown only while
1515
587
  busy. */
1516
- .${PREFIX2}-ring {
588
+ .${PREFIX}-ring {
1517
589
  position: relative;
1518
590
  display: inline-flex;
1519
591
  vertical-align: middle;
1520
592
  --zrl-beam-time: 4s;
1521
593
  }
1522
- .${PREFIX2}-ring-svg {
594
+ .${PREFIX}-ring-svg {
1523
595
  position: absolute;
1524
596
  inset: -4px;
1525
597
  width: calc(100% + 8px);
@@ -1529,8 +601,18 @@ var CSS = `
1529
601
  opacity: 0;
1530
602
  transition: opacity 200ms ease-out;
1531
603
  }
1532
- .${PREFIX2}-ring[data-busy="true"] > .${PREFIX2}-ring-svg { opacity: 1; }
1533
- .${PREFIX2}-ring-svg rect {
604
+ .${PREFIX}-ring[data-busy="true"] > .${PREFIX}-ring-svg { opacity: 1; }
605
+ /* The same light as an overlay in the document body, placed over a site's
606
+ own control by the package itself (busy.ts): nothing of the site's
607
+ markup or CSS is touched, and neither an ancestor's overflow nor a
608
+ selector on the control's parent is affected. */
609
+ .${PREFIX}-ring-overlay {
610
+ position: fixed;
611
+ display: block;
612
+ z-index: 2147483000;
613
+ pointer-events: none;
614
+ }
615
+ .${PREFIX}-ring-svg rect {
1534
616
  --zrl-l: var(--zrl-ring-len, 600px);
1535
617
  x: 2px;
1536
618
  y: 2px;
@@ -1541,46 +623,1084 @@ var CSS = `
1541
623
  stroke-width: var(--zrl-beam-line);
1542
624
  stroke-linecap: round;
1543
625
  stroke-dashoffset: var(--zrl-s, 0px);
1544
- animation: ${PREFIX2}-dash var(--zrl-beam-time) linear infinite;
626
+ animation: ${PREFIX}-dash var(--zrl-beam-time) linear infinite;
1545
627
  }
1546
- .${PREFIX2}-ring-head { stroke: var(--zrl-beam-head); }
1547
- .${PREFIX2}-ring-halo {
628
+ .${PREFIX}-ring-head { stroke: var(--zrl-beam-head); }
629
+ .${PREFIX}-ring-halo {
1548
630
  stroke-width: calc(var(--zrl-glow-core) * 2 + var(--zrl-beam-line));
1549
631
  filter: blur(var(--zrl-glow-blur));
1550
632
  }
1551
- @keyframes ${PREFIX2}-dash {
1552
- from { stroke-dashoffset: var(--zrl-s, 0px); }
1553
- to { stroke-dashoffset: calc(var(--zrl-s, 0px) - var(--zrl-l)); }
633
+ @keyframes ${PREFIX}-dash {
634
+ from { stroke-dashoffset: var(--zrl-s, 0px); }
635
+ to { stroke-dashoffset: calc(var(--zrl-s, 0px) - var(--zrl-l)); }
636
+ }
637
+ @media (prefers-reduced-motion: reduce) {
638
+ .${PREFIX}-ring-svg rect { animation: none; stroke-dasharray: none; opacity: 0.45; }
639
+ .${PREFIX}-ring-halo, .${PREFIX}-ring-head { display: none; }
640
+ }
641
+
642
+
643
+ @media (prefers-reduced-motion: reduce) {
644
+ .${PREFIX}-scrim,
645
+ .${PREFIX}-card,
646
+ .${PREFIX}-qr-overlay { animation: none }
647
+ .${PREFIX}-dot i:first-child { animation: none; opacity: 0.35 }
648
+ .${PREFIX}-qr,
649
+ .${PREFIX}-cancel,
650
+ .${PREFIX}-close,
651
+ .${PREFIX}-timer { transition: none }
652
+ /* No travelling light; the edge keeps its dim static glow instead. */
653
+ .${PREFIX}-qr-beam::after,
654
+ .${PREFIX}-qr-beam-glow-band::after { animation: none; opacity: 0 }
655
+ .${PREFIX}-qr-beam::before { opacity: 0.55 }
656
+ .${PREFIX}-qr-beam-glow-band::before { opacity: 0.7 }
657
+ }
658
+ `;
659
+ function ensureStyles() {
660
+ if (typeof document === "undefined") return;
661
+ if (document.getElementById(STYLE_ELEMENT_ID)) return;
662
+ const el2 = document.createElement("style");
663
+ el2.id = STYLE_ELEMENT_ID;
664
+ el2.textContent = CSS;
665
+ document.head.appendChild(el2);
666
+ }
667
+
668
+ // src/busy.ts
669
+ var SVG_NS = "http://www.w3.org/2000/svg";
670
+ var TAIL = 0.3;
671
+ var STACK = Array.from({ length: 12 }, (_, i) => 12 - i);
672
+ var HALO = [3, 2, 1];
673
+ function radiusOf(control) {
674
+ const value = parseFloat(getComputedStyle(control).borderTopLeftRadius);
675
+ return Number.isFinite(value) ? value : 8;
676
+ }
677
+ function holdBusy(control) {
678
+ if (typeof document === "undefined") return () => {
679
+ };
680
+ ensureStyles();
681
+ const hadDisabled = control.hasAttribute("disabled");
682
+ const hadBusy = control.getAttribute("aria-busy");
683
+ if (control instanceof HTMLButtonElement || control instanceof HTMLInputElement) {
684
+ control.disabled = true;
685
+ } else {
686
+ control.setAttribute("aria-disabled", "true");
687
+ }
688
+ control.setAttribute("aria-busy", "true");
689
+ const overlay = document.createElement("div");
690
+ overlay.className = `${cx("root")} ${cx("ring")} ${cx("ring-overlay")}`;
691
+ overlay.dataset.theme = "auto";
692
+ overlay.dataset.busy = "true";
693
+ overlay.setAttribute("aria-hidden", "true");
694
+ const svg2 = document.createElementNS(SVG_NS, "svg");
695
+ svg2.setAttribute("class", cx("ring-svg"));
696
+ const rx = radiusOf(control) + 2;
697
+ const layer = (name, len, alpha) => {
698
+ const rect = document.createElementNS(SVG_NS, "rect");
699
+ rect.setAttribute("class", cx(name));
700
+ rect.setAttribute("rx", String(rx));
701
+ rect.setAttribute("ry", String(rx));
702
+ rect.style.strokeDasharray = `calc(var(--zrl-l) * ${len}) calc(var(--zrl-l) * ${1 - len})`;
703
+ rect.style.setProperty("--zrl-s", `calc(var(--zrl-l) * ${-(TAIL - len)})`);
704
+ rect.style.opacity = alpha;
705
+ svg2.appendChild(rect);
706
+ return rect;
707
+ };
708
+ let measured = null;
709
+ for (const n of HALO) {
710
+ const rect = layer("ring-halo", TAIL * n / HALO.length, `calc(var(--zrl-glow-opacity) * 0.6 / ${n})`);
711
+ measured ?? (measured = rect);
712
+ }
713
+ for (const n of STACK) layer(n <= 2 ? "ring-head" : "ring-tail", TAIL * n / STACK.length, String(1 / n));
714
+ overlay.appendChild(svg2);
715
+ document.body.appendChild(overlay);
716
+ let frame = 0;
717
+ const place = () => {
718
+ frame = 0;
719
+ const box = control.getBoundingClientRect();
720
+ overlay.style.left = `${box.left}px`;
721
+ overlay.style.top = `${box.top}px`;
722
+ overlay.style.width = `${box.width}px`;
723
+ overlay.style.height = `${box.height}px`;
724
+ const length = typeof measured?.getTotalLength === "function" ? measured.getTotalLength() : 0;
725
+ if (length > 0) overlay.style.setProperty("--zrl-ring-len", `${length}px`);
726
+ };
727
+ const schedule = () => {
728
+ if (!frame) frame = requestAnimationFrame(place);
729
+ };
730
+ place();
731
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(schedule);
732
+ observer?.observe(control);
733
+ window.addEventListener("scroll", schedule, true);
734
+ window.addEventListener("resize", schedule);
735
+ let released = false;
736
+ return () => {
737
+ if (released) return;
738
+ released = true;
739
+ if (frame) cancelAnimationFrame(frame);
740
+ observer?.disconnect();
741
+ window.removeEventListener("scroll", schedule, true);
742
+ window.removeEventListener("resize", schedule);
743
+ overlay.remove();
744
+ if (control instanceof HTMLButtonElement || control instanceof HTMLInputElement) {
745
+ control.disabled = hadDisabled;
746
+ } else {
747
+ control.removeAttribute("aria-disabled");
748
+ }
749
+ if (hadBusy === null) control.removeAttribute("aria-busy");
750
+ else control.setAttribute("aria-busy", hadBusy);
751
+ };
752
+ }
753
+
754
+ // src/intent.ts
755
+ var SIGN_IN_SCOPES = /* @__PURE__ */ new Set(["openid", "email", "profile.name"]);
756
+ function resolveIntent(intent, scope, acrValues) {
757
+ if (intent) return intent;
758
+ const scopes = (scope ?? "openid").split(/\s+/).filter(Boolean);
759
+ if (scopes.some((s) => !SIGN_IN_SCOPES.has(s))) return "identify";
760
+ const acr = typeof acrValues === "string" ? acrValues.split(/\s+/) : acrValues ?? [];
761
+ if (scopes.every((s) => s === "openid") && acr.includes("zoreal.live")) return "presence";
762
+ return "sign-in";
763
+ }
764
+ function titleFor(t, intent) {
765
+ if (intent === "identify") return t.titleIdentify;
766
+ if (intent === "presence") return t.titlePresence;
767
+ return t.title;
768
+ }
769
+
770
+ // src/return.ts
771
+ var PREFIX2 = "zoreal:oauth2:return:";
772
+ var DONE = "zoreal:oauth2:done:";
773
+ var MAX_AGE_MS = 10 * 60 * 1e3;
774
+ function storage() {
775
+ try {
776
+ return typeof localStorage === "undefined" ? null : localStorage;
777
+ } catch {
778
+ return null;
779
+ }
780
+ }
781
+ function saveReturnFlow(flow) {
782
+ try {
783
+ storage()?.setItem(PREFIX2 + flow.requestId, JSON.stringify(flow));
784
+ } catch {
785
+ }
786
+ }
787
+ function peekReturnFlow(requestId) {
788
+ const store = storage();
789
+ if (!store) return null;
790
+ const raw = store.getItem(PREFIX2 + requestId);
791
+ if (!raw) return null;
792
+ try {
793
+ const flow = JSON.parse(raw);
794
+ if (flow.v !== 1 || flow.requestId !== requestId) return null;
795
+ if (Date.now() - flow.createdAt > MAX_AGE_MS) return null;
796
+ return flow;
797
+ } catch {
798
+ return null;
799
+ }
800
+ }
801
+ function forgetReturnFlow(requestId) {
802
+ try {
803
+ storage()?.removeItem(PREFIX2 + requestId);
804
+ } catch {
805
+ }
806
+ if (pending === requestId) pending = null;
807
+ }
808
+ function markReturnDone(requestId) {
809
+ try {
810
+ const store = storage();
811
+ store?.setItem(DONE + requestId, String(Date.now()));
812
+ store?.removeItem(PREFIX2 + requestId);
813
+ } catch {
814
+ }
815
+ }
816
+ function isReturnDone(requestId) {
817
+ return storage()?.getItem(DONE + requestId) !== null && storage()?.getItem(DONE + requestId) !== void 0;
818
+ }
819
+ function visibleOrDone(requestId, signal) {
820
+ if (typeof document === "undefined" || document.visibilityState !== "hidden") {
821
+ return Promise.resolve(!isReturnDone(requestId));
822
+ }
823
+ return new Promise((resolve) => {
824
+ const finish = (value) => {
825
+ document.removeEventListener("visibilitychange", onVisible);
826
+ window.removeEventListener("storage", onStorage);
827
+ signal?.removeEventListener("abort", onAbort);
828
+ resolve(value);
829
+ };
830
+ const onVisible = () => {
831
+ if (document.visibilityState !== "hidden") finish(!isReturnDone(requestId));
832
+ };
833
+ const onStorage = () => {
834
+ if (isReturnDone(requestId)) finish(false);
835
+ };
836
+ const onAbort = () => finish(false);
837
+ document.addEventListener("visibilitychange", onVisible);
838
+ window.addEventListener("storage", onStorage);
839
+ signal?.addEventListener("abort", onAbort, { once: true });
840
+ if (isReturnDone(requestId)) finish(false);
841
+ });
842
+ }
843
+ function returnToUrl() {
844
+ if (typeof window === "undefined") return void 0;
845
+ const { href } = window.location;
846
+ const hash = href.indexOf("#");
847
+ return hash === -1 ? href : href.slice(0, hash);
848
+ }
849
+ var RETURN_MARK = /(?:^|[#&])zoreal_return=([A-Za-z0-9]{32})(?:&|$)/;
850
+ var pending = null;
851
+ function pendingReturnId() {
852
+ if (pending) return pending;
853
+ if (typeof window === "undefined") return null;
854
+ const match = RETURN_MARK.exec(window.location.hash);
855
+ if (!match) return null;
856
+ pending = match[1];
857
+ try {
858
+ window.history.replaceState(window.history.state, "", returnToUrl());
859
+ } catch {
860
+ }
861
+ return pending;
862
+ }
863
+
864
+ // src/i18n.ts
865
+ var en = {
866
+ title: "Scan to sign in",
867
+ titleIdentify: "Scan to verify your identity",
868
+ titlePresence: "Scan to prove you are a real human",
869
+ titleApprove: "Approve on your phone",
870
+ bodyScan: "Scan with your phone camera or the ZOREAL ID app.",
871
+ bodyApprove: "Approve the login in your ZOREAL ID app.",
872
+ bodyEnrolling: "Finish setting up ZOREAL ID on your phone, then approve the login.",
873
+ waiting: "Waiting for scan",
874
+ waitingApproval: "Waiting for approval",
875
+ expiresIn: "Expires in {time}",
876
+ secured: "Proof-of-Human verification by ZOREAL",
877
+ noIdTitle: "No ZOREAL ID yet?",
878
+ noIdBody: "Scan the same code to download the app and create one for free. It only takes a minute.",
879
+ cancel: "Cancel",
880
+ close: "Close",
881
+ qrAlt: "QR code to sign in with ZOREAL",
882
+ buttonContinue: "Continue with ZOREAL"
883
+ };
884
+ var TRANSLATIONS = {
885
+ en,
886
+ sv: {
887
+ title: "Skanna f\xF6r att logga in",
888
+ titleIdentify: "Skanna f\xF6r att verifiera din identitet",
889
+ titlePresence: "Skanna f\xF6r att bevisa att du \xE4r en riktig m\xE4nniska",
890
+ titleApprove: "Godk\xE4nn p\xE5 telefonen",
891
+ bodyScan: "Skanna med telefonens kamera eller ZOREAL ID-appen.",
892
+ bodyApprove: "Godk\xE4nn inloggningen i ZOREAL ID-appen.",
893
+ bodyEnrolling: "Slutf\xF6r konfigurationen av ZOREAL ID p\xE5 telefonen och godk\xE4nn sedan inloggningen.",
894
+ waiting: "V\xE4ntar p\xE5 skanning",
895
+ waitingApproval: "V\xE4ntar p\xE5 godk\xE4nnande",
896
+ expiresIn: "Upph\xF6r om {time}",
897
+ secured: "Proof-of-Human-verifiering av ZOREAL",
898
+ noIdTitle: "Har du inget ZOREAL ID?",
899
+ noIdBody: "Skanna samma kod f\xF6r att ladda ner appen och skapa ett gratis. Det tar bara en minut.",
900
+ cancel: "Avbryt",
901
+ close: "St\xE4ng",
902
+ qrAlt: "QR-kod f\xF6r att logga in med ZOREAL",
903
+ buttonContinue: "Forts\xE4tt med ZOREAL"
904
+ },
905
+ es: {
906
+ title: "Escanea para iniciar sesi\xF3n",
907
+ titleIdentify: "Escanea para verificar tu identidad",
908
+ titlePresence: "Escanea para demostrar que eres una persona real",
909
+ titleApprove: "Apru\xE9balo en tu tel\xE9fono",
910
+ bodyScan: "Escanea con la c\xE1mara de tu tel\xE9fono o con la app ZOREAL ID.",
911
+ bodyApprove: "Aprueba el inicio de sesi\xF3n en tu app ZOREAL ID.",
912
+ bodyEnrolling: "Termina de configurar ZOREAL ID en tu tel\xE9fono y luego aprueba el inicio de sesi\xF3n.",
913
+ waiting: "Esperando el escaneo",
914
+ waitingApproval: "Esperando aprobaci\xF3n",
915
+ expiresIn: "Caduca en {time}",
916
+ secured: "Verificaci\xF3n Proof-of-Human de ZOREAL",
917
+ noIdTitle: "\xBFA\xFAn no tienes ZOREAL ID?",
918
+ noIdBody: "Escanea el mismo c\xF3digo para descargar la app y crear una gratis. Solo toma un minuto.",
919
+ cancel: "Cancelar",
920
+ close: "Cerrar",
921
+ qrAlt: "C\xF3digo QR para iniciar sesi\xF3n con ZOREAL",
922
+ buttonContinue: "Continuar con ZOREAL"
923
+ },
924
+ pt: {
925
+ title: "Digitalize para entrar",
926
+ titleIdentify: "Digitalize para verificar a sua identidade",
927
+ titlePresence: "Digitalize para provar que \xE9 uma pessoa real",
928
+ titleApprove: "Aprove no seu telefone",
929
+ bodyScan: "Digitalize com a c\xE2mara do seu telefone ou com a app ZOREAL ID.",
930
+ bodyApprove: "Aprove o login no app ZOREAL ID.",
931
+ bodyEnrolling: "Termine de configurar o ZOREAL ID no seu telefone e depois aprove o login.",
932
+ waiting: "Aguardando digitaliza\xE7\xE3o",
933
+ waitingApproval: "Aguardando aprova\xE7\xE3o",
934
+ expiresIn: "Expira em {time}",
935
+ secured: "Verifica\xE7\xE3o Proof-of-Human da ZOREAL",
936
+ noIdTitle: "Ainda n\xE3o tem ZOREAL ID?",
937
+ noIdBody: "Digitalize o mesmo c\xF3digo para baixar o app e criar uma conta gr\xE1tis. Leva s\xF3 um minuto.",
938
+ cancel: "Cancelar",
939
+ close: "Fechar",
940
+ qrAlt: "C\xF3digo QR para entrar com ZOREAL",
941
+ buttonContinue: "Continuar com ZOREAL"
942
+ },
943
+ fr: {
944
+ title: "Scannez pour vous connecter",
945
+ titleIdentify: "Scannez pour v\xE9rifier votre identit\xE9",
946
+ titlePresence: "Scannez pour prouver que vous \xEAtes bien un humain",
947
+ titleApprove: "Approuvez sur votre t\xE9l\xE9phone",
948
+ bodyScan: "Scannez avec l'appareil photo de votre t\xE9l\xE9phone ou l'app ZOREAL ID.",
949
+ bodyApprove: "Approuvez la connexion dans votre app ZOREAL ID.",
950
+ bodyEnrolling: "Terminez la configuration de ZOREAL ID sur votre t\xE9l\xE9phone, puis approuvez la connexion.",
951
+ waiting: "En attente du scan",
952
+ waitingApproval: "En attente d'approbation",
953
+ expiresIn: "Expire dans {time}",
954
+ secured: "V\xE9rification Proof-of-Human par ZOREAL",
955
+ noIdTitle: "Pas encore de ZOREAL ID ?",
956
+ noIdBody: "Scannez le m\xEAme code pour t\xE9l\xE9charger l'app et en cr\xE9er un gratuitement. Cela prend une minute.",
957
+ cancel: "Annuler",
958
+ close: "Fermer",
959
+ qrAlt: "Code QR pour se connecter avec ZOREAL",
960
+ buttonContinue: "Continuer avec ZOREAL"
961
+ },
962
+ de: {
963
+ title: "Zum Anmelden scannen",
964
+ titleIdentify: "Scannen, um Ihre Identit\xE4t zu verifizieren",
965
+ titlePresence: "Scannen, um zu beweisen, dass Sie ein echter Mensch sind",
966
+ titleApprove: "Auf dem Handy best\xE4tigen",
967
+ bodyScan: "Mit der Handykamera oder der ZOREAL ID App scannen.",
968
+ bodyApprove: "Anmeldung in der ZOREAL ID App best\xE4tigen.",
969
+ bodyEnrolling: "ZOREAL ID auf dem Handy fertig einrichten und dann die Anmeldung best\xE4tigen.",
970
+ waiting: "Warten auf Scan",
971
+ waitingApproval: "Warten auf Best\xE4tigung",
972
+ expiresIn: "L\xE4uft ab in {time}",
973
+ secured: "Proof-of-Human-Verifizierung von ZOREAL",
974
+ noIdTitle: "Noch keine ZOREAL ID?",
975
+ noIdBody: "Denselben Code scannen, um die App zu laden und kostenlos eine zu erstellen. Dauert nur eine Minute.",
976
+ cancel: "Abbrechen",
977
+ close: "Schlie\xDFen",
978
+ qrAlt: "QR-Code f\xFCr die Anmeldung mit ZOREAL",
979
+ buttonContinue: "Weiter mit ZOREAL"
980
+ },
981
+ ru: {
982
+ title: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0432\u043E\u0439\u0442\u0438",
983
+ titleIdentify: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u043B\u0438\u0447\u043D\u043E\u0441\u0442\u044C",
984
+ titlePresence: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0434\u043E\u043A\u0430\u0437\u0430\u0442\u044C, \u0447\u0442\u043E \u0432\u044B \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0439 \u0447\u0435\u043B\u043E\u0432\u0435\u043A",
985
+ titleApprove: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0435",
986
+ bodyScan: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u0439 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0447\u0435\u0440\u0435\u0437 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 ZOREAL ID.",
987
+ bodyApprove: "\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0432\u0445\u043E\u0434 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 ZOREAL ID.",
988
+ bodyEnrolling: "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0435, \u0437\u0430\u0442\u0435\u043C \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0432\u0445\u043E\u0434.",
989
+ waiting: "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u0441\u043A\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
990
+ waitingApproval: "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F",
991
+ expiresIn: "\u0418\u0441\u0442\u0435\u043A\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 {time}",
992
+ secured: "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 Proof-of-Human \u043E\u0442 ZOREAL",
993
+ noIdTitle: "\u0415\u0449\u0451 \u043D\u0435\u0442 ZOREAL ID?",
994
+ noIdBody: "\u041E\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 \u0442\u043E\u0442 \u0436\u0435 \u043A\u043E\u0434, \u0447\u0442\u043E\u0431\u044B \u0441\u043A\u0430\u0447\u0430\u0442\u044C \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0438 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0435\u0433\u043E \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E. \u042D\u0442\u043E \u0437\u0430\u0439\u043C\u0451\u0442 \u043C\u0438\u043D\u0443\u0442\u0443.",
995
+ cancel: "\u041E\u0442\u043C\u0435\u043D\u0430",
996
+ close: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
997
+ qrAlt: "QR-\u043A\u043E\u0434 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 ZOREAL",
998
+ buttonContinue: "\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0441 ZOREAL"
999
+ },
1000
+ ja: {
1001
+ title: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30ED\u30B0\u30A4\u30F3",
1002
+ titleIdentify: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u672C\u4EBA\u78BA\u8A8D",
1003
+ titlePresence: "\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u5B9F\u5728\u306E\u4EBA\u7269\u3067\u3042\u308B\u3053\u3068\u3092\u8A3C\u660E",
1004
+ titleApprove: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3067\u627F\u8A8D",
1005
+ bodyScan: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u306E\u30AB\u30E1\u30E9\u307E\u305F\u306FZOREAL ID\u30A2\u30D7\u30EA\u3067\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
1006
+ bodyApprove: "ZOREAL ID\u30A2\u30D7\u30EA\u3067\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
1007
+ bodyEnrolling: "\u30B9\u30DE\u30FC\u30C8\u30D5\u30A9\u30F3\u3067ZOREAL ID\u306E\u8A2D\u5B9A\u3092\u5B8C\u4E86\u3057\u3001\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
1008
+ waiting: "\u30B9\u30AD\u30E3\u30F3\u5F85\u3061",
1009
+ waitingApproval: "\u627F\u8A8D\u5F85\u3061",
1010
+ expiresIn: "\u6709\u52B9\u671F\u9650\u307E\u3067 {time}",
1011
+ secured: "ZOREAL\u306B\u3088\u308BProof-of-Human\u8A8D\u8A3C",
1012
+ noIdTitle: "ZOREAL ID\u3092\u304A\u6301\u3061\u3067\u306A\u3044\u3067\u3059\u304B\uFF1F",
1013
+ noIdBody: "\u540C\u3058\u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30A2\u30D7\u30EA\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3001\u7121\u6599\u3067\u4F5C\u6210\u3067\u304D\u307E\u3059\u30021\u5206\u307B\u3069\u3067\u5B8C\u4E86\u3057\u307E\u3059\u3002",
1014
+ cancel: "\u30AD\u30E3\u30F3\u30BB\u30EB",
1015
+ close: "\u9589\u3058\u308B",
1016
+ qrAlt: "ZOREAL\u3067\u30ED\u30B0\u30A4\u30F3\u3059\u308B\u305F\u3081\u306EQR\u30B3\u30FC\u30C9",
1017
+ buttonContinue: "ZOREAL\u3067\u7D9A\u884C"
1018
+ },
1019
+ hi: {
1020
+ title: "\u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
1021
+ titleIdentify: "\u0905\u092A\u0928\u0940 \u092A\u0939\u091A\u093E\u0928 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902",
1022
+ titlePresence: "\u092F\u0939 \u0938\u093E\u092C\u093F\u0924 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902 \u0915\u093F \u0906\u092A \u090F\u0915 \u0935\u093E\u0938\u094D\u0924\u0935\u093F\u0915 \u0907\u0902\u0938\u093E\u0928 \u0939\u0948\u0902",
1023
+ titleApprove: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u092A\u0930 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902",
1024
+ bodyScan: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u0915\u0947 \u0915\u0948\u092E\u0930\u0947 \u092F\u093E ZOREAL ID \u0910\u092A \u0938\u0947 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902\u0964",
1025
+ bodyApprove: "\u0905\u092A\u0928\u0947 ZOREAL ID \u0910\u092A \u092E\u0947\u0902 \u0932\u0949\u0917\u093F\u0928 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902\u0964",
1026
+ bodyEnrolling: "\u0905\u092A\u0928\u0947 \u092B\u094B\u0928 \u092A\u0930 ZOREAL ID \u0938\u0947\u091F\u0905\u092A \u092A\u0942\u0930\u093E \u0915\u0930\u0947\u0902, \u092B\u093F\u0930 \u0932\u0949\u0917\u093F\u0928 \u0938\u094D\u0935\u0940\u0915\u0943\u0924 \u0915\u0930\u0947\u0902\u0964",
1027
+ waiting: "\u0938\u094D\u0915\u0948\u0928 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948",
1028
+ waitingApproval: "\u0938\u094D\u0935\u0940\u0915\u0943\u0924\u093F \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0939\u0948",
1029
+ expiresIn: "{time} \u092E\u0947\u0902 \u0938\u092E\u093E\u092A\u094D\u0924",
1030
+ secured: "ZOREAL \u0926\u094D\u0935\u093E\u0930\u093E Proof-of-Human \u0938\u0924\u094D\u092F\u093E\u092A\u0928",
1031
+ noIdTitle: "\u0905\u092D\u0940 \u0924\u0915 ZOREAL ID \u0928\u0939\u0940\u0902 \u0939\u0948?",
1032
+ noIdBody: "\u0910\u092A \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0930\u0928\u0947 \u0914\u0930 \u092E\u0941\u092B\u094D\u0924 \u092E\u0947\u0902 \u090F\u0915 \u092C\u0928\u093E\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0935\u0939\u0940 \u0915\u094B\u0921 \u0938\u094D\u0915\u0948\u0928 \u0915\u0930\u0947\u0902\u0964 \u0907\u0938\u092E\u0947\u0902 \u092C\u0938 \u090F\u0915 \u092E\u093F\u0928\u091F \u0932\u0917\u0924\u093E \u0939\u0948\u0964",
1033
+ cancel: "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
1034
+ close: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
1035
+ qrAlt: "ZOREAL \u0938\u0947 \u0938\u093E\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F QR \u0915\u094B\u0921",
1036
+ buttonContinue: "ZOREAL \u0915\u0947 \u0938\u093E\u0925 \u091C\u093E\u0930\u0940 \u0930\u0916\u0947\u0902"
1037
+ },
1038
+ zhs: {
1039
+ title: "\u626B\u7801\u767B\u5F55",
1040
+ titleIdentify: "\u626B\u7801\u9A8C\u8BC1\u8EAB\u4EFD",
1041
+ titlePresence: "\u626B\u7801\u8BC1\u660E\u60A8\u662F\u771F\u4EBA",
1042
+ titleApprove: "\u5728\u624B\u673A\u4E0A\u6279\u51C6",
1043
+ bodyScan: "\u4F7F\u7528\u624B\u673A\u76F8\u673A\u6216 ZOREAL ID \u5E94\u7528\u626B\u63CF\u3002",
1044
+ bodyApprove: "\u8BF7\u5728 ZOREAL ID \u5E94\u7528\u4E2D\u6279\u51C6\u767B\u5F55\u3002",
1045
+ bodyEnrolling: "\u8BF7\u5728\u624B\u673A\u4E0A\u5B8C\u6210 ZOREAL ID \u8BBE\u7F6E\uFF0C\u7136\u540E\u6279\u51C6\u767B\u5F55\u3002",
1046
+ waiting: "\u7B49\u5F85\u626B\u63CF",
1047
+ waitingApproval: "\u7B49\u5F85\u6279\u51C6",
1048
+ expiresIn: "{time} \u540E\u5931\u6548",
1049
+ secured: "\u7531 ZOREAL \u63D0\u4F9B\u7684 Proof-of-Human \u9A8C\u8BC1",
1050
+ noIdTitle: "\u8FD8\u6CA1\u6709 ZOREAL ID\uFF1F",
1051
+ noIdBody: "\u626B\u63CF\u540C\u4E00\u4E2A\u4E8C\u7EF4\u7801\u5373\u53EF\u4E0B\u8F7D\u5E94\u7528\u5E76\u514D\u8D39\u521B\u5EFA\uFF0C\u53EA\u9700\u4E00\u5206\u949F\u3002",
1052
+ cancel: "\u53D6\u6D88",
1053
+ close: "\u5173\u95ED",
1054
+ qrAlt: "\u4F7F\u7528 ZOREAL \u767B\u5F55\u7684\u4E8C\u7EF4\u7801",
1055
+ buttonContinue: "\u4F7F\u7528 ZOREAL \u7EE7\u7EED"
1056
+ },
1057
+ zht: {
1058
+ title: "\u6383\u78BC\u767B\u5165",
1059
+ titleIdentify: "\u6383\u78BC\u9A57\u8B49\u8EAB\u5206",
1060
+ titlePresence: "\u6383\u78BC\u8B49\u660E\u60A8\u662F\u771F\u4EBA",
1061
+ titleApprove: "\u5728\u624B\u6A5F\u4E0A\u6838\u51C6",
1062
+ bodyScan: "\u4F7F\u7528\u624B\u6A5F\u76F8\u6A5F\u6216 ZOREAL ID \u61C9\u7528\u7A0B\u5F0F\u6383\u63CF\u3002",
1063
+ bodyApprove: "\u8ACB\u5728 ZOREAL ID \u61C9\u7528\u7A0B\u5F0F\u4E2D\u6838\u51C6\u767B\u5165\u3002",
1064
+ bodyEnrolling: "\u8ACB\u5728\u624B\u6A5F\u4E0A\u5B8C\u6210 ZOREAL ID \u8A2D\u5B9A\uFF0C\u7136\u5F8C\u6838\u51C6\u767B\u5165\u3002",
1065
+ waiting: "\u7B49\u5F85\u6383\u63CF",
1066
+ waitingApproval: "\u7B49\u5F85\u6838\u51C6",
1067
+ expiresIn: "{time} \u5F8C\u5931\u6548",
1068
+ secured: "\u7531 ZOREAL \u63D0\u4F9B\u7684 Proof-of-Human \u9A57\u8B49",
1069
+ noIdTitle: "\u9084\u6C92\u6709 ZOREAL ID\uFF1F",
1070
+ noIdBody: "\u6383\u63CF\u540C\u4E00\u500B QR code \u5373\u53EF\u4E0B\u8F09\u61C9\u7528\u7A0B\u5F0F\u4E26\u514D\u8CBB\u5EFA\u7ACB\uFF0C\u53EA\u9700\u4E00\u5206\u9418\u3002",
1071
+ cancel: "\u53D6\u6D88",
1072
+ close: "\u95DC\u9589",
1073
+ qrAlt: "\u4F7F\u7528 ZOREAL \u767B\u5165\u7684 QR code",
1074
+ buttonContinue: "\u4F7F\u7528 ZOREAL \u7E7C\u7E8C"
1075
+ },
1076
+ ar: {
1077
+ title: "\u0627\u0645\u0633\u062D \u0644\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644",
1078
+ titleIdentify: "\u0627\u0645\u0633\u062D \u0644\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0647\u0648\u064A\u062A\u0643",
1079
+ titlePresence: "\u0627\u0645\u0633\u062D \u0644\u0625\u062B\u0628\u0627\u062A \u0623\u0646\u0643 \u0625\u0646\u0633\u0627\u0646 \u062D\u0642\u064A\u0642\u064A",
1080
+ titleApprove: "\u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u0647\u0627\u062A\u0641\u0643",
1081
+ bodyScan: "\u0627\u0645\u0633\u062D \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0643\u0627\u0645\u064A\u0631\u0627 \u0647\u0627\u062A\u0641\u0643 \u0623\u0648 \u062A\u0637\u0628\u064A\u0642 ZOREAL ID.",
1082
+ bodyApprove: "\u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0641\u064A \u062A\u0637\u0628\u064A\u0642 ZOREAL ID.",
1083
+ bodyEnrolling: "\u0623\u0643\u0645\u0644 \u0625\u0639\u062F\u0627\u062F ZOREAL ID \u0639\u0644\u0649 \u0647\u0627\u062A\u0641\u0643\u060C \u062B\u0645 \u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644.",
1084
+ waiting: "\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u0645\u0633\u062D",
1085
+ waitingApproval: "\u0641\u064A \u0627\u0646\u062A\u0638\u0627\u0631 \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629",
1086
+ expiresIn: "\u062A\u0646\u062A\u0647\u064A \u0627\u0644\u0635\u0644\u0627\u062D\u064A\u0629 \u062E\u0644\u0627\u0644 {time}",
1087
+ secured: "\u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 Proof-of-Human \u0628\u0648\u0627\u0633\u0637\u0629 ZOREAL",
1088
+ noIdTitle: "\u0644\u064A\u0633 \u0644\u062F\u064A\u0643 ZOREAL ID \u0628\u0639\u062F\u061F",
1089
+ noIdBody: "\u0627\u0645\u0633\u062D \u0627\u0644\u0631\u0645\u0632 \u0646\u0641\u0633\u0647 \u0644\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u062A\u0637\u0628\u064A\u0642 \u0648\u0625\u0646\u0634\u0627\u0621 \u062D\u0633\u0627\u0628 \u0645\u062C\u0627\u0646\u064A. \u064A\u0633\u062A\u063A\u0631\u0642 \u0627\u0644\u0623\u0645\u0631 \u062F\u0642\u064A\u0642\u0629 \u0648\u0627\u062D\u062F\u0629 \u0641\u0642\u0637.",
1090
+ cancel: "\u0625\u0644\u063A\u0627\u0621",
1091
+ close: "\u0625\u063A\u0644\u0627\u0642",
1092
+ qrAlt: "\u0631\u0645\u0632 QR \u0644\u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062F\u062E\u0648\u0644 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 ZOREAL",
1093
+ buttonContinue: "\u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 ZOREAL"
1094
+ },
1095
+ ko: {
1096
+ title: "\uC2A4\uCE94\uD558\uC5EC \uB85C\uADF8\uC778",
1097
+ titleIdentify: "\uC2A4\uCE94\uD558\uC5EC \uC2E0\uC6D0 \uD655\uC778",
1098
+ titlePresence: "\uC2A4\uCE94\uD558\uC5EC \uC2E4\uC81C \uC0AC\uB78C\uC784\uC744 \uC99D\uBA85",
1099
+ titleApprove: "\uD734\uB300\uD3F0\uC5D0\uC11C \uC2B9\uC778",
1100
+ bodyScan: "\uD734\uB300\uD3F0 \uCE74\uBA54\uB77C \uB610\uB294 ZOREAL ID \uC571\uC73C\uB85C \uC2A4\uCE94\uD558\uC138\uC694.",
1101
+ bodyApprove: "ZOREAL ID \uC571\uC5D0\uC11C \uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uC138\uC694.",
1102
+ bodyEnrolling: "\uD734\uB300\uD3F0\uC5D0\uC11C ZOREAL ID \uC124\uC815\uC744 \uC644\uB8CC\uD55C \uD6C4 \uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uC138\uC694.",
1103
+ waiting: "\uC2A4\uCE94 \uB300\uAE30 \uC911",
1104
+ waitingApproval: "\uC2B9\uC778 \uB300\uAE30 \uC911",
1105
+ expiresIn: "{time} \uD6C4 \uB9CC\uB8CC",
1106
+ secured: "ZOREAL\uC758 Proof-of-Human \uC778\uC99D",
1107
+ noIdTitle: "\uC544\uC9C1 ZOREAL ID\uAC00 \uC5C6\uC73C\uC2E0\uAC00\uC694?",
1108
+ noIdBody: "\uAC19\uC740 \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD574 \uC571\uC744 \uB0B4\uB824\uBC1B\uACE0 \uBB34\uB8CC\uB85C \uB9CC\uB4DC\uC138\uC694. 1\uBD84\uC774\uBA74 \uB429\uB2C8\uB2E4.",
1109
+ cancel: "\uCDE8\uC18C",
1110
+ close: "\uB2EB\uAE30",
1111
+ qrAlt: "ZOREAL\uB85C \uB85C\uADF8\uC778\uD558\uAE30 \uC704\uD55C QR \uCF54\uB4DC",
1112
+ buttonContinue: "ZOREAL\uB85C \uACC4\uC18D"
1113
+ },
1114
+ // Български
1115
+ bg: {
1116
+ title: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0437\u0430 \u0432\u0445\u043E\u0434",
1117
+ titleIdentify: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435, \u0437\u0430 \u0434\u0430 \u043F\u043E\u0442\u0432\u044A\u0440\u0434\u0438\u0442\u0435 \u0441\u0430\u043C\u043E\u043B\u0438\u0447\u043D\u043E\u0441\u0442\u0442\u0430 \u0441\u0438",
1118
+ titlePresence: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435, \u0437\u0430 \u0434\u0430 \u0434\u043E\u043A\u0430\u0436\u0435\u0442\u0435, \u0447\u0435 \u0441\u0442\u0435 \u0438\u0441\u0442\u0438\u043D\u0441\u043A\u0438 \u0447\u043E\u0432\u0435\u043A",
1119
+ titleApprove: "\u041F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0441\u0438",
1120
+ bodyScan: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0441 \u043A\u0430\u043C\u0435\u0440\u0430\u0442\u0430 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0441 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E ZOREAL ID.",
1121
+ bodyApprove: "\u041F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u0432\u0445\u043E\u0434\u0430 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E ZOREAL ID.",
1122
+ bodyEnrolling: "\u0414\u043E\u0432\u044A\u0440\u0448\u0435\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0442\u0430 \u043D\u0430 ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0441\u0438, \u0441\u043B\u0435\u0434 \u043A\u043E\u0435\u0442\u043E \u043F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u0442\u0435 \u0432\u0445\u043E\u0434\u0430.",
1123
+ waiting: "\u0418\u0437\u0447\u0430\u043A\u0432\u0430\u043D\u0435 \u043D\u0430 \u0441\u043A\u0430\u043D\u0438\u0440\u0430\u043D\u0435",
1124
+ waitingApproval: "\u0418\u0437\u0447\u0430\u043A\u0432\u0430\u043D\u0435 \u043D\u0430 \u043F\u043E\u0442\u0432\u044A\u0440\u0436\u0434\u0435\u043D\u0438\u0435",
1125
+ expiresIn: "\u0418\u0437\u0442\u0438\u0447\u0430 \u0441\u043B\u0435\u0434 {time}",
1126
+ secured: "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 Proof-of-Human \u043E\u0442 ZOREAL",
1127
+ noIdTitle: "\u0412\u0441\u0435 \u043E\u0449\u0435 \u043D\u044F\u043C\u0430\u0442\u0435 ZOREAL ID?",
1128
+ noIdBody: "\u0421\u043A\u0430\u043D\u0438\u0440\u0430\u0439\u0442\u0435 \u0441\u044A\u0449\u0438\u044F \u043A\u043E\u0434, \u0437\u0430 \u0434\u0430 \u0438\u0437\u0442\u0435\u0433\u043B\u0438\u0442\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u0442\u043E \u0438 \u0434\u0430 \u0441\u0438 \u0441\u044A\u0437\u0434\u0430\u0434\u0435\u0442\u0435 \u0431\u0435\u0437\u043F\u043B\u0430\u0442\u0435\u043D \u0430\u043A\u0430\u0443\u043D\u0442. \u041E\u0442\u043D\u0435\u043C\u0430 \u0441\u0430\u043C\u043E \u043C\u0438\u043D\u0443\u0442\u0430.",
1129
+ cancel: "\u041E\u0442\u043A\u0430\u0437",
1130
+ close: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438",
1131
+ qrAlt: "QR \u043A\u043E\u0434 \u0437\u0430 \u0432\u0445\u043E\u0434 \u0441\u044A\u0441 ZOREAL",
1132
+ buttonContinue: "\u041F\u0440\u043E\u0434\u044A\u043B\u0436\u0438 \u0441\u044A\u0441 ZOREAL"
1133
+ },
1134
+ // বাংলা
1135
+ bn: {
1136
+ title: "\u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
1137
+ titleIdentify: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AA\u09B0\u09BF\u099A\u09AF\u09BC \u09AF\u09BE\u099A\u09BE\u0987 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
1138
+ titlePresence: "\u0986\u09AA\u09A8\u09BF \u098F\u0995\u099C\u09A8 \u09AA\u09CD\u09B0\u0995\u09C3\u09A4 \u09AE\u09BE\u09A8\u09C1\u09B7 \u09A4\u09BE \u09AA\u09CD\u09B0\u09AE\u09BE\u09A3 \u0995\u09B0\u09A4\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",
1139
+ titleApprove: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8",
1140
+ bodyScan: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7\u09B0 \u0995\u09CD\u09AF\u09BE\u09AE\u09C7\u09B0\u09BE \u09AC\u09BE ZOREAL ID \u0985\u09CD\u09AF\u09BE\u09AA \u09A6\u09BF\u09AF\u09BC\u09C7 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
1141
+ bodyApprove: "\u0986\u09AA\u09A8\u09BE\u09B0 ZOREAL ID \u0985\u09CD\u09AF\u09BE\u09AA\u09C7 \u09B2\u0997\u0987\u09A8 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
1142
+ bodyEnrolling: "\u0986\u09AA\u09A8\u09BE\u09B0 \u09AB\u09CB\u09A8\u09C7 ZOREAL ID \u09B8\u09C7\u099F\u0986\u09AA \u09B8\u09AE\u09CD\u09AA\u09C2\u09B0\u09CD\u09A3 \u0995\u09B0\u09C1\u09A8, \u09A4\u09BE\u09B0\u09AA\u09B0 \u09B2\u0997\u0987\u09A8 \u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8 \u0995\u09B0\u09C1\u09A8\u0964",
1143
+ waiting: "\u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8\u09C7\u09B0 \u0985\u09AA\u09C7\u0995\u09CD\u09B7\u09BE\u09AF\u09BC",
1144
+ waitingApproval: "\u0985\u09A8\u09C1\u09AE\u09CB\u09A6\u09A8\u09C7\u09B0 \u0985\u09AA\u09C7\u0995\u09CD\u09B7\u09BE\u09AF\u09BC",
1145
+ expiresIn: "{time} \u09AA\u09B0\u09C7 \u09AE\u09C7\u09AF\u09BC\u09BE\u09A6 \u09B6\u09C7\u09B7 \u09B9\u09AC\u09C7",
1146
+ secured: "ZOREAL \u09A6\u09CD\u09AC\u09BE\u09B0\u09BE Proof-of-Human \u09AF\u09BE\u099A\u09BE\u0987\u0995\u09B0\u09A3",
1147
+ noIdTitle: "\u098F\u0996\u09A8\u09CB ZOREAL ID \u09A8\u09C7\u0987?",
1148
+ noIdBody: "\u0985\u09CD\u09AF\u09BE\u09AA \u09A1\u09BE\u0989\u09A8\u09B2\u09CB\u09A1 \u0995\u09B0\u09C7 \u09AC\u09BF\u09A8\u09BE\u09AE\u09C2\u09B2\u09CD\u09AF\u09C7 \u098F\u0995\u099F\u09BF \u09A4\u09C8\u09B0\u09BF \u0995\u09B0\u09A4\u09C7 \u098F\u0995\u0987 \u0995\u09CB\u09A1 \u09B8\u09CD\u0995\u09CD\u09AF\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8\u0964 \u098F\u09A4\u09C7 \u09AE\u09BE\u09A4\u09CD\u09B0 \u098F\u0995 \u09AE\u09BF\u09A8\u09BF\u099F \u09B8\u09AE\u09AF\u09BC \u09B2\u09BE\u0997\u09C7\u0964",
1149
+ cancel: "\u09AC\u09BE\u09A4\u09BF\u09B2",
1150
+ close: "\u09AC\u09A8\u09CD\u09A7",
1151
+ qrAlt: "ZOREAL \u09A6\u09BF\u09AF\u09BC\u09C7 \u09B8\u09BE\u0987\u09A8 \u0987\u09A8 \u0995\u09B0\u09BE\u09B0 \u099C\u09A8\u09CD\u09AF QR \u0995\u09CB\u09A1",
1152
+ buttonContinue: "ZOREAL \u09A6\u09BF\u09AF\u09BC\u09C7 \u099A\u09BE\u09B2\u09BF\u09AF\u09BC\u09C7 \u09AF\u09BE\u09A8"
1153
+ },
1154
+ // Bosanski
1155
+ bs: {
1156
+ title: "Skenirajte za prijavu",
1157
+ titleIdentify: "Skenirajte da potvrdite svoj identitet",
1158
+ titlePresence: "Skenirajte da doka\u017Eete da ste stvarna osoba",
1159
+ titleApprove: "Odobrite na svom telefonu",
1160
+ bodyScan: "Skenirajte kamerom svog telefona ili aplikacijom ZOREAL ID.",
1161
+ bodyApprove: "Odobrite prijavu u aplikaciji ZOREAL ID.",
1162
+ bodyEnrolling: "Zavr\u0161ite pode\u0161avanje ZOREAL ID-a na svom telefonu, a zatim odobrite prijavu.",
1163
+ waiting: "\u010Ceka se skeniranje",
1164
+ waitingApproval: "\u010Ceka se odobrenje",
1165
+ expiresIn: "Isti\u010De za {time}",
1166
+ secured: "ZOREAL Proof-of-Human verifikacija",
1167
+ noIdTitle: "Nemate ZOREAL ID?",
1168
+ noIdBody: "Skenirajte isti kod da preuzmete aplikaciju i besplatno ga napravite. Traje samo minutu.",
1169
+ cancel: "Otka\u017Ei",
1170
+ close: "Zatvori",
1171
+ qrAlt: "QR kod za prijavu putem ZOREAL-a",
1172
+ buttonContinue: "Nastavi sa ZOREAL-om"
1173
+ },
1174
+ // Čeština
1175
+ cs: {
1176
+ title: "P\u0159ihlaste se naskenov\xE1n\xEDm",
1177
+ titleIdentify: "Naskenujte pro ov\u011B\u0159en\xED toto\u017Enosti",
1178
+ titlePresence: "Naskenujte a proka\u017Ete, \u017Ee jste skute\u010Dn\xFD \u010Dlov\u011Bk",
1179
+ titleApprove: "Potvr\u010Fte v telefonu",
1180
+ bodyScan: "Naskenujte fotoapar\xE1tem telefonu nebo aplikac\xED ZOREAL ID.",
1181
+ bodyApprove: "Potvr\u010Fte p\u0159ihl\xE1\u0161en\xED v aplikaci ZOREAL ID.",
1182
+ bodyEnrolling: "Dokon\u010Dete nastaven\xED ZOREAL ID v telefonu a pot\xE9 potvr\u010Fte p\u0159ihl\xE1\u0161en\xED.",
1183
+ waiting: "\u010Cek\xE1n\xED na naskenov\xE1n\xED",
1184
+ waitingApproval: "\u010Cek\xE1n\xED na potvrzen\xED",
1185
+ expiresIn: "Vypr\u0161\xED za {time}",
1186
+ secured: "Ov\u011B\u0159en\xED Proof-of-Human od ZOREAL",
1187
+ noIdTitle: "Je\u0161t\u011B nem\xE1te ZOREAL ID?",
1188
+ noIdBody: "Naskenov\xE1n\xEDm stejn\xE9ho k\xF3du si st\xE1hnete aplikaci a zdarma vytvo\u0159\xEDte ZOREAL ID. Zabere to jen minutu.",
1189
+ cancel: "Zru\u0161it",
1190
+ close: "Zav\u0159\xEDt",
1191
+ qrAlt: "QR k\xF3d pro p\u0159ihl\xE1\u0161en\xED pomoc\xED ZOREAL",
1192
+ buttonContinue: "Pokra\u010Dovat se ZOREAL"
1193
+ },
1194
+ // Dansk
1195
+ da: {
1196
+ title: "Scan for at logge ind",
1197
+ titleIdentify: "Scan for at bekr\xE6fte din identitet",
1198
+ titlePresence: "Scan for at bevise, at du er et rigtigt menneske",
1199
+ titleApprove: "Godkend p\xE5 din telefon",
1200
+ bodyScan: "Scan med telefonens kamera eller ZOREAL ID-appen.",
1201
+ bodyApprove: "Godkend login i din ZOREAL ID-app.",
1202
+ bodyEnrolling: "F\xE6rdigg\xF8r ops\xE6tningen af ZOREAL ID p\xE5 din telefon, og godkend derefter login.",
1203
+ waiting: "Venter p\xE5 scanning",
1204
+ waitingApproval: "Venter p\xE5 godkendelse",
1205
+ expiresIn: "Udl\xF8ber om {time}",
1206
+ secured: "Proof-of-Human-verificering af ZOREAL",
1207
+ noIdTitle: "Har du ikke et ZOREAL ID endnu?",
1208
+ noIdBody: "Scan den samme kode for at hente appen og oprette et gratis. Det tager kun et minut.",
1209
+ cancel: "Annuller",
1210
+ close: "Luk",
1211
+ qrAlt: "QR-kode til at logge ind med ZOREAL",
1212
+ buttonContinue: "Forts\xE6t med ZOREAL"
1213
+ },
1214
+ // Ελληνικά
1215
+ el: {
1216
+ title: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7",
1217
+ titleIdentify: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03B5\u03C0\u03B1\u03BB\u03AE\u03B8\u03B5\u03C5\u03C3\u03B7 \u03C4\u03B1\u03C5\u03C4\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2",
1218
+ titlePresence: "\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03B4\u03B5\u03AF\u03BE\u03B5\u03C4\u03B5 \u03CC\u03C4\u03B9 \u03B5\u03AF\u03C3\u03C4\u03B5 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03B9\u03BA\u03CC\u03C2 \u03AC\u03BD\u03B8\u03C1\u03C9\u03C0\u03BF\u03C2",
1219
+ titleApprove: "\u0388\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 \u03B1\u03C0\u03CC \u03C4\u03BF \u03BA\u03B9\u03BD\u03B7\u03C4\u03CC \u03C3\u03B1\u03C2",
1220
+ bodyScan: "\u03A3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5 \u03BC\u03B5 \u03C4\u03B7\u03BD \u03BA\u03AC\u03BC\u03B5\u03C1\u03B1 \u03C4\u03BF\u03C5 \u03BA\u03B9\u03BD\u03B7\u03C4\u03BF\u03CD \u03C3\u03B1\u03C2 \u03AE \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE ZOREAL ID.",
1221
+ bodyApprove: "\u0395\u03B3\u03BA\u03C1\u03AF\u03BD\u03B5\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03C3\u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE ZOREAL ID.",
1222
+ bodyEnrolling: "\u039F\u03BB\u03BF\u03BA\u03BB\u03B7\u03C1\u03CE\u03C3\u03C4\u03B5 \u03C4\u03B7 \u03C1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 \u03C4\u03BF\u03C5 ZOREAL ID \u03C3\u03C4\u03BF \u03BA\u03B9\u03BD\u03B7\u03C4\u03CC \u03C3\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03AD\u03C0\u03B5\u03B9\u03C4\u03B1 \u03B5\u03B3\u03BA\u03C1\u03AF\u03BD\u03B5\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7.",
1223
+ waiting: "\u0391\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03C3\u03AC\u03C1\u03C9\u03C3\u03B7\u03C2",
1224
+ waitingApproval: "\u0391\u03BD\u03B1\u03BC\u03BF\u03BD\u03AE \u03AD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7\u03C2",
1225
+ expiresIn: "\u039B\u03AE\u03B3\u03B5\u03B9 \u03C3\u03B5 {time}",
1226
+ secured: "\u0395\u03C0\u03B1\u03BB\u03AE\u03B8\u03B5\u03C5\u03C3\u03B7 Proof-of-Human \u03B1\u03C0\u03CC \u03C4\u03B7 ZOREAL",
1227
+ noIdTitle: "\u0394\u03B5\u03BD \u03AD\u03C7\u03B5\u03C4\u03B5 \u03B1\u03BA\u03CC\u03BC\u03B1 ZOREAL ID;",
1228
+ noIdBody: "\u03A3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5 \u03C4\u03BF\u03BD \u03AF\u03B4\u03B9\u03BF \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BA\u03B1\u03C4\u03B5\u03B2\u03AC\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03BA\u03B1\u03B9 \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03B5\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03B4\u03C9\u03C1\u03B5\u03AC\u03BD. \u03A7\u03C1\u03B5\u03B9\u03AC\u03B6\u03B5\u03C4\u03B1\u03B9 \u03BC\u03CC\u03BD\u03BF \u03AD\u03BD\u03B1 \u03BB\u03B5\u03C0\u03C4\u03CC.",
1229
+ cancel: "\u0386\u03BA\u03C5\u03C1\u03BF",
1230
+ close: "\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF",
1231
+ qrAlt: "\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 QR \u03B3\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03BC\u03B5 ZOREAL",
1232
+ buttonContinue: "\u03A3\u03C5\u03BD\u03AD\u03C7\u03B5\u03B9\u03B1 \u03BC\u03B5 ZOREAL"
1233
+ },
1234
+ // Español (LA)
1235
+ "es-419": {
1236
+ title: "Escanea para iniciar sesi\xF3n",
1237
+ titleIdentify: "Escanea para verificar tu identidad",
1238
+ titlePresence: "Escanea para demostrar que eres una persona real",
1239
+ titleApprove: "Aprueba desde tu celular",
1240
+ bodyScan: "Escanea con la c\xE1mara de tu celular o con la app ZOREAL ID.",
1241
+ bodyApprove: "Aprueba el inicio de sesi\xF3n en tu app ZOREAL ID.",
1242
+ bodyEnrolling: "Termina de configurar ZOREAL ID en tu celular y luego aprueba el inicio de sesi\xF3n.",
1243
+ waiting: "Esperando escaneo",
1244
+ waitingApproval: "Esperando aprobaci\xF3n",
1245
+ expiresIn: "Expira en {time}",
1246
+ secured: "Verificaci\xF3n Proof-of-Human de ZOREAL",
1247
+ noIdTitle: "\xBFTodav\xEDa no tienes ZOREAL ID?",
1248
+ noIdBody: "Escanea el mismo c\xF3digo para descargar la app y crear uno gratis. Solo toma un minuto.",
1249
+ cancel: "Cancelar",
1250
+ close: "Cerrar",
1251
+ qrAlt: "C\xF3digo QR para iniciar sesi\xF3n con ZOREAL",
1252
+ buttonContinue: "Continuar con ZOREAL"
1253
+ },
1254
+ // Suomi
1255
+ fi: {
1256
+ title: "Kirjaudu sis\xE4\xE4n skannaamalla",
1257
+ titleIdentify: "Vahvista henkil\xF6llisyytesi skannaamalla",
1258
+ titlePresence: "Todista skannaamalla, ett\xE4 olet oikea ihminen",
1259
+ titleApprove: "Hyv\xE4ksy puhelimessasi",
1260
+ bodyScan: "Skannaa puhelimesi kameralla tai ZOREAL ID -sovelluksella.",
1261
+ bodyApprove: "Hyv\xE4ksy kirjautuminen ZOREAL ID -sovelluksessasi.",
1262
+ bodyEnrolling: "Viimeistele ZOREAL ID -sovelluksen k\xE4ytt\xF6\xF6notto puhelimellasi ja hyv\xE4ksy sitten kirjautuminen.",
1263
+ waiting: "Odotetaan skannausta",
1264
+ waitingApproval: "Odotetaan hyv\xE4ksynt\xE4\xE4",
1265
+ expiresIn: "Vanhenee {time} kuluttua",
1266
+ secured: "ZOREALin Proof-of-Human-vahvistus",
1267
+ noIdTitle: "Eik\xF6 sinulla ole viel\xE4 ZOREAL ID:t\xE4?",
1268
+ noIdBody: "Skannaa sama koodi ladataksesi sovelluksen ja luodaksesi tunnuksen ilmaiseksi. Se vie vain minuutin.",
1269
+ cancel: "Peruuta",
1270
+ close: "Sulje",
1271
+ qrAlt: "QR-koodi ZOREAL-kirjautumista varten",
1272
+ buttonContinue: "Jatka ZOREALilla"
1273
+ },
1274
+ // עברית
1275
+ he: {
1276
+ title: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05EA\u05D7\u05D1\u05E8",
1277
+ titleIdentify: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D0\u05DE\u05EA \u05D0\u05EA \u05D6\u05D4\u05D5\u05EA\u05DA",
1278
+ titlePresence: "\u05E1\u05E8\u05D5\u05E7 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D5\u05DB\u05D9\u05D7 \u05E9\u05D0\u05EA\u05D4 \u05D0\u05D3\u05DD \u05D0\u05DE\u05D9\u05EA\u05D9",
1279
+ titleApprove: "\u05D0\u05E9\u05E8 \u05D1\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA",
1280
+ bodyScan: "\u05E1\u05E8\u05D5\u05E7 \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA \u05DE\u05E6\u05DC\u05DE\u05EA \u05D4\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA \u05D0\u05D5 \u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA ZOREAL ID.",
1281
+ bodyApprove: "\u05D0\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05D1\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D9\u05EA ZOREAL ID \u05E9\u05DC\u05DA.",
1282
+ bodyEnrolling: "\u05E1\u05D9\u05D9\u05DD \u05DC\u05D4\u05D2\u05D3\u05D9\u05E8 \u05D0\u05EA ZOREAL ID \u05D1\u05D8\u05DC\u05E4\u05D5\u05DF \u05E9\u05DC\u05DA, \u05D5\u05D0\u05D6 \u05D0\u05E9\u05E8 \u05D0\u05EA \u05D4\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA.",
1283
+ waiting: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05E1\u05E8\u05D9\u05E7\u05D4",
1284
+ waitingApproval: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05DC\u05D0\u05D9\u05E9\u05D5\u05E8",
1285
+ expiresIn: "\u05D9\u05E4\u05D5\u05D2 \u05D1\u05E2\u05D5\u05D3 {time}",
1286
+ secured: "\u05D0\u05D9\u05DE\u05D5\u05EA Proof-of-Human \u05DE\u05D1\u05D9\u05EA ZOREAL",
1287
+ noIdTitle: "\u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05DF \u05DC\u05DA ZOREAL ID?",
1288
+ noIdBody: "\u05E1\u05E8\u05D5\u05E7 \u05D0\u05EA \u05D0\u05D5\u05EA\u05D5 \u05D4\u05E7\u05D5\u05D3 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05D5\u05E8\u05D9\u05D3 \u05D0\u05EA \u05D4\u05D0\u05E4\u05DC\u05D9\u05E7\u05E6\u05D9\u05D4 \u05D5\u05DC\u05D9\u05E6\u05D5\u05E8 \u05D0\u05D7\u05D3 \u05D1\u05D7\u05D9\u05E0\u05DD. \u05D6\u05D4 \u05DC\u05D5\u05E7\u05D7 \u05E8\u05E7 \u05D3\u05E7\u05D4.",
1289
+ cancel: "\u05D1\u05D9\u05D8\u05D5\u05DC",
1290
+ close: "\u05E1\u05D2\u05D5\u05E8",
1291
+ qrAlt: "\u05E7\u05D5\u05D3 QR \u05DC\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05E2\u05DD ZOREAL",
1292
+ buttonContinue: "\u05D4\u05DE\u05E9\u05DA \u05E2\u05DD ZOREAL"
1293
+ },
1294
+ // Hrvatski
1295
+ hr: {
1296
+ title: "Skenirajte za prijavu",
1297
+ titleIdentify: "Skenirajte za potvrdu identiteta",
1298
+ titlePresence: "Skenirajte kako biste dokazali da ste stvarna osoba",
1299
+ titleApprove: "Odobrite na svom mobitelu",
1300
+ bodyScan: "Skenirajte kamerom svog mobitela ili aplikacijom ZOREAL ID.",
1301
+ bodyApprove: "Odobrite prijavu u aplikaciji ZOREAL ID.",
1302
+ bodyEnrolling: "Dovr\u0161ite postavljanje ZOREAL ID-a na svom mobitelu, a zatim odobrite prijavu.",
1303
+ waiting: "\u010Ceka se skeniranje",
1304
+ waitingApproval: "\u010Ceka se odobrenje",
1305
+ expiresIn: "Isti\u010De za {time}",
1306
+ secured: "ZOREAL Proof-of-Human provjera",
1307
+ noIdTitle: "Nemate ZOREAL ID?",
1308
+ noIdBody: "Skenirajte isti kod da preuzmete aplikaciju i besplatno ga izradite. Traje samo minutu.",
1309
+ cancel: "Odustani",
1310
+ close: "Zatvori",
1311
+ qrAlt: "QR kod za prijavu putem ZOREAL-a",
1312
+ buttonContinue: "Nastavi sa ZOREAL-om"
1313
+ },
1314
+ // Magyar
1315
+ hu: {
1316
+ title: "Bejelentkez\xE9s beolvas\xE1ssal",
1317
+ titleIdentify: "Olvassa be a szem\xE9lyazonoss\xE1ga igazol\xE1s\xE1hoz",
1318
+ titlePresence: "Olvassa be annak igazol\xE1s\xE1hoz, hogy val\xF3di ember",
1319
+ titleApprove: "J\xF3v\xE1hagy\xE1s a telefonj\xE1n",
1320
+ bodyScan: "Olvassa be a telefonja kamer\xE1j\xE1val, vagy a ZOREAL ID alkalmaz\xE1ssal.",
1321
+ bodyApprove: "Hagyja j\xF3v\xE1 a bejelentkez\xE9st a ZOREAL ID alkalmaz\xE1sban.",
1322
+ bodyEnrolling: "Fejezze be a ZOREAL ID be\xE1ll\xEDt\xE1s\xE1t a telefonj\xE1n, majd hagyja j\xF3v\xE1 a bejelentkez\xE9st.",
1323
+ waiting: "V\xE1rakoz\xE1s beolvas\xE1sra",
1324
+ waitingApproval: "V\xE1rakoz\xE1s j\xF3v\xE1hagy\xE1sra",
1325
+ expiresIn: "Lej\xE1r {time} m\xFAlva",
1326
+ secured: "Proof-of-Human hiteles\xEDt\xE9s a ZOREAL-t\xF3l",
1327
+ noIdTitle: "M\xE9g nincs ZOREAL ID-je?",
1328
+ noIdBody: "Olvassa be ugyanazt a k\xF3dot az alkalmaz\xE1s let\xF6lt\xE9s\xE9hez, \xE9s hozzon l\xE9tre egyet ingyenesen. Mind\xF6ssze egy percet vesz ig\xE9nybe.",
1329
+ cancel: "M\xE9gse",
1330
+ close: "Bez\xE1r\xE1s",
1331
+ qrAlt: "QR-k\xF3d a ZOREAL-lal val\xF3 bejelentkez\xE9shez",
1332
+ buttonContinue: "Folytat\xE1s a ZOREAL-lal"
1333
+ },
1334
+ // Bahasa Indonesia
1335
+ id: {
1336
+ title: "Pindai untuk masuk",
1337
+ titleIdentify: "Pindai untuk memverifikasi identitas Anda",
1338
+ titlePresence: "Pindai untuk membuktikan bahwa Anda manusia sungguhan",
1339
+ titleApprove: "Setujui di ponsel Anda",
1340
+ bodyScan: "Pindai dengan kamera ponsel atau aplikasi ZOREAL ID.",
1341
+ bodyApprove: "Setujui proses masuk di aplikasi ZOREAL ID Anda.",
1342
+ bodyEnrolling: "Selesaikan pengaturan ZOREAL ID di ponsel Anda, lalu setujui proses masuk.",
1343
+ waiting: "Menunggu pemindaian",
1344
+ waitingApproval: "Menunggu persetujuan",
1345
+ expiresIn: "Berakhir dalam {time}",
1346
+ secured: "Verifikasi Proof-of-Human oleh ZOREAL",
1347
+ noIdTitle: "Belum punya ZOREAL ID?",
1348
+ noIdBody: "Pindai kode yang sama untuk mengunduh aplikasi dan membuat akun secara gratis. Hanya butuh waktu satu menit.",
1349
+ cancel: "Batal",
1350
+ close: "Tutup",
1351
+ qrAlt: "Kode QR untuk masuk dengan ZOREAL",
1352
+ buttonContinue: "Lanjutkan dengan ZOREAL"
1353
+ },
1354
+ // Italiano
1355
+ it: {
1356
+ title: "Scansiona per accedere",
1357
+ titleIdentify: "Scansiona per verificare la tua identit\xE0",
1358
+ titlePresence: "Scansiona per dimostrare di essere una persona reale",
1359
+ titleApprove: "Approva sul tuo telefono",
1360
+ bodyScan: "Scansiona con la fotocamera del telefono o con l'app ZOREAL ID.",
1361
+ bodyApprove: "Approva l'accesso nell'app ZOREAL ID.",
1362
+ bodyEnrolling: "Completa la configurazione di ZOREAL ID sul telefono, poi approva l'accesso.",
1363
+ waiting: "In attesa della scansione",
1364
+ waitingApproval: "In attesa di approvazione",
1365
+ expiresIn: "Scade tra {time}",
1366
+ secured: "Verifica Proof-of-Human di ZOREAL",
1367
+ noIdTitle: "Non hai ancora uno ZOREAL ID?",
1368
+ noIdBody: "Scansiona lo stesso codice per scaricare l'app e crearne uno gratis. Basta un minuto.",
1369
+ cancel: "Annulla",
1370
+ close: "Chiudi",
1371
+ qrAlt: "Codice QR per accedere con ZOREAL",
1372
+ buttonContinue: "Continua con ZOREAL"
1373
+ },
1374
+ // Bahasa Melayu
1375
+ ms: {
1376
+ title: "Imbas untuk log masuk",
1377
+ titleIdentify: "Imbas untuk mengesahkan identiti anda",
1378
+ titlePresence: "Imbas untuk membuktikan anda manusia sebenar",
1379
+ titleApprove: "Luluskan di telefon anda",
1380
+ bodyScan: "Imbas dengan kamera telefon atau aplikasi ZOREAL ID.",
1381
+ bodyApprove: "Luluskan log masuk dalam aplikasi ZOREAL ID anda.",
1382
+ bodyEnrolling: "Selesaikan persediaan ZOREAL ID di telefon anda, kemudian luluskan log masuk.",
1383
+ waiting: "Menunggu imbasan",
1384
+ waitingApproval: "Menunggu kelulusan",
1385
+ expiresIn: "Tamat tempoh dalam {time}",
1386
+ secured: "Pengesahan Proof-of-Human oleh ZOREAL",
1387
+ noIdTitle: "Belum ada ZOREAL ID?",
1388
+ noIdBody: "Imbas kod yang sama untuk memuat turun aplikasi dan cipta satu secara percuma. Hanya mengambil masa seminit.",
1389
+ cancel: "Batal",
1390
+ close: "Tutup",
1391
+ qrAlt: "Kod QR untuk log masuk dengan ZOREAL",
1392
+ buttonContinue: "Teruskan dengan ZOREAL"
1393
+ },
1394
+ // Nederlands
1395
+ nl: {
1396
+ title: "Scan om in te loggen",
1397
+ titleIdentify: "Scan om je identiteit te verifi\xEBren",
1398
+ titlePresence: "Scan om te bewijzen dat je een echt mens bent",
1399
+ titleApprove: "Keur goed op je telefoon",
1400
+ bodyScan: "Scan met de camera van je telefoon of de ZOREAL ID-app.",
1401
+ bodyApprove: "Keur de aanmelding goed in je ZOREAL ID-app.",
1402
+ bodyEnrolling: "Rond het instellen van ZOREAL ID op je telefoon af en keur daarna de aanmelding goed.",
1403
+ waiting: "Wachten op scan",
1404
+ waitingApproval: "Wachten op goedkeuring",
1405
+ expiresIn: "Verloopt over {time}",
1406
+ secured: "Proof-of-Human-verificatie door ZOREAL",
1407
+ noIdTitle: "Nog geen ZOREAL ID?",
1408
+ noIdBody: "Scan dezelfde code om de app te downloaden en gratis een account aan te maken. Dit duurt maar een minuut.",
1409
+ cancel: "Annuleren",
1410
+ close: "Sluiten",
1411
+ qrAlt: "QR-code om in te loggen met ZOREAL",
1412
+ buttonContinue: "Doorgaan met ZOREAL"
1413
+ },
1414
+ // Norsk
1415
+ no: {
1416
+ title: "Skann for \xE5 logge inn",
1417
+ titleIdentify: "Skann for \xE5 bekrefte identiteten din",
1418
+ titlePresence: "Skann for \xE5 bevise at du er et ekte menneske",
1419
+ titleApprove: "Godkjenn p\xE5 telefonen din",
1420
+ bodyScan: "Skann med telefonens kamera eller ZOREAL ID-appen.",
1421
+ bodyApprove: "Godkjenn innloggingen i ZOREAL ID-appen din.",
1422
+ bodyEnrolling: "Fullf\xF8r oppsettet av ZOREAL ID p\xE5 telefonen din, og godkjenn deretter innloggingen.",
1423
+ waiting: "Venter p\xE5 skanning",
1424
+ waitingApproval: "Venter p\xE5 godkjenning",
1425
+ expiresIn: "Utl\xF8per om {time}",
1426
+ secured: "Proof-of-Human-verifisering av ZOREAL",
1427
+ noIdTitle: "Har du ikke ZOREAL ID enn\xE5?",
1428
+ noIdBody: "Skann den samme koden for \xE5 laste ned appen og opprette en gratis. Det tar bare et minutt.",
1429
+ cancel: "Avbryt",
1430
+ close: "Lukk",
1431
+ qrAlt: "QR-kode for \xE5 logge inn med ZOREAL",
1432
+ buttonContinue: "Fortsett med ZOREAL"
1433
+ },
1434
+ // Polski
1435
+ pl: {
1436
+ title: "Zeskanuj, aby si\u0119 zalogowa\u0107",
1437
+ titleIdentify: "Zeskanuj, aby zweryfikowa\u0107 swoj\u0105 to\u017Csamo\u015B\u0107",
1438
+ titlePresence: "Zeskanuj, aby udowodni\u0107, \u017Ce jeste\u015B prawdziwym cz\u0142owiekiem",
1439
+ titleApprove: "Zatwierd\u017A w telefonie",
1440
+ bodyScan: "Zeskanuj aparatem telefonu lub aplikacj\u0105 ZOREAL ID.",
1441
+ bodyApprove: "Zatwierd\u017A logowanie w aplikacji ZOREAL ID.",
1442
+ bodyEnrolling: "Doko\u0144cz konfiguracj\u0119 ZOREAL ID w telefonie, a nast\u0119pnie zatwierd\u017A logowanie.",
1443
+ waiting: "Czekanie na skan",
1444
+ waitingApproval: "Czekanie na zatwierdzenie",
1445
+ expiresIn: "Wygasa za {time}",
1446
+ secured: "Weryfikacja Proof-of-Human od ZOREAL",
1447
+ noIdTitle: "Nie masz jeszcze ZOREAL ID?",
1448
+ noIdBody: "Zeskanuj ten sam kod, aby pobra\u0107 aplikacj\u0119 i bezp\u0142atnie utworzy\u0107 ZOREAL ID. Zajmie to tylko minut\u0119.",
1449
+ cancel: "Anuluj",
1450
+ close: "Zamknij",
1451
+ qrAlt: "Kod QR do logowania za pomoc\u0105 ZOREAL",
1452
+ buttonContinue: "Kontynuuj z ZOREAL"
1453
+ },
1454
+ // Português (BR)
1455
+ "pt-br": {
1456
+ title: "Escaneie para entrar",
1457
+ titleIdentify: "Escaneie para verificar sua identidade",
1458
+ titlePresence: "Escaneie para provar que voc\xEA \xE9 uma pessoa real",
1459
+ titleApprove: "Aprove no seu celular",
1460
+ bodyScan: "Escaneie com a c\xE2mera do seu celular ou com o app ZOREAL ID.",
1461
+ bodyApprove: "Aprove o login no app ZOREAL ID.",
1462
+ bodyEnrolling: "Termine de configurar o ZOREAL ID no seu celular e depois aprove o login.",
1463
+ waiting: "Aguardando escaneamento",
1464
+ waitingApproval: "Aguardando aprova\xE7\xE3o",
1465
+ expiresIn: "Expira em {time}",
1466
+ secured: "Verifica\xE7\xE3o Proof-of-Human da ZOREAL",
1467
+ noIdTitle: "Ainda n\xE3o tem um ZOREAL ID?",
1468
+ noIdBody: "Escaneie o mesmo c\xF3digo para baixar o app e criar um de gra\xE7a. Leva s\xF3 um minuto.",
1469
+ cancel: "Cancelar",
1470
+ close: "Fechar",
1471
+ qrAlt: "C\xF3digo QR para entrar com ZOREAL",
1472
+ buttonContinue: "Continuar com ZOREAL"
1473
+ },
1474
+ // Română
1475
+ ro: {
1476
+ title: "Scana\u021Bi pentru conectare",
1477
+ titleIdentify: "Scana\u021Bi pentru a v\u0103 verifica identitatea",
1478
+ titlePresence: "Scana\u021Bi pentru a dovedi c\u0103 sunte\u021Bi o persoan\u0103 real\u0103",
1479
+ titleApprove: "Aproba\u021Bi de pe telefon",
1480
+ bodyScan: "Scana\u021Bi cu camera telefonului sau cu aplica\u021Bia ZOREAL ID.",
1481
+ bodyApprove: "Aproba\u021Bi conectarea \xEEn aplica\u021Bia ZOREAL ID.",
1482
+ bodyEnrolling: "Finaliza\u021Bi configurarea ZOREAL ID pe telefon, apoi aproba\u021Bi conectarea.",
1483
+ waiting: "Se a\u0219teapt\u0103 scanarea",
1484
+ waitingApproval: "Se a\u0219teapt\u0103 aprobarea",
1485
+ expiresIn: "Expir\u0103 \xEEn {time}",
1486
+ secured: "Verificare Proof-of-Human de la ZOREAL",
1487
+ noIdTitle: "Nu ave\u021Bi \xEEnc\u0103 un ZOREAL ID?",
1488
+ noIdBody: "Scana\u021Bi acela\u0219i cod pentru a desc\u0103rca aplica\u021Bia \u0219i a crea unul gratuit. Dureaz\u0103 doar un minut.",
1489
+ cancel: "Anuleaz\u0103",
1490
+ close: "\xCEnchide",
1491
+ qrAlt: "Cod QR pentru conectare cu ZOREAL",
1492
+ buttonContinue: "Continua\u021Bi cu ZOREAL"
1493
+ },
1494
+ // Српски
1495
+ sr: {
1496
+ title: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443",
1497
+ titleIdentify: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0434\u0430 \u043F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435 \u0441\u0432\u043E\u0458 \u0438\u0434\u0435\u043D\u0442\u0438\u0442\u0435\u0442",
1498
+ titlePresence: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0434\u0430 \u0434\u043E\u043A\u0430\u0436\u0435\u0442\u0435 \u0434\u0430 \u0441\u0442\u0435 \u043F\u0440\u0430\u0432\u0430 \u043E\u0441\u043E\u0431\u0430",
1499
+ titleApprove: "\u041E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043D\u0430 \u0441\u0432\u043E\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443",
1500
+ bodyScan: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u043C \u0441\u0432\u043E\u0433 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430 \u0438\u043B\u0438 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u043E\u043C ZOREAL ID.",
1501
+ bodyApprove: "\u041E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u0443 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0438 ZOREAL ID.",
1502
+ bodyEnrolling: "\u0414\u043E\u0432\u0440\u0448\u0438\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 ZOREAL ID-\u0430 \u043D\u0430 \u0441\u0432\u043E\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443, \u043F\u0430 \u043E\u0434\u043E\u0431\u0440\u0438\u0442\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0443.",
1503
+ waiting: "\u0427\u0435\u043A\u0430 \u0441\u0435 \u0441\u043A\u0435\u043D\u0438\u0440\u0430\u045A\u0435",
1504
+ waitingApproval: "\u0427\u0435\u043A\u0430 \u0441\u0435 \u043E\u0434\u043E\u0431\u0440\u0435\u045A\u0435",
1505
+ expiresIn: "\u0418\u0441\u0442\u0438\u0447\u0435 \u0437\u0430 {time}",
1506
+ secured: "ZOREAL Proof-of-Human \u0432\u0435\u0440\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0430",
1507
+ noIdTitle: "\u041D\u0435\u043C\u0430\u0442\u0435 ZOREAL ID?",
1508
+ noIdBody: "\u0421\u043A\u0435\u043D\u0438\u0440\u0430\u0458\u0442\u0435 \u0438\u0441\u0442\u0438 \u043A\u043E\u0434 \u0434\u0430 \u043F\u0440\u0435\u0443\u0437\u043C\u0435\u0442\u0435 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0443 \u0438 \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E \u0433\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0435. \u0422\u0440\u0430\u0458\u0435 \u0441\u0430\u043C\u043E \u043C\u0438\u043D\u0443\u0442.",
1509
+ cancel: "\u041E\u0442\u043A\u0430\u0436\u0438",
1510
+ close: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438",
1511
+ qrAlt: "QR \u043A\u043E\u0434 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u043F\u0440\u0435\u043A\u043E ZOREAL-\u0430",
1512
+ buttonContinue: "\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u0441\u0430 ZOREAL-\u043E\u043C"
1513
+ },
1514
+ // ไทย
1515
+ th: {
1516
+ title: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",
1517
+ titleIdentify: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E15\u0E31\u0E27\u0E15\u0E19\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
1518
+ titlePresence: "\u0E2A\u0E41\u0E01\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E1E\u0E34\u0E2A\u0E39\u0E08\u0E19\u0E4C\u0E27\u0E48\u0E32\u0E04\u0E38\u0E13\u0E40\u0E1B\u0E47\u0E19\u0E21\u0E19\u0E38\u0E29\u0E22\u0E4C\u0E08\u0E23\u0E34\u0E07",
1519
+ titleApprove: "\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E1A\u0E19\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
1520
+ bodyScan: "\u0E2A\u0E41\u0E01\u0E19\u0E14\u0E49\u0E27\u0E22\u0E01\u0E25\u0E49\u0E2D\u0E07\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E2B\u0E23\u0E37\u0E2D\u0E41\u0E2D\u0E1B ZOREAL ID",
1521
+ bodyApprove: "\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E43\u0E19\u0E41\u0E2D\u0E1B ZOREAL ID \u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13",
1522
+ bodyEnrolling: "\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32 ZOREAL ID \u0E1A\u0E19\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E43\u0E2B\u0E49\u0E40\u0E2A\u0E23\u0E47\u0E08\u0E2A\u0E34\u0E49\u0E19 \u0E41\u0E25\u0E49\u0E27\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",
1523
+ waiting: "\u0E23\u0E2D\u0E01\u0E32\u0E23\u0E2A\u0E41\u0E01\u0E19",
1524
+ waitingApproval: "\u0E23\u0E2D\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E21\u0E31\u0E15\u0E34",
1525
+ expiresIn: "\u0E2B\u0E21\u0E14\u0E2D\u0E32\u0E22\u0E38\u0E43\u0E19 {time}",
1526
+ secured: "\u0E01\u0E32\u0E23\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E15\u0E31\u0E27\u0E15\u0E19 Proof-of-Human \u0E42\u0E14\u0E22 ZOREAL",
1527
+ noIdTitle: "\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35 ZOREAL ID \u0E43\u0E0A\u0E48\u0E44\u0E2B\u0E21",
1528
+ noIdBody: "\u0E2A\u0E41\u0E01\u0E19\u0E42\u0E04\u0E49\u0E14\u0E40\u0E14\u0E35\u0E22\u0E27\u0E01\u0E31\u0E19\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E14\u0E32\u0E27\u0E19\u0E4C\u0E42\u0E2B\u0E25\u0E14\u0E41\u0E2D\u0E1B\u0E41\u0E25\u0E30\u0E2A\u0E23\u0E49\u0E32\u0E07\u0E1A\u0E31\u0E0D\u0E0A\u0E35\u0E1F\u0E23\u0E35 \u0E43\u0E0A\u0E49\u0E40\u0E27\u0E25\u0E32\u0E40\u0E1E\u0E35\u0E22\u0E07\u0E19\u0E32\u0E17\u0E35\u0E40\u0E14\u0E35\u0E22\u0E27",
1529
+ cancel: "\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",
1530
+ close: "\u0E1B\u0E34\u0E14",
1531
+ qrAlt: "\u0E04\u0E34\u0E27\u0E2D\u0E32\u0E23\u0E4C\u0E42\u0E04\u0E49\u0E14\u0E2A\u0E33\u0E2B\u0E23\u0E31\u0E1A\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E14\u0E49\u0E27\u0E22 ZOREAL",
1532
+ buttonContinue: "\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23\u0E15\u0E48\u0E2D\u0E14\u0E49\u0E27\u0E22 ZOREAL"
1533
+ },
1534
+ // Tagalog
1535
+ tl: {
1536
+ title: "I-scan para mag-sign in",
1537
+ titleIdentify: "I-scan para i-verify ang iyong pagkakakilanlan",
1538
+ titlePresence: "I-scan para patunayang tunay kang tao",
1539
+ titleApprove: "I-approve sa iyong telepono",
1540
+ bodyScan: "I-scan gamit ang camera ng iyong telepono o ang ZOREAL ID app.",
1541
+ bodyApprove: "I-approve ang login sa iyong ZOREAL ID app.",
1542
+ bodyEnrolling: "Tapusin muna ang pag-set up ng ZOREAL ID sa iyong telepono, pagkatapos ay i-approve ang login.",
1543
+ waiting: "Naghihintay ng scan",
1544
+ waitingApproval: "Naghihintay ng approval",
1545
+ expiresIn: "Mag-e-expire sa {time}",
1546
+ secured: "Proof-of-Human verification mula sa ZOREAL",
1547
+ noIdTitle: "Wala ka pang ZOREAL ID?",
1548
+ noIdBody: "I-scan ang parehong code para i-download ang app at gumawa ng iyong ZOREAL ID nang libre. Isang minuto lang ito.",
1549
+ cancel: "Kanselahin",
1550
+ close: "Isara",
1551
+ qrAlt: "QR code para mag-sign in gamit ang ZOREAL",
1552
+ buttonContinue: "Magpatuloy gamit ang ZOREAL"
1553
+ },
1554
+ // Türkçe
1555
+ tr: {
1556
+ title: "Giri\u015F i\xE7in taray\u0131n",
1557
+ titleIdentify: "Kimli\u011Finizi do\u011Frulamak i\xE7in taray\u0131n",
1558
+ titlePresence: "Ger\xE7ek bir insan oldu\u011Funuzu kan\u0131tlamak i\xE7in taray\u0131n",
1559
+ titleApprove: "Telefonunuzdan onaylay\u0131n",
1560
+ bodyScan: "Telefonunuzun kameras\u0131yla veya ZOREAL ID uygulamas\u0131yla taray\u0131n.",
1561
+ bodyApprove: "Giri\u015Fi ZOREAL ID uygulaman\u0131zdan onaylay\u0131n.",
1562
+ bodyEnrolling: "Telefonunuzda ZOREAL ID kurulumunu tamamlay\u0131n, ard\u0131ndan giri\u015Fi onaylay\u0131n.",
1563
+ waiting: "Tarama bekleniyor",
1564
+ waitingApproval: "Onay bekleniyor",
1565
+ expiresIn: "{time} i\xE7inde sona erer",
1566
+ secured: "ZOREAL taraf\u0131ndan Proof-of-Human do\u011Frulamas\u0131",
1567
+ noIdTitle: "Hen\xFCz ZOREAL ID'niz yok mu?",
1568
+ noIdBody: "Uygulamay\u0131 indirmek ve \xFCcretsiz bir tane olu\u015Fturmak i\xE7in ayn\u0131 kodu taray\u0131n. Sadece bir dakikan\u0131z\u0131 al\u0131r.",
1569
+ cancel: "\u0130ptal",
1570
+ close: "Kapat",
1571
+ qrAlt: "ZOREAL ile giri\u015F yapmak i\xE7in QR kodu",
1572
+ buttonContinue: "ZOREAL ile devam et"
1573
+ },
1574
+ // Українська
1575
+ uk: {
1576
+ title: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0443",
1577
+ titleIdentify: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435, \u0449\u043E\u0431 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0438 \u043E\u0441\u043E\u0431\u0443",
1578
+ titlePresence: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435, \u0449\u043E\u0431 \u0434\u043E\u0432\u0435\u0441\u0442\u0438, \u0449\u043E \u0432\u0438 \u0441\u043F\u0440\u0430\u0432\u0436\u043D\u044F \u043B\u044E\u0434\u0438\u043D\u0430",
1579
+ titleApprove: "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0456",
1580
+ bodyScan: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u043A\u0430\u043C\u0435\u0440\u043E\u044E \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443 \u0430\u0431\u043E \u0434\u043E\u0434\u0430\u0442\u043A\u043E\u043C ZOREAL ID.",
1581
+ bodyApprove: "\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0432\u0445\u0456\u0434 \u0443 \u0434\u043E\u0434\u0430\u0442\u043A\u0443 ZOREAL ID.",
1582
+ bodyEnrolling: "\u0417\u0430\u0432\u0435\u0440\u0448\u0456\u0442\u044C \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F ZOREAL ID \u043D\u0430 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0456, \u0430 \u043F\u043E\u0442\u0456\u043C \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0432\u0445\u0456\u0434.",
1583
+ waiting: "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",
1584
+ waitingApproval: "\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F",
1585
+ expiresIn: "\u0421\u043F\u043B\u0438\u0432\u0430\u0454 \u0447\u0435\u0440\u0435\u0437 {time}",
1586
+ secured: "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 Proof-of-Human \u0432\u0456\u0434 ZOREAL",
1587
+ noIdTitle: "\u0429\u0435 \u043D\u0435\u043C\u0430\u0454 ZOREAL ID?",
1588
+ noIdBody: "\u0421\u043A\u0430\u043D\u0443\u0439\u0442\u0435 \u0442\u043E\u0439 \u0441\u0430\u043C\u0438\u0439 \u043A\u043E\u0434, \u0449\u043E\u0431 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0434\u043E\u0434\u0430\u0442\u043E\u043A \u0456 \u0431\u0435\u0437\u043A\u043E\u0448\u0442\u043E\u0432\u043D\u043E \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0439\u043E\u0433\u043E. \u0426\u0435 \u0437\u0430\u0439\u043C\u0435 \u043B\u0438\u0448\u0435 \u0445\u0432\u0438\u043B\u0438\u043D\u0443.",
1589
+ cancel: "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438",
1590
+ close: "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
1591
+ qrAlt: "QR-\u043A\u043E\u0434 \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u0443 \u0447\u0435\u0440\u0435\u0437 ZOREAL",
1592
+ buttonContinue: "\u041F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u0437 ZOREAL"
1593
+ },
1594
+ // اردو
1595
+ ur: {
1596
+ title: "\u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA",
1597
+ titleIdentify: "\u0627\u067E\u0646\u06CC \u0634\u0646\u0627\u062E\u062A \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA",
1598
+ titlePresence: "\u06CC\u06C1 \u062B\u0627\u0628\u062A \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA \u06A9\u06C1 \u0622\u067E \u0627\u06CC\u06A9 \u062D\u0642\u06CC\u0642\u06CC \u0627\u0646\u0633\u0627\u0646 \u06C1\u06CC\u06BA",
1599
+ titleApprove: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u067E\u0631 \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA",
1600
+ bodyScan: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u06A9\u06D2 \u06A9\u06CC\u0645\u0631\u06D2 \u06CC\u0627 ZOREAL ID \u0627\u06CC\u067E \u0633\u06D2 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA\u06D4",
1601
+ bodyApprove: "\u0627\u067E\u0646\u06CC ZOREAL ID \u0627\u06CC\u067E \u0645\u06CC\u06BA \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u06CC \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA\u06D4",
1602
+ bodyEnrolling: "\u0627\u067E\u0646\u06D2 \u0641\u0648\u0646 \u067E\u0631 ZOREAL ID \u06A9\u06CC \u0633\u06CC\u0679 \u0627\u067E \u0645\u06A9\u0645\u0644 \u06A9\u0631\u06CC\u06BA\u060C \u067E\u06BE\u0631 \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u06CC \u0645\u0646\u0638\u0648\u0631\u06CC \u062F\u06CC\u06BA\u06D4",
1603
+ waiting: "\u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631",
1604
+ waitingApproval: "\u0645\u0646\u0638\u0648\u0631\u06CC \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631",
1605
+ expiresIn: "{time} \u0645\u06CC\u06BA \u062E\u062A\u0645 \u06C1\u0648\u06AF\u0627",
1606
+ secured: "ZOREAL \u06A9\u06CC \u062C\u0627\u0646\u0628 \u0633\u06D2 Proof-of-Human \u062A\u0635\u062F\u06CC\u0642",
1607
+ noIdTitle: "\u0627\u0628\u06BE\u06CC \u062A\u06A9 ZOREAL ID \u0646\u06C1\u06CC\u06BA \u06C1\u06D2\u061F",
1608
+ noIdBody: "\u0627\u06CC\u067E \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06A9\u0631\u0646\u06D2 \u0627\u0648\u0631 \u0645\u0641\u062A \u0645\u06CC\u06BA \u0627\u06CC\u06A9 \u0628\u0646\u0627\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0648\u06C1\u06CC \u06A9\u0648\u0688 \u0627\u0633\u06A9\u06CC\u0646 \u06A9\u0631\u06CC\u06BA\u06D4 \u0627\u0633 \u0645\u06CC\u06BA \u0635\u0631\u0641 \u0627\u06CC\u06A9 \u0645\u0646\u0679 \u0644\u06AF\u062A\u0627 \u06C1\u06D2\u06D4",
1609
+ cancel: "\u0645\u0646\u0633\u0648\u062E \u06A9\u0631\u06CC\u06BA",
1610
+ close: "\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",
1611
+ qrAlt: "ZOREAL \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u0644\u0627\u06AF \u0627\u0650\u0646 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 QR \u06A9\u0648\u0688",
1612
+ buttonContinue: "ZOREAL \u06A9\u06D2 \u0633\u0627\u062A\u06BE \u062C\u0627\u0631\u06CC \u0631\u06A9\u06BE\u06CC\u06BA"
1613
+ },
1614
+ // Tiếng Việt
1615
+ vi: {
1616
+ title: "Qu\xE9t \u0111\u1EC3 \u0111\u0103ng nh\u1EADp",
1617
+ titleIdentify: "Qu\xE9t \u0111\u1EC3 x\xE1c minh danh t\xEDnh c\u1EE7a b\u1EA1n",
1618
+ titlePresence: "Qu\xE9t \u0111\u1EC3 ch\u1EE9ng minh b\u1EA1n l\xE0 ng\u01B0\u1EDDi th\u1EADt",
1619
+ titleApprove: "Ph\xEA duy\u1EC7t tr\xEAn \u0111i\u1EC7n tho\u1EA1i c\u1EE7a b\u1EA1n",
1620
+ bodyScan: "Qu\xE9t b\u1EB1ng camera \u0111i\u1EC7n tho\u1EA1i ho\u1EB7c \u1EE9ng d\u1EE5ng ZOREAL ID.",
1621
+ bodyApprove: "Ph\xEA duy\u1EC7t \u0111\u0103ng nh\u1EADp trong \u1EE9ng d\u1EE5ng ZOREAL ID c\u1EE7a b\u1EA1n.",
1622
+ bodyEnrolling: "Ho\xE0n t\u1EA5t thi\u1EBFt l\u1EADp ZOREAL ID tr\xEAn \u0111i\u1EC7n tho\u1EA1i, sau \u0111\xF3 ph\xEA duy\u1EC7t \u0111\u0103ng nh\u1EADp.",
1623
+ waiting: "\u0110ang ch\u1EDD qu\xE9t m\xE3",
1624
+ waitingApproval: "\u0110ang ch\u1EDD ph\xEA duy\u1EC7t",
1625
+ expiresIn: "H\u1EBFt h\u1EA1n sau {time}",
1626
+ secured: "X\xE1c minh Proof-of-Human b\u1EDFi ZOREAL",
1627
+ noIdTitle: "Ch\u01B0a c\xF3 ZOREAL ID?",
1628
+ noIdBody: "Qu\xE9t c\xF9ng m\xE3 n\xE0y \u0111\u1EC3 t\u1EA3i \u1EE9ng d\u1EE5ng v\xE0 t\u1EA1o t\xE0i kho\u1EA3n mi\u1EC5n ph\xED. Ch\u1EC9 m\u1EA5t m\u1ED9t ph\xFAt.",
1629
+ cancel: "H\u1EE7y",
1630
+ close: "\u0110\xF3ng",
1631
+ qrAlt: "M\xE3 QR \u0111\u1EC3 \u0111\u0103ng nh\u1EADp b\u1EB1ng ZOREAL",
1632
+ buttonContinue: "Ti\u1EBFp t\u1EE5c v\u1EDBi ZOREAL"
1633
+ }
1634
+ };
1635
+ var RTL = /* @__PURE__ */ new Set(["ar", "he", "iw", "ur"]);
1636
+ var ALIASES = {
1637
+ nb: "no",
1638
+ // Bokmål — what we actually wrote
1639
+ nn: "no",
1640
+ // Nynorsk reader, served Bokmål: closer than English
1641
+ fil: "tl",
1642
+ // Filipino / Tagalog
1643
+ iw: "he",
1644
+ // superseded code for Hebrew, still emitted by some platforms
1645
+ in: "id"
1646
+ // superseded code for Indonesian
1647
+ };
1648
+ var LATAM = /* @__PURE__ */ new Set([
1649
+ "ar",
1650
+ "bo",
1651
+ "cl",
1652
+ "co",
1653
+ "cr",
1654
+ "cu",
1655
+ "do",
1656
+ "ec",
1657
+ "gt",
1658
+ "hn",
1659
+ "mx",
1660
+ "ni",
1661
+ "pa",
1662
+ "pe",
1663
+ "pr",
1664
+ "py",
1665
+ "sv",
1666
+ "uy",
1667
+ "ve",
1668
+ "419"
1669
+ ]);
1670
+ function lookup(locale) {
1671
+ const tag = locale.toLowerCase().replace(/_/g, "-");
1672
+ const parts = tag.split("-");
1673
+ const primary = ALIASES[parts[0]] ?? parts[0];
1674
+ const region = parts[1];
1675
+ if (primary === "zh") {
1676
+ const simplified = /(^|-)(hans|cn|sg|my)(-|$)/.test(tag);
1677
+ return TRANSLATIONS[simplified ? "zhs" : "zht"];
1678
+ }
1679
+ if (primary === "es" && region && LATAM.has(region)) return TRANSLATIONS["es-419"];
1680
+ if (primary === "pt" && region === "br") return TRANSLATIONS["pt-br"];
1681
+ return TRANSLATIONS[tag] ?? TRANSLATIONS[primary];
1682
+ }
1683
+ function browserLocales() {
1684
+ if (typeof navigator === "undefined") return [];
1685
+ const nav = navigator;
1686
+ if (nav.languages && nav.languages.length) return [...nav.languages];
1687
+ return nav.language ? [nav.language] : [];
1554
1688
  }
1555
- @media (prefers-reduced-motion: reduce) {
1556
- .${PREFIX2}-ring-svg rect { animation: none; stroke-dasharray: none; opacity: 0.45; }
1557
- .${PREFIX2}-ring-halo, .${PREFIX2}-ring-head { display: none; }
1689
+ function strings(locale) {
1690
+ if (locale) return lookup(locale) ?? en;
1691
+ for (const candidate of browserLocales()) {
1692
+ const hit = lookup(candidate);
1693
+ if (hit) return hit;
1694
+ }
1695
+ return en;
1558
1696
  }
1559
-
1560
-
1561
- @media (prefers-reduced-motion: reduce) {
1562
- .${PREFIX2}-scrim,
1563
- .${PREFIX2}-card,
1564
- .${PREFIX2}-qr-overlay { animation: none }
1565
- .${PREFIX2}-dot i:first-child { animation: none; opacity: 0.35 }
1566
- .${PREFIX2}-qr,
1567
- .${PREFIX2}-cancel,
1568
- .${PREFIX2}-close,
1569
- .${PREFIX2}-timer { transition: none }
1570
- /* No travelling light; the edge keeps its dim static glow instead. */
1571
- .${PREFIX2}-qr-beam::after,
1572
- .${PREFIX2}-qr-beam-glow-band::after { animation: none; opacity: 0 }
1573
- .${PREFIX2}-qr-beam::before { opacity: 0.55 }
1574
- .${PREFIX2}-qr-beam-glow-band::before { opacity: 0.7 }
1697
+ function isRtl(locale) {
1698
+ const tag = locale ?? browserLocales()[0];
1699
+ if (!tag) return false;
1700
+ return RTL.has(tag.toLowerCase().replace(/_/g, "-").split("-")[0]);
1575
1701
  }
1576
- `;
1577
- function ensureStyles() {
1578
- if (typeof document === "undefined") return;
1579
- if (document.getElementById(STYLE_ELEMENT_ID)) return;
1580
- const el2 = document.createElement("style");
1581
- el2.id = STYLE_ELEMENT_ID;
1582
- el2.textContent = CSS;
1583
- document.head.appendChild(el2);
1702
+ function interpolate(template, time) {
1703
+ return template.replace("{time}", time);
1584
1704
  }
1585
1705
 
1586
1706
  // src/modal.ts
@@ -1597,9 +1717,9 @@ function el(tag, className, text) {
1597
1717
  if (text !== void 0) node.textContent = text;
1598
1718
  return node;
1599
1719
  }
1600
- var SVG_NS = "http://www.w3.org/2000/svg";
1720
+ var SVG_NS2 = "http://www.w3.org/2000/svg";
1601
1721
  function svg(viewBox, attrs = {}) {
1602
- const node = document.createElementNS(SVG_NS, "svg");
1722
+ const node = document.createElementNS(SVG_NS2, "svg");
1603
1723
  node.setAttribute("viewBox", viewBox);
1604
1724
  node.setAttribute("focusable", "false");
1605
1725
  node.setAttribute("aria-hidden", "true");
@@ -1607,7 +1727,7 @@ function svg(viewBox, attrs = {}) {
1607
1727
  return node;
1608
1728
  }
1609
1729
  function path(d, attrs = {}) {
1610
- const node = document.createElementNS(SVG_NS, "path");
1730
+ const node = document.createElementNS(SVG_NS2, "path");
1611
1731
  node.setAttribute("d", d);
1612
1732
  for (const [k, v] of Object.entries(attrs)) node.setAttribute(k, v);
1613
1733
  return node;
@@ -1645,7 +1765,7 @@ function lockup(height) {
1645
1765
  node.setAttribute("role", "img");
1646
1766
  node.setAttribute("aria-label", "ZOREAL");
1647
1767
  node.appendChild(path(WORDMARK, { fill: "currentColor" }));
1648
- const g = document.createElementNS(SVG_NS, "g");
1768
+ const g = document.createElementNS(SVG_NS2, "g");
1649
1769
  g.setAttribute("fill", ZOREAL_BLUE);
1650
1770
  g.setAttribute("fill-rule", "evenodd");
1651
1771
  for (const d of MARK_PATHS) g.appendChild(path(d));
@@ -1964,10 +2084,13 @@ function startLogin(options) {
1964
2084
  let stopRefresh = () => {
1965
2085
  };
1966
2086
  controller.signal.addEventListener("abort", () => stopRefresh());
2087
+ const releaseControl = options.control ? holdBusy(options.control) : () => {
2088
+ };
1967
2089
  const teardown = () => {
1968
2090
  stopRefresh();
1969
2091
  modal?.close();
1970
2092
  modal = null;
2093
+ releaseControl();
1971
2094
  };
1972
2095
  const run = async () => {
1973
2096
  const verifier = generateVerifier();
@@ -2028,7 +2151,7 @@ function startLogin(options) {
2028
2151
  controller.signal,
2029
2152
  { tolerateUnknownUntil: Date.now() + 15e3 }
2030
2153
  );
2031
- if (isReturnDone(requestId)) {
2154
+ if (!await visibleOrDone(requestId, controller.signal)) {
2032
2155
  throw new DOMException("aborted", "AbortError");
2033
2156
  }
2034
2157
  } else {
@@ -2193,6 +2316,8 @@ function resumeLogin(options) {
2193
2316
  forgetReturnFlow(id);
2194
2317
  const issuer = options.issuer ?? saved.issuer;
2195
2318
  const controller = new AbortController();
2319
+ const releaseControl = options.control ? holdBusy(options.control) : () => {
2320
+ };
2196
2321
  const promise = (async () => {
2197
2322
  const code = await pollUntilApproved(
2198
2323
  issuer,
@@ -2227,6 +2352,7 @@ function resumeLogin(options) {
2227
2352
  markReturnDone(id);
2228
2353
  return response;
2229
2354
  })();
2355
+ promise.then(releaseControl, releaseControl);
2230
2356
  promise.catch(() => {
2231
2357
  });
2232
2358
  return {