metag-verify 0.1.0 → 0.1.1
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/esm2022/lib/screens/selfie/selfie.component.mjs +81 -9
- package/esm2022/lib/services/camera.mjs +120 -0
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/metag-verify.mjs +200 -9
- package/fesm2022/metag-verify.mjs.map +1 -1
- package/lib/screens/selfie/selfie.component.d.ts +22 -0
- package/lib/services/camera.d.ts +15 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/metag-verify-0.1.0.tgz +0 -0
|
@@ -4,6 +4,7 @@ import { NO_CONNECTION_MESSAGE } from '../../services/metag-api.service';
|
|
|
4
4
|
import { isVirtualCamera } from '../../services/virtual-camera';
|
|
5
5
|
import { G_LOGO_DATA_URI } from '../../theme/brand';
|
|
6
6
|
import { BrightnessBoost } from '../../services/screen-brightness';
|
|
7
|
+
import { focusAt, getCameraControls, hasMultipleCameras, openCamera, resumeAutofocus, stopStream, } from '../../services/camera';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
const JPEG_QUALITY = 0.75;
|
|
9
10
|
/** Cuenta regresiva antes de tomar la foto: 3, 2, 1. */
|
|
@@ -22,6 +23,9 @@ const TIPS = [
|
|
|
22
23
|
const EMPTY_POSTER = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
|
|
23
24
|
/** Tiempo que se muestra "Verificación completada" antes de cerrar. */
|
|
24
25
|
const SUCCESS_HOLD_MS = 1200;
|
|
26
|
+
/** Tiempo que se muestra el círculo de enfoque y tras el cual vuelve el enfoque continuo. */
|
|
27
|
+
const FOCUS_RING_MS = 800;
|
|
28
|
+
const FOCUS_HOLD_MS = 3000;
|
|
25
29
|
const CAMERA_ERROR_MESSAGE = 'No pudimos acceder a la cámara. Revisa los permisos e intenta de nuevo.';
|
|
26
30
|
/**
|
|
27
31
|
* Foto Selfie, diseño A: cámara al 100% de la pantalla y botón rectangular "Tomar Fotografía".
|
|
@@ -38,6 +42,12 @@ export class SelfieComponent {
|
|
|
38
42
|
this.emptyPoster = EMPTY_POSTER;
|
|
39
43
|
/** La cámara ya está transmitiendo imagen. */
|
|
40
44
|
this.cameraReady = signal(false);
|
|
45
|
+
/** Por defecto la trasera; la frontal queda disponible con el botón de cambiar cámara. */
|
|
46
|
+
this.facing = signal('environment');
|
|
47
|
+
this.canSwitchCamera = signal(false);
|
|
48
|
+
this.tapFocus = false;
|
|
49
|
+
/** Punto donde se tocó para enfocar (px dentro de la pantalla); el id reinicia la animación. */
|
|
50
|
+
this.focusPoint = signal(null);
|
|
41
51
|
this.tips = TIPS;
|
|
42
52
|
this.tipIndex = signal(0);
|
|
43
53
|
this.tipLeaving = signal(false);
|
|
@@ -51,6 +61,8 @@ export class SelfieComponent {
|
|
|
51
61
|
this.tipTimer = null;
|
|
52
62
|
this.tipLeaveTimer = null;
|
|
53
63
|
this.successTimer = null;
|
|
64
|
+
this.focusRingTimer = null;
|
|
65
|
+
this.focusHoldTimer = null;
|
|
54
66
|
this.destroyed = false;
|
|
55
67
|
}
|
|
56
68
|
async ngAfterViewInit() {
|
|
@@ -62,6 +74,7 @@ export class SelfieComponent {
|
|
|
62
74
|
this.stopTips();
|
|
63
75
|
if (this.successTimer)
|
|
64
76
|
clearTimeout(this.successTimer);
|
|
77
|
+
this.clearFocusTimers();
|
|
65
78
|
this.stopCountdown();
|
|
66
79
|
this.stopCamera();
|
|
67
80
|
}
|
|
@@ -80,6 +93,29 @@ export class SelfieComponent {
|
|
|
80
93
|
void this.captureAndSend();
|
|
81
94
|
}, 1000);
|
|
82
95
|
}
|
|
96
|
+
switchCamera() {
|
|
97
|
+
if (this.sending() || this.success() || this.countdown() !== null || !this.cameraReady())
|
|
98
|
+
return;
|
|
99
|
+
this.facing.update(f => (f === 'environment' ? 'user' : 'environment'));
|
|
100
|
+
this.stopCamera();
|
|
101
|
+
void this.startCamera();
|
|
102
|
+
}
|
|
103
|
+
/** Enfocar al tocar: se ignoran los toques sobre botones y textos. */
|
|
104
|
+
async onTap(event) {
|
|
105
|
+
if (!this.tapFocus || !this.cameraReady() || this.sending() || this.success())
|
|
106
|
+
return;
|
|
107
|
+
if (event.target.closest('button, .mv-hint'))
|
|
108
|
+
return;
|
|
109
|
+
const video = this.videoRef.nativeElement;
|
|
110
|
+
const rect = video.getBoundingClientRect();
|
|
111
|
+
const point = this.toVideoPoint(video, rect, event.clientX, event.clientY);
|
|
112
|
+
if (!point || !(await focusAt(this.stream, point.x, point.y)))
|
|
113
|
+
return;
|
|
114
|
+
this.clearFocusTimers();
|
|
115
|
+
this.focusPoint.set({ x: event.clientX - rect.left, y: event.clientY - rect.top, id: Date.now() });
|
|
116
|
+
this.focusRingTimer = setTimeout(() => this.focusPoint.set(null), FOCUS_RING_MS);
|
|
117
|
+
this.focusHoldTimer = setTimeout(() => void resumeAutofocus(this.stream), FOCUS_HOLD_MS);
|
|
118
|
+
}
|
|
83
119
|
close() {
|
|
84
120
|
if (this.sending() || this.success())
|
|
85
121
|
return;
|
|
@@ -99,11 +135,9 @@ export class SelfieComponent {
|
|
|
99
135
|
void this.videoRef.nativeElement.play().catch(() => undefined);
|
|
100
136
|
}
|
|
101
137
|
async startCamera() {
|
|
138
|
+
this.cameraReady.set(false);
|
|
102
139
|
try {
|
|
103
|
-
this.stream = await
|
|
104
|
-
video: { width: { ideal: 1920 }, height: { ideal: 1080 }, facingMode: 'user' },
|
|
105
|
-
audio: false,
|
|
106
|
-
});
|
|
140
|
+
this.stream = await openCamera(this.facing());
|
|
107
141
|
}
|
|
108
142
|
catch {
|
|
109
143
|
this.dialog.set({ message: CAMERA_ERROR_MESSAGE, fatal: true });
|
|
@@ -120,8 +154,43 @@ export class SelfieComponent {
|
|
|
120
154
|
}
|
|
121
155
|
const video = this.videoRef.nativeElement;
|
|
122
156
|
video.srcObject = this.stream;
|
|
123
|
-
|
|
157
|
+
// El brillo al máximo solo sirve con la frontal: la pantalla ilumina el rostro.
|
|
158
|
+
if (this.facing() === 'user')
|
|
159
|
+
void this.brightness.raise();
|
|
160
|
+
this.canSwitchCamera.set(await hasMultipleCameras());
|
|
124
161
|
await video.play().catch(() => undefined);
|
|
162
|
+
// Las capacidades se leen con el video ya transmitiendo: algunos Android no reportan la linterna antes.
|
|
163
|
+
const stream = this.stream;
|
|
164
|
+
const controls = await getCameraControls(stream);
|
|
165
|
+
// Si mientras tanto se cambió o cerró la cámara, estos controles ya no aplican.
|
|
166
|
+
if (this.destroyed || stream !== this.stream)
|
|
167
|
+
return;
|
|
168
|
+
this.tapFocus = controls.tapFocus;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Convierte el toque en pantalla a coordenadas 0-1 de la imagen real del lente,
|
|
172
|
+
* considerando el recorte de object-fit: cover y el espejo de la frontal.
|
|
173
|
+
*/
|
|
174
|
+
toVideoPoint(video, rect, clientX, clientY) {
|
|
175
|
+
if (!video.videoWidth || !video.videoHeight)
|
|
176
|
+
return null;
|
|
177
|
+
const scale = Math.max(rect.width / video.videoWidth, rect.height / video.videoHeight);
|
|
178
|
+
const shownW = video.videoWidth * scale;
|
|
179
|
+
const shownH = video.videoHeight * scale;
|
|
180
|
+
let x = (clientX - rect.left - (rect.width - shownW) / 2) / shownW;
|
|
181
|
+
const y = (clientY - rect.top - (rect.height - shownH) / 2) / shownH;
|
|
182
|
+
if (this.facing() === 'user')
|
|
183
|
+
x = 1 - x;
|
|
184
|
+
const clamp = (v) => Math.min(1, Math.max(0, v));
|
|
185
|
+
return { x: clamp(x), y: clamp(y) };
|
|
186
|
+
}
|
|
187
|
+
clearFocusTimers() {
|
|
188
|
+
if (this.focusRingTimer)
|
|
189
|
+
clearTimeout(this.focusRingTimer);
|
|
190
|
+
if (this.focusHoldTimer)
|
|
191
|
+
clearTimeout(this.focusHoldTimer);
|
|
192
|
+
this.focusRingTimer = null;
|
|
193
|
+
this.focusHoldTimer = null;
|
|
125
194
|
}
|
|
126
195
|
async captureAndSend() {
|
|
127
196
|
const video = this.videoRef.nativeElement;
|
|
@@ -204,16 +273,19 @@ export class SelfieComponent {
|
|
|
204
273
|
this.countdown.set(null);
|
|
205
274
|
}
|
|
206
275
|
stopCamera() {
|
|
207
|
-
this.stream
|
|
276
|
+
stopStream(this.stream);
|
|
208
277
|
this.stream = null;
|
|
278
|
+
this.tapFocus = false;
|
|
279
|
+
this.clearFocusTimers();
|
|
280
|
+
this.focusPoint.set(null);
|
|
209
281
|
void this.brightness.restore();
|
|
210
282
|
}
|
|
211
283
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelfieComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
212
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SelfieComponent, isStandalone: true, selector: "mv-selfie", inputs: { submit: "submit" }, outputs: { completed: "completed", closed: "closed", blocked: "blocked", failed: "failed" }, viewQueries: [{ propertyName: "videoRef", first: true, predicate: ["video"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"mv-camera\">\n <!-- poster transparente: evita el \u00EDcono gris de \"play\" que Android WebView muestra mientras arranca la c\u00E1mara -->\n <video #video class=\"mv-video\" [class.mv-video--ready]=\"cameraReady()\" [poster]=\"emptyPoster\"\n muted autoplay playsinline (playing)=\"cameraReady.set(true)\"></video>\n <div class=\"mv-scrim\" aria-hidden=\"true\"></div>\n\n <div class=\"mv-ui\">\n <header class=\"mv-head\">\n <div class=\"mv-title-group\">\n <img class=\"mv-title-logo\" [src]=\"gLogo\" alt=\"\" aria-hidden=\"true\" />\n <h2 class=\"mv-title\">Foto Selfie</h2>\n </div>\n <button type=\"button\" class=\"mv-close\" aria-label=\"Cerrar\" [disabled]=\"sending() || success()\" (click)=\"close()\">\n
|
|
284
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SelfieComponent, isStandalone: true, selector: "mv-selfie", inputs: { submit: "submit" }, outputs: { completed: "completed", closed: "closed", blocked: "blocked", failed: "failed" }, viewQueries: [{ propertyName: "videoRef", first: true, predicate: ["video"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"mv-camera\">\n <!-- poster transparente: evita el \u00EDcono gris de \"play\" que Android WebView muestra mientras arranca la c\u00E1mara -->\n <video #video class=\"mv-video\" [class.mv-video--ready]=\"cameraReady()\" [class.mv-video--mirror]=\"facing() === 'user'\" [poster]=\"emptyPoster\"\n muted autoplay playsinline (playing)=\"cameraReady.set(true)\"></video>\n <div class=\"mv-scrim\" aria-hidden=\"true\"></div>\n\n @if (focusPoint(); as p) {\n @for (id of [p.id]; track id) {\n <span class=\"mv-focus-ring\" [style.left.px]=\"p.x\" [style.top.px]=\"p.y\" aria-hidden=\"true\"></span>\n }\n }\n\n <!-- Tocar la imagen enfoca en ese punto (si el lente lo soporta) -->\n <div class=\"mv-ui\" (click)=\"onTap($event)\">\n <header class=\"mv-head\">\n <div class=\"mv-title-group\">\n <img class=\"mv-title-logo\" [src]=\"gLogo\" alt=\"\" aria-hidden=\"true\" />\n <h2 class=\"mv-title\">Foto Selfie</h2>\n </div>\n <!-- La X arriba y debajo los controles en columna, como en las apps de c\u00E1mara -->\n <div class=\"mv-actions\">\n <button type=\"button\" class=\"mv-close\" aria-label=\"Cerrar\" [disabled]=\"sending() || success()\" (click)=\"close()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\" /></svg>\n </button>\n @if (!sending() && !success()) {\n <div class=\"mv-tools\">\n @if (canSwitchCamera()) {\n <button type=\"button\" class=\"mv-close mv-tool\" aria-label=\"Cambiar c\u00E1mara\"\n [disabled]=\"!cameraReady() || countdown() !== null\" (click)=\"switchCamera()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M11 19H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h5 M13 5h7a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-5 M12 9a3 3 0 1 0 0 6a3 3 0 1 0 0-6 M18 22l-3-3l3-3 M6 2l3 3l-3 3\" /></svg>\n </button>\n }\n </div>\n }\n </div>\n </header>\n\n <div class=\"mv-spacer\"></div>\n\n <footer class=\"mv-foot\">\n @if (countdown() !== null) {\n <!-- @for recrea el elemento en cada n\u00FAmero para repetir la animaci\u00F3n -->\n @for (n of [countdown()]; track n) {\n <p class=\"mv-hint mv-countdown\" aria-live=\"assertive\">{{ n }}</p>\n }\n } @else if (success()) {\n <p class=\"mv-hint mv-success-text\" role=\"status\" aria-live=\"polite\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M5 12.5l4.5 4.5L19 7.5\" /></svg>\n Verificaci\u00F3n completada\n </p>\n } @else {\n @if (sending()) {\n <p class=\"mv-hint\" aria-live=\"polite\">Validando foto...</p>\n } @else {\n <!-- Tips rotativos: el recuadro se queda fijo y solo cambia el contenido -->\n <div class=\"mv-hint mv-tips\">\n <span class=\"mv-sr-only\">{{ tips[0].text }}</span>\n @for (i of [tipIndex()]; track i) {\n <span class=\"mv-tip\" [class.mv-tip--leaving]=\"tipLeaving()\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\"><path [attr.d]=\"tips[i].icon\" /></svg>\n {{ tips[i].text }}\n </span>\n }\n </div>\n }\n }\n @if (sending()) {\n <span class=\"mv-sending-bar\" aria-hidden=\"true\"></span>\n } @else if (success()) {\n <span class=\"mv-success-bar\" aria-hidden=\"true\"></span>\n }\n <!-- Oculto mientras se env\u00EDa y al confirmar el \u00E9xito; vuelve a aparecer si hay error para reintentar -->\n @if (!sending() && !success()) {\n <button type=\"button\" class=\"mv-button\" [disabled]=\"!cameraReady() || countdown() !== null\" (click)=\"takePhoto()\">\n Tomar Fotograf\u00EDa\n </button>\n }\n </footer>\n </div>\n\n @if (dialog(); as d) {\n <mv-dialog [message]=\"d.message\" (closed)=\"onDialogClosed()\"></mv-dialog>\n }\n</div>\n", styles: [":host{display:block;height:100%}.mv-camera{position:relative;height:100%;overflow:hidden;background:#000}.mv-video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000;opacity:0;transition:opacity .3s ease}.mv-video--mirror{transform:scaleX(-1)}.mv-video--ready{opacity:1}.mv-scrim{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,#00000080,#0000 22% 62%,#0009)}.mv-focus-ring{position:absolute;width:64px;height:64px;margin:-32px 0 0 -32px;border-radius:50%;box-shadow:inset 0 0 0 1.5px #fff;pointer-events:none;animation:mv-focus .8s ease-out both}@keyframes mv-focus{0%{opacity:0;transform:scale(1.4)}25%{opacity:1;transform:scale(1)}75%{opacity:1}to{opacity:0;transform:scale(1)}}@media (prefers-reduced-motion: reduce){.mv-focus-ring{animation:none}}.mv-ui{position:absolute;inset:0;display:flex;flex-direction:column;padding:max(22px,env(safe-area-inset-top)) 22px max(22px,env(safe-area-inset-bottom));color:#fff}.mv-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.mv-title-group{display:flex;align-items:center;gap:10px;min-width:0}.mv-title-logo{flex-shrink:0;width:36px;height:36px}.mv-title{margin:0;font-family:var(--mv-font);font-size:20px;font-weight:600;letter-spacing:-.025em;line-height:1.2;font-size:26px;line-height:36px;color:#fff}.mv-close{flex-shrink:0;width:36px;height:36px;padding:0;border:0;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:#ffffff2e;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);color:#fff;cursor:pointer}.mv-close svg{width:24px;height:24px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round}.mv-close:disabled{opacity:.4;cursor:default}.mv-close:focus-visible{outline:2px solid #ffffff;outline-offset:2px}.mv-actions{display:flex;flex-direction:column;align-items:center;gap:16px}.mv-tools{display:flex;flex-direction:column;gap:12px}.mv-tool svg{width:20px;height:20px;stroke-width:2;stroke-linejoin:round}.mv-spacer{flex:1}.mv-foot{display:flex;flex-direction:column;gap:16px}.mv-hint{margin:0 0 16px;font-family:var(--mv-font);font-size:14px;font-weight:400;line-height:1.5;align-self:center;max-width:100%;padding:10px 18px;border-radius:14px;background:#09090b80;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);font-size:18px;font-weight:500;color:#fff;text-align:center}.mv-tips{width:min(100%,300px);overflow:hidden}.mv-tip{display:inline-flex;align-items:center;justify-content:center;gap:8px;animation:mv-tip-in .3s ease-out backwards;transition:opacity .25s ease,transform .25s ease}.mv-tip svg{width:20px;height:20px;flex-shrink:0;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.mv-tip--leaving{opacity:0;transform:translateY(-6px)}@keyframes mv-tip-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){.mv-tip{animation:none;transition:none}}.mv-sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.mv-countdown{min-width:64px;font-size:28px;font-weight:600;line-height:1;font-variant-numeric:tabular-nums;color:#fff;animation:mv-count-pop .35s ease-out both}@keyframes mv-count-pop{0%{opacity:0;transform:scale(.7)}to{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion: reduce){.mv-countdown{animation:none}}.mv-button{height:52px;border:0;border-radius:14px;font-family:var(--mv-font);font-size:15px;font-weight:600;letter-spacing:-.01em;width:100%;background:var(--mv-primary);color:#fff;cursor:pointer;transition:background-color .15s ease,transform .12s ease,opacity .15s ease;font-size:18px}.mv-button:hover{background:var(--mv-primary-hover)}.mv-button:active{transform:scale(.985)}.mv-button:disabled{opacity:.5;cursor:default;transform:none}.mv-button:focus-visible{outline:2px solid var(--mv-primary);outline-offset:3px}.mv-sending-bar{position:relative;height:8px;border-radius:999px;background:#ffffff4d;overflow:hidden}.mv-sending-bar:after{content:\"\";position:absolute;top:0;bottom:0;width:40%;border-radius:999px;background:var(--mv-accent);animation:mv-track-slide 1.1s cubic-bezier(.6,.1,.4,.9) infinite}@keyframes mv-track-slide{0%{left:-40%}to{left:100%}}@media (prefers-reduced-motion: reduce){.mv-sending-bar:after{animation-duration:2.4s}}.mv-success-bar{height:8px;border-radius:999px;background:#ffffff4d;overflow:hidden}.mv-success-bar:after{content:\"\";display:block;height:100%;border-radius:999px;background:var(--mv-success);animation:mv-success-fill .35s ease-out both}@keyframes mv-success-fill{0%{width:40%}to{width:100%}}.mv-success-text{display:inline-flex;align-items:center;justify-content:center;gap:8px;color:#fff;animation:mv-count-pop .3s ease-out both}.mv-success-text svg{width:22px;height:22px;flex-shrink:0;stroke:var(--mv-success);fill:none;stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round}@media (prefers-reduced-motion: reduce){.mv-success-bar:after,.mv-success-text{animation:none}}@media (min-width: 768px){.mv-ui{padding:28px 32px}.mv-foot{width:100%;max-width:380px;margin:0 auto}}\n"], dependencies: [{ kind: "component", type: DialogComponent, selector: "mv-dialog", inputs: ["title", "message", "buttonLabel"], outputs: ["closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
213
285
|
}
|
|
214
286
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelfieComponent, decorators: [{
|
|
215
287
|
type: Component,
|
|
216
|
-
args: [{ selector: 'mv-selfie', standalone: true, imports: [DialogComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mv-camera\">\n <!-- poster transparente: evita el \u00EDcono gris de \"play\" que Android WebView muestra mientras arranca la c\u00E1mara -->\n <video #video class=\"mv-video\" [class.mv-video--ready]=\"cameraReady()\" [poster]=\"emptyPoster\"\n muted autoplay playsinline (playing)=\"cameraReady.set(true)\"></video>\n <div class=\"mv-scrim\" aria-hidden=\"true\"></div>\n\n <div class=\"mv-ui\">\n <header class=\"mv-head\">\n <div class=\"mv-title-group\">\n <img class=\"mv-title-logo\" [src]=\"gLogo\" alt=\"\" aria-hidden=\"true\" />\n <h2 class=\"mv-title\">Foto Selfie</h2>\n </div>\n <button type=\"button\" class=\"mv-close\" aria-label=\"Cerrar\" [disabled]=\"sending() || success()\" (click)=\"close()\">\n
|
|
288
|
+
args: [{ selector: 'mv-selfie', standalone: true, imports: [DialogComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mv-camera\">\n <!-- poster transparente: evita el \u00EDcono gris de \"play\" que Android WebView muestra mientras arranca la c\u00E1mara -->\n <video #video class=\"mv-video\" [class.mv-video--ready]=\"cameraReady()\" [class.mv-video--mirror]=\"facing() === 'user'\" [poster]=\"emptyPoster\"\n muted autoplay playsinline (playing)=\"cameraReady.set(true)\"></video>\n <div class=\"mv-scrim\" aria-hidden=\"true\"></div>\n\n @if (focusPoint(); as p) {\n @for (id of [p.id]; track id) {\n <span class=\"mv-focus-ring\" [style.left.px]=\"p.x\" [style.top.px]=\"p.y\" aria-hidden=\"true\"></span>\n }\n }\n\n <!-- Tocar la imagen enfoca en ese punto (si el lente lo soporta) -->\n <div class=\"mv-ui\" (click)=\"onTap($event)\">\n <header class=\"mv-head\">\n <div class=\"mv-title-group\">\n <img class=\"mv-title-logo\" [src]=\"gLogo\" alt=\"\" aria-hidden=\"true\" />\n <h2 class=\"mv-title\">Foto Selfie</h2>\n </div>\n <!-- La X arriba y debajo los controles en columna, como en las apps de c\u00E1mara -->\n <div class=\"mv-actions\">\n <button type=\"button\" class=\"mv-close\" aria-label=\"Cerrar\" [disabled]=\"sending() || success()\" (click)=\"close()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\" /></svg>\n </button>\n @if (!sending() && !success()) {\n <div class=\"mv-tools\">\n @if (canSwitchCamera()) {\n <button type=\"button\" class=\"mv-close mv-tool\" aria-label=\"Cambiar c\u00E1mara\"\n [disabled]=\"!cameraReady() || countdown() !== null\" (click)=\"switchCamera()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M11 19H4a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h5 M13 5h7a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-5 M12 9a3 3 0 1 0 0 6a3 3 0 1 0 0-6 M18 22l-3-3l3-3 M6 2l3 3l-3 3\" /></svg>\n </button>\n }\n </div>\n }\n </div>\n </header>\n\n <div class=\"mv-spacer\"></div>\n\n <footer class=\"mv-foot\">\n @if (countdown() !== null) {\n <!-- @for recrea el elemento en cada n\u00FAmero para repetir la animaci\u00F3n -->\n @for (n of [countdown()]; track n) {\n <p class=\"mv-hint mv-countdown\" aria-live=\"assertive\">{{ n }}</p>\n }\n } @else if (success()) {\n <p class=\"mv-hint mv-success-text\" role=\"status\" aria-live=\"polite\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M5 12.5l4.5 4.5L19 7.5\" /></svg>\n Verificaci\u00F3n completada\n </p>\n } @else {\n @if (sending()) {\n <p class=\"mv-hint\" aria-live=\"polite\">Validando foto...</p>\n } @else {\n <!-- Tips rotativos: el recuadro se queda fijo y solo cambia el contenido -->\n <div class=\"mv-hint mv-tips\">\n <span class=\"mv-sr-only\">{{ tips[0].text }}</span>\n @for (i of [tipIndex()]; track i) {\n <span class=\"mv-tip\" [class.mv-tip--leaving]=\"tipLeaving()\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\"><path [attr.d]=\"tips[i].icon\" /></svg>\n {{ tips[i].text }}\n </span>\n }\n </div>\n }\n }\n @if (sending()) {\n <span class=\"mv-sending-bar\" aria-hidden=\"true\"></span>\n } @else if (success()) {\n <span class=\"mv-success-bar\" aria-hidden=\"true\"></span>\n }\n <!-- Oculto mientras se env\u00EDa y al confirmar el \u00E9xito; vuelve a aparecer si hay error para reintentar -->\n @if (!sending() && !success()) {\n <button type=\"button\" class=\"mv-button\" [disabled]=\"!cameraReady() || countdown() !== null\" (click)=\"takePhoto()\">\n Tomar Fotograf\u00EDa\n </button>\n }\n </footer>\n </div>\n\n @if (dialog(); as d) {\n <mv-dialog [message]=\"d.message\" (closed)=\"onDialogClosed()\"></mv-dialog>\n }\n</div>\n", styles: [":host{display:block;height:100%}.mv-camera{position:relative;height:100%;overflow:hidden;background:#000}.mv-video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000;opacity:0;transition:opacity .3s ease}.mv-video--mirror{transform:scaleX(-1)}.mv-video--ready{opacity:1}.mv-scrim{position:absolute;inset:0;pointer-events:none;background:linear-gradient(180deg,#00000080,#0000 22% 62%,#0009)}.mv-focus-ring{position:absolute;width:64px;height:64px;margin:-32px 0 0 -32px;border-radius:50%;box-shadow:inset 0 0 0 1.5px #fff;pointer-events:none;animation:mv-focus .8s ease-out both}@keyframes mv-focus{0%{opacity:0;transform:scale(1.4)}25%{opacity:1;transform:scale(1)}75%{opacity:1}to{opacity:0;transform:scale(1)}}@media (prefers-reduced-motion: reduce){.mv-focus-ring{animation:none}}.mv-ui{position:absolute;inset:0;display:flex;flex-direction:column;padding:max(22px,env(safe-area-inset-top)) 22px max(22px,env(safe-area-inset-bottom));color:#fff}.mv-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.mv-title-group{display:flex;align-items:center;gap:10px;min-width:0}.mv-title-logo{flex-shrink:0;width:36px;height:36px}.mv-title{margin:0;font-family:var(--mv-font);font-size:20px;font-weight:600;letter-spacing:-.025em;line-height:1.2;font-size:26px;line-height:36px;color:#fff}.mv-close{flex-shrink:0;width:36px;height:36px;padding:0;border:0;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:#ffffff2e;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);color:#fff;cursor:pointer}.mv-close svg{width:24px;height:24px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round}.mv-close:disabled{opacity:.4;cursor:default}.mv-close:focus-visible{outline:2px solid #ffffff;outline-offset:2px}.mv-actions{display:flex;flex-direction:column;align-items:center;gap:16px}.mv-tools{display:flex;flex-direction:column;gap:12px}.mv-tool svg{width:20px;height:20px;stroke-width:2;stroke-linejoin:round}.mv-spacer{flex:1}.mv-foot{display:flex;flex-direction:column;gap:16px}.mv-hint{margin:0 0 16px;font-family:var(--mv-font);font-size:14px;font-weight:400;line-height:1.5;align-self:center;max-width:100%;padding:10px 18px;border-radius:14px;background:#09090b80;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);font-size:18px;font-weight:500;color:#fff;text-align:center}.mv-tips{width:min(100%,300px);overflow:hidden}.mv-tip{display:inline-flex;align-items:center;justify-content:center;gap:8px;animation:mv-tip-in .3s ease-out backwards;transition:opacity .25s ease,transform .25s ease}.mv-tip svg{width:20px;height:20px;flex-shrink:0;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.mv-tip--leaving{opacity:0;transform:translateY(-6px)}@keyframes mv-tip-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){.mv-tip{animation:none;transition:none}}.mv-sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.mv-countdown{min-width:64px;font-size:28px;font-weight:600;line-height:1;font-variant-numeric:tabular-nums;color:#fff;animation:mv-count-pop .35s ease-out both}@keyframes mv-count-pop{0%{opacity:0;transform:scale(.7)}to{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion: reduce){.mv-countdown{animation:none}}.mv-button{height:52px;border:0;border-radius:14px;font-family:var(--mv-font);font-size:15px;font-weight:600;letter-spacing:-.01em;width:100%;background:var(--mv-primary);color:#fff;cursor:pointer;transition:background-color .15s ease,transform .12s ease,opacity .15s ease;font-size:18px}.mv-button:hover{background:var(--mv-primary-hover)}.mv-button:active{transform:scale(.985)}.mv-button:disabled{opacity:.5;cursor:default;transform:none}.mv-button:focus-visible{outline:2px solid var(--mv-primary);outline-offset:3px}.mv-sending-bar{position:relative;height:8px;border-radius:999px;background:#ffffff4d;overflow:hidden}.mv-sending-bar:after{content:\"\";position:absolute;top:0;bottom:0;width:40%;border-radius:999px;background:var(--mv-accent);animation:mv-track-slide 1.1s cubic-bezier(.6,.1,.4,.9) infinite}@keyframes mv-track-slide{0%{left:-40%}to{left:100%}}@media (prefers-reduced-motion: reduce){.mv-sending-bar:after{animation-duration:2.4s}}.mv-success-bar{height:8px;border-radius:999px;background:#ffffff4d;overflow:hidden}.mv-success-bar:after{content:\"\";display:block;height:100%;border-radius:999px;background:var(--mv-success);animation:mv-success-fill .35s ease-out both}@keyframes mv-success-fill{0%{width:40%}to{width:100%}}.mv-success-text{display:inline-flex;align-items:center;justify-content:center;gap:8px;color:#fff;animation:mv-count-pop .3s ease-out both}.mv-success-text svg{width:22px;height:22px;flex-shrink:0;stroke:var(--mv-success);fill:none;stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round}@media (prefers-reduced-motion: reduce){.mv-success-bar:after,.mv-success-text{animation:none}}@media (min-width: 768px){.mv-ui{padding:28px 32px}.mv-foot{width:100%;max-width:380px;margin:0 auto}}\n"] }]
|
|
217
289
|
}], propDecorators: { submit: [{
|
|
218
290
|
type: Input,
|
|
219
291
|
args: [{ required: true }]
|
|
@@ -229,4 +301,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
229
301
|
type: ViewChild,
|
|
230
302
|
args: ['video', { static: true }]
|
|
231
303
|
}] } });
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZmllLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21ldGFnLXZlcmlmeS9zcmMvbGliL3NjcmVlbnMvc2VsZmllL3NlbGZpZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhZy12ZXJpZnkvc3JjL2xpYi9zY3JlZW5zL3NlbGZpZS9zZWxmaWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7O0FBRW5FLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQix3REFBd0Q7QUFDeEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLDhEQUE4RDtBQUM5RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDN0IsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBRXpCLDZGQUE2RjtBQUM3RixNQUFNLElBQUksR0FBa0Q7SUFDMUQsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLHlHQUF5RyxFQUFFO0lBQzdJLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSwyRUFBMkUsRUFBRTtJQUMvRyxFQUFFLElBQUksRUFB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LENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLENBQUM7K0dBbk1VLGVBQWU7bUdBQWYsZUFBZSxpVENwRDVCLGkyRkFnRUEsdytJRGpCWSxlQUFlOzs0RkFLZCxlQUFlO2tCQVIzQixTQUFTOytCQUNFLFdBQVcsY0FDVCxJQUFJLFdBQ1AsQ0FBQyxlQUFlLENBQUMsbUJBQ1QsdUJBQXVCLENBQUMsTUFBTTs4QkFNcEIsTUFBTTtzQkFBaEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBRWYsU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBRXVDLFFBQVE7c0JBQXJELFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9kaWFsb2cvZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOT19DT05ORUNUSU9OX01FU1NBR0UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZXRhZy1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBpc1ZpcnR1YWxDYW1lcmEgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aXJ0dWFsLWNhbWVyYSc7XG5pbXBvcnQgeyBHX0xPR09fREFUQV9VUkkgfSBmcm9tICcuLi8uLi90aGVtZS9icmFuZCc7XG5pbXBvcnQgeyBCcmlnaHRuZXNzQm9vc3QgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zY3JlZW4tYnJpZ2h0bmVzcyc7XG5cbmNvbnN0IEpQRUdfUVVBTElUWSA9IDAuNzU7XG4vKiogQ3VlbnRhIHJlZ3Jlc2l2YSBhbnRlcyBkZSB0b21hciBsYSBmb3RvOiAzLCAyLCAxLiAqL1xuY29uc3QgQ09VTlRET1dOX0ZST00gPSAzO1xuLyoqIFRpZW1wbyBxdWUgc2UgbXVlc3RyYSBjYWRhIHRpcCB5IGR1cmFjacOzbiBkZSBzdSBzYWxpZGEuICovXG5jb25zdCBUSVBfSU5URVJWQUxfTVMgPSAzMDAwO1xuY29uc3QgVElQX0xFQVZFX01TID0gMjUwO1xuXG4vKiogVGlwcyBxdWUgcm90YW4gbWllbnRyYXMgbGEgcGVyc29uYSBzZSBwcmVwYXJhIChvcmRlbiBmaWpvOiBlbCBtw6FzIGltcG9ydGFudGUgcHJpbWVybykuICovXG5jb25zdCBUSVBTOiBSZWFkb25seUFycmF5PHsgdGV4dDogc3RyaW5nOyBpY29uOiBzdHJpbmcgfT4gPSBbXG4gIHsgdGV4dDogJ1Blcm1hbmVjZSBxdWlldG8nLCBpY29uOiAnTTEyIDNhOSA5IDAgMSAwIDAgMThhOSA5IDAgMSAwIDAtMTggTTkgMTBoLjAxIE0xNSAxMGguMDEgTTguNSAxNC41YzEgMS4yIDIuMiAxLjggMy41IDEuOHMyLjUtLjYgMy41LTEuOCcgfSxcbiAgeyB0ZXh0OiAnU29sbyB1bmEgcGVyc29uYScsIGljb246ICdNMTIgNGE0IDQgMCAxIDAgMCA4YTQgNCAwIDEgMCAwLTggTTQgMjBjMS41LTMuNSA0LjQtNS41IDgtNS41czYuNSAyIDggNS41JyB9LFxuICB7IHRleHQ6ICdCdXNjYSBidWVuYSBpbHVtaW5hY2nDs24nLCBpY29uOiAnTTEyIDhhNCA0IDAgMSAwIDAgOGE0IDQgMCAxIDAgMC04IE0xMiAydjIgTTEyIDIwdjIgTTQuOSA0LjlsMS40IDEuNCBNMTcuNyAxNy43bDEuNCAxLjQgTTIgMTJoMiBNMjAgMTJoMiBNNC45IDE5LjFsMS40LTEuNCBNMTcuNyA2LjNsMS40LTEuNCcgfSxcbiAgeyB0ZXh0OiAnU2luIGxlbnRlcyBuaSBnb3JyYScsIGljb246ICdNNyAxMWEzIDMgMCAxIDAgMCA2YTMgMyAwIDEgMCAwLTYgTTE3IDExYTMgMyAwIDEgMCAwIDZhMyAzIDAgMSAwIDAtNiBNMTAgMTRoNCBNMyA0bDE4IDE2JyB9XG5dO1xuLyoqIEdJRiB0cmFuc3BhcmVudGUgZGUgMXgxIHBhcmEgZWwgcG9zdGVyIGRlbCB2aWRlby4gKi9cbmNvbnN0IEVNUFRZX1BPU1RFUiA9ICdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFBQUFBUC8vL3lINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQlJBQTcnO1xuLyoqIFRpZW1wbyBxdWUgc2UgbXVlc3RyYSBcIlZlcmlmaWNhY2nDs24gY29tcGxldGFkYVwiIGFudGVzIGRlIGNlcnJhci4gKi9cbmNvbnN0IFNVQ0NFU1NfSE9MRF9NUyA9IDEyMDA7XG5jb25zdCBDQU1FUkFfRVJST1JfTUVTU0FHRSA9ICdObyBwdWRpbW9zIGFjY2VkZXIgYSBsYSBjw6FtYXJhLiBSZXZpc2EgbG9zIHBlcm1pc29zIGUgaW50ZW50YSBkZSBudWV2by4nO1xuXG50eXBlIERpYWxvZ1N0YXRlID0geyBtZXNzYWdlOiBzdHJpbmc7IGZhdGFsOiBib29sZWFuIH0gfCBudWxsO1xuXG4vKipcbiAqIEZvdG8gU2VsZmllLCBkaXNlw7FvIEE6IGPDoW1hcmEgYWwgMTAwJSBkZSBsYSBwYW50YWxsYSB5IGJvdMOzbiByZWN0YW5ndWxhciBcIlRvbWFyIEZvdG9ncmFmw61hXCIuXG4gKiBMYSBmb3RvIHNlIHRvbWEgYWwgaW5zdGFudGU7IG1pZW50cmFzIHNlIHZhbGlkYSwgbGEgYmFycmEgcm9qYSBpbmZlcmlvciBpbmRpY2EgZWwgZW52w61vLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdi1zZWxmaWUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbRGlhbG9nQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxmaWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vc2VsZmllLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZmllQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIEVudsOtYSBsYSBmb3RvIChkYXRhIFVSTCBKUEVHKS4gU2kgbGFuemEgZXJyb3IsIHNlIG11ZXN0cmEgZWwgbWVuc2FqZSB5IHNlIHBlcm1pdGUgcmVpbnRlbnRhci4gKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc3VibWl0ITogKGZpbGVCYXNlNjQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIExhIGZvdG8gZnVlIGFjZXB0YWRhIHkgeWEgc2UgbW9zdHLDsyBsYSBjb25maXJtYWNpw7NuLiAqL1xuICBAT3V0cHV0KCkgY29tcGxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgYmxvY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZGVvJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSB2aWRlb1JlZiE6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XG5cbiAgcmVhZG9ubHkgZ0xvZ28gPSBHX0xPR09fREFUQV9VUkk7XG4gIHJlYWRvbmx5IGVtcHR5UG9zdGVyID0gRU1QVFlfUE9TVEVSO1xuICAvKiogTGEgY8OhbWFyYSB5YSBlc3TDoSB0cmFuc21pdGllbmRvIGltYWdlbi4gKi9cbiAgcmVhZG9ubHkgY2FtZXJhUmVhZHkgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB0aXBzID0gVElQUztcbiAgcmVhZG9ubHkgdGlwSW5kZXggPSBzaWduYWwoMCk7XG4gIHJlYWRvbmx5IHRpcExlYXZpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBzZW5kaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc3VjY2VzcyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGNvdW50ZG93biA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgZGlhbG9nID0gc2lnbmFsPERpYWxvZ1N0YXRlPihudWxsKTtcblxuICBwcml2YXRlIHN0cmVhbTogTWVkaWFTdHJlYW0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBicmlnaHRuZXNzID0gbmV3IEJyaWdodG5lc3NCb29zdCgpO1xuICBwcml2YXRlIGNvdW50ZG93blRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0aXBUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdGlwTGVhdmVUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdWNjZXNzVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhcnRUaXBzKCk7XG4gICAgYXdhaXQgdGhpcy5zdGFydENhbWVyYSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuc3RvcFRpcHMoKTtcbiAgICBpZiAodGhpcy5zdWNjZXNzVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnN1Y2Nlc3NUaW1lcik7XG4gICAgdGhpcy5zdG9wQ291bnRkb3duKCk7XG4gICAgdGhpcy5zdG9wQ2FtZXJhKCk7XG4gIH1cblxuICB0YWtlUGhvdG8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VuZGluZygpIHx8IHRoaXMuc3VjY2VzcygpIHx8IHRoaXMuY291bnRkb3duKCkgIT09IG51bGwgfHwgIXRoaXMuc3RyZWFtKSByZXR1cm47XG4gICAgdGhpcy5zdG9wVGlwcygpO1xuICAgIHRoaXMuY291bnRkb3duLnNldChDT1VOVERPV05fRlJPTSk7XG4gICAgdGhpcy5jb3VudGRvd25UaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSAodGhpcy5jb3VudGRvd24oKSA/PyAxKSAtIDE7XG4gICAgICBpZiAobmV4dCA+IDApIHtcbiAgICAgICAgdGhpcy5jb3VudGRvd24uc2V0KG5leHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0b3BDb3VudGRvd24oKTtcbiAgICAgIHZvaWQgdGhpcy5jYXB0dXJlQW5kU2VuZCgpO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VuZGluZygpIHx8IHRoaXMuc3VjY2VzcygpKSByZXR1cm47XG4gICAgdGhpcy5zdG9wQ291bnRkb3duKCk7XG4gICAgdGhpcy5zdG9wQ2FtZXJhKCk7XG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICB9XG5cbiAgb25EaWFsb2dDbG9zZWQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRpYWxvZygpO1xuICAgIHRoaXMuZGlhbG9nLnNldChudWxsKTtcbiAgICBpZiAoc3RhdGU/LmZhdGFsKSB7XG4gICAgICB0aGlzLmZhaWxlZC5lbWl0KHN0YXRlLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZWludGVudG86IHNlIHJlYW51ZGEgbGEgY8OhbWFyYSB5IGxvcyB0aXBzIGVtcGllemFuIGRlIG51ZXZvLlxuICAgIHRoaXMuc3RhcnRUaXBzKCk7XG4gICAgdm9pZCB0aGlzLnZpZGVvUmVmLm5hdGl2ZUVsZW1lbnQucGxheSgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YXJ0Q2FtZXJhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcbiAgICAgICAgdmlkZW86IHsgd2lkdGg6IHsgaWRlYWw6IDE5MjAgfSwgaGVpZ2h0OiB7IGlkZWFsOiAxMDgwIH0sIGZhY2luZ01vZGU6ICd1c2VyJyB9LFxuICAgICAgICBhdWRpbzogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuZGlhbG9nLnNldCh7IG1lc3NhZ2U6IENBTUVSQV9FUlJPUl9NRVNTQUdFLCBmYXRhbDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMuc3RvcENhbWVyYSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCBpc1ZpcnR1YWxDYW1lcmEodGhpcy5zdHJlYW0pKSB7XG4gICAgICB0aGlzLnN0b3BDYW1lcmEoKTtcbiAgICAgIHRoaXMuYmxvY2tlZC5lbWl0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZpZGVvUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdmlkZW8uc3JjT2JqZWN0ID0gdGhpcy5zdHJlYW07XG4gICAgdm9pZCB0aGlzLmJyaWdodG5lc3MucmFpc2UoKTtcbiAgICBhd2FpdCB2aWRlby5wbGF5KCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FwdHVyZUFuZFNlbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZpZGVvUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZUJhc2U2NCA9IHRoaXMuZ3JhYkZyYW1lKHZpZGVvKTtcbiAgICB2aWRlby5wYXVzZSgpO1xuXG4gICAgaWYgKCFmaWxlQmFzZTY0KSB7XG4gICAgICB0aGlzLmRpYWxvZy5zZXQoeyBtZXNzYWdlOiAnTm8gc2UgcHVkbyByZWFsaXphciBlbCBwcm9jZXNvLicsIGZhdGFsOiBmYWxzZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLm9uTGluZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZGlhbG9nLnNldCh7IG1lc3NhZ2U6IE5PX0NPTk5FQ1RJT05fTUVTU0FHRSwgZmF0YWw6IGZhbHNlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VuZGluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc3VibWl0KGZpbGVCYXNlNjQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdObyBzZSBwdWRvIHJlYWxpemFyIGVsIHByb2Nlc28uJztcbiAgICAgIHRoaXMuc2VuZGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5kaWFsb2cuc2V0KHsgbWVzc2FnZSwgZmF0YWw6IGZhbHNlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIMOJeGl0byBlbiBsYSBtaXNtYSBwYW50YWxsYTogYmFycmEgY29tcGxldGEgZW4gdmVyZGUsIHRleHRvIGRlIGNvbmZpcm1hY2nDs24geSBsYSBmb3RvIGNvbmdlbGFkYS5cbiAgICB0aGlzLnNlbmRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnN1Y2Nlc3Muc2V0KHRydWUpO1xuICAgIHRoaXMuc3RvcENhbWVyYSgpO1xuICAgIHRoaXMudmlicmF0ZSgpO1xuICAgIHRoaXMuc3VjY2Vzc1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmNvbXBsZXRlZC5lbWl0KCksIFNVQ0NFU1NfSE9MRF9NUyk7XG4gIH1cblxuICAvKiogVG9tYSBlbCBjdWFkcm8gY29tcGxldG8gZGVsIHZpZGVvIChzaW4gZXNwZWpvKSBjb21vIEpQRUcuICovXG4gIHByaXZhdGUgZ3JhYkZyYW1lKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3Qgd2lkdGggPSB2aWRlby52aWRlb1dpZHRoIHx8IDE5MjA7XG4gICAgY29uc3QgaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQgfHwgMTA4MDtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcbiAgICBjdHguZHJhd0ltYWdlKHZpZGVvLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIEpQRUdfUVVBTElUWSk7XG4gIH1cblxuICAvKiogVmlicmFjacOzbiBjb3J0YSBkZSBjb25maXJtYWNpw7NuIChBbmRyb2lkOyBpT1Mgbm8gbG8gcGVybWl0ZSBkZXNkZSBlbCBuYXZlZ2Fkb3IpLiAqL1xuICBwcml2YXRlIHZpYnJhdGUoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIG5hdmlnYXRvci52aWJyYXRlPy4oNjApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU2luIHNvcG9ydGU6IG5vIHBhc2EgbmFkYS5cbiAgICB9XG4gIH1cblxuICAvKiogUm90YSBsb3MgdGlwczogZWwgYWN0dWFsIHNhbGUgeSBsdWVnbyBlbnRyYSBlbCBzaWd1aWVudGUuICovXG4gIHByaXZhdGUgc3RhcnRUaXBzKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFRpcHMoKTtcbiAgICB0aGlzLnRpcEluZGV4LnNldCgwKTtcbiAgICB0aGlzLnRpcExlYXZpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnRpcFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy50aXBMZWF2aW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMudGlwTGVhdmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRpcEluZGV4LnVwZGF0ZShpID0+IChpICsgMSkgJSBUSVBTLmxlbmd0aCk7XG4gICAgICAgIHRoaXMudGlwTGVhdmluZy5zZXQoZmFsc2UpO1xuICAgICAgfSwgVElQX0xFQVZFX01TKTtcbiAgICB9LCBUSVBfSU5URVJWQUxfTVMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wVGlwcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aXBUaW1lcikgY2xlYXJJbnRlcnZhbCh0aGlzLnRpcFRpbWVyKTtcbiAgICBpZiAodGhpcy50aXBMZWF2ZVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy50aXBMZWF2ZVRpbWVyKTtcbiAgICB0aGlzLnRpcFRpbWVyID0gbnVsbDtcbiAgICB0aGlzLnRpcExlYXZlVGltZXIgPSBudWxsO1xuICAgIHRoaXMudGlwTGVhdmluZy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wQ291bnRkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvdW50ZG93blRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuY291bnRkb3duVGltZXIpO1xuICAgICAgdGhpcy5jb3VudGRvd25UaW1lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY291bnRkb3duLnNldChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENhbWVyYSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0cmVhbT8uZ2V0VHJhY2tzKCkuZm9yRWFjaCh0cmFjayA9PiB0cmFjay5zdG9wKCkpO1xuICAgIHRoaXMuc3RyZWFtID0gbnVsbDtcbiAgICB2b2lkIHRoaXMuYnJpZ2h0bmVzcy5yZXN0b3JlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtdi1jYW1lcmFcIj5cbiAgPCEtLSBwb3N0ZXIgdHJhbnNwYXJlbnRlOiBldml0YSBlbCDDrWNvbm8gZ3JpcyBkZSBcInBsYXlcIiBxdWUgQW5kcm9pZCBXZWJWaWV3IG11ZXN0cmEgbWllbnRyYXMgYXJyYW5jYSBsYSBjw6FtYXJhIC0tPlxuICA8dmlkZW8gI3ZpZGVvIGNsYXNzPVwibXYtdmlkZW9cIiBbY2xhc3MubXYtdmlkZW8tLXJlYWR5XT1cImNhbWVyYVJlYWR5KClcIiBbcG9zdGVyXT1cImVtcHR5UG9zdGVyXCJcbiAgICAgICAgIG11dGVkIGF1dG9wbGF5IHBsYXlzaW5saW5lIChwbGF5aW5nKT1cImNhbWVyYVJlYWR5LnNldCh0cnVlKVwiPjwvdmlkZW8+XG4gIDxkaXYgY2xhc3M9XCJtdi1zY3JpbVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtdi11aVwiPlxuICAgIDxoZWFkZXIgY2xhc3M9XCJtdi1oZWFkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibXYtdGl0bGUtZ3JvdXBcIj5cbiAgICAgICAgPGltZyBjbGFzcz1cIm12LXRpdGxlLWxvZ29cIiBbc3JjXT1cImdMb2dvXCIgYWx0PVwiXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgPGgyIGNsYXNzPVwibXYtdGl0bGVcIj5Gb3RvIFNlbGZpZTwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibXYtY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2VycmFyXCIgW2Rpc2FibGVkXT1cInNlbmRpbmcoKSB8fCBzdWNjZXNzKClcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48cGF0aCBkPVwiTTYgNmwxMiAxMk0xOCA2TDYgMThcIiAvPjwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9oZWFkZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXYtc3BhY2VyXCI+PC9kaXY+XG5cbiAgICA8Zm9vdGVyIGNsYXNzPVwibXYtZm9vdFwiPlxuICAgICAgQGlmIChjb3VudGRvd24oKSAhPT0gbnVsbCkge1xuICAgICAgICA8IS0tIEBmb3IgcmVjcmVhIGVsIGVsZW1lbnRvIGVuIGNhZGEgbsO6bWVybyBwYXJhIHJlcGV0aXIgbGEgYW5pbWFjacOzbiAtLT5cbiAgICAgICAgQGZvciAobiBvZiBbY291bnRkb3duKCldOyB0cmFjayBuKSB7XG4gICAgICAgICAgPHAgY2xhc3M9XCJtdi1oaW50IG12LWNvdW50ZG93blwiIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPnt7IG4gfX08L3A+XG4gICAgICAgIH1cbiAgICAgIH0gQGVsc2UgaWYgKHN1Y2Nlc3MoKSkge1xuICAgICAgICA8cCBjbGFzcz1cIm12LWhpbnQgbXYtc3VjY2Vzcy10ZXh0XCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxwYXRoIGQ9XCJNNSAxMi41bDQuNSA0LjVMMTkgNy41XCIgLz48L3N2Zz5cbiAgICAgICAgICBWZXJpZmljYWNpw7NuIGNvbXBsZXRhZGFcbiAgICAgICAgPC9wPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBpZiAoc2VuZGluZygpKSB7XG4gICAgICAgICAgPHAgY2xhc3M9XCJtdi1oaW50XCIgYXJpYS1saXZlPVwicG9saXRlXCI+VmFsaWRhbmRvIGZvdG8uLi48L3A+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDwhLS0gVGlwcyByb3RhdGl2b3M6IGVsIHJlY3VhZHJvIHNlIHF1ZWRhIGZpam8geSBzb2xvIGNhbWJpYSBlbCBjb250ZW5pZG8gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm12LWhpbnQgbXYtdGlwc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdi1zci1vbmx5XCI+e3sgdGlwc1swXS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgQGZvciAoaSBvZiBbdGlwSW5kZXgoKV07IHRyYWNrIGkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdi10aXBcIiBbY2xhc3MubXYtdGlwLS1sZWF2aW5nXT1cInRpcExlYXZpbmcoKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIFthdHRyLmRdPVwidGlwc1tpXS5pY29uXCIgLz48L3N2Zz5cbiAgICAgICAgICAgICAgICB7eyB0aXBzW2ldLnRleHQgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBAaWYgKHNlbmRpbmcoKSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm12LXNlbmRpbmctYmFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgfSBAZWxzZSBpZiAoc3VjY2VzcygpKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXYtc3VjY2Vzcy1iYXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICB9XG4gICAgICA8IS0tIE9jdWx0byBtaWVudHJhcyBzZSBlbnbDrWEgeSBhbCBjb25maXJtYXIgZWwgw6l4aXRvOyB2dWVsdmUgYSBhcGFyZWNlciBzaSBoYXkgZXJyb3IgcGFyYSByZWludGVudGFyIC0tPlxuICAgICAgQGlmICghc2VuZGluZygpICYmICFzdWNjZXNzKCkpIHtcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtdi1idXR0b25cIiBbZGlzYWJsZWRdPVwiIWNhbWVyYVJlYWR5KCkgfHwgY291bnRkb3duKCkgIT09IG51bGxcIiAoY2xpY2spPVwidGFrZVBob3RvKClcIj5cbiAgICAgICAgICBUb21hciBGb3RvZ3JhZsOtYVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Zvb3Rlcj5cbiAgPC9kaXY+XG5cbiAgQGlmIChkaWFsb2coKTsgYXMgZCkge1xuICAgIDxtdi1kaWFsb2cgW21lc3NhZ2VdPVwiZC5tZXNzYWdlXCIgKGNsb3NlZCk9XCJvbkRpYWxvZ0Nsb3NlZCgpXCI+PC9tdi1kaWFsb2c+XG4gIH1cbjwvZGl2PlxuIl19
|
|
304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZmllLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21ldGFnLXZlcmlmeS9zcmMvbGliL3NjcmVlbnMvc2VsZmllL3NlbGZpZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhZy12ZXJpZnkvc3JjL2xpYi9zY3JlZW5zL3NlbGZpZS9zZWxmaWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUVMLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixlQUFlLEVBQ2YsVUFBVSxHQUNYLE1BQU0sdUJBQXVCLENBQUM7O0FBRS9CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQix3REFBd0Q7QUFDeEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLDhEQUE4RDtBQUM5RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDN0IsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBRXpCLDZGQUE2RjtBQUM3RixNQUFNLElBQUksR0FBa0Q7SUFDMUQsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLHlHQUF5RyxFQUFFO0lBQzdJLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSwyRUFBMkUsRUFBRTtJQUMvRyxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsNklBQTZJLEVBQUU7SUFDeEwsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLDBGQUEwRixFQUFFO0NBQ2xJLENBQUM7QUFDRix3REFBd0Q7QUFDeEQsTUFBTSxZQUFZLEdBQUcsZ0ZBQWdGLENBQUM7QUFDdEcsdUVBQXVFO0FBQ3ZFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztBQUM3Qiw2RkFBNkY7QUFDN0YsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLG9CQUFvQixHQUFHLHlFQUF5RSxDQUFDO0FBSXZHOzs7R0FHRztBQVNILE1BQU0sT0FBTyxlQUFlO0lBUjVCO1FBV0UsMkRBQTJEO1FBQ2pELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3JDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ25DLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBSXJDLFVBQUssR0FBRyxlQUFlLENBQUM7UUFDeEIsZ0JBQVcsR0FBRyxZQUFZLENBQUM7UUFDcEMsOENBQThDO1FBQ3JDLGdCQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLDBGQUEwRjtRQUNqRixXQUFNLEdBQUcsTUFBTSxDQUFlLGFBQWEsQ0FBQyxDQUFDO1FBQzdDLG9CQUFlLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDekIsZ0dBQWdHO1FBQ3ZGLGVBQVUsR0FBRyxNQUFNLENBQThDLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixhQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLGVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsWUFBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixZQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3hDLFdBQU0sR0FBRyxNQUFNLENBQWMsSUFBSSxDQUFDLENBQUM7UUFFcEMsV0FBTSxHQUF1QixJQUFJLENBQUM7UUFDekIsZUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFDNUMsbUJBQWMsR0FBMEMsSUFBSSxDQUFDO1FBQzdELGFBQVEsR0FBMEMsSUFBSSxDQUFDO1FBQ3ZELGtCQUFhLEdBQXlDLElBQUksQ0FBQztRQUMzRCxpQkFBWSxHQUF5QyxJQUFJLENBQUM7UUFDMUQsbUJBQWMsR0FBeUMsSUFBSSxDQUFDO1FBQzVELG1CQUFjLEdBQXlDLElBQUksQ0FBQztRQUM1RCxjQUFTLEdBQUcsS0FBSyxDQUFDO0tBK04zQjtJQTdOQyxLQUFLLENBQUMsZUFBZTtRQUNuQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzFGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDckMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixLQUFLLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM3QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU87UUFDakcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQWlCO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTztRQUN0RixJQUFLLEtBQUssQ0FBQyxNQUFzQixDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztZQUFFLE9BQU87UUFFdEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBRXRFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFBRSxPQUFPO1FBQzdDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsY0FBYztRQUNaLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7UUFDRCxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRSxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUMxQyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDOUIsZ0ZBQWdGO1FBQ2hGLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLE1BQU07WUFBRSxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDckQsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLHdHQUF3RztRQUN4RyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sUUFBUSxHQUFHLE1BQU0saUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsZ0ZBQWdGO1FBQ2hGLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3JELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssWUFBWSxDQUFDLEtBQXVCLEVBQUUsSUFBYSxFQUFFLE9BQWUsRUFBRSxPQUFlO1FBQzNGLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDbkUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLE1BQU07WUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzRCxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFZCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDOUUsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25FLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQztZQUM1RyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMzQyxPQUFPO1FBQ1QsQ0FBQztRQUVELGtHQUFrRztRQUNsRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsZ0VBQWdFO0lBQ3hELFNBQVMsQ0FBQyxLQUF1QjtRQUN2QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN0QixHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCx1RkFBdUY7SUFDL0UsT0FBTztRQUNiLElBQUksQ0FBQztZQUNILFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsNkJBQTZCO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ3hELFNBQVM7UUFDZixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNuQixDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVPLFFBQVE7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxhQUFhO1lBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU8sVUFBVTtRQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQyxDQUFDOytHQW5RVSxlQUFlO21HQUFmLGVBQWUsaVRDaEU1Qiw2N0hBb0ZBLGlsS0R6QlksZUFBZTs7NEZBS2QsZUFBZTtrQkFSM0IsU0FBUzsrQkFDRSxXQUFXLGNBQ1QsSUFBSSxXQUNQLENBQUMsZUFBZSxDQUFDLG1CQUNULHVCQUF1QixDQUFDLE1BQU07OEJBTXBCLE1BQU07c0JBQWhDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVmLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUV1QyxRQUFRO3NCQUFyRCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vZGlhbG9nL2RpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTk9fQ09OTkVDVElPTl9NRVNTQUdFIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWV0YWctYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgaXNWaXJ0dWFsQ2FtZXJhIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmlydHVhbC1jYW1lcmEnO1xuaW1wb3J0IHsgR19MT0dPX0RBVEFfVVJJIH0gZnJvbSAnLi4vLi4vdGhlbWUvYnJhbmQnO1xuaW1wb3J0IHsgQnJpZ2h0bmVzc0Jvb3N0IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2NyZWVuLWJyaWdodG5lc3MnO1xuaW1wb3J0IHtcbiAgQ2FtZXJhRmFjaW5nLFxuICBmb2N1c0F0LFxuICBnZXRDYW1lcmFDb250cm9scyxcbiAgaGFzTXVsdGlwbGVDYW1lcmFzLFxuICBvcGVuQ2FtZXJhLFxuICByZXN1bWVBdXRvZm9jdXMsXG4gIHN0b3BTdHJlYW0sXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NhbWVyYSc7XG5cbmNvbnN0IEpQRUdfUVVBTElUWSA9IDAuNzU7XG4vKiogQ3VlbnRhIHJlZ3Jlc2l2YSBhbnRlcyBkZSB0b21hciBsYSBmb3RvOiAzLCAyLCAxLiAqL1xuY29uc3QgQ09VTlRET1dOX0ZST00gPSAzO1xuLyoqIFRpZW1wbyBxdWUgc2UgbXVlc3RyYSBjYWRhIHRpcCB5IGR1cmFjacOzbiBkZSBzdSBzYWxpZGEuICovXG5jb25zdCBUSVBfSU5URVJWQUxfTVMgPSAzMDAwO1xuY29uc3QgVElQX0xFQVZFX01TID0gMjUwO1xuXG4vKiogVGlwcyBxdWUgcm90YW4gbWllbnRyYXMgbGEgcGVyc29uYSBzZSBwcmVwYXJhIChvcmRlbiBmaWpvOiBlbCBtw6FzIGltcG9ydGFudGUgcHJpbWVybykuICovXG5jb25zdCBUSVBTOiBSZWFkb25seUFycmF5PHsgdGV4dDogc3RyaW5nOyBpY29uOiBzdHJpbmcgfT4gPSBbXG4gIHsgdGV4dDogJ1Blcm1hbmVjZSBxdWlldG8nLCBpY29uOiAnTTEyIDNhOSA5IDAgMSAwIDAgMThhOSA5IDAgMSAwIDAtMTggTTkgMTBoLjAxIE0xNSAxMGguMDEgTTguNSAxNC41YzEgMS4yIDIuMiAxLjggMy41IDEuOHMyLjUtLjYgMy41LTEuOCcgfSxcbiAgeyB0ZXh0OiAnU29sbyB1bmEgcGVyc29uYScsIGljb246ICdNMTIgNGE0IDQgMCAxIDAgMCA4YTQgNCAwIDEgMCAwLTggTTQgMjBjMS41LTMuNSA0LjQtNS41IDgtNS41czYuNSAyIDggNS41JyB9LFxuICB7IHRleHQ6ICdCdXNjYSBidWVuYSBpbHVtaW5hY2nDs24nLCBpY29uOiAnTTEyIDhhNCA0IDAgMSAwIDAgOGE0IDQgMCAxIDAgMC04IE0xMiAydjIgTTEyIDIwdjIgTTQuOSA0LjlsMS40IDEuNCBNMTcuNyAxNy43bDEuNCAxLjQgTTIgMTJoMiBNMjAgMTJoMiBNNC45IDE5LjFsMS40LTEuNCBNMTcuNyA2LjNsMS40LTEuNCcgfSxcbiAgeyB0ZXh0OiAnU2luIGxlbnRlcyBuaSBnb3JyYScsIGljb246ICdNNyAxMWEzIDMgMCAxIDAgMCA2YTMgMyAwIDEgMCAwLTYgTTE3IDExYTMgMyAwIDEgMCAwIDZhMyAzIDAgMSAwIDAtNiBNMTAgMTRoNCBNMyA0bDE4IDE2JyB9XG5dO1xuLyoqIEdJRiB0cmFuc3BhcmVudGUgZGUgMXgxIHBhcmEgZWwgcG9zdGVyIGRlbCB2aWRlby4gKi9cbmNvbnN0IEVNUFRZX1BPU1RFUiA9ICdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFBQUFBUC8vL3lINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQlJBQTcnO1xuLyoqIFRpZW1wbyBxdWUgc2UgbXVlc3RyYSBcIlZlcmlmaWNhY2nDs24gY29tcGxldGFkYVwiIGFudGVzIGRlIGNlcnJhci4gKi9cbmNvbnN0IFNVQ0NFU1NfSE9MRF9NUyA9IDEyMDA7XG4vKiogVGllbXBvIHF1ZSBzZSBtdWVzdHJhIGVsIGPDrXJjdWxvIGRlIGVuZm9xdWUgeSB0cmFzIGVsIGN1YWwgdnVlbHZlIGVsIGVuZm9xdWUgY29udGludW8uICovXG5jb25zdCBGT0NVU19SSU5HX01TID0gODAwO1xuY29uc3QgRk9DVVNfSE9MRF9NUyA9IDMwMDA7XG5jb25zdCBDQU1FUkFfRVJST1JfTUVTU0FHRSA9ICdObyBwdWRpbW9zIGFjY2VkZXIgYSBsYSBjw6FtYXJhLiBSZXZpc2EgbG9zIHBlcm1pc29zIGUgaW50ZW50YSBkZSBudWV2by4nO1xuXG50eXBlIERpYWxvZ1N0YXRlID0geyBtZXNzYWdlOiBzdHJpbmc7IGZhdGFsOiBib29sZWFuIH0gfCBudWxsO1xuXG4vKipcbiAqIEZvdG8gU2VsZmllLCBkaXNlw7FvIEE6IGPDoW1hcmEgYWwgMTAwJSBkZSBsYSBwYW50YWxsYSB5IGJvdMOzbiByZWN0YW5ndWxhciBcIlRvbWFyIEZvdG9ncmFmw61hXCIuXG4gKiBMYSBmb3RvIHNlIHRvbWEgYWwgaW5zdGFudGU7IG1pZW50cmFzIHNlIHZhbGlkYSwgbGEgYmFycmEgcm9qYSBpbmZlcmlvciBpbmRpY2EgZWwgZW52w61vLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdi1zZWxmaWUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbRGlhbG9nQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxmaWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vc2VsZmllLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZmllQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIEVudsOtYSBsYSBmb3RvIChkYXRhIFVSTCBKUEVHKS4gU2kgbGFuemEgZXJyb3IsIHNlIG11ZXN0cmEgZWwgbWVuc2FqZSB5IHNlIHBlcm1pdGUgcmVpbnRlbnRhci4gKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc3VibWl0ITogKGZpbGVCYXNlNjQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIExhIGZvdG8gZnVlIGFjZXB0YWRhIHkgeWEgc2UgbW9zdHLDsyBsYSBjb25maXJtYWNpw7NuLiAqL1xuICBAT3V0cHV0KCkgY29tcGxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgYmxvY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZGVvJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSB2aWRlb1JlZiE6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XG5cbiAgcmVhZG9ubHkgZ0xvZ28gPSBHX0xPR09fREFUQV9VUkk7XG4gIHJlYWRvbmx5IGVtcHR5UG9zdGVyID0gRU1QVFlfUE9TVEVSO1xuICAvKiogTGEgY8OhbWFyYSB5YSBlc3TDoSB0cmFuc21pdGllbmRvIGltYWdlbi4gKi9cbiAgcmVhZG9ubHkgY2FtZXJhUmVhZHkgPSBzaWduYWwoZmFsc2UpO1xuICAvKiogUG9yIGRlZmVjdG8gbGEgdHJhc2VyYTsgbGEgZnJvbnRhbCBxdWVkYSBkaXNwb25pYmxlIGNvbiBlbCBib3TDs24gZGUgY2FtYmlhciBjw6FtYXJhLiAqL1xuICByZWFkb25seSBmYWNpbmcgPSBzaWduYWw8Q2FtZXJhRmFjaW5nPignZW52aXJvbm1lbnQnKTtcbiAgcmVhZG9ubHkgY2FuU3dpdGNoQ2FtZXJhID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSB0YXBGb2N1cyA9IGZhbHNlO1xuICAvKiogUHVudG8gZG9uZGUgc2UgdG9jw7MgcGFyYSBlbmZvY2FyIChweCBkZW50cm8gZGUgbGEgcGFudGFsbGEpOyBlbCBpZCByZWluaWNpYSBsYSBhbmltYWNpw7NuLiAqL1xuICByZWFkb25seSBmb2N1c1BvaW50ID0gc2lnbmFsPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IGlkOiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSB0aXBzID0gVElQUztcbiAgcmVhZG9ubHkgdGlwSW5kZXggPSBzaWduYWwoMCk7XG4gIHJlYWRvbmx5IHRpcExlYXZpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBzZW5kaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc3VjY2VzcyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGNvdW50ZG93biA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgZGlhbG9nID0gc2lnbmFsPERpYWxvZ1N0YXRlPihudWxsKTtcblxuICBwcml2YXRlIHN0cmVhbTogTWVkaWFTdHJlYW0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBicmlnaHRuZXNzID0gbmV3IEJyaWdodG5lc3NCb29zdCgpO1xuICBwcml2YXRlIGNvdW50ZG93blRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0aXBUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdGlwTGVhdmVUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdWNjZXNzVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZm9jdXNSaW5nVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZm9jdXNIb2xkVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhcnRUaXBzKCk7XG4gICAgYXdhaXQgdGhpcy5zdGFydENhbWVyYSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuc3RvcFRpcHMoKTtcbiAgICBpZiAodGhpcy5zdWNjZXNzVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnN1Y2Nlc3NUaW1lcik7XG4gICAgdGhpcy5jbGVhckZvY3VzVGltZXJzKCk7XG4gICAgdGhpcy5zdG9wQ291bnRkb3duKCk7XG4gICAgdGhpcy5zdG9wQ2FtZXJhKCk7XG4gIH1cblxuICB0YWtlUGhvdG8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VuZGluZygpIHx8IHRoaXMuc3VjY2VzcygpIHx8IHRoaXMuY291bnRkb3duKCkgIT09IG51bGwgfHwgIXRoaXMuc3RyZWFtKSByZXR1cm47XG4gICAgdGhpcy5zdG9wVGlwcygpO1xuICAgIHRoaXMuY291bnRkb3duLnNldChDT1VOVERPV05fRlJPTSk7XG4gICAgdGhpcy5jb3VudGRvd25UaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSAodGhpcy5jb3VudGRvd24oKSA/PyAxKSAtIDE7XG4gICAgICBpZiAobmV4dCA+IDApIHtcbiAgICAgICAgdGhpcy5jb3VudGRvd24uc2V0KG5leHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0b3BDb3VudGRvd24oKTtcbiAgICAgIHZvaWQgdGhpcy5jYXB0dXJlQW5kU2VuZCgpO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgc3dpdGNoQ2FtZXJhKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbmRpbmcoKSB8fCB0aGlzLnN1Y2Nlc3MoKSB8fCB0aGlzLmNvdW50ZG93bigpICE9PSBudWxsIHx8ICF0aGlzLmNhbWVyYVJlYWR5KCkpIHJldHVybjtcbiAgICB0aGlzLmZhY2luZy51cGRhdGUoZiA9PiAoZiA9PT0gJ2Vudmlyb25tZW50JyA/ICd1c2VyJyA6ICdlbnZpcm9ubWVudCcpKTtcbiAgICB0aGlzLnN0b3BDYW1lcmEoKTtcbiAgICB2b2lkIHRoaXMuc3RhcnRDYW1lcmEoKTtcbiAgfVxuXG4gIC8qKiBFbmZvY2FyIGFsIHRvY2FyOiBzZSBpZ25vcmFuIGxvcyB0b3F1ZXMgc29icmUgYm90b25lcyB5IHRleHRvcy4gKi9cbiAgYXN5bmMgb25UYXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMudGFwRm9jdXMgfHwgIXRoaXMuY2FtZXJhUmVhZHkoKSB8fCB0aGlzLnNlbmRpbmcoKSB8fCB0aGlzLnN1Y2Nlc3MoKSkgcmV0dXJuO1xuICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCdidXR0b24sIC5tdi1oaW50JykpIHJldHVybjtcblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52aWRlb1JlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB2aWRlby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwb2ludCA9IHRoaXMudG9WaWRlb1BvaW50KHZpZGVvLCByZWN0LCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICBpZiAoIXBvaW50IHx8ICEoYXdhaXQgZm9jdXNBdCh0aGlzLnN0cmVhbSwgcG9pbnQueCwgcG9pbnQueSkpKSByZXR1cm47XG5cbiAgICB0aGlzLmNsZWFyRm9jdXNUaW1lcnMoKTtcbiAgICB0aGlzLmZvY3VzUG9pbnQuc2V0KHsgeDogZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCwgeTogZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wLCBpZDogRGF0ZS5ub3coKSB9KTtcbiAgICB0aGlzLmZvY3VzUmluZ1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzUG9pbnQuc2V0KG51bGwpLCBGT0NVU19SSU5HX01TKTtcbiAgICB0aGlzLmZvY3VzSG9sZFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHJlc3VtZUF1dG9mb2N1cyh0aGlzLnN0cmVhbSksIEZPQ1VTX0hPTERfTVMpO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VuZGluZygpIHx8IHRoaXMuc3VjY2VzcygpKSByZXR1cm47XG4gICAgdGhpcy5zdG9wQ291bnRkb3duKCk7XG4gICAgdGhpcy5zdG9wQ2FtZXJhKCk7XG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICB9XG5cbiAgb25EaWFsb2dDbG9zZWQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRpYWxvZygpO1xuICAgIHRoaXMuZGlhbG9nLnNldChudWxsKTtcbiAgICBpZiAoc3RhdGU/LmZhdGFsKSB7XG4gICAgICB0aGlzLmZhaWxlZC5lbWl0KHN0YXRlLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZWludGVudG86IHNlIHJlYW51ZGEgbGEgY8OhbWFyYSB5IGxvcyB0aXBzIGVtcGllemFuIGRlIG51ZXZvLlxuICAgIHRoaXMuc3RhcnRUaXBzKCk7XG4gICAgdm9pZCB0aGlzLnZpZGVvUmVmLm5hdGl2ZUVsZW1lbnQucGxheSgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YXJ0Q2FtZXJhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2FtZXJhUmVhZHkuc2V0KGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zdHJlYW0gPSBhd2FpdCBvcGVuQ2FtZXJhKHRoaXMuZmFjaW5nKCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5kaWFsb2cuc2V0KHsgbWVzc2FnZTogQ0FNRVJBX0VSUk9SX01FU1NBR0UsIGZhdGFsOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgdGhpcy5zdG9wQ2FtZXJhKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IGlzVmlydHVhbENhbWVyYSh0aGlzLnN0cmVhbSkpIHtcbiAgICAgIHRoaXMuc3RvcENhbWVyYSgpO1xuICAgICAgdGhpcy5ibG9ja2VkLmVtaXQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudmlkZW9SZWYubmF0aXZlRWxlbWVudDtcbiAgICB2aWRlby5zcmNPYmplY3QgPSB0aGlzLnN0cmVhbTtcbiAgICAvLyBFbCBicmlsbG8gYWwgbcOheGltbyBzb2xvIHNpcnZlIGNvbiBsYSBmcm9udGFsOiBsYSBwYW50YWxsYSBpbHVtaW5hIGVsIHJvc3Ryby5cbiAgICBpZiAodGhpcy5mYWNpbmcoKSA9PT0gJ3VzZXInKSB2b2lkIHRoaXMuYnJpZ2h0bmVzcy5yYWlzZSgpO1xuICAgIHRoaXMuY2FuU3dpdGNoQ2FtZXJhLnNldChhd2FpdCBoYXNNdWx0aXBsZUNhbWVyYXMoKSk7XG4gICAgYXdhaXQgdmlkZW8ucGxheSgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgLy8gTGFzIGNhcGFjaWRhZGVzIHNlIGxlZW4gY29uIGVsIHZpZGVvIHlhIHRyYW5zbWl0aWVuZG86IGFsZ3Vub3MgQW5kcm9pZCBubyByZXBvcnRhbiBsYSBsaW50ZXJuYSBhbnRlcy5cbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbTtcbiAgICBjb25zdCBjb250cm9scyA9IGF3YWl0IGdldENhbWVyYUNvbnRyb2xzKHN0cmVhbSk7XG4gICAgLy8gU2kgbWllbnRyYXMgdGFudG8gc2UgY2FtYmnDsyBvIGNlcnLDsyBsYSBjw6FtYXJhLCBlc3RvcyBjb250cm9sZXMgeWEgbm8gYXBsaWNhbi5cbiAgICBpZiAodGhpcy5kZXN0cm95ZWQgfHwgc3RyZWFtICE9PSB0aGlzLnN0cmVhbSkgcmV0dXJuO1xuICAgIHRoaXMudGFwRm9jdXMgPSBjb250cm9scy50YXBGb2N1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252aWVydGUgZWwgdG9xdWUgZW4gcGFudGFsbGEgYSBjb29yZGVuYWRhcyAwLTEgZGUgbGEgaW1hZ2VuIHJlYWwgZGVsIGxlbnRlLFxuICAgKiBjb25zaWRlcmFuZG8gZWwgcmVjb3J0ZSBkZSBvYmplY3QtZml0OiBjb3ZlciB5IGVsIGVzcGVqbyBkZSBsYSBmcm9udGFsLlxuICAgKi9cbiAgcHJpdmF0ZSB0b1ZpZGVvUG9pbnQodmlkZW86IEhUTUxWaWRlb0VsZW1lbnQsIHJlY3Q6IERPTVJlY3QsIGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgaWYgKCF2aWRlby52aWRlb1dpZHRoIHx8ICF2aWRlby52aWRlb0hlaWdodCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1heChyZWN0LndpZHRoIC8gdmlkZW8udmlkZW9XaWR0aCwgcmVjdC5oZWlnaHQgLyB2aWRlby52aWRlb0hlaWdodCk7XG4gICAgY29uc3Qgc2hvd25XID0gdmlkZW8udmlkZW9XaWR0aCAqIHNjYWxlO1xuICAgIGNvbnN0IHNob3duSCA9IHZpZGVvLnZpZGVvSGVpZ2h0ICogc2NhbGU7XG4gICAgbGV0IHggPSAoY2xpZW50WCAtIHJlY3QubGVmdCAtIChyZWN0LndpZHRoIC0gc2hvd25XKSAvIDIpIC8gc2hvd25XO1xuICAgIGNvbnN0IHkgPSAoY2xpZW50WSAtIHJlY3QudG9wIC0gKHJlY3QuaGVpZ2h0IC0gc2hvd25IKSAvIDIpIC8gc2hvd25IO1xuICAgIGlmICh0aGlzLmZhY2luZygpID09PSAndXNlcicpIHggPSAxIC0geDtcbiAgICBjb25zdCBjbGFtcCA9ICh2OiBudW1iZXIpID0+IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIHYpKTtcbiAgICByZXR1cm4geyB4OiBjbGFtcCh4KSwgeTogY2xhbXAoeSkgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJGb2N1c1RpbWVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb2N1c1JpbmdUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNSaW5nVGltZXIpO1xuICAgIGlmICh0aGlzLmZvY3VzSG9sZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5mb2N1c0hvbGRUaW1lcik7XG4gICAgdGhpcy5mb2N1c1JpbmdUaW1lciA9IG51bGw7XG4gICAgdGhpcy5mb2N1c0hvbGRUaW1lciA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhcHR1cmVBbmRTZW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52aWRlb1JlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGZpbGVCYXNlNjQgPSB0aGlzLmdyYWJGcmFtZSh2aWRlbyk7XG4gICAgdmlkZW8ucGF1c2UoKTtcblxuICAgIGlmICghZmlsZUJhc2U2NCkge1xuICAgICAgdGhpcy5kaWFsb2cuc2V0KHsgbWVzc2FnZTogJ05vIHNlIHB1ZG8gcmVhbGl6YXIgZWwgcHJvY2Vzby4nLCBmYXRhbDogZmFsc2UgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5vbkxpbmUgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmRpYWxvZy5zZXQoeyBtZXNzYWdlOiBOT19DT05ORUNUSU9OX01FU1NBR0UsIGZhdGFsOiBmYWxzZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRpbmcuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnN1Ym1pdChmaWxlQmFzZTY0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiAnTm8gc2UgcHVkbyByZWFsaXphciBlbCBwcm9jZXNvLic7XG4gICAgICB0aGlzLnNlbmRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuZGlhbG9nLnNldCh7IG1lc3NhZ2UsIGZhdGFsOiBmYWxzZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDDiXhpdG8gZW4gbGEgbWlzbWEgcGFudGFsbGE6IGJhcnJhIGNvbXBsZXRhIGVuIHZlcmRlLCB0ZXh0byBkZSBjb25maXJtYWNpw7NuIHkgbGEgZm90byBjb25nZWxhZGEuXG4gICAgdGhpcy5zZW5kaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5zdWNjZXNzLnNldCh0cnVlKTtcbiAgICB0aGlzLnN0b3BDYW1lcmEoKTtcbiAgICB0aGlzLnZpYnJhdGUoKTtcbiAgICB0aGlzLnN1Y2Nlc3NUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb21wbGV0ZWQuZW1pdCgpLCBTVUNDRVNTX0hPTERfTVMpO1xuICB9XG5cbiAgLyoqIFRvbWEgZWwgY3VhZHJvIGNvbXBsZXRvIGRlbCB2aWRlbyAoc2luIGVzcGVqbykgY29tbyBKUEVHLiAqL1xuICBwcml2YXRlIGdyYWJGcmFtZSh2aWRlbzogSFRNTFZpZGVvRWxlbWVudCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHdpZHRoID0gdmlkZW8udmlkZW9XaWR0aCB8fCAxOTIwO1xuICAgIGNvbnN0IGhlaWdodCA9IHZpZGVvLnZpZGVvSGVpZ2h0IHx8IDEwODA7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIG51bGw7XG4gICAgY3R4LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCBKUEVHX1FVQUxJVFkpO1xuICB9XG5cbiAgLyoqIFZpYnJhY2nDs24gY29ydGEgZGUgY29uZmlybWFjacOzbiAoQW5kcm9pZDsgaU9TIG5vIGxvIHBlcm1pdGUgZGVzZGUgZWwgbmF2ZWdhZG9yKS4gKi9cbiAgcHJpdmF0ZSB2aWJyYXRlKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBuYXZpZ2F0b3IudmlicmF0ZT8uKDYwKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNpbiBzb3BvcnRlOiBubyBwYXNhIG5hZGEuXG4gICAgfVxuICB9XG5cbiAgLyoqIFJvdGEgbG9zIHRpcHM6IGVsIGFjdHVhbCBzYWxlIHkgbHVlZ28gZW50cmEgZWwgc2lndWllbnRlLiAqL1xuICBwcml2YXRlIHN0YXJ0VGlwcygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BUaXBzKCk7XG4gICAgdGhpcy50aXBJbmRleC5zZXQoMCk7XG4gICAgdGhpcy50aXBMZWF2aW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy50aXBUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMudGlwTGVhdmluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnRpcExlYXZlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy50aXBJbmRleC51cGRhdGUoaSA9PiAoaSArIDEpICUgVElQUy5sZW5ndGgpO1xuICAgICAgICB0aGlzLnRpcExlYXZpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0sIFRJUF9MRUFWRV9NUyk7XG4gICAgfSwgVElQX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFRpcHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGlwVGltZXIpIGNsZWFySW50ZXJ2YWwodGhpcy50aXBUaW1lcik7XG4gICAgaWYgKHRoaXMudGlwTGVhdmVUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMudGlwTGVhdmVUaW1lcik7XG4gICAgdGhpcy50aXBUaW1lciA9IG51bGw7XG4gICAgdGhpcy50aXBMZWF2ZVRpbWVyID0gbnVsbDtcbiAgICB0aGlzLnRpcExlYXZpbmcuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENvdW50ZG93bigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb3VudGRvd25UaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmNvdW50ZG93blRpbWVyKTtcbiAgICAgIHRoaXMuY291bnRkb3duVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvdW50ZG93bi5zZXQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BDYW1lcmEoKTogdm9pZCB7XG4gICAgc3RvcFN0cmVhbSh0aGlzLnN0cmVhbSk7XG4gICAgdGhpcy5zdHJlYW0gPSBudWxsO1xuICAgIHRoaXMudGFwRm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLmNsZWFyRm9jdXNUaW1lcnMoKTtcbiAgICB0aGlzLmZvY3VzUG9pbnQuc2V0KG51bGwpO1xuICAgIHZvaWQgdGhpcy5icmlnaHRuZXNzLnJlc3RvcmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm12LWNhbWVyYVwiPlxuICA8IS0tIHBvc3RlciB0cmFuc3BhcmVudGU6IGV2aXRhIGVsIMOtY29ubyBncmlzIGRlIFwicGxheVwiIHF1ZSBBbmRyb2lkIFdlYlZpZXcgbXVlc3RyYSBtaWVudHJhcyBhcnJhbmNhIGxhIGPDoW1hcmEgLS0+XG4gIDx2aWRlbyAjdmlkZW8gY2xhc3M9XCJtdi12aWRlb1wiIFtjbGFzcy5tdi12aWRlby0tcmVhZHldPVwiY2FtZXJhUmVhZHkoKVwiIFtjbGFzcy5tdi12aWRlby0tbWlycm9yXT1cImZhY2luZygpID09PSAndXNlcidcIiBbcG9zdGVyXT1cImVtcHR5UG9zdGVyXCJcbiAgICAgICAgIG11dGVkIGF1dG9wbGF5IHBsYXlzaW5saW5lIChwbGF5aW5nKT1cImNhbWVyYVJlYWR5LnNldCh0cnVlKVwiPjwvdmlkZW8+XG4gIDxkaXYgY2xhc3M9XCJtdi1zY3JpbVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuXG4gIEBpZiAoZm9jdXNQb2ludCgpOyBhcyBwKSB7XG4gICAgQGZvciAoaWQgb2YgW3AuaWRdOyB0cmFjayBpZCkge1xuICAgICAgPHNwYW4gY2xhc3M9XCJtdi1mb2N1cy1yaW5nXCIgW3N0eWxlLmxlZnQucHhdPVwicC54XCIgW3N0eWxlLnRvcC5weF09XCJwLnlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgfVxuICB9XG5cbiAgPCEtLSBUb2NhciBsYSBpbWFnZW4gZW5mb2NhIGVuIGVzZSBwdW50byAoc2kgZWwgbGVudGUgbG8gc29wb3J0YSkgLS0+XG4gIDxkaXYgY2xhc3M9XCJtdi11aVwiIChjbGljayk9XCJvblRhcCgkZXZlbnQpXCI+XG4gICAgPGhlYWRlciBjbGFzcz1cIm12LWhlYWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdi10aXRsZS1ncm91cFwiPlxuICAgICAgICA8aW1nIGNsYXNzPVwibXYtdGl0bGUtbG9nb1wiIFtzcmNdPVwiZ0xvZ29cIiBhbHQ9XCJcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICA8aDIgY2xhc3M9XCJtdi10aXRsZVwiPkZvdG8gU2VsZmllPC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBMYSBYIGFycmliYSB5IGRlYmFqbyBsb3MgY29udHJvbGVzIGVuIGNvbHVtbmEsIGNvbW8gZW4gbGFzIGFwcHMgZGUgY8OhbWFyYSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdi1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibXYtY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2VycmFyXCIgW2Rpc2FibGVkXT1cInNlbmRpbmcoKSB8fCBzdWNjZXNzKClcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxwYXRoIGQ9XCJNNiA2bDEyIDEyTTE4IDZMNiAxOFwiIC8+PC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICBAaWYgKCFzZW5kaW5nKCkgJiYgIXN1Y2Nlc3MoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdi10b29sc1wiPlxuICAgICAgICAgICAgQGlmIChjYW5Td2l0Y2hDYW1lcmEoKSkge1xuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm12LWNsb3NlIG12LXRvb2xcIiBhcmlhLWxhYmVsPVwiQ2FtYmlhciBjw6FtYXJhXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbWVyYVJlYWR5KCkgfHwgY291bnRkb3duKCkgIT09IG51bGxcIiAoY2xpY2spPVwic3dpdGNoQ2FtZXJhKClcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48cGF0aCBkPVwiTTExIDE5SDRhMiAyIDAgMCAxLTItMlY3YTIgMiAwIDAgMSAyLTJoNSBNMTMgNWg3YTIgMiAwIDAgMSAyIDJ2MTBhMiAyIDAgMCAxLTIgMmgtNSBNMTIgOWEzIDMgMCAxIDAgMCA2YTMgMyAwIDEgMCAwLTYgTTE4IDIybC0zLTNsMy0zIE02IDJsMyAzbC0zIDNcIiAvPjwvc3ZnPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9oZWFkZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXYtc3BhY2VyXCI+PC9kaXY+XG5cbiAgICA8Zm9vdGVyIGNsYXNzPVwibXYtZm9vdFwiPlxuICAgICAgQGlmIChjb3VudGRvd24oKSAhPT0gbnVsbCkge1xuICAgICAgICA8IS0tIEBmb3IgcmVjcmVhIGVsIGVsZW1lbnRvIGVuIGNhZGEgbsO6bWVybyBwYXJhIHJlcGV0aXIgbGEgYW5pbWFjacOzbiAtLT5cbiAgICAgICAgQGZvciAobiBvZiBbY291bnRkb3duKCldOyB0cmFjayBuKSB7XG4gICAgICAgICAgPHAgY2xhc3M9XCJtdi1oaW50IG12LWNvdW50ZG93blwiIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPnt7IG4gfX08L3A+XG4gICAgICAgIH1cbiAgICAgIH0gQGVsc2UgaWYgKHN1Y2Nlc3MoKSkge1xuICAgICAgICA8cCBjbGFzcz1cIm12LWhpbnQgbXYtc3VjY2Vzcy10ZXh0XCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxwYXRoIGQ9XCJNNSAxMi41bDQuNSA0LjVMMTkgNy41XCIgLz48L3N2Zz5cbiAgICAgICAgICBWZXJpZmljYWNpw7NuIGNvbXBsZXRhZGFcbiAgICAgICAgPC9wPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBpZiAoc2VuZGluZygpKSB7XG4gICAgICAgICAgPHAgY2xhc3M9XCJtdi1oaW50XCIgYXJpYS1saXZlPVwicG9saXRlXCI+VmFsaWRhbmRvIGZvdG8uLi48L3A+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDwhLS0gVGlwcyByb3RhdGl2b3M6IGVsIHJlY3VhZHJvIHNlIHF1ZWRhIGZpam8geSBzb2xvIGNhbWJpYSBlbCBjb250ZW5pZG8gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm12LWhpbnQgbXYtdGlwc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdi1zci1vbmx5XCI+e3sgdGlwc1swXS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgQGZvciAoaSBvZiBbdGlwSW5kZXgoKV07IHRyYWNrIGkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdi10aXBcIiBbY2xhc3MubXYtdGlwLS1sZWF2aW5nXT1cInRpcExlYXZpbmcoKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIFthdHRyLmRdPVwidGlwc1tpXS5pY29uXCIgLz48L3N2Zz5cbiAgICAgICAgICAgICAgICB7eyB0aXBzW2ldLnRleHQgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBAaWYgKHNlbmRpbmcoKSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm12LXNlbmRpbmctYmFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgfSBAZWxzZSBpZiAoc3VjY2VzcygpKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXYtc3VjY2Vzcy1iYXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICB9XG4gICAgICA8IS0tIE9jdWx0byBtaWVudHJhcyBzZSBlbnbDrWEgeSBhbCBjb25maXJtYXIgZWwgw6l4aXRvOyB2dWVsdmUgYSBhcGFyZWNlciBzaSBoYXkgZXJyb3IgcGFyYSByZWludGVudGFyIC0tPlxuICAgICAgQGlmICghc2VuZGluZygpICYmICFzdWNjZXNzKCkpIHtcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtdi1idXR0b25cIiBbZGlzYWJsZWRdPVwiIWNhbWVyYVJlYWR5KCkgfHwgY291bnRkb3duKCkgIT09IG51bGxcIiAoY2xpY2spPVwidGFrZVBob3RvKClcIj5cbiAgICAgICAgICBUb21hciBGb3RvZ3JhZsOtYVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Zvb3Rlcj5cbiAgPC9kaXY+XG5cbiAgQGlmIChkaWFsb2coKTsgYXMgZCkge1xuICAgIDxtdi1kaWFsb2cgW21lc3NhZ2VdPVwiZC5tZXNzYWdlXCIgKGNsb3NlZCk9XCJvbkRpYWxvZ0Nsb3NlZCgpXCI+PC9tdi1kaWFsb2c+XG4gIH1cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Apertura de la cámara. La trasera se elige con la misma regla que el SDK actual (captura de DPI):
|
|
2
|
+
// 1) el lente "camera2 0" (el principal en Android, con enfoque automático), 2) la trasera con el número
|
|
3
|
+
// más bajo ("camera 0, facing back"), 3) cualquiera "back/rear", 4) la que entregue facingMode "environment".
|
|
4
|
+
const VIDEO_SIZE = { width: { ideal: 1920 }, height: { ideal: 1080 } };
|
|
5
|
+
const REAR_LABEL = /back|rear|environment/i;
|
|
6
|
+
const MAIN_REAR_LABEL = /camera2\s?0/i;
|
|
7
|
+
const CAMERA_INDEX = /camera2?\s*(\d+)/i;
|
|
8
|
+
export async function openCamera(facing) {
|
|
9
|
+
if (facing === 'user') {
|
|
10
|
+
return getStream({ ...VIDEO_SIZE, facingMode: 'user' });
|
|
11
|
+
}
|
|
12
|
+
// Si ya hay permiso, los nombres están disponibles y se abre directo el lente principal.
|
|
13
|
+
const known = await preferredRearCamera();
|
|
14
|
+
let stream = await getStream(known ? { ...VIDEO_SIZE, deviceId: { exact: known } } : { ...VIDEO_SIZE, facingMode: { ideal: 'environment' } });
|
|
15
|
+
// Primera vez: los nombres aparecen después del permiso; si hay un lente mejor, se cambia a ese.
|
|
16
|
+
if (!known) {
|
|
17
|
+
const preferred = await preferredRearCamera();
|
|
18
|
+
const current = stream.getVideoTracks()[0]?.getSettings().deviceId;
|
|
19
|
+
if (preferred && preferred !== current) {
|
|
20
|
+
stopStream(stream);
|
|
21
|
+
stream = await getStream({ ...VIDEO_SIZE, deviceId: { exact: preferred } });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return stream;
|
|
25
|
+
}
|
|
26
|
+
/** Indica si el dispositivo tiene más de una cámara (para mostrar el botón de cambiar). */
|
|
27
|
+
export async function hasMultipleCameras() {
|
|
28
|
+
try {
|
|
29
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
30
|
+
return devices.filter(d => d.kind === 'videoinput').length > 1;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Android reporta los modos de enfoque unos instantes después de abrir la cámara: se reintenta. */
|
|
37
|
+
const CAPABILITY_ATTEMPTS = 6;
|
|
38
|
+
const CAPABILITY_RETRY_MS = 250;
|
|
39
|
+
export async function getCameraControls(stream) {
|
|
40
|
+
const caps = await readCapabilities(stream);
|
|
41
|
+
// Enfoque automático continuo cuando el lente lo soporta.
|
|
42
|
+
if (caps?.focusMode?.includes('continuous'))
|
|
43
|
+
await applyAdvanced(stream, { focusMode: 'continuous' });
|
|
44
|
+
return { tapFocus: caps?.focusMode?.includes('single-shot') === true };
|
|
45
|
+
}
|
|
46
|
+
/** Enfoca en un punto del cuadro; x e y van de 0 a 1 sobre la imagen real del lente. */
|
|
47
|
+
export function focusAt(stream, x, y) {
|
|
48
|
+
return applyAdvanced(stream, { focusMode: 'single-shot', pointsOfInterest: [{ x, y }] });
|
|
49
|
+
}
|
|
50
|
+
/** Vuelve al enfoque automático continuo después de enfocar al tocar. */
|
|
51
|
+
export function resumeAutofocus(stream) {
|
|
52
|
+
return applyAdvanced(stream, { focusMode: 'continuous' });
|
|
53
|
+
}
|
|
54
|
+
async function applyAdvanced(stream, constraint) {
|
|
55
|
+
const track = stream?.getVideoTracks()[0];
|
|
56
|
+
if (!track)
|
|
57
|
+
return false;
|
|
58
|
+
try {
|
|
59
|
+
await track.applyConstraints({ advanced: [constraint] });
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function stopStream(stream) {
|
|
67
|
+
stream?.getTracks().forEach(track => track.stop());
|
|
68
|
+
}
|
|
69
|
+
function getStream(video) {
|
|
70
|
+
return navigator.mediaDevices.getUserMedia({ video, audio: false });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Lee las capacidades del lente esperando a que Android las reporte. ImageCapture obliga a Chrome
|
|
74
|
+
* a cargarlas; luego se reintenta unas veces hasta que aparezcan los modos de enfoque.
|
|
75
|
+
*/
|
|
76
|
+
async function readCapabilities(stream) {
|
|
77
|
+
const track = stream?.getVideoTracks()[0];
|
|
78
|
+
if (!track?.getCapabilities)
|
|
79
|
+
return undefined;
|
|
80
|
+
const ImageCaptureCtor = globalThis.ImageCapture;
|
|
81
|
+
if (ImageCaptureCtor) {
|
|
82
|
+
try {
|
|
83
|
+
await new ImageCaptureCtor(track).getPhotoCapabilities();
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Sin soporte: se sigue con los reintentos.
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
let caps = track.getCapabilities();
|
|
90
|
+
for (let i = 1; i < CAPABILITY_ATTEMPTS && !caps.focusMode?.length; i++) {
|
|
91
|
+
await new Promise(resolve => setTimeout(resolve, CAPABILITY_RETRY_MS));
|
|
92
|
+
if (track.readyState !== 'live')
|
|
93
|
+
return undefined;
|
|
94
|
+
caps = track.getCapabilities();
|
|
95
|
+
}
|
|
96
|
+
return caps;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Android numera las cámaras ("camera 0, facing back", "camera2 2, facing back"...) y la principal,
|
|
100
|
+
* la que tiene flash y enfoque automático, es la trasera con el número más bajo.
|
|
101
|
+
*/
|
|
102
|
+
function lowestIndexed(cams) {
|
|
103
|
+
const indexed = cams
|
|
104
|
+
.map(d => ({ d, n: Number(CAMERA_INDEX.exec(d.label)?.[1]) }))
|
|
105
|
+
.filter(c => Number.isFinite(c.n));
|
|
106
|
+
indexed.sort((a, b) => a.n - b.n);
|
|
107
|
+
return indexed[0]?.d;
|
|
108
|
+
}
|
|
109
|
+
async function preferredRearCamera() {
|
|
110
|
+
try {
|
|
111
|
+
const cams = (await navigator.mediaDevices.enumerateDevices()).filter(d => d.kind === 'videoinput' && d.label);
|
|
112
|
+
const rear = cams.filter(d => REAR_LABEL.test(d.label));
|
|
113
|
+
const chosen = rear.find(d => MAIN_REAR_LABEL.test(d.label)) ?? lowestIndexed(rear) ?? rear.find(d => /back/i.test(d.label)) ?? rear[0];
|
|
114
|
+
return chosen?.deviceId || null;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtZXJhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWV0YWctdmVyaWZ5L3NyYy9saWIvc2VydmljZXMvY2FtZXJhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9HQUFvRztBQUNwRyx5R0FBeUc7QUFDekcsOEdBQThHO0FBSTlHLE1BQU0sVUFBVSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0FBQ3ZFLE1BQU0sVUFBVSxHQUFHLHdCQUF3QixDQUFDO0FBQzVDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQUN2QyxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FBQztBQUV6QyxNQUFNLENBQUMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxNQUFvQjtJQUNuRCxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN0QixPQUFPLFNBQVMsQ0FBQyxFQUFFLEdBQUcsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCx5RkFBeUY7SUFDekYsTUFBTSxLQUFLLEdBQUcsTUFBTSxtQkFBbUIsRUFBRSxDQUFDO0lBQzFDLElBQUksTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFVBQVUsRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTlJLGlHQUFpRztJQUNqRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLFNBQVMsR0FBRyxNQUFNLG1CQUFtQixFQUFFLENBQUM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNuRSxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDdkMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25CLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxFQUFFLEdBQUcsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsMkZBQTJGO0FBQzNGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCO0lBQ3RDLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hFLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQVVELG9HQUFvRztBQUNwRyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUVoQyxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUFDLE1BQTBCO0lBQ2hFLE1BQU0sSUFBSSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsMERBQTBEO0lBQzFELElBQUksSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQUUsTUFBTSxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDdEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztBQUN6RSxDQUFDO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sVUFBVSxPQUFPLENBQUMsTUFBMEIsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUN0RSxPQUFPLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0YsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQTBCO0lBQ3hELE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxLQUFLLFVBQVUsYUFBYSxDQUFDLE1BQTBCLEVBQUUsVUFBbUM7SUFDMUYsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxVQUFxQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLE1BQTBCO0lBQ25ELE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsS0FBNEI7SUFDN0MsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLGdCQUFnQixDQUFDLE1BQTBCO0lBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFLGVBQWU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU5QyxNQUFNLGdCQUFnQixHQUFJLFVBQTJHLENBQUMsWUFBWSxDQUFDO0lBQ25KLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMzRCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsNENBQTRDO1FBQzlDLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFBMEIsQ0FBQztJQUMzRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssTUFBTTtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2xELElBQUksR0FBRyxLQUFLLENBQUMsZUFBZSxFQUEwQixDQUFDO0lBQ3pELENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUF1QjtJQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJO1NBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzdELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBR0QsS0FBSyxVQUFVLG1CQUFtQjtJQUNoQyxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9HLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEksT0FBTyxNQUFNLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFwZXJ0dXJhIGRlIGxhIGPDoW1hcmEuIExhIHRyYXNlcmEgc2UgZWxpZ2UgY29uIGxhIG1pc21hIHJlZ2xhIHF1ZSBlbCBTREsgYWN0dWFsIChjYXB0dXJhIGRlIERQSSk6XG4vLyAxKSBlbCBsZW50ZSBcImNhbWVyYTIgMFwiIChlbCBwcmluY2lwYWwgZW4gQW5kcm9pZCwgY29uIGVuZm9xdWUgYXV0b23DoXRpY28pLCAyKSBsYSB0cmFzZXJhIGNvbiBlbCBuw7ptZXJvXG4vLyBtw6FzIGJham8gKFwiY2FtZXJhIDAsIGZhY2luZyBiYWNrXCIpLCAzKSBjdWFscXVpZXJhIFwiYmFjay9yZWFyXCIsIDQpIGxhIHF1ZSBlbnRyZWd1ZSBmYWNpbmdNb2RlIFwiZW52aXJvbm1lbnRcIi5cblxuZXhwb3J0IHR5cGUgQ2FtZXJhRmFjaW5nID0gJ2Vudmlyb25tZW50JyB8ICd1c2VyJztcblxuY29uc3QgVklERU9fU0laRSA9IHsgd2lkdGg6IHsgaWRlYWw6IDE5MjAgfSwgaGVpZ2h0OiB7IGlkZWFsOiAxMDgwIH0gfTtcbmNvbnN0IFJFQVJfTEFCRUwgPSAvYmFja3xyZWFyfGVudmlyb25tZW50L2k7XG5jb25zdCBNQUlOX1JFQVJfTEFCRUwgPSAvY2FtZXJhMlxccz8wL2k7XG5jb25zdCBDQU1FUkFfSU5ERVggPSAvY2FtZXJhMj9cXHMqKFxcZCspL2k7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuQ2FtZXJhKGZhY2luZzogQ2FtZXJhRmFjaW5nKTogUHJvbWlzZTxNZWRpYVN0cmVhbT4ge1xuICBpZiAoZmFjaW5nID09PSAndXNlcicpIHtcbiAgICByZXR1cm4gZ2V0U3RyZWFtKHsgLi4uVklERU9fU0laRSwgZmFjaW5nTW9kZTogJ3VzZXInIH0pO1xuICB9XG5cbiAgLy8gU2kgeWEgaGF5IHBlcm1pc28sIGxvcyBub21icmVzIGVzdMOhbiBkaXNwb25pYmxlcyB5IHNlIGFicmUgZGlyZWN0byBlbCBsZW50ZSBwcmluY2lwYWwuXG4gIGNvbnN0IGtub3duID0gYXdhaXQgcHJlZmVycmVkUmVhckNhbWVyYSgpO1xuICBsZXQgc3RyZWFtID0gYXdhaXQgZ2V0U3RyZWFtKGtub3duID8geyAuLi5WSURFT19TSVpFLCBkZXZpY2VJZDogeyBleGFjdDoga25vd24gfSB9IDogeyAuLi5WSURFT19TSVpFLCBmYWNpbmdNb2RlOiB7IGlkZWFsOiAnZW52aXJvbm1lbnQnIH0gfSk7XG5cbiAgLy8gUHJpbWVyYSB2ZXo6IGxvcyBub21icmVzIGFwYXJlY2VuIGRlc3B1w6lzIGRlbCBwZXJtaXNvOyBzaSBoYXkgdW4gbGVudGUgbWVqb3IsIHNlIGNhbWJpYSBhIGVzZS5cbiAgaWYgKCFrbm93bikge1xuICAgIGNvbnN0IHByZWZlcnJlZCA9IGF3YWl0IHByZWZlcnJlZFJlYXJDYW1lcmEoKTtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RyZWFtLmdldFZpZGVvVHJhY2tzKClbMF0/LmdldFNldHRpbmdzKCkuZGV2aWNlSWQ7XG4gICAgaWYgKHByZWZlcnJlZCAmJiBwcmVmZXJyZWQgIT09IGN1cnJlbnQpIHtcbiAgICAgIHN0b3BTdHJlYW0oc3RyZWFtKTtcbiAgICAgIHN0cmVhbSA9IGF3YWl0IGdldFN0cmVhbSh7IC4uLlZJREVPX1NJWkUsIGRldmljZUlkOiB7IGV4YWN0OiBwcmVmZXJyZWQgfSB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyZWFtO1xufVxuXG4vKiogSW5kaWNhIHNpIGVsIGRpc3Bvc2l0aXZvIHRpZW5lIG3DoXMgZGUgdW5hIGPDoW1hcmEgKHBhcmEgbW9zdHJhciBlbCBib3TDs24gZGUgY2FtYmlhcikuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFzTXVsdGlwbGVDYW1lcmFzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRldmljZXMgPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKTtcbiAgICByZXR1cm4gZGV2aWNlcy5maWx0ZXIoZCA9PiBkLmtpbmQgPT09ICd2aWRlb2lucHV0JykubGVuZ3RoID4gMTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBDb250cm9sZXMgcXVlIG9mcmVjZSBlbCBsZW50ZSBhY3Rpdm8uICovXG5leHBvcnQgaW50ZXJmYWNlIENhbWVyYUNvbnRyb2xzIHtcbiAgLyoqIEVuZm9xdWUgYWwgdG9jYXIgbGEgcGFudGFsbGEgKGZvY3VzTW9kZSBcInNpbmdsZS1zaG90XCIgKyBwdW50byBkZSBpbnRlcsOpcykuICovXG4gIHRhcEZvY3VzOiBib29sZWFuO1xufVxuXG50eXBlIEV4dGVuZGVkQ2FwYWJpbGl0aWVzID0gTWVkaWFUcmFja0NhcGFiaWxpdGllcyAmIHsgZm9jdXNNb2RlPzogc3RyaW5nW10gfTtcblxuLyoqIEFuZHJvaWQgcmVwb3J0YSBsb3MgbW9kb3MgZGUgZW5mb3F1ZSB1bm9zIGluc3RhbnRlcyBkZXNwdcOpcyBkZSBhYnJpciBsYSBjw6FtYXJhOiBzZSByZWludGVudGEuICovXG5jb25zdCBDQVBBQklMSVRZX0FUVEVNUFRTID0gNjtcbmNvbnN0IENBUEFCSUxJVFlfUkVUUllfTVMgPSAyNTA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYW1lcmFDb250cm9scyhzdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbCk6IFByb21pc2U8Q2FtZXJhQ29udHJvbHM+IHtcbiAgY29uc3QgY2FwcyA9IGF3YWl0IHJlYWRDYXBhYmlsaXRpZXMoc3RyZWFtKTtcbiAgLy8gRW5mb3F1ZSBhdXRvbcOhdGljbyBjb250aW51byBjdWFuZG8gZWwgbGVudGUgbG8gc29wb3J0YS5cbiAgaWYgKGNhcHM/LmZvY3VzTW9kZT8uaW5jbHVkZXMoJ2NvbnRpbnVvdXMnKSkgYXdhaXQgYXBwbHlBZHZhbmNlZChzdHJlYW0sIHsgZm9jdXNNb2RlOiAnY29udGludW91cycgfSk7XG4gIHJldHVybiB7IHRhcEZvY3VzOiBjYXBzPy5mb2N1c01vZGU/LmluY2x1ZGVzKCdzaW5nbGUtc2hvdCcpID09PSB0cnVlIH07XG59XG5cbi8qKiBFbmZvY2EgZW4gdW4gcHVudG8gZGVsIGN1YWRybzsgeCBlIHkgdmFuIGRlIDAgYSAxIHNvYnJlIGxhIGltYWdlbiByZWFsIGRlbCBsZW50ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2N1c0F0KHN0cmVhbTogTWVkaWFTdHJlYW0gfCBudWxsLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gYXBwbHlBZHZhbmNlZChzdHJlYW0sIHsgZm9jdXNNb2RlOiAnc2luZ2xlLXNob3QnLCBwb2ludHNPZkludGVyZXN0OiBbeyB4LCB5IH1dIH0pO1xufVxuXG4vKiogVnVlbHZlIGFsIGVuZm9xdWUgYXV0b23DoXRpY28gY29udGludW8gZGVzcHXDqXMgZGUgZW5mb2NhciBhbCB0b2Nhci4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN1bWVBdXRvZm9jdXMoc3RyZWFtOiBNZWRpYVN0cmVhbSB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGFwcGx5QWR2YW5jZWQoc3RyZWFtLCB7IGZvY3VzTW9kZTogJ2NvbnRpbnVvdXMnIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUFkdmFuY2VkKHN0cmVhbTogTWVkaWFTdHJlYW0gfCBudWxsLCBjb25zdHJhaW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB0cmFjayA9IHN0cmVhbT8uZ2V0VmlkZW9UcmFja3MoKVswXTtcbiAgaWYgKCF0cmFjaykgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGF3YWl0IHRyYWNrLmFwcGx5Q29uc3RyYWludHMoeyBhZHZhbmNlZDogW2NvbnN0cmFpbnQgYXMgTWVkaWFUcmFja0NvbnN0cmFpbnRTZXRdIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BTdHJlYW0oc3RyZWFtOiBNZWRpYVN0cmVhbSB8IG51bGwpOiB2b2lkIHtcbiAgc3RyZWFtPy5nZXRUcmFja3MoKS5mb3JFYWNoKHRyYWNrID0+IHRyYWNrLnN0b3AoKSk7XG59XG5cbmZ1bmN0aW9uIGdldFN0cmVhbSh2aWRlbzogTWVkaWFUcmFja0NvbnN0cmFpbnRzKTogUHJvbWlzZTxNZWRpYVN0cmVhbT4ge1xuICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyB2aWRlbywgYXVkaW86IGZhbHNlIH0pO1xufVxuXG4vKipcbiAqIExlZSBsYXMgY2FwYWNpZGFkZXMgZGVsIGxlbnRlIGVzcGVyYW5kbyBhIHF1ZSBBbmRyb2lkIGxhcyByZXBvcnRlLiBJbWFnZUNhcHR1cmUgb2JsaWdhIGEgQ2hyb21lXG4gKiBhIGNhcmdhcmxhczsgbHVlZ28gc2UgcmVpbnRlbnRhIHVuYXMgdmVjZXMgaGFzdGEgcXVlIGFwYXJlemNhbiBsb3MgbW9kb3MgZGUgZW5mb3F1ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZENhcGFiaWxpdGllcyhzdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbCk6IFByb21pc2U8RXh0ZW5kZWRDYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgdHJhY2sgPSBzdHJlYW0/LmdldFZpZGVvVHJhY2tzKClbMF07XG4gIGlmICghdHJhY2s/LmdldENhcGFiaWxpdGllcykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBJbWFnZUNhcHR1cmVDdG9yID0gKGdsb2JhbFRoaXMgYXMgeyBJbWFnZUNhcHR1cmU/OiBuZXcgKHQ6IE1lZGlhU3RyZWFtVHJhY2spID0+IHsgZ2V0UGhvdG9DYXBhYmlsaXRpZXMoKTogUHJvbWlzZTx1bmtub3duPiB9IH0pLkltYWdlQ2FwdHVyZTtcbiAgaWYgKEltYWdlQ2FwdHVyZUN0b3IpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV3IEltYWdlQ2FwdHVyZUN0b3IodHJhY2spLmdldFBob3RvQ2FwYWJpbGl0aWVzKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTaW4gc29wb3J0ZTogc2Ugc2lndWUgY29uIGxvcyByZWludGVudG9zLlxuICAgIH1cbiAgfVxuXG4gIGxldCBjYXBzID0gdHJhY2suZ2V0Q2FwYWJpbGl0aWVzKCkgYXMgRXh0ZW5kZWRDYXBhYmlsaXRpZXM7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgQ0FQQUJJTElUWV9BVFRFTVBUUyAmJiAhY2Fwcy5mb2N1c01vZGU/Lmxlbmd0aDsgaSsrKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIENBUEFCSUxJVFlfUkVUUllfTVMpKTtcbiAgICBpZiAodHJhY2sucmVhZHlTdGF0ZSAhPT0gJ2xpdmUnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNhcHMgPSB0cmFjay5nZXRDYXBhYmlsaXRpZXMoKSBhcyBFeHRlbmRlZENhcGFiaWxpdGllcztcbiAgfVxuICByZXR1cm4gY2Fwcztcbn1cblxuLyoqXG4gKiBBbmRyb2lkIG51bWVyYSBsYXMgY8OhbWFyYXMgKFwiY2FtZXJhIDAsIGZhY2luZyBiYWNrXCIsIFwiY2FtZXJhMiAyLCBmYWNpbmcgYmFja1wiLi4uKSB5IGxhIHByaW5jaXBhbCxcbiAqIGxhIHF1ZSB0aWVuZSBmbGFzaCB5IGVuZm9xdWUgYXV0b23DoXRpY28sIGVzIGxhIHRyYXNlcmEgY29uIGVsIG7Dum1lcm8gbcOhcyBiYWpvLlxuICovXG5mdW5jdGlvbiBsb3dlc3RJbmRleGVkKGNhbXM6IE1lZGlhRGV2aWNlSW5mb1tdKTogTWVkaWFEZXZpY2VJbmZvIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5kZXhlZCA9IGNhbXNcbiAgICAubWFwKGQgPT4gKHsgZCwgbjogTnVtYmVyKENBTUVSQV9JTkRFWC5leGVjKGQubGFiZWwpPy5bMV0pIH0pKVxuICAgIC5maWx0ZXIoYyA9PiBOdW1iZXIuaXNGaW5pdGUoYy5uKSk7XG4gIGluZGV4ZWQuc29ydCgoYSwgYikgPT4gYS5uIC0gYi5uKTtcbiAgcmV0dXJuIGluZGV4ZWRbMF0/LmQ7XG59XG5cblxuYXN5bmMgZnVuY3Rpb24gcHJlZmVycmVkUmVhckNhbWVyYSgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjYW1zID0gKGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpKS5maWx0ZXIoZCA9PiBkLmtpbmQgPT09ICd2aWRlb2lucHV0JyAmJiBkLmxhYmVsKTtcbiAgICBjb25zdCByZWFyID0gY2Ftcy5maWx0ZXIoZCA9PiBSRUFSX0xBQkVMLnRlc3QoZC5sYWJlbCkpO1xuICAgIGNvbnN0IGNob3NlbiA9IHJlYXIuZmluZChkID0+IE1BSU5fUkVBUl9MQUJFTC50ZXN0KGQubGFiZWwpKSA/PyBsb3dlc3RJbmRleGVkKHJlYXIpID8/IHJlYXIuZmluZChkID0+IC9iYWNrL2kudGVzdChkLmxhYmVsKSkgPz8gcmVhclswXTtcbiAgICByZXR1cm4gY2hvc2VuPy5kZXZpY2VJZCB8fCBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4iXX0=
|
package/esm2022/lib/version.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/** Versión que se envía en el header sdk-version (el backend no la valida). */
|
|
2
|
-
export const METAG_VERIFY_VERSION = '0.1.
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
export const METAG_VERIFY_VERSION = '0.1.1';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21ldGFnLXZlcmlmeS9zcmMvbGliL3ZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBWZXJzacOzbiBxdWUgc2UgZW52w61hIGVuIGVsIGhlYWRlciBzZGstdmVyc2lvbiAoZWwgYmFja2VuZCBubyBsYSB2YWxpZGEpLiAqL1xuZXhwb3J0IGNvbnN0IE1FVEFHX1ZFUklGWV9WRVJTSU9OID0gJzAuMS4xJztcbiJdfQ==
|