valtech-components 2.0.773 → 2.0.774

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.
@@ -10,19 +10,27 @@
10
10
  * transform="translate(col*100 row*100)">` con un `<rect width=100 height=100
11
11
  * fill=bg/>` de fondo.
12
12
  */
13
+ /**
14
+ * Chevrons stroke-based con linecap/linejoin redondos — visualmente coherente
15
+ * con el símbolo de marca Valtech (`>_`). Stroke-width 18 (default), 12 para
16
+ * variants `small-*`.
17
+ */
18
+ const CHEV_STROKE = 18;
19
+ const CHEV_SMALL_STROKE = 12;
20
+ const chevStyle = (f, w = CHEV_STROKE) => `stroke="${f}" stroke-width="${w}" stroke-linecap="round" stroke-linejoin="round" fill="none"`;
13
21
  export const PATTERN_MOTIFS = {
14
- 'chev-r': f => `<path d="M22 18 L58 50 L22 82 L42 82 L78 50 L42 18 Z" fill="${f}"/>`,
15
- 'chev-l': f => `<path d="M78 18 L42 50 L78 82 L58 82 L22 50 L58 18 Z" fill="${f}"/>`,
16
- 'chev-d': f => `<path d="M18 22 L50 58 L82 22 L82 42 L50 78 L18 42 Z" fill="${f}"/>`,
17
- 'chev-u': f => `<path d="M18 78 L50 42 L82 78 L82 58 L50 22 L18 58 Z" fill="${f}"/>`,
22
+ 'chev-r': f => `<path d="M22 18 L72 50 L22 82" ${chevStyle(f)}/>`,
23
+ 'chev-l': f => `<path d="M78 18 L28 50 L78 82" ${chevStyle(f)}/>`,
24
+ 'chev-d': f => `<path d="M18 22 L50 72 L82 22" ${chevStyle(f)}/>`,
25
+ 'chev-u': f => `<path d="M18 78 L50 28 L82 78" ${chevStyle(f)}/>`,
18
26
  'tri-tl': f => `<polygon points="0,0 100,0 0,100" fill="${f}"/>`,
19
27
  'tri-tr': f => `<polygon points="0,0 100,0 100,100" fill="${f}"/>`,
20
28
  'tri-bl': f => `<polygon points="0,0 100,100 0,100" fill="${f}"/>`,
21
29
  'tri-br': f => `<polygon points="100,0 100,100 0,100" fill="${f}"/>`,
22
30
  solid: () => ``,
23
31
  diamond: f => `<polygon points="50,12 88,50 50,88 12,50" fill="${f}"/>`,
24
- 'small-r': f => `<path d="M38 32 L62 50 L38 68 L48 68 L72 50 L48 32 Z" fill="${f}"/>`,
25
- 'small-l': f => `<path d="M62 32 L38 50 L62 68 L52 68 L28 50 L52 32 Z" fill="${f}"/>`,
32
+ 'small-r': f => `<path d="M38 32 L62 50 L38 68" ${chevStyle(f, CHEV_SMALL_STROKE)}/>`,
33
+ 'small-l': f => `<path d="M62 32 L38 50 L62 68" ${chevStyle(f, CHEV_SMALL_STROKE)}/>`,
26
34
  'arrow-r': f => `<path d="M10 42 L60 42 L60 28 L92 50 L60 72 L60 58 L10 58 Z" fill="${f}"/>`,
27
35
  'arrow-l': f => `<path d="M90 42 L40 42 L40 28 L8 50 L40 72 L40 58 L90 58 Z" fill="${f}"/>`,
28
36
  'house-d': f => `<polygon points="50,20 88,50 12,50" fill="${f}"/><rect x="28" y="50" width="44" height="32" fill="${f}"/>`,
@@ -82,6 +90,31 @@ export function mulberry32(seed) {
82
90
  return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
83
91
  };
84
92
  }
93
+ /**
94
+ * Genera UN tile con motif/bg/fg respetando densidades + contraste.
95
+ * Caller pasa rng (Math.random o seeded) — útil para reshuffle individual de
96
+ * tiles en `val-pattern` sin regenerar la grid completa.
97
+ */
98
+ export function generateRandomTile(palette, chevronDensity = 0.55, rng = Math.random) {
99
+ const roll = rng();
100
+ let key;
101
+ if (roll < chevronDensity)
102
+ key = CHEV_KEYS[Math.floor(rng() * CHEV_KEYS.length)];
103
+ else if (roll < chevronDensity + 0.2)
104
+ key = SOLID_KEYS[Math.floor(rng() * SOLID_KEYS.length)];
105
+ else if (roll < chevronDensity + 0.35)
106
+ key = SHAPE_KEYS[Math.floor(rng() * SHAPE_KEYS.length)];
107
+ else
108
+ key = TRI_KEYS[Math.floor(rng() * TRI_KEYS.length)];
109
+ const bgIdx = Math.floor(rng() * palette.length);
110
+ let fgIdx = Math.floor(rng() * palette.length);
111
+ let tries = 0;
112
+ while (Math.abs(fgIdx - bgIdx) < 3 && tries < 6) {
113
+ fgIdx = Math.floor(rng() * palette.length);
114
+ tries++;
115
+ }
116
+ return { motif: key, bg: palette[bgIdx], fg: palette[fgIdx] };
117
+ }
85
118
  /** Genera matriz de tiles aplicando densidades + reglas de contraste. */
86
119
  export function generatePatternTiles(cfg) {
87
120
  const { cols, rows, seed, palette } = cfg;
@@ -89,25 +122,7 @@ export function generatePatternTiles(cfg) {
89
122
  const r = mulberry32(seed);
90
123
  const tiles = [];
91
124
  for (let i = 0; i < cols * rows; i++) {
92
- const roll = r();
93
- let key;
94
- if (roll < chevronDensity)
95
- key = CHEV_KEYS[Math.floor(r() * CHEV_KEYS.length)];
96
- else if (roll < chevronDensity + 0.2)
97
- key = SOLID_KEYS[Math.floor(r() * SOLID_KEYS.length)];
98
- else if (roll < chevronDensity + 0.35)
99
- key = SHAPE_KEYS[Math.floor(r() * SHAPE_KEYS.length)];
100
- else
101
- key = TRI_KEYS[Math.floor(r() * TRI_KEYS.length)];
102
- // Pick bg + contrasting fg (índices con distancia ≥3 en la palette).
103
- const bgIdx = Math.floor(r() * palette.length);
104
- let fgIdx = Math.floor(r() * palette.length);
105
- let tries = 0;
106
- while (Math.abs(fgIdx - bgIdx) < 3 && tries < 6) {
107
- fgIdx = Math.floor(r() * palette.length);
108
- tries++;
109
- }
110
- tiles.push({ motif: key, bg: palette[bgIdx], fg: palette[fgIdx] });
125
+ tiles.push(generateRandomTile(palette, chevronDensity, r));
111
126
  }
112
127
  return tiles;
113
128
  }
@@ -129,4 +144,4 @@ export function renderPatternSvgInner(tiles, cols, baseColor) {
129
144
  }
130
145
  return inner;
131
146
  }
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW90aWZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2F0b21zL3BhdHRlcm4vbW90aWZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBcUJILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBb0Q7SUFDN0UsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsK0RBQStELENBQUMsS0FBSztJQUNwRixRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQywrREFBK0QsQ0FBQyxLQUFLO0lBQ3BGLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLCtEQUErRCxDQUFDLEtBQUs7SUFDcEYsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsK0RBQStELENBQUMsS0FBSztJQUNwRixRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQywyQ0FBMkMsQ0FBQyxLQUFLO0lBQ2hFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLDZDQUE2QyxDQUFDLEtBQUs7SUFDbEUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsNkNBQTZDLENBQUMsS0FBSztJQUNsRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQywrQ0FBK0MsQ0FBQyxLQUFLO0lBQ3BFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQ2YsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsbURBQW1ELENBQUMsS0FBSztJQUN2RSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQywrREFBK0QsQ0FBQyxLQUFLO0lBQ3JGLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLCtEQUErRCxDQUFDLEtBQUs7SUFDckYsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsc0VBQXNFLENBQUMsS0FBSztJQUM1RixTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxxRUFBcUUsQ0FBQyxLQUFLO0lBQzNGLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUNiLDZDQUE2QyxDQUFDLHVEQUF1RCxDQUFDLEtBQUs7SUFDN0csUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsbURBQW1ELENBQUMsS0FBSztJQUN4RSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxtREFBbUQsQ0FBQyxLQUFLO0NBQ3pFLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQXNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFzQixDQUFDO0FBRTlGLDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQXNCO0lBQzFDLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0NBQ1YsQ0FBQztBQUVGLG1DQUFtQztBQUNuQyxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQXNCO0lBQ3pDLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7Q0FDVixDQUFDO0FBRUYsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV6RCxtREFBbUQ7QUFDbkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBS3ZELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUF3QztJQUNuRSxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ2hHLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDN0YsUUFBUSxFQUFFO1FBQ1IsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7S0FDVjtDQUNGLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVk7SUFDckMsT0FBTztRQUNMLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2IsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7SUFDL0MsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQW9CRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEdBQXFCO0lBQ3hELE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDMUMsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUM7SUFDbEQsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLE1BQU0sS0FBSyxHQUFrQixFQUFFLENBQUM7SUFFaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQixJQUFJLEdBQW9CLENBQUM7UUFDekIsSUFBSSxJQUFJLEdBQUcsY0FBYztZQUFFLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQzthQUMzRSxJQUFJLElBQUksR0FBRyxjQUFjLEdBQUcsR0FBRztZQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQzthQUN4RixJQUFJLElBQUksR0FBRyxjQUFjLEdBQUcsSUFBSTtZQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQzs7WUFDekYsR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBRSxDQUFDO1FBRXhELHFFQUFxRTtRQUNyRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEQsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLEtBQUssRUFBRSxDQUFDO1FBQ1YsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsS0FBb0IsRUFDcEIsSUFBWSxFQUNaLFNBQWlCO0lBRWpCLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7SUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7SUFDckIsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFdBQVcsU0FBUyxLQUFLLENBQUM7SUFDckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUNwQixNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QyxLQUFLLElBQUksMkJBQTJCLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsMkNBQTJDLENBQUMsQ0FBQyxFQUFFLE1BQU0sS0FBSyxNQUFNLENBQUM7SUFDekgsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmFsdGVjaCBQYXR0ZXJuIFN5c3RlbSDigJQgbW90aWZzICsgcGFsZXR0ZXMuXG4gKlxuICogUHVyZSBkYXRhICsgaGVscGVycywgc2luIGRlcGVuZGVuY2lhcyBBbmd1bGFyLiBSZXVzYWJsZSBkZXNkZSBOb2RlL3NjcmlwdHNcbiAqIChlLmcuLCBnZW5lcmF0ZSBzdGF0aWMgdGh1bWJuYWlscykgbyBkZXNkZSBlbCBjb21wb25lbnRlIGB2YWwtcGF0dGVybmAuXG4gKlxuICogT3JpZ2luYWwgc3BlYzogYGFzc2V0cy9WYWx0ZWNoIFBhdHRlcm4gU3lzdGVtLmh0bWxgIChzaW5nbGUtcGFnZSBkZW1vKS5cbiAqIENhZGEgbW90aWYgZXMgZnVuY2nDs24gYChmaWxsOiBzdHJpbmcpID0+IHN0cmluZ2AgcXVlIGRldnVlbHZlIFNWRyBpbm5lclxuICogbWFya3VwLiBUaWxlIGVzIDEwMMOXMTAwIHVuaWRhZGVzOyBlbCBtb3RpZiBzZSByZW5kZXJpemEgZGVudHJvIGRlIHVuIGA8Z1xuICogdHJhbnNmb3JtPVwidHJhbnNsYXRlKGNvbCoxMDAgcm93KjEwMClcIj5gIGNvbiB1biBgPHJlY3Qgd2lkdGg9MTAwIGhlaWdodD0xMDBcbiAqIGZpbGw9YmcvPmAgZGUgZm9uZG8uXG4gKi9cblxuZXhwb3J0IHR5cGUgUGF0dGVybk1vdGlmS2V5ID1cbiAgfCAnY2hldi1yJ1xuICB8ICdjaGV2LWwnXG4gIHwgJ2NoZXYtZCdcbiAgfCAnY2hldi11J1xuICB8ICd0cmktdGwnXG4gIHwgJ3RyaS10cidcbiAgfCAndHJpLWJsJ1xuICB8ICd0cmktYnInXG4gIHwgJ3NvbGlkJ1xuICB8ICdkaWFtb25kJ1xuICB8ICdzbWFsbC1yJ1xuICB8ICdzbWFsbC1sJ1xuICB8ICdhcnJvdy1yJ1xuICB8ICdhcnJvdy1sJ1xuICB8ICdob3VzZS1kJ1xuICB8ICdoYWxmLWwnXG4gIHwgJ2hhbGYtdCc7XG5cbmV4cG9ydCBjb25zdCBQQVRURVJOX01PVElGUzogUmVjb3JkPFBhdHRlcm5Nb3RpZktleSwgKGZnOiBzdHJpbmcpID0+IHN0cmluZz4gPSB7XG4gICdjaGV2LXInOiBmID0+IGA8cGF0aCBkPVwiTTIyIDE4IEw1OCA1MCBMMjIgODIgTDQyIDgyIEw3OCA1MCBMNDIgMTggWlwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICdjaGV2LWwnOiBmID0+IGA8cGF0aCBkPVwiTTc4IDE4IEw0MiA1MCBMNzggODIgTDU4IDgyIEwyMiA1MCBMNTggMTggWlwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICdjaGV2LWQnOiBmID0+IGA8cGF0aCBkPVwiTTE4IDIyIEw1MCA1OCBMODIgMjIgTDgyIDQyIEw1MCA3OCBMMTggNDIgWlwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICdjaGV2LXUnOiBmID0+IGA8cGF0aCBkPVwiTTE4IDc4IEw1MCA0MiBMODIgNzggTDgyIDU4IEw1MCAyMiBMMTggNTggWlwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICd0cmktdGwnOiBmID0+IGA8cG9seWdvbiBwb2ludHM9XCIwLDAgMTAwLDAgMCwxMDBcIiBmaWxsPVwiJHtmfVwiLz5gLFxuICAndHJpLXRyJzogZiA9PiBgPHBvbHlnb24gcG9pbnRzPVwiMCwwIDEwMCwwIDEwMCwxMDBcIiBmaWxsPVwiJHtmfVwiLz5gLFxuICAndHJpLWJsJzogZiA9PiBgPHBvbHlnb24gcG9pbnRzPVwiMCwwIDEwMCwxMDAgMCwxMDBcIiBmaWxsPVwiJHtmfVwiLz5gLFxuICAndHJpLWJyJzogZiA9PiBgPHBvbHlnb24gcG9pbnRzPVwiMTAwLDAgMTAwLDEwMCAwLDEwMFwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gIHNvbGlkOiAoKSA9PiBgYCxcbiAgZGlhbW9uZDogZiA9PiBgPHBvbHlnb24gcG9pbnRzPVwiNTAsMTIgODgsNTAgNTAsODggMTIsNTBcIiBmaWxsPVwiJHtmfVwiLz5gLFxuICAnc21hbGwtcic6IGYgPT4gYDxwYXRoIGQ9XCJNMzggMzIgTDYyIDUwIEwzOCA2OCBMNDggNjggTDcyIDUwIEw0OCAzMiBaXCIgZmlsbD1cIiR7Zn1cIi8+YCxcbiAgJ3NtYWxsLWwnOiBmID0+IGA8cGF0aCBkPVwiTTYyIDMyIEwzOCA1MCBMNjIgNjggTDUyIDY4IEwyOCA1MCBMNTIgMzIgWlwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICdhcnJvdy1yJzogZiA9PiBgPHBhdGggZD1cIk0xMCA0MiBMNjAgNDIgTDYwIDI4IEw5MiA1MCBMNjAgNzIgTDYwIDU4IEwxMCA1OCBaXCIgZmlsbD1cIiR7Zn1cIi8+YCxcbiAgJ2Fycm93LWwnOiBmID0+IGA8cGF0aCBkPVwiTTkwIDQyIEw0MCA0MiBMNDAgMjggTDggNTAgTDQwIDcyIEw0MCA1OCBMOTAgNTggWlwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICdob3VzZS1kJzogZiA9PlxuICAgIGA8cG9seWdvbiBwb2ludHM9XCI1MCwyMCA4OCw1MCAxMiw1MFwiIGZpbGw9XCIke2Z9XCIvPjxyZWN0IHg9XCIyOFwiIHk9XCI1MFwiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCIzMlwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICdoYWxmLWwnOiBmID0+IGA8cmVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI1MFwiIGhlaWdodD1cIjEwMFwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICdoYWxmLXQnOiBmID0+IGA8cmVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCIxMDBcIiBoZWlnaHQ9XCI1MFwiIGZpbGw9XCIke2Z9XCIvPmAsXG59O1xuXG5leHBvcnQgY29uc3QgTU9USUZfS0VZUzogUGF0dGVybk1vdGlmS2V5W10gPSBPYmplY3Qua2V5cyhQQVRURVJOX01PVElGUykgYXMgUGF0dGVybk1vdGlmS2V5W107XG5cbi8qKiBDaGV2cm9uIGZhbWlseSDigJQgb3JpZW50YXRpb25zICsgc2l6ZSB2YXJpYW50cyArIGFycm93cy4gKi9cbmV4cG9ydCBjb25zdCBDSEVWX0tFWVM6IFBhdHRlcm5Nb3RpZktleVtdID0gW1xuICAnY2hldi1yJyxcbiAgJ2NoZXYtbCcsXG4gICdjaGV2LWQnLFxuICAnY2hldi11JyxcbiAgJ3NtYWxsLXInLFxuICAnc21hbGwtbCcsXG4gICdhcnJvdy1yJyxcbiAgJ2Fycm93LWwnLFxuXTtcblxuLyoqIFRyaWFuZ2xlIC8gaGFsZi1maWxsIGZhbWlseS4gKi9cbmV4cG9ydCBjb25zdCBUUklfS0VZUzogUGF0dGVybk1vdGlmS2V5W10gPSBbXG4gICd0cmktdGwnLFxuICAndHJpLXRyJyxcbiAgJ3RyaS1ibCcsXG4gICd0cmktYnInLFxuICAnaGFsZi1sJyxcbiAgJ2hhbGYtdCcsXG4gICdob3VzZS1kJyxcbl07XG5cbi8qKiBDZW50ZXIgc2hhcGUgZmFtaWx5IChjdXJyZW50bHkgc29sbyBkaWFtb25kKS4gKi9cbmV4cG9ydCBjb25zdCBTSEFQRV9LRVlTOiBQYXR0ZXJuTW90aWZLZXlbXSA9IFsnZGlhbW9uZCddO1xuXG4vKiogTm8tZm9yZWdyb3VuZCB0aWxlcyDigJQgc29sbyBlbCByZWN0IGRlIGZvbmRvLiAqL1xuZXhwb3J0IGNvbnN0IFNPTElEX0tFWVM6IFBhdHRlcm5Nb3RpZktleVtdID0gWydzb2xpZCddO1xuXG4vKiogQnVpbHQtaW4gcGFsZXR0ZXMg4oCUIGRhcmsg4oaSIGxpZ2h0ICg4IGNvbG9ycykuICovXG5leHBvcnQgdHlwZSBQYXR0ZXJuUGFsZXR0ZUtleSA9ICdwdXJwbGUnIHwgJ2luaycgfCAnbGF2ZW5kZXInO1xuXG5leHBvcnQgY29uc3QgUEFUVEVSTl9QQUxFVFRFUzogUmVjb3JkPFBhdHRlcm5QYWxldHRlS2V5LCBzdHJpbmdbXT4gPSB7XG4gIHB1cnBsZTogWycjMGUwNDIwJywgJyMyYTExNTgnLCAnIzRhMWQ5NicsICcjNzAyNmRmJywgJyM5MTU2ZTgnLCAnI2I0OGVlYScsICcjZDljM2Y1JywgJyNlYmRjZmQnXSxcbiAgaW5rOiBbJyMwMDAwMDAnLCAnIzBhMGYxYycsICcjMWEyMjM1JywgJyMyZDNhNTUnLCAnIzRhNTg3OCcsICcjN2Q4YWE1JywgJyNiOGMxZDQnLCAnI2U0ZThmMCddLFxuICBsYXZlbmRlcjogW1xuICAgICcjMWEwZTNhJyxcbiAgICAnIzJlMTc1NScsXG4gICAgJyM1YTNhYTAnLFxuICAgICcjN2U1ZGM2JyxcbiAgICAnI2ExOGJkOScsXG4gICAgJyNjNGE4ZjAnLFxuICAgICcjZGNjZWY1JyxcbiAgICAnI2YwZTZmYycsXG4gIF0sXG59O1xuXG4vKipcbiAqIE11bGJlcnJ5MzIgc2VlZGVkIFJORyDigJQgZGV2dWVsdmUgZnVuY2nDs24gYCgpPT5bMCwxKWAuXG4gKiBEZXRlcm1pbmlzdGljOiBtaXNtbyBzZWVkIOKGkiBtaXNtYSBzZWN1ZW5jaWEuIMOadGlsIHBhcmEgcGF0cm9uZXMgcmVwcm9kdWNpYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bGJlcnJ5MzIoc2VlZDogbnVtYmVyKTogKCkgPT4gbnVtYmVyIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBzZWVkID0gKHNlZWQgKyAweDZkMmI3OWY1KSA+Pj4gMDtcbiAgICBsZXQgdCA9IHNlZWQ7XG4gICAgdCA9IE1hdGguaW11bCh0IF4gKHQgPj4+IDE1KSwgdCB8IDEpO1xuICAgIHQgXj0gdCArIE1hdGguaW11bCh0IF4gKHQgPj4+IDcpLCB0IHwgNjEpO1xuICAgIHJldHVybiAoKHQgXiAodCA+Pj4gMTQpKSA+Pj4gMCkgLyA0Mjk0OTY3Mjk2O1xuICB9O1xufVxuXG4vKipcbiAqIERlbnNpZGFkIGRlIGNoZXZyb25zICgwLi4xKS4gRWwgcmVzdG8gc2UgcmVwYXJ0ZSBlbnRyZSBzb2xpZCAoMjAlKSwgc2hhcGVcbiAqICgxNSUpIHkgdHJpIChyZXN0byksIHByb3BvcmNpb25hbCBhbCBnYXAgbGVmdCBkZXNwdcOpcyBkZWwgdGhyZXNob2xkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdHRlcm5HZW5Db25maWcge1xuICBjb2xzOiBudW1iZXI7XG4gIHJvd3M6IG51bWJlcjtcbiAgc2VlZDogbnVtYmVyO1xuICBwYWxldHRlOiBzdHJpbmdbXTtcbiAgY2hldnJvbkRlbnNpdHk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF0dGVyblRpbGUge1xuICBtb3RpZjogUGF0dGVybk1vdGlmS2V5O1xuICBiZzogc3RyaW5nO1xuICBmZzogc3RyaW5nO1xufVxuXG4vKiogR2VuZXJhIG1hdHJpeiBkZSB0aWxlcyBhcGxpY2FuZG8gZGVuc2lkYWRlcyArIHJlZ2xhcyBkZSBjb250cmFzdGUuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQYXR0ZXJuVGlsZXMoY2ZnOiBQYXR0ZXJuR2VuQ29uZmlnKTogUGF0dGVyblRpbGVbXSB7XG4gIGNvbnN0IHsgY29scywgcm93cywgc2VlZCwgcGFsZXR0ZSB9ID0gY2ZnO1xuICBjb25zdCBjaGV2cm9uRGVuc2l0eSA9IGNmZy5jaGV2cm9uRGVuc2l0eSA/PyAwLjU1O1xuICBjb25zdCByID0gbXVsYmVycnkzMihzZWVkKTtcbiAgY29uc3QgdGlsZXM6IFBhdHRlcm5UaWxlW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHMgKiByb3dzOyBpKyspIHtcbiAgICBjb25zdCByb2xsID0gcigpO1xuICAgIGxldCBrZXk6IFBhdHRlcm5Nb3RpZktleTtcbiAgICBpZiAocm9sbCA8IGNoZXZyb25EZW5zaXR5KSBrZXkgPSBDSEVWX0tFWVNbTWF0aC5mbG9vcihyKCkgKiBDSEVWX0tFWVMubGVuZ3RoKV0hO1xuICAgIGVsc2UgaWYgKHJvbGwgPCBjaGV2cm9uRGVuc2l0eSArIDAuMikga2V5ID0gU09MSURfS0VZU1tNYXRoLmZsb29yKHIoKSAqIFNPTElEX0tFWVMubGVuZ3RoKV0hO1xuICAgIGVsc2UgaWYgKHJvbGwgPCBjaGV2cm9uRGVuc2l0eSArIDAuMzUpIGtleSA9IFNIQVBFX0tFWVNbTWF0aC5mbG9vcihyKCkgKiBTSEFQRV9LRVlTLmxlbmd0aCldITtcbiAgICBlbHNlIGtleSA9IFRSSV9LRVlTW01hdGguZmxvb3IocigpICogVFJJX0tFWVMubGVuZ3RoKV0hO1xuXG4gICAgLy8gUGljayBiZyArIGNvbnRyYXN0aW5nIGZnICjDrW5kaWNlcyBjb24gZGlzdGFuY2lhIOKJpTMgZW4gbGEgcGFsZXR0ZSkuXG4gICAgY29uc3QgYmdJZHggPSBNYXRoLmZsb29yKHIoKSAqIHBhbGV0dGUubGVuZ3RoKTtcbiAgICBsZXQgZmdJZHggPSBNYXRoLmZsb29yKHIoKSAqIHBhbGV0dGUubGVuZ3RoKTtcbiAgICBsZXQgdHJpZXMgPSAwO1xuICAgIHdoaWxlIChNYXRoLmFicyhmZ0lkeCAtIGJnSWR4KSA8IDMgJiYgdHJpZXMgPCA2KSB7XG4gICAgICBmZ0lkeCA9IE1hdGguZmxvb3IocigpICogcGFsZXR0ZS5sZW5ndGgpO1xuICAgICAgdHJpZXMrKztcbiAgICB9XG4gICAgdGlsZXMucHVzaCh7IG1vdGlmOiBrZXksIGJnOiBwYWxldHRlW2JnSWR4XSEsIGZnOiBwYWxldHRlW2ZnSWR4XSEgfSk7XG4gIH1cblxuICByZXR1cm4gdGlsZXM7XG59XG5cbi8qKlxuICogUmVuZGVyaXphIGVsIGlubmVyIFNWRyAoc2luIGVsIGA8c3ZnPmAgcm9vdCkgcGFyYSB1bmEgbWF0cml6IGRlIHRpbGVzLlxuICogQ2FsbGVyIHdyYXBzIGVuIGA8c3ZnIHZpZXdCb3g9XCIwIDAge2NvbHMqMTAwfSB7cm93cyoxMDB9XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cInhNaWRZTWlkIHNsaWNlXCI+YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclBhdHRlcm5TdmdJbm5lcihcbiAgdGlsZXM6IFBhdHRlcm5UaWxlW10sXG4gIGNvbHM6IG51bWJlcixcbiAgYmFzZUNvbG9yOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IFcgPSBjb2xzICogMTAwO1xuICBjb25zdCByb3dzID0gTWF0aC5jZWlsKHRpbGVzLmxlbmd0aCAvIGNvbHMpO1xuICBjb25zdCBIID0gcm93cyAqIDEwMDtcbiAgbGV0IGlubmVyID0gYDxyZWN0IHdpZHRoPVwiJHtXfVwiIGhlaWdodD1cIiR7SH1cIiBmaWxsPVwiJHtiYXNlQ29sb3J9XCIvPmA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjID0gaSAlIGNvbHM7XG4gICAgY29uc3QgciA9IE1hdGguZmxvb3IoaSAvIGNvbHMpO1xuICAgIGNvbnN0IHQgPSB0aWxlc1tpXSE7XG4gICAgY29uc3Qgc2hhcGUgPSBQQVRURVJOX01PVElGU1t0Lm1vdGlmXSh0LmZnKTtcbiAgICBpbm5lciArPSBgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKCR7YyAqIDEwMH0gJHtyICogMTAwfSlcIj48cmVjdCB3aWR0aD1cIjEwMFwiIGhlaWdodD1cIjEwMFwiIGZpbGw9XCIke3QuYmd9XCIvPiR7c2hhcGV9PC9nPmA7XG4gIH1cbiAgcmV0dXJuIGlubmVyO1xufVxuIl19
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW90aWZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2F0b21zL3BhdHRlcm4vbW90aWZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBcUJIOzs7O0dBSUc7QUFDSCxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFTLEVBQUUsSUFBWSxXQUFXLEVBQUUsRUFBRSxDQUN2RCxXQUFXLENBQUMsbUJBQW1CLENBQUMsOERBQThELENBQUM7QUFFakcsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFvRDtJQUM3RSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxrQ0FBa0MsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJO0lBQ2pFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLGtDQUFrQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUk7SUFDakUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsa0NBQWtDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtJQUNqRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxrQ0FBa0MsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJO0lBQ2pFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLEtBQUs7SUFDaEUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsNkNBQTZDLENBQUMsS0FBSztJQUNsRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyw2Q0FBNkMsQ0FBQyxLQUFLO0lBQ2xFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLCtDQUErQyxDQUFDLEtBQUs7SUFDcEUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDZixP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YUFBYSxDQUFDLFdBQVcsU0FBUyxLQUFLLENBQUM7SUFDckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUNwQixNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QyxLQUFLLElBQUksMkJBQTJCLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsMkNBQTJDLENBQUMsQ0FBQyxFQUFFLE1BQU0sS0FBSyxNQUFNLENBQUM7SUFDekgsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmFsdGVjaCBQYXR0ZXJuIFN5c3RlbSDigJQgbW90aWZzICsgcGFsZXR0ZXMuXG4gKlxuICogUHVyZSBkYXRhICsgaGVscGVycywgc2luIGRlcGVuZGVuY2lhcyBBbmd1bGFyLiBSZXVzYWJsZSBkZXNkZSBOb2RlL3NjcmlwdHNcbiAqIChlLmcuLCBnZW5lcmF0ZSBzdGF0aWMgdGh1bWJuYWlscykgbyBkZXNkZSBlbCBjb21wb25lbnRlIGB2YWwtcGF0dGVybmAuXG4gKlxuICogT3JpZ2luYWwgc3BlYzogYGFzc2V0cy9WYWx0ZWNoIFBhdHRlcm4gU3lzdGVtLmh0bWxgIChzaW5nbGUtcGFnZSBkZW1vKS5cbiAqIENhZGEgbW90aWYgZXMgZnVuY2nDs24gYChmaWxsOiBzdHJpbmcpID0+IHN0cmluZ2AgcXVlIGRldnVlbHZlIFNWRyBpbm5lclxuICogbWFya3VwLiBUaWxlIGVzIDEwMMOXMTAwIHVuaWRhZGVzOyBlbCBtb3RpZiBzZSByZW5kZXJpemEgZGVudHJvIGRlIHVuIGA8Z1xuICogdHJhbnNmb3JtPVwidHJhbnNsYXRlKGNvbCoxMDAgcm93KjEwMClcIj5gIGNvbiB1biBgPHJlY3Qgd2lkdGg9MTAwIGhlaWdodD0xMDBcbiAqIGZpbGw9YmcvPmAgZGUgZm9uZG8uXG4gKi9cblxuZXhwb3J0IHR5cGUgUGF0dGVybk1vdGlmS2V5ID1cbiAgfCAnY2hldi1yJ1xuICB8ICdjaGV2LWwnXG4gIHwgJ2NoZXYtZCdcbiAgfCAnY2hldi11J1xuICB8ICd0cmktdGwnXG4gIHwgJ3RyaS10cidcbiAgfCAndHJpLWJsJ1xuICB8ICd0cmktYnInXG4gIHwgJ3NvbGlkJ1xuICB8ICdkaWFtb25kJ1xuICB8ICdzbWFsbC1yJ1xuICB8ICdzbWFsbC1sJ1xuICB8ICdhcnJvdy1yJ1xuICB8ICdhcnJvdy1sJ1xuICB8ICdob3VzZS1kJ1xuICB8ICdoYWxmLWwnXG4gIHwgJ2hhbGYtdCc7XG5cbi8qKlxuICogQ2hldnJvbnMgc3Ryb2tlLWJhc2VkIGNvbiBsaW5lY2FwL2xpbmVqb2luIHJlZG9uZG9zIOKAlCB2aXN1YWxtZW50ZSBjb2hlcmVudGVcbiAqIGNvbiBlbCBzw61tYm9sbyBkZSBtYXJjYSBWYWx0ZWNoIChgPl9gKS4gU3Ryb2tlLXdpZHRoIDE4IChkZWZhdWx0KSwgMTIgcGFyYVxuICogdmFyaWFudHMgYHNtYWxsLSpgLlxuICovXG5jb25zdCBDSEVWX1NUUk9LRSA9IDE4O1xuY29uc3QgQ0hFVl9TTUFMTF9TVFJPS0UgPSAxMjtcbmNvbnN0IGNoZXZTdHlsZSA9IChmOiBzdHJpbmcsIHc6IG51bWJlciA9IENIRVZfU1RST0tFKSA9PlxuICBgc3Ryb2tlPVwiJHtmfVwiIHN0cm9rZS13aWR0aD1cIiR7d31cIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBmaWxsPVwibm9uZVwiYDtcblxuZXhwb3J0IGNvbnN0IFBBVFRFUk5fTU9USUZTOiBSZWNvcmQ8UGF0dGVybk1vdGlmS2V5LCAoZmc6IHN0cmluZykgPT4gc3RyaW5nPiA9IHtcbiAgJ2NoZXYtcic6IGYgPT4gYDxwYXRoIGQ9XCJNMjIgMTggTDcyIDUwIEwyMiA4MlwiICR7Y2hldlN0eWxlKGYpfS8+YCxcbiAgJ2NoZXYtbCc6IGYgPT4gYDxwYXRoIGQ9XCJNNzggMTggTDI4IDUwIEw3OCA4MlwiICR7Y2hldlN0eWxlKGYpfS8+YCxcbiAgJ2NoZXYtZCc6IGYgPT4gYDxwYXRoIGQ9XCJNMTggMjIgTDUwIDcyIEw4MiAyMlwiICR7Y2hldlN0eWxlKGYpfS8+YCxcbiAgJ2NoZXYtdSc6IGYgPT4gYDxwYXRoIGQ9XCJNMTggNzggTDUwIDI4IEw4MiA3OFwiICR7Y2hldlN0eWxlKGYpfS8+YCxcbiAgJ3RyaS10bCc6IGYgPT4gYDxwb2x5Z29uIHBvaW50cz1cIjAsMCAxMDAsMCAwLDEwMFwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICd0cmktdHInOiBmID0+IGA8cG9seWdvbiBwb2ludHM9XCIwLDAgMTAwLDAgMTAwLDEwMFwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICd0cmktYmwnOiBmID0+IGA8cG9seWdvbiBwb2ludHM9XCIwLDAgMTAwLDEwMCAwLDEwMFwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICd0cmktYnInOiBmID0+IGA8cG9seWdvbiBwb2ludHM9XCIxMDAsMCAxMDAsMTAwIDAsMTAwXCIgZmlsbD1cIiR7Zn1cIi8+YCxcbiAgc29saWQ6ICgpID0+IGBgLFxuICBkaWFtb25kOiBmID0+IGA8cG9seWdvbiBwb2ludHM9XCI1MCwxMiA4OCw1MCA1MCw4OCAxMiw1MFwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICdzbWFsbC1yJzogZiA9PiBgPHBhdGggZD1cIk0zOCAzMiBMNjIgNTAgTDM4IDY4XCIgJHtjaGV2U3R5bGUoZiwgQ0hFVl9TTUFMTF9TVFJPS0UpfS8+YCxcbiAgJ3NtYWxsLWwnOiBmID0+IGA8cGF0aCBkPVwiTTYyIDMyIEwzOCA1MCBMNjIgNjhcIiAke2NoZXZTdHlsZShmLCBDSEVWX1NNQUxMX1NUUk9LRSl9Lz5gLFxuICAnYXJyb3ctcic6IGYgPT4gYDxwYXRoIGQ9XCJNMTAgNDIgTDYwIDQyIEw2MCAyOCBMOTIgNTAgTDYwIDcyIEw2MCA1OCBMMTAgNTggWlwiIGZpbGw9XCIke2Z9XCIvPmAsXG4gICdhcnJvdy1sJzogZiA9PiBgPHBhdGggZD1cIk05MCA0MiBMNDAgNDIgTDQwIDI4IEw4IDUwIEw0MCA3MiBMNDAgNTggTDkwIDU4IFpcIiBmaWxsPVwiJHtmfVwiLz5gLFxuICAnaG91c2UtZCc6IGYgPT5cbiAgICBgPHBvbHlnb24gcG9pbnRzPVwiNTAsMjAgODgsNTAgMTIsNTBcIiBmaWxsPVwiJHtmfVwiLz48cmVjdCB4PVwiMjhcIiB5PVwiNTBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiMzJcIiBmaWxsPVwiJHtmfVwiLz5gLFxuICAnaGFsZi1sJzogZiA9PiBgPHJlY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNTBcIiBoZWlnaHQ9XCIxMDBcIiBmaWxsPVwiJHtmfVwiLz5gLFxuICAnaGFsZi10JzogZiA9PiBgPHJlY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMTAwXCIgaGVpZ2h0PVwiNTBcIiBmaWxsPVwiJHtmfVwiLz5gLFxufTtcblxuZXhwb3J0IGNvbnN0IE1PVElGX0tFWVM6IFBhdHRlcm5Nb3RpZktleVtdID0gT2JqZWN0LmtleXMoUEFUVEVSTl9NT1RJRlMpIGFzIFBhdHRlcm5Nb3RpZktleVtdO1xuXG4vKiogQ2hldnJvbiBmYW1pbHkg4oCUIG9yaWVudGF0aW9ucyArIHNpemUgdmFyaWFudHMgKyBhcnJvd3MuICovXG5leHBvcnQgY29uc3QgQ0hFVl9LRVlTOiBQYXR0ZXJuTW90aWZLZXlbXSA9IFtcbiAgJ2NoZXYtcicsXG4gICdjaGV2LWwnLFxuICAnY2hldi1kJyxcbiAgJ2NoZXYtdScsXG4gICdzbWFsbC1yJyxcbiAgJ3NtYWxsLWwnLFxuICAnYXJyb3ctcicsXG4gICdhcnJvdy1sJyxcbl07XG5cbi8qKiBUcmlhbmdsZSAvIGhhbGYtZmlsbCBmYW1pbHkuICovXG5leHBvcnQgY29uc3QgVFJJX0tFWVM6IFBhdHRlcm5Nb3RpZktleVtdID0gW1xuICAndHJpLXRsJyxcbiAgJ3RyaS10cicsXG4gICd0cmktYmwnLFxuICAndHJpLWJyJyxcbiAgJ2hhbGYtbCcsXG4gICdoYWxmLXQnLFxuICAnaG91c2UtZCcsXG5dO1xuXG4vKiogQ2VudGVyIHNoYXBlIGZhbWlseSAoY3VycmVudGx5IHNvbG8gZGlhbW9uZCkuICovXG5leHBvcnQgY29uc3QgU0hBUEVfS0VZUzogUGF0dGVybk1vdGlmS2V5W10gPSBbJ2RpYW1vbmQnXTtcblxuLyoqIE5vLWZvcmVncm91bmQgdGlsZXMg4oCUIHNvbG8gZWwgcmVjdCBkZSBmb25kby4gKi9cbmV4cG9ydCBjb25zdCBTT0xJRF9LRVlTOiBQYXR0ZXJuTW90aWZLZXlbXSA9IFsnc29saWQnXTtcblxuLyoqIEJ1aWx0LWluIHBhbGV0dGVzIOKAlCBkYXJrIOKGkiBsaWdodCAoOCBjb2xvcnMpLiAqL1xuZXhwb3J0IHR5cGUgUGF0dGVyblBhbGV0dGVLZXkgPSAncHVycGxlJyB8ICdpbmsnIHwgJ2xhdmVuZGVyJztcblxuZXhwb3J0IGNvbnN0IFBBVFRFUk5fUEFMRVRURVM6IFJlY29yZDxQYXR0ZXJuUGFsZXR0ZUtleSwgc3RyaW5nW10+ID0ge1xuICBwdXJwbGU6IFsnIzBlMDQyMCcsICcjMmExMTU4JywgJyM0YTFkOTYnLCAnIzcwMjZkZicsICcjOTE1NmU4JywgJyNiNDhlZWEnLCAnI2Q5YzNmNScsICcjZWJkY2ZkJ10sXG4gIGluazogWycjMDAwMDAwJywgJyMwYTBmMWMnLCAnIzFhMjIzNScsICcjMmQzYTU1JywgJyM0YTU4NzgnLCAnIzdkOGFhNScsICcjYjhjMWQ0JywgJyNlNGU4ZjAnXSxcbiAgbGF2ZW5kZXI6IFtcbiAgICAnIzFhMGUzYScsXG4gICAgJyMyZTE3NTUnLFxuICAgICcjNWEzYWEwJyxcbiAgICAnIzdlNWRjNicsXG4gICAgJyNhMThiZDknLFxuICAgICcjYzRhOGYwJyxcbiAgICAnI2RjY2VmNScsXG4gICAgJyNmMGU2ZmMnLFxuICBdLFxufTtcblxuLyoqXG4gKiBNdWxiZXJyeTMyIHNlZWRlZCBSTkcg4oCUIGRldnVlbHZlIGZ1bmNpw7NuIGAoKT0+WzAsMSlgLlxuICogRGV0ZXJtaW5pc3RpYzogbWlzbW8gc2VlZCDihpIgbWlzbWEgc2VjdWVuY2lhLiDDmnRpbCBwYXJhIHBhdHJvbmVzIHJlcHJvZHVjaWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWxiZXJyeTMyKHNlZWQ6IG51bWJlcik6ICgpID0+IG51bWJlciB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgc2VlZCA9IChzZWVkICsgMHg2ZDJiNzlmNSkgPj4+IDA7XG4gICAgbGV0IHQgPSBzZWVkO1xuICAgIHQgPSBNYXRoLmltdWwodCBeICh0ID4+PiAxNSksIHQgfCAxKTtcbiAgICB0IF49IHQgKyBNYXRoLmltdWwodCBeICh0ID4+PiA3KSwgdCB8IDYxKTtcbiAgICByZXR1cm4gKCh0IF4gKHQgPj4+IDE0KSkgPj4+IDApIC8gNDI5NDk2NzI5NjtcbiAgfTtcbn1cblxuLyoqXG4gKiBEZW5zaWRhZCBkZSBjaGV2cm9ucyAoMC4uMSkuIEVsIHJlc3RvIHNlIHJlcGFydGUgZW50cmUgc29saWQgKDIwJSksIHNoYXBlXG4gKiAoMTUlKSB5IHRyaSAocmVzdG8pLCBwcm9wb3JjaW9uYWwgYWwgZ2FwIGxlZnQgZGVzcHXDqXMgZGVsIHRocmVzaG9sZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXR0ZXJuR2VuQ29uZmlnIHtcbiAgY29sczogbnVtYmVyO1xuICByb3dzOiBudW1iZXI7XG4gIHNlZWQ6IG51bWJlcjtcbiAgcGFsZXR0ZTogc3RyaW5nW107XG4gIGNoZXZyb25EZW5zaXR5PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhdHRlcm5UaWxlIHtcbiAgbW90aWY6IFBhdHRlcm5Nb3RpZktleTtcbiAgYmc6IHN0cmluZztcbiAgZmc6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHZW5lcmEgVU4gdGlsZSBjb24gbW90aWYvYmcvZmcgcmVzcGV0YW5kbyBkZW5zaWRhZGVzICsgY29udHJhc3RlLlxuICogQ2FsbGVyIHBhc2Egcm5nIChNYXRoLnJhbmRvbSBvIHNlZWRlZCkg4oCUIMO6dGlsIHBhcmEgcmVzaHVmZmxlIGluZGl2aWR1YWwgZGVcbiAqIHRpbGVzIGVuIGB2YWwtcGF0dGVybmAgc2luIHJlZ2VuZXJhciBsYSBncmlkIGNvbXBsZXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21UaWxlKFxuICBwYWxldHRlOiBzdHJpbmdbXSxcbiAgY2hldnJvbkRlbnNpdHkgPSAwLjU1LFxuICBybmc6ICgpID0+IG51bWJlciA9IE1hdGgucmFuZG9tXG4pOiBQYXR0ZXJuVGlsZSB7XG4gIGNvbnN0IHJvbGwgPSBybmcoKTtcbiAgbGV0IGtleTogUGF0dGVybk1vdGlmS2V5O1xuICBpZiAocm9sbCA8IGNoZXZyb25EZW5zaXR5KSBrZXkgPSBDSEVWX0tFWVNbTWF0aC5mbG9vcihybmcoKSAqIENIRVZfS0VZUy5sZW5ndGgpXSE7XG4gIGVsc2UgaWYgKHJvbGwgPCBjaGV2cm9uRGVuc2l0eSArIDAuMikga2V5ID0gU09MSURfS0VZU1tNYXRoLmZsb29yKHJuZygpICogU09MSURfS0VZUy5sZW5ndGgpXSE7XG4gIGVsc2UgaWYgKHJvbGwgPCBjaGV2cm9uRGVuc2l0eSArIDAuMzUpIGtleSA9IFNIQVBFX0tFWVNbTWF0aC5mbG9vcihybmcoKSAqIFNIQVBFX0tFWVMubGVuZ3RoKV0hO1xuICBlbHNlIGtleSA9IFRSSV9LRVlTW01hdGguZmxvb3Iocm5nKCkgKiBUUklfS0VZUy5sZW5ndGgpXSE7XG5cbiAgY29uc3QgYmdJZHggPSBNYXRoLmZsb29yKHJuZygpICogcGFsZXR0ZS5sZW5ndGgpO1xuICBsZXQgZmdJZHggPSBNYXRoLmZsb29yKHJuZygpICogcGFsZXR0ZS5sZW5ndGgpO1xuICBsZXQgdHJpZXMgPSAwO1xuICB3aGlsZSAoTWF0aC5hYnMoZmdJZHggLSBiZ0lkeCkgPCAzICYmIHRyaWVzIDwgNikge1xuICAgIGZnSWR4ID0gTWF0aC5mbG9vcihybmcoKSAqIHBhbGV0dGUubGVuZ3RoKTtcbiAgICB0cmllcysrO1xuICB9XG4gIHJldHVybiB7IG1vdGlmOiBrZXksIGJnOiBwYWxldHRlW2JnSWR4XSEsIGZnOiBwYWxldHRlW2ZnSWR4XSEgfTtcbn1cblxuLyoqIEdlbmVyYSBtYXRyaXogZGUgdGlsZXMgYXBsaWNhbmRvIGRlbnNpZGFkZXMgKyByZWdsYXMgZGUgY29udHJhc3RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUGF0dGVyblRpbGVzKGNmZzogUGF0dGVybkdlbkNvbmZpZyk6IFBhdHRlcm5UaWxlW10ge1xuICBjb25zdCB7IGNvbHMsIHJvd3MsIHNlZWQsIHBhbGV0dGUgfSA9IGNmZztcbiAgY29uc3QgY2hldnJvbkRlbnNpdHkgPSBjZmcuY2hldnJvbkRlbnNpdHkgPz8gMC41NTtcbiAgY29uc3QgciA9IG11bGJlcnJ5MzIoc2VlZCk7XG4gIGNvbnN0IHRpbGVzOiBQYXR0ZXJuVGlsZVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29scyAqIHJvd3M7IGkrKykge1xuICAgIHRpbGVzLnB1c2goZ2VuZXJhdGVSYW5kb21UaWxlKHBhbGV0dGUsIGNoZXZyb25EZW5zaXR5LCByKSk7XG4gIH1cbiAgcmV0dXJuIHRpbGVzO1xufVxuXG4vKipcbiAqIFJlbmRlcml6YSBlbCBpbm5lciBTVkcgKHNpbiBlbCBgPHN2Zz5gIHJvb3QpIHBhcmEgdW5hIG1hdHJpeiBkZSB0aWxlcy5cbiAqIENhbGxlciB3cmFwcyBlbiBgPHN2ZyB2aWV3Qm94PVwiMCAwIHtjb2xzKjEwMH0ge3Jvd3MqMTAwfVwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJ4TWlkWU1pZCBzbGljZVwiPmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJQYXR0ZXJuU3ZnSW5uZXIoXG4gIHRpbGVzOiBQYXR0ZXJuVGlsZVtdLFxuICBjb2xzOiBudW1iZXIsXG4gIGJhc2VDb2xvcjogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBXID0gY29scyAqIDEwMDtcbiAgY29uc3Qgcm93cyA9IE1hdGguY2VpbCh0aWxlcy5sZW5ndGggLyBjb2xzKTtcbiAgY29uc3QgSCA9IHJvd3MgKiAxMDA7XG4gIGxldCBpbm5lciA9IGA8cmVjdCB3aWR0aD1cIiR7V31cIiBoZWlnaHQ9XCIke0h9XCIgZmlsbD1cIiR7YmFzZUNvbG9yfVwiLz5gO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYyA9IGkgJSBjb2xzO1xuICAgIGNvbnN0IHIgPSBNYXRoLmZsb29yKGkgLyBjb2xzKTtcbiAgICBjb25zdCB0ID0gdGlsZXNbaV0hO1xuICAgIGNvbnN0IHNoYXBlID0gUEFUVEVSTl9NT1RJRlNbdC5tb3RpZl0odC5mZyk7XG4gICAgaW5uZXIgKz0gYDxnIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgke2MgKiAxMDB9ICR7ciAqIDEwMH0pXCI+PHJlY3Qgd2lkdGg9XCIxMDBcIiBoZWlnaHQ9XCIxMDBcIiBmaWxsPVwiJHt0LmJnfVwiLz4ke3NoYXBlfTwvZz5gO1xuICB9XG4gIHJldHVybiBpbm5lcjtcbn1cbiJdfQ==
@@ -2,7 +2,7 @@ import { CommonModule } from '@angular/common';
2
2
  import { Component, computed, effect, Input, signal } from '@angular/core';
3
3
  import { DomSanitizer } from '@angular/platform-browser';
4
4
  import { inject } from '@angular/core';
5
- import { generatePatternTiles, PATTERN_PALETTES, renderPatternSvgInner, } from './motifs';
5
+ import { generatePatternTiles, generateRandomTile, PATTERN_PALETTES, renderPatternSvgInner, } from './motifs';
6
6
  import * as i0 from "@angular/core";
7
7
  /**
8
8
  * `val-pattern`
@@ -54,6 +54,9 @@ export class PatternComponent {
54
54
  if (value.reshuffleInterval !== undefined && value.reshuffleInterval > 0) {
55
55
  this.reshuffleInterval.set(value.reshuffleInterval);
56
56
  }
57
+ if (value.tilesPerTick !== undefined && value.tilesPerTick > 0) {
58
+ this.tilesPerTick.set(Math.floor(value.tilesPerTick));
59
+ }
57
60
  if (value.animated !== undefined)
58
61
  this.animated.set(!!value.animated);
59
62
  }
@@ -66,15 +69,16 @@ export class PatternComponent {
66
69
  this.chevronDensity = signal(0.55);
67
70
  this.preserveAspect = signal('slice');
68
71
  this.animated = signal(false);
69
- this.reshuffleInterval = signal(8000);
70
- /** Tiles computed — se regenera cuando cambia seed/cols/rows/palette/density. */
71
- this.tiles = computed(() => generatePatternTiles({
72
- cols: this.cols(),
73
- rows: this.rows(),
74
- seed: this.seed(),
75
- palette: this.paletteRef(),
76
- chevronDensity: this.chevronDensity(),
77
- }));
72
+ /** ms entre updates individuales de tiles (modo animated). Default 1200ms. */
73
+ this.reshuffleInterval = signal(1200);
74
+ /** Cuántos tiles cambiar por tick (default 1 → cambio sutil). */
75
+ this.tilesPerTick = signal(1);
76
+ /**
77
+ * Tiles signal — mutable. Se regenera completa cuando cambia seed/cols/rows/
78
+ * palette/density. En modo animated, tiles individuales se sobrescriben sin
79
+ * tocar el resto (efecto staggered).
80
+ */
81
+ this.tiles = signal([]);
78
82
  /** SVG completo como string sanitized para `[innerHTML]`. */
79
83
  this.svgHtml = computed(() => {
80
84
  const cols = this.cols();
@@ -85,18 +89,30 @@ export class PatternComponent {
85
89
  const svg = `<svg viewBox="0 0 ${cols * 100} ${rows * 100}" preserveAspectRatio="${aspect}" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">${inner}</svg>`;
86
90
  return this.sanitizer.bypassSecurityTrustHtml(svg);
87
91
  });
88
- // Animated reshuffle: cada N ms cambia seed para reshuffle visual.
92
+ // Regenera grid completa cuando cambian props estructurales (cols/rows/
93
+ // palette/density/seed). El seed solo cambia explícitamente via props o
94
+ // mount inicial — NO se muta en modo animated.
95
+ effect(() => {
96
+ const cols = this.cols();
97
+ const rows = this.rows();
98
+ const seed = this.seed();
99
+ const palette = this.paletteRef();
100
+ const density = this.chevronDensity();
101
+ this.tiles.set(generatePatternTiles({ cols, rows, seed, palette, chevronDensity: density }));
102
+ });
103
+ // Modo animated: cada `reshuffleInterval` ms, sobrescribe `tilesPerTick`
104
+ // tiles random — efecto staggered (no toda la grid de una). Si el user
105
+ // desactiva animated, el timer se limpia automáticamente.
89
106
  effect(onCleanup => {
90
107
  const isAnimated = this.animated();
91
108
  const interval = this.reshuffleInterval();
109
+ const perTick = this.tilesPerTick();
92
110
  if (this.timer)
93
111
  clearInterval(this.timer);
94
112
  this.timer = undefined;
95
113
  if (!isAnimated)
96
114
  return;
97
- this.timer = setInterval(() => {
98
- this.seed.set(this.randomSeed());
99
- }, interval);
115
+ this.timer = setInterval(() => this.mutateRandomTiles(perTick), interval);
100
116
  onCleanup(() => {
101
117
  if (this.timer) {
102
118
  clearInterval(this.timer);
@@ -105,6 +121,23 @@ export class PatternComponent {
105
121
  });
106
122
  });
107
123
  }
124
+ /**
125
+ * Reemplaza `count` tiles random del grid actual con tiles nuevos generados.
126
+ * Usado por el modo animated para staggered reshuffle.
127
+ */
128
+ mutateRandomTiles(count) {
129
+ const current = this.tiles();
130
+ if (current.length === 0)
131
+ return;
132
+ const next = [...current];
133
+ const palette = this.paletteRef();
134
+ const density = this.chevronDensity();
135
+ for (let n = 0; n < count; n++) {
136
+ const idx = Math.floor(Math.random() * next.length);
137
+ next[idx] = generateRandomTile(palette, density);
138
+ }
139
+ this.tiles.set(next);
140
+ }
108
141
  ngOnDestroy() {
109
142
  if (this.timer)
110
143
  clearInterval(this.timer);
@@ -128,4 +161,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
128
161
  }], ctorParameters: () => [], propDecorators: { props: [{
129
162
  type: Input
130
163
  }] } });
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvYXRvbXMvcGF0dGVybi9wYXR0ZXJuLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFHaEIscUJBQXFCLEdBQ3RCLE1BQU0sVUFBVSxDQUFDOztBQUdsQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBOEJILE1BQU0sT0FBTyxnQkFBZ0I7SUFjM0Isa0VBQWtFO0lBQ2xFLElBQWEsS0FBSyxDQUFDLEtBQWtDO1FBQ25ELElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUNuQixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsSUFBSSxD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LElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JCLDJFQUEyRTtZQUMzRSxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUNyRCxDQUFDO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7SUFDeEQsQ0FBQztJQUVPLFVBQVU7UUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDOytHQXpGVSxnQkFBZ0I7bUdBQWhCLGdCQUFnQixtR0F6QmpCLDJEQUEyRCx1UkFEM0QsWUFBWTs7NEZBMEJYLGdCQUFnQjtrQkE3QjVCLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLDJEQUEyRDt3REF3Q3hELEtBQUs7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBJbnB1dCwgT25EZXN0cm95LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVQYXR0ZXJuVGlsZXMsXG4gIFBBVFRFUk5fUEFMRVRURVMsXG4gIFBhdHRlcm5QYWxldHRlS2V5LFxuICBQYXR0ZXJuVGlsZSxcbiAgcmVuZGVyUGF0dGVyblN2Z0lubmVyLFxufSBmcm9tICcuL21vdGlmcyc7XG5pbXBvcnQgeyBQYXR0ZXJuTWV0YWRhdGEgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBgdmFsLXBhdHRlcm5gXG4gKlxuICogQ29tcG9uZW50ZSBkZSBmb25kbyBnZW9tw6l0cmljbyBpbnNwaXJhZG8gZW4gZWwgc2lzdGVtYSBWYWx0ZWNoLiBSZW5kZXJpemEgdW5cbiAqIGdyaWQgZGUgdGlsZXMgMTAww5cxMDAgY29uIG1vdGlmcyAoY2hldnJvbnMsIHRyaWFuZ2xlcywgZGlhbW9uZHMsIGFycm93cykgZW5cbiAqIHVuIFNWRyBpbmxpbmUuIERldGVybWluaXN0YSB2w61hIGBzZWVkYCBvIGFuaW1hZG8gdsOtYSBgcmVzaHVmZmxlYC5cbiAqXG4gKiBDZXJvIGRlcGVuZGVuY2lhcyBleHRlcm5hcyDigJQgdG9kbyBTVkcuXG4gKlxuICogQGV4YW1wbGUgQ29tbyBmb25kbyBkZSBjYXJkIChDU1MgYWJzb2x1dGUpOlxuICogYGBgc2Nzc1xuICogLmNhcmQgeyBwb3NpdGlvbjogcmVsYXRpdmU7IG92ZXJmbG93OiBoaWRkZW47IH1cbiAqIC5jYXJkIHZhbC1wYXR0ZXJuIHsgcG9zaXRpb246IGFic29sdXRlOyBpbnNldDogMDsgei1pbmRleDogMDsgb3BhY2l0eTogMC40OyB9XG4gKiAuY2FyZCAuY29udGVudCB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgei1pbmRleDogMTsgfVxuICogYGBgXG4gKlxuICogYGBgaHRtbFxuICogPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAqICAgPHZhbC1wYXR0ZXJuIFtwcm9wc109XCJ7IHBhbGV0dGU6ICdwdXJwbGUnLCBjb2xzOiA2LCByb3dzOiAzLCBzZWVkOiA0MiB9XCIgLz5cbiAqICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5UdSBjb250ZW5pZG8gYXF1w608L2Rpdj5cbiAqIDwvZGl2PlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQ29tbyBiYWNrZ3JvdW5kIGFuaW1hZG8gKGhlcm8vbG9naW4pOlxuICogYGBgaHRtbFxuICogPHZhbC1wYXR0ZXJuIFtwcm9wc109XCJ7IHBhbGV0dGU6ICdsYXZlbmRlcicsIGNvbHM6IDE2LCByb3dzOiA4LCBhbmltYXRlZDogdHJ1ZSB9XCIgLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtcGF0dGVybicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZTogYCA8ZGl2IGNsYXNzPVwidmFsLXBhdHRlcm5cIiBbaW5uZXJIVE1MXT1cInN2Z0h0bWwoKVwiPjwvZGl2PiBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBsaW5lLWhlaWdodDogMDtcbiAgICAgIH1cblxuICAgICAgLnZhbC1wYXR0ZXJuIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC42cyBlYXNlLWluLW91dDtcbiAgICAgIH1cblxuICAgICAgLnZhbC1wYXR0ZXJuIDp3aGVyZShzdmcpIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUGF0dGVybkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc2FuaXRpemVyID0gaW5qZWN0KERvbVNhbml0aXplcik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb2xzID0gc2lnbmFsKDEyKTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3dzID0gc2lnbmFsKDQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlZWQgPSBzaWduYWwodGhpcy5yYW5kb21TZWVkKCkpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhbGV0dGVSZWYgPSBzaWduYWw8c3RyaW5nW10+KFBBVFRFUk5fUEFMRVRURVMucHVycGxlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGV2cm9uRGVuc2l0eSA9IHNpZ25hbCgwLjU1KTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVzZXJ2ZUFzcGVjdCA9IHNpZ25hbDwnc2xpY2UnIHwgJ21lZXQnPignc2xpY2UnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhbmltYXRlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzaHVmZmxlSW50ZXJ2YWwgPSBzaWduYWwoODAwMCk7XG5cbiAgcHJpdmF0ZSB0aW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcblxuICAvKiogT2JqZWN0LWZpcnN0IGlucHV0LiBDYW1iaW9zIGRpc3BhcmFuIHJlLXJlbmRlciBwb3Igc2lnbmFscy4gKi9cbiAgQElucHV0KCkgc2V0IHByb3BzKHZhbHVlOiBQYXR0ZXJuTWV0YWRhdGEgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgaWYgKHZhbHVlLmNvbHMgIT09IHVuZGVmaW5lZCkgdGhpcy5jb2xzLnNldChNYXRoLm1heCgxLCB2YWx1ZS5jb2xzKSk7XG4gICAgaWYgKHZhbHVlLnJvd3MgIT09IHVuZGVmaW5lZCkgdGhpcy5yb3dzLnNldChNYXRoLm1heCgxLCB2YWx1ZS5yb3dzKSk7XG4gICAgaWYgKHZhbHVlLnNlZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5zZWVkLnNldCh2YWx1ZS5zZWVkKTtcbiAgICBpZiAodmFsdWUuY2hldnJvbkRlbnNpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jaGV2cm9uRGVuc2l0eS5zZXQoTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgdmFsdWUuY2hldnJvbkRlbnNpdHkpKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5wcmVzZXJ2ZUFzcGVjdCAhPT0gdW5kZWZpbmVkKSB0aGlzLnByZXNlcnZlQXNwZWN0LnNldCh2YWx1ZS5wcmVzZXJ2ZUFzcGVjdCk7XG4gICAgaWYgKHZhbHVlLnBhbGV0dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wYWxldHRlUmVmLnNldCh0aGlzLnJlc29sdmVQYWxldHRlKHZhbHVlLnBhbGV0dGUpKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnJlc2h1ZmZsZUludGVydmFsICE9PSB1bmRlZmluZWQgJiYgdmFsdWUucmVzaHVmZmxlSW50ZXJ2YWwgPiAwKSB7XG4gICAgICB0aGlzLnJlc2h1ZmZsZUludGVydmFsLnNldCh2YWx1ZS5yZXNodWZmbGVJbnRlcnZhbCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5hbmltYXRlZCAhPT0gdW5kZWZpbmVkKSB0aGlzLmFuaW1hdGVkLnNldCghIXZhbHVlLmFuaW1hdGVkKTtcbiAgfVxuXG4gIC8qKiBUaWxlcyBjb21wdXRlZCDigJQgc2UgcmVnZW5lcmEgY3VhbmRvIGNhbWJpYSBzZWVkL2NvbHMvcm93cy9wYWxldHRlL2RlbnNpdHkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGlsZXMgPSBjb21wdXRlZDxQYXR0ZXJuVGlsZVtdPigoKSA9PlxuICAgIGdlbmVyYXRlUGF0dGVyblRpbGVzKHtcbiAgICAgIGNvbHM6IHRoaXMuY29scygpLFxuICAgICAgcm93czogdGhpcy5yb3dzKCksXG4gICAgICBzZWVkOiB0aGlzLnNlZWQoKSxcbiAgICAgIHBhbGV0dGU6IHRoaXMucGFsZXR0ZVJlZigpLFxuICAgICAgY2hldnJvbkRlbnNpdHk6IHRoaXMuY2hldnJvbkRlbnNpdHkoKSxcbiAgICB9KVxuICApO1xuXG4gIC8qKiBTVkcgY29tcGxldG8gY29tbyBzdHJpbmcgc2FuaXRpemVkIHBhcmEgYFtpbm5lckhUTUxdYC4gKi9cbiAgcmVhZG9ubHkgc3ZnSHRtbCA9IGNvbXB1dGVkPFNhZmVIdG1sPigoKSA9PiB7XG4gICAgY29uc3QgY29scyA9IHRoaXMuY29scygpO1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnJvd3MoKTtcbiAgICBjb25zdCBwYWxldHRlID0gdGhpcy5wYWxldHRlUmVmKCk7XG4gICAgY29uc3QgaW5uZXIgPSByZW5kZXJQYXR0ZXJuU3ZnSW5uZXIodGhpcy50aWxlcygpLCBjb2xzLCBwYWxldHRlWzBdISk7XG4gICAgY29uc3QgYXNwZWN0ID0gdGhpcy5wcmVzZXJ2ZUFzcGVjdCgpID09PSAnbWVldCcgPyAneE1pZFlNaWQgbWVldCcgOiAneE1pZFlNaWQgc2xpY2UnO1xuICAgIGNvbnN0IHN2ZyA9IGA8c3ZnIHZpZXdCb3g9XCIwIDAgJHtjb2xzICogMTAwfSAke3Jvd3MgKiAxMDB9XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIiR7YXNwZWN0fVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4ke2lubmVyfTwvc3ZnPmA7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHN2Zyk7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEFuaW1hdGVkIHJlc2h1ZmZsZTogY2FkYSBOIG1zIGNhbWJpYSBzZWVkIHBhcmEgcmVzaHVmZmxlIHZpc3VhbC5cbiAgICBlZmZlY3Qob25DbGVhbnVwID0+IHtcbiAgICAgIGNvbnN0IGlzQW5pbWF0ZWQgPSB0aGlzLmFuaW1hdGVkKCk7XG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHRoaXMucmVzaHVmZmxlSW50ZXJ2YWwoKTtcbiAgICAgIGlmICh0aGlzLnRpbWVyKSBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICghaXNBbmltYXRlZCkgcmV0dXJuO1xuICAgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZWVkLnNldCh0aGlzLnJhbmRvbVNlZWQoKSk7XG4gICAgICB9LCBpbnRlcnZhbCk7XG4gICAgICBvbkNsZWFudXAoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG4gICAgICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVBhbGV0dGUocDogUGF0dGVyblBhbGV0dGVLZXkgfCBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwKSkge1xuICAgICAgLy8gQWNlcHRhIGFycmF5cyBkZSBjdWFscXVpZXIgbG9uZ2l0dWQg4omlMjsgdGlsZSBjb250cmFzdCBsb2dpYyB1c2Egw61uZGljZXMuXG4gICAgICByZXR1cm4gcC5sZW5ndGggPj0gMiA/IHAgOiBQQVRURVJOX1BBTEVUVEVTLnB1cnBsZTtcbiAgICB9XG4gICAgcmV0dXJuIFBBVFRFUk5fUEFMRVRURVNbcF0gPz8gUEFUVEVSTl9QQUxFVFRFUy5wdXJwbGU7XG4gIH1cblxuICBwcml2YXRlIHJhbmRvbVNlZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMV8wMDBfMDAwKTtcbiAgfVxufVxuIl19
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvYXRvbXMvcGF0dGVybi9wYXR0ZXJuLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBR2hCLHFCQUFxQixHQUN0QixNQUFNLFVBQVUsQ0FBQzs7QUFHbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQThCSCxNQUFNLE9BQU8sZ0JBQWdCO0lBaUIzQixrRUFBa0U7SUFDbEUsSUFBYSxLQUFLLENBQUMsS0FBa0M7UUFDbkQsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQ25CLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsY0FBYyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEYsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLGlCQUFpQixLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBb0JEO1FBeERRLGNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixTQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLFNBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDakMsZUFBVSxHQUFHLE1BQU0sQ0FBVyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixtQkFBYyxHQUFHLE1BQU0sQ0FBbUIsT0FBTyxDQUFDLENBQUM7UUFDbkQsYUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyw4RUFBOEU7UUFDN0Qsc0JBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELGlFQUFpRTtRQUNoRCxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQTBCMUM7Ozs7V0FJRztRQUNjLFVBQUssR0FBRyxNQUFNLENBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELDZEQUE2RDtRQUNwRCxZQUFPLEdBQUcsUUFBUSxDQUFXLEdBQUcsRUFBRTtZQUN6QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7WUFDckYsTUFBTSxHQUFHLEdBQUcscUJBQXFCLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsMEJBQTBCLE1BQU0sMkRBQTJELEtBQUssUUFBUSxDQUFDO1lBQ2xLLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUdELHdFQUF3RTtRQUN4RSx3RUFBd0U7UUFDeEUsK0NBQStDO1FBQy9DLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQyxDQUFDLENBQUM7UUFFSCx5RUFBeUU7UUFDekUsdUVBQXVFO1FBQ3ZFLDBEQUEwRDtRQUMxRCxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQyxJQUFJLElBQUksQ0FBQyxLQUFLO2dCQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7WUFDdkIsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsT0FBTztZQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUUsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZixhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztnQkFDekIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssaUJBQWlCLENBQUMsS0FBYTtRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU8sY0FBYyxDQUFDLENBQStCO1FBQ3BELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JCLDJFQUEyRTtZQUMzRSxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUNyRCxDQUFDO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7SUFDeEQsQ0FBQztJQUVPLFVBQVU7UUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDOytHQXpIVSxnQkFBZ0I7bUdBQWhCLGdCQUFnQixtR0F6QmpCLDJEQUEyRCx1UkFEM0QsWUFBWTs7NEZBMEJYLGdCQUFnQjtrQkE3QjVCLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLDJEQUEyRDt3REEyQ3hELEtBQUs7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBJbnB1dCwgT25EZXN0cm95LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVQYXR0ZXJuVGlsZXMsXG4gIGdlbmVyYXRlUmFuZG9tVGlsZSxcbiAgUEFUVEVSTl9QQUxFVFRFUyxcbiAgUGF0dGVyblBhbGV0dGVLZXksXG4gIFBhdHRlcm5UaWxlLFxuICByZW5kZXJQYXR0ZXJuU3ZnSW5uZXIsXG59IGZyb20gJy4vbW90aWZzJztcbmltcG9ydCB7IFBhdHRlcm5NZXRhZGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIGB2YWwtcGF0dGVybmBcbiAqXG4gKiBDb21wb25lbnRlIGRlIGZvbmRvIGdlb23DqXRyaWNvIGluc3BpcmFkbyBlbiBlbCBzaXN0ZW1hIFZhbHRlY2guIFJlbmRlcml6YSB1blxuICogZ3JpZCBkZSB0aWxlcyAxMDDDlzEwMCBjb24gbW90aWZzIChjaGV2cm9ucywgdHJpYW5nbGVzLCBkaWFtb25kcywgYXJyb3dzKSBlblxuICogdW4gU1ZHIGlubGluZS4gRGV0ZXJtaW5pc3RhIHbDrWEgYHNlZWRgIG8gYW5pbWFkbyB2w61hIGByZXNodWZmbGVgLlxuICpcbiAqIENlcm8gZGVwZW5kZW5jaWFzIGV4dGVybmFzIOKAlCB0b2RvIFNWRy5cbiAqXG4gKiBAZXhhbXBsZSBDb21vIGZvbmRvIGRlIGNhcmQgKENTUyBhYnNvbHV0ZSk6XG4gKiBgYGBzY3NzXG4gKiAuY2FyZCB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgb3ZlcmZsb3c6IGhpZGRlbjsgfVxuICogLmNhcmQgdmFsLXBhdHRlcm4geyBwb3NpdGlvbjogYWJzb2x1dGU7IGluc2V0OiAwOyB6LWluZGV4OiAwOyBvcGFjaXR5OiAwLjQ7IH1cbiAqIC5jYXJkIC5jb250ZW50IHsgcG9zaXRpb246IHJlbGF0aXZlOyB6LWluZGV4OiAxOyB9XG4gKiBgYGBcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICogICA8dmFsLXBhdHRlcm4gW3Byb3BzXT1cInsgcGFsZXR0ZTogJ3B1cnBsZScsIGNvbHM6IDYsIHJvd3M6IDMsIHNlZWQ6IDQyIH1cIiAvPlxuICogICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlR1IGNvbnRlbmlkbyBhcXXDrTwvZGl2PlxuICogPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBDb21vIGJhY2tncm91bmQgYW5pbWFkbyAoaGVyby9sb2dpbik6XG4gKiBgYGBodG1sXG4gKiA8dmFsLXBhdHRlcm4gW3Byb3BzXT1cInsgcGFsZXR0ZTogJ2xhdmVuZGVyJywgY29sczogMTYsIHJvd3M6IDgsIGFuaW1hdGVkOiB0cnVlIH1cIiAvPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1wYXR0ZXJuJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlOiBgIDxkaXYgY2xhc3M9XCJ2YWwtcGF0dGVyblwiIFtpbm5lckhUTUxdPVwic3ZnSHRtbCgpXCI+PC9kaXY+IGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAwO1xuICAgICAgfVxuXG4gICAgICAudmFsLXBhdHRlcm4ge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjZzIGVhc2UtaW4tb3V0O1xuICAgICAgfVxuXG4gICAgICAudmFsLXBhdHRlcm4gOndoZXJlKHN2Zykge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBQYXR0ZXJuQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbHMgPSBzaWduYWwoMTIpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvd3MgPSBzaWduYWwoNCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VlZCA9IHNpZ25hbCh0aGlzLnJhbmRvbVNlZWQoKSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFsZXR0ZVJlZiA9IHNpZ25hbDxzdHJpbmdbXT4oUEFUVEVSTl9QQUxFVFRFUy5wdXJwbGUpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoZXZyb25EZW5zaXR5ID0gc2lnbmFsKDAuNTUpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXNlcnZlQXNwZWN0ID0gc2lnbmFsPCdzbGljZScgfCAnbWVldCc+KCdzbGljZScpO1xuICBwcml2YXRlIHJlYWRvbmx5IGFuaW1hdGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgLyoqIG1zIGVudHJlIHVwZGF0ZXMgaW5kaXZpZHVhbGVzIGRlIHRpbGVzIChtb2RvIGFuaW1hdGVkKS4gRGVmYXVsdCAxMjAwbXMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzaHVmZmxlSW50ZXJ2YWwgPSBzaWduYWwoMTIwMCk7XG4gIC8qKiBDdcOhbnRvcyB0aWxlcyBjYW1iaWFyIHBvciB0aWNrIChkZWZhdWx0IDEg4oaSIGNhbWJpbyBzdXRpbCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGlsZXNQZXJUaWNrID0gc2lnbmFsKDEpO1xuXG4gIHByaXZhdGUgdGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG5cbiAgLyoqIE9iamVjdC1maXJzdCBpbnB1dC4gQ2FtYmlvcyBkaXNwYXJhbiByZS1yZW5kZXIgcG9yIHNpZ25hbHMuICovXG4gIEBJbnB1dCgpIHNldCBwcm9wcyh2YWx1ZTogUGF0dGVybk1ldGFkYXRhIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIGlmICh2YWx1ZS5jb2xzICE9PSB1bmRlZmluZWQpIHRoaXMuY29scy5zZXQoTWF0aC5tYXgoMSwgdmFsdWUuY29scykpO1xuICAgIGlmICh2YWx1ZS5yb3dzICE9PSB1bmRlZmluZWQpIHRoaXMucm93cy5zZXQoTWF0aC5tYXgoMSwgdmFsdWUucm93cykpO1xuICAgIGlmICh2YWx1ZS5zZWVkICE9PSB1bmRlZmluZWQpIHRoaXMuc2VlZC5zZXQodmFsdWUuc2VlZCk7XG4gICAgaWYgKHZhbHVlLmNoZXZyb25EZW5zaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2hldnJvbkRlbnNpdHkuc2V0KE1hdGgubWluKDEsIE1hdGgubWF4KDAsIHZhbHVlLmNoZXZyb25EZW5zaXR5KSkpO1xuICAgIH1cbiAgICBpZiAodmFsdWUucHJlc2VydmVBc3BlY3QgIT09IHVuZGVmaW5lZCkgdGhpcy5wcmVzZXJ2ZUFzcGVjdC5zZXQodmFsdWUucHJlc2VydmVBc3BlY3QpO1xuICAgIGlmICh2YWx1ZS5wYWxldHRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucGFsZXR0ZVJlZi5zZXQodGhpcy5yZXNvbHZlUGFsZXR0ZSh2YWx1ZS5wYWxldHRlKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5yZXNodWZmbGVJbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnJlc2h1ZmZsZUludGVydmFsID4gMCkge1xuICAgICAgdGhpcy5yZXNodWZmbGVJbnRlcnZhbC5zZXQodmFsdWUucmVzaHVmZmxlSW50ZXJ2YWwpO1xuICAgIH1cbiAgICBpZiAodmFsdWUudGlsZXNQZXJUaWNrICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudGlsZXNQZXJUaWNrID4gMCkge1xuICAgICAgdGhpcy50aWxlc1BlclRpY2suc2V0KE1hdGguZmxvb3IodmFsdWUudGlsZXNQZXJUaWNrKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5hbmltYXRlZCAhPT0gdW5kZWZpbmVkKSB0aGlzLmFuaW1hdGVkLnNldCghIXZhbHVlLmFuaW1hdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaWxlcyBzaWduYWwg4oCUIG11dGFibGUuIFNlIHJlZ2VuZXJhIGNvbXBsZXRhIGN1YW5kbyBjYW1iaWEgc2VlZC9jb2xzL3Jvd3MvXG4gICAqIHBhbGV0dGUvZGVuc2l0eS4gRW4gbW9kbyBhbmltYXRlZCwgdGlsZXMgaW5kaXZpZHVhbGVzIHNlIHNvYnJlc2NyaWJlbiBzaW5cbiAgICogdG9jYXIgZWwgcmVzdG8gKGVmZWN0byBzdGFnZ2VyZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0aWxlcyA9IHNpZ25hbDxQYXR0ZXJuVGlsZVtdPihbXSk7XG5cbiAgLyoqIFNWRyBjb21wbGV0byBjb21vIHN0cmluZyBzYW5pdGl6ZWQgcGFyYSBgW2lubmVySFRNTF1gLiAqL1xuICByZWFkb25seSBzdmdIdG1sID0gY29tcHV0ZWQ8U2FmZUh0bWw+KCgpID0+IHtcbiAgICBjb25zdCBjb2xzID0gdGhpcy5jb2xzKCk7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMucm93cygpO1xuICAgIGNvbnN0IHBhbGV0dGUgPSB0aGlzLnBhbGV0dGVSZWYoKTtcbiAgICBjb25zdCBpbm5lciA9IHJlbmRlclBhdHRlcm5TdmdJbm5lcih0aGlzLnRpbGVzKCksIGNvbHMsIHBhbGV0dGVbMF0hKTtcbiAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnByZXNlcnZlQXNwZWN0KCkgPT09ICdtZWV0JyA/ICd4TWlkWU1pZCBtZWV0JyA6ICd4TWlkWU1pZCBzbGljZSc7XG4gICAgY29uc3Qgc3ZnID0gYDxzdmcgdmlld0JveD1cIjAgMCAke2NvbHMgKiAxMDB9ICR7cm93cyAqIDEwMH1cIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwiJHthc3BlY3R9XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiR7aW5uZXJ9PC9zdmc+YDtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoc3ZnKTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gUmVnZW5lcmEgZ3JpZCBjb21wbGV0YSBjdWFuZG8gY2FtYmlhbiBwcm9wcyBlc3RydWN0dXJhbGVzIChjb2xzL3Jvd3MvXG4gICAgLy8gcGFsZXR0ZS9kZW5zaXR5L3NlZWQpLiBFbCBzZWVkIHNvbG8gY2FtYmlhIGV4cGzDrWNpdGFtZW50ZSB2aWEgcHJvcHMgb1xuICAgIC8vIG1vdW50IGluaWNpYWwg4oCUIE5PIHNlIG11dGEgZW4gbW9kbyBhbmltYXRlZC5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY29scyA9IHRoaXMuY29scygpO1xuICAgICAgY29uc3Qgcm93cyA9IHRoaXMucm93cygpO1xuICAgICAgY29uc3Qgc2VlZCA9IHRoaXMuc2VlZCgpO1xuICAgICAgY29uc3QgcGFsZXR0ZSA9IHRoaXMucGFsZXR0ZVJlZigpO1xuICAgICAgY29uc3QgZGVuc2l0eSA9IHRoaXMuY2hldnJvbkRlbnNpdHkoKTtcbiAgICAgIHRoaXMudGlsZXMuc2V0KGdlbmVyYXRlUGF0dGVyblRpbGVzKHsgY29scywgcm93cywgc2VlZCwgcGFsZXR0ZSwgY2hldnJvbkRlbnNpdHk6IGRlbnNpdHkgfSkpO1xuICAgIH0pO1xuXG4gICAgLy8gTW9kbyBhbmltYXRlZDogY2FkYSBgcmVzaHVmZmxlSW50ZXJ2YWxgIG1zLCBzb2JyZXNjcmliZSBgdGlsZXNQZXJUaWNrYFxuICAgIC8vIHRpbGVzIHJhbmRvbSDigJQgZWZlY3RvIHN0YWdnZXJlZCAobm8gdG9kYSBsYSBncmlkIGRlIHVuYSkuIFNpIGVsIHVzZXJcbiAgICAvLyBkZXNhY3RpdmEgYW5pbWF0ZWQsIGVsIHRpbWVyIHNlIGxpbXBpYSBhdXRvbcOhdGljYW1lbnRlLlxuICAgIGVmZmVjdChvbkNsZWFudXAgPT4ge1xuICAgICAgY29uc3QgaXNBbmltYXRlZCA9IHRoaXMuYW5pbWF0ZWQoKTtcbiAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5yZXNodWZmbGVJbnRlcnZhbCgpO1xuICAgICAgY29uc3QgcGVyVGljayA9IHRoaXMudGlsZXNQZXJUaWNrKCk7XG4gICAgICBpZiAodGhpcy50aW1lcikgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcbiAgICAgIHRoaXMudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWlzQW5pbWF0ZWQpIHJldHVybjtcbiAgICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLm11dGF0ZVJhbmRvbVRpbGVzKHBlclRpY2spLCBpbnRlcnZhbCk7XG4gICAgICBvbkNsZWFudXAoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG4gICAgICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVlbXBsYXphIGBjb3VudGAgdGlsZXMgcmFuZG9tIGRlbCBncmlkIGFjdHVhbCBjb24gdGlsZXMgbnVldm9zIGdlbmVyYWRvcy5cbiAgICogVXNhZG8gcG9yIGVsIG1vZG8gYW5pbWF0ZWQgcGFyYSBzdGFnZ2VyZWQgcmVzaHVmZmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBtdXRhdGVSYW5kb21UaWxlcyhjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMudGlsZXMoKTtcbiAgICBpZiAoY3VycmVudC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gWy4uLmN1cnJlbnRdO1xuICAgIGNvbnN0IHBhbGV0dGUgPSB0aGlzLnBhbGV0dGVSZWYoKTtcbiAgICBjb25zdCBkZW5zaXR5ID0gdGhpcy5jaGV2cm9uRGVuc2l0eSgpO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgY291bnQ7IG4rKykge1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbmV4dC5sZW5ndGgpO1xuICAgICAgbmV4dFtpZHhdID0gZ2VuZXJhdGVSYW5kb21UaWxlKHBhbGV0dGUsIGRlbnNpdHkpO1xuICAgIH1cbiAgICB0aGlzLnRpbGVzLnNldChuZXh0KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyKSBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGFsZXR0ZShwOiBQYXR0ZXJuUGFsZXR0ZUtleSB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHApKSB7XG4gICAgICAvLyBBY2VwdGEgYXJyYXlzIGRlIGN1YWxxdWllciBsb25naXR1ZCDiiaUyOyB0aWxlIGNvbnRyYXN0IGxvZ2ljIHVzYSDDrW5kaWNlcy5cbiAgICAgIHJldHVybiBwLmxlbmd0aCA+PSAyID8gcCA6IFBBVFRFUk5fUEFMRVRURVMucHVycGxlO1xuICAgIH1cbiAgICByZXR1cm4gUEFUVEVSTl9QQUxFVFRFU1twXSA/PyBQQVRURVJOX1BBTEVUVEVTLnB1cnBsZTtcbiAgfVxuXG4gIHByaXZhdGUgcmFuZG9tU2VlZCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxXzAwMF8wMDApO1xuICB9XG59XG4iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvYXRvbXMvcGF0dGVybi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGF0dGVyblBhbGV0dGVLZXkgfSBmcm9tICcuL21vdGlmcyc7XG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gZGVsIGNvbXBvbmVudGUgYHZhbC1wYXR0ZXJuYC5cbiAqXG4gKiBAZXhhbXBsZSBTdGF0aWMgKHNlZWQgZmlqbywgcmVwcm9kdWNpYmxlKTpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtcGF0dGVybiBbcHJvcHNdPVwieyBwYWxldHRlOiAncHVycGxlJywgY29sczogMTIsIHJvd3M6IDQsIHNlZWQ6IDQyIH1cIiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQW5pbWF0ZWQgKHJlc2h1ZmZsZSBjYWRhIDhzKTpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtcGF0dGVybiBbcHJvcHNdPVwieyBwYWxldHRlOiAnaW5rJywgY29sczogMTYsIHJvd3M6IDgsIGFuaW1hdGVkOiB0cnVlIH1cIiAvPlxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0dGVybk1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIFBhbGV0dGUgYnVpbHQtaW4gKGAncHVycGxlJyB8ICdpbmsnIHwgJ2xhdmVuZGVyJ2ApIG8gYXJyYXkgY3VzdG9tIGRlIDhcbiAgICogY29sb3JlcyBkYXJrIOKGkiBsaWdodC4gRGVmYXVsdDogYCdwdXJwbGUnYC5cbiAgICovXG4gIHBhbGV0dGU/OiBQYXR0ZXJuUGFsZXR0ZUtleSB8IHN0cmluZ1tdO1xuXG4gIC8qKiBDb2x1bW5hcyBkZWwgZ3JpZC4gRGVmYXVsdDogMTIuICovXG4gIGNvbHM/OiBudW1iZXI7XG5cbiAgLyoqIEZpbGFzIGRlbCBncmlkLiBEZWZhdWx0OiA0LiAqL1xuICByb3dzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTZWVkIHBhcmEgTXVsYmVycnkzMiDigJQgZGV0ZXJtaW5hIGVsIHBhdHLDs24uIFNpIG5vIHNlIHBhc2EsIGdlbmVyYSB1bm8gcmFuZG9tXG4gICAqIGFsIG1vdW50IHkgcXVlZGEgZmlqbyAoYSBtZW5vcyBxdWUgYGFuaW1hdGVkOiB0cnVlYCkuXG4gICAqL1xuICBzZWVkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZW5zaWRhZCBkZSBjaGV2cm9ucyAoMC4uMSkuIEVsIHJlc3RvIHNlIHJlcGFydGUgZW50cmUgc29saWQvc2hhcGUvdHJpLlxuICAgKiBEZWZhdWx0OiBgMC41NWAuXG4gICAqL1xuICBjaGV2cm9uRGVuc2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogU2kgYHRydWVgLCBlbCBwYXRyw7NuIHNlIHJlc2h1ZmZsZXMgYXV0b23DoXRpY2FtZW50ZSBjb24gZmFkZSBlbnRyZSBzZWVkcy5cbiAgICogRGVmYXVsdDogYGZhbHNlYC5cbiAgICovXG4gIGFuaW1hdGVkPzogYm9vbGVhbjtcblxuICAvKiogSW50ZXJ2YWxvIGVuIG1zIGVudHJlIHJlc2h1ZmZsZXMgKHNvbG8gc2kgYGFuaW1hdGVkOiB0cnVlYCkuIERlZmF1bHQ6IGA4MDAwYC4gKi9cbiAgcmVzaHVmZmxlSW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGBzbGljZWAgKGRlZmF1bHQpIOKAlCBlbCBwYXRyw7NuIGN1YnJlIHRvZG8gZWwgY29udGVuZWRvciBtYW50ZW5pZW5kbyBhc3BlY3QsXG4gICAqIGNyb3BlYW5kbyBzaSBuZWNlc2FyaW8uIGBtZWV0YCDigJQgZml0IGNvbXBsZXRvIHNpbiBjcm9wLCBkZWphIGVzcGFjaW8uXG4gICAqL1xuICBwcmVzZXJ2ZUFzcGVjdD86ICdzbGljZScgfCAnbWVldCc7XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvYXRvbXMvcGF0dGVybi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGF0dGVyblBhbGV0dGVLZXkgfSBmcm9tICcuL21vdGlmcyc7XG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gZGVsIGNvbXBvbmVudGUgYHZhbC1wYXR0ZXJuYC5cbiAqXG4gKiBAZXhhbXBsZSBTdGF0aWMgKHNlZWQgZmlqbywgcmVwcm9kdWNpYmxlKTpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtcGF0dGVybiBbcHJvcHNdPVwieyBwYWxldHRlOiAncHVycGxlJywgY29sczogMTIsIHJvd3M6IDQsIHNlZWQ6IDQyIH1cIiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQW5pbWF0ZWQgc3RhZ2dlcmVkICgxIHRpbGUgY2FkYSAxLjJzLCBzdXRpbCk6XG4gKiBgYGBodG1sXG4gKiA8dmFsLXBhdHRlcm4gW3Byb3BzXT1cInsgcGFsZXR0ZTogJ2luaycsIGNvbHM6IDE2LCByb3dzOiA4LCBhbmltYXRlZDogdHJ1ZSB9XCIgLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEFuaW1hdGVkIG3DoXMgYWN0aXZvICgyIHRpbGVzIGNhZGEgODAwbXMpOlxuICogYGBgaHRtbFxuICogPHZhbC1wYXR0ZXJuIFtwcm9wc109XCJ7IGFuaW1hdGVkOiB0cnVlLCByZXNodWZmbGVJbnRlcnZhbDogODAwLCB0aWxlc1BlclRpY2s6IDIgfVwiIC8+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXR0ZXJuTWV0YWRhdGEge1xuICAvKipcbiAgICogUGFsZXR0ZSBidWlsdC1pbiAoYCdwdXJwbGUnIHwgJ2luaycgfCAnbGF2ZW5kZXInYCkgbyBhcnJheSBjdXN0b20gZGUgOFxuICAgKiBjb2xvcmVzIGRhcmsg4oaSIGxpZ2h0LiBEZWZhdWx0OiBgJ3B1cnBsZSdgLlxuICAgKi9cbiAgcGFsZXR0ZT86IFBhdHRlcm5QYWxldHRlS2V5IHwgc3RyaW5nW107XG5cbiAgLyoqIENvbHVtbmFzIGRlbCBncmlkLiBEZWZhdWx0OiAxMi4gKi9cbiAgY29scz86IG51bWJlcjtcblxuICAvKiogRmlsYXMgZGVsIGdyaWQuIERlZmF1bHQ6IDQuICovXG4gIHJvd3M/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNlZWQgcGFyYSBNdWxiZXJyeTMyIOKAlCBkZXRlcm1pbmEgZWwgcGF0csOzbi4gU2kgbm8gc2UgcGFzYSwgZ2VuZXJhIHVubyByYW5kb21cbiAgICogYWwgbW91bnQgeSBxdWVkYSBmaWpvIChhIG1lbm9zIHF1ZSBgYW5pbWF0ZWQ6IHRydWVgKS5cbiAgICovXG4gIHNlZWQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlbnNpZGFkIGRlIGNoZXZyb25zICgwLi4xKS4gRWwgcmVzdG8gc2UgcmVwYXJ0ZSBlbnRyZSBzb2xpZC9zaGFwZS90cmkuXG4gICAqIERlZmF1bHQ6IGAwLjU1YC5cbiAgICovXG4gIGNoZXZyb25EZW5zaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTaSBgdHJ1ZWAsIGVsIHBhdHLDs24gaGFjZSAqKnN0YWdnZXJlZCByZXNodWZmbGUqKjogY2FkYSBgcmVzaHVmZmxlSW50ZXJ2YWxgXG4gICAqIG1zIHNlIHJlZW1wbGF6YW4gYHRpbGVzUGVyVGlja2AgdGlsZXMgcmFuZG9tIOKAlCBOTyBsYSBncmlkIGVudGVyYS5cbiAgICogRGVmYXVsdDogYGZhbHNlYC5cbiAgICovXG4gIGFuaW1hdGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogbXMgZW50cmUgdXBkYXRlcyBpbmRpdmlkdWFsZXMgZGUgdGlsZXMgKG1vZG8gYW5pbWF0ZWQpLlxuICAgKiBEZWZhdWx0OiBgMTIwMGAgKH4xIHRpbGUgY2FkYSAxLjJzIGNvbiBgdGlsZXNQZXJUaWNrOiAxYCkuXG4gICAqL1xuICByZXNodWZmbGVJbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogQ3XDoW50b3MgdGlsZXMgY2FtYmlhciBwb3IgdGljayAobW9kbyBhbmltYXRlZCkuIERlZmF1bHQ6IGAxYCAoY2FtYmlvIHN1dGlsKS5cbiAgICogU3ViaXIgYSAyLTQgcGFyYSBlZmVjdG8gbcOhcyB2aXZvLlxuICAgKi9cbiAgdGlsZXNQZXJUaWNrPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBgc2xpY2VgIChkZWZhdWx0KSDigJQgZWwgcGF0csOzbiBjdWJyZSB0b2RvIGVsIGNvbnRlbmVkb3IgbWFudGVuaWVuZG8gYXNwZWN0LFxuICAgKiBjcm9wZWFuZG8gc2kgbmVjZXNhcmlvLiBgbWVldGAg4oCUIGZpdCBjb21wbGV0byBzaW4gY3JvcCwgZGVqYSBlc3BhY2lvLlxuICAgKi9cbiAgcHJlc2VydmVBc3BlY3Q/OiAnc2xpY2UnIHwgJ21lZXQnO1xufVxuIl19
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '2.0.773';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC43NzMnO1xuIl19
5
+ export const VERSION = '2.0.774';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC43NzQnO1xuIl19
@@ -52,7 +52,7 @@ import 'prismjs/components/prism-json';
52
52
  * Current version of valtech-components.
53
53
  * This is automatically updated during the publish process.
54
54
  */
55
- const VERSION = '2.0.773';
55
+ const VERSION = '2.0.774';
56
56
 
57
57
  /**
58
58
  * Servicio para gestionar presets de componentes.
@@ -5834,19 +5834,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
5834
5834
  * transform="translate(col*100 row*100)">` con un `<rect width=100 height=100
5835
5835
  * fill=bg/>` de fondo.
5836
5836
  */
5837
+ /**
5838
+ * Chevrons stroke-based con linecap/linejoin redondos — visualmente coherente
5839
+ * con el símbolo de marca Valtech (`>_`). Stroke-width 18 (default), 12 para
5840
+ * variants `small-*`.
5841
+ */
5842
+ const CHEV_STROKE = 18;
5843
+ const CHEV_SMALL_STROKE = 12;
5844
+ const chevStyle = (f, w = CHEV_STROKE) => `stroke="${f}" stroke-width="${w}" stroke-linecap="round" stroke-linejoin="round" fill="none"`;
5837
5845
  const PATTERN_MOTIFS = {
5838
- 'chev-r': f => `<path d="M22 18 L58 50 L22 82 L42 82 L78 50 L42 18 Z" fill="${f}"/>`,
5839
- 'chev-l': f => `<path d="M78 18 L42 50 L78 82 L58 82 L22 50 L58 18 Z" fill="${f}"/>`,
5840
- 'chev-d': f => `<path d="M18 22 L50 58 L82 22 L82 42 L50 78 L18 42 Z" fill="${f}"/>`,
5841
- 'chev-u': f => `<path d="M18 78 L50 42 L82 78 L82 58 L50 22 L18 58 Z" fill="${f}"/>`,
5846
+ 'chev-r': f => `<path d="M22 18 L72 50 L22 82" ${chevStyle(f)}/>`,
5847
+ 'chev-l': f => `<path d="M78 18 L28 50 L78 82" ${chevStyle(f)}/>`,
5848
+ 'chev-d': f => `<path d="M18 22 L50 72 L82 22" ${chevStyle(f)}/>`,
5849
+ 'chev-u': f => `<path d="M18 78 L50 28 L82 78" ${chevStyle(f)}/>`,
5842
5850
  'tri-tl': f => `<polygon points="0,0 100,0 0,100" fill="${f}"/>`,
5843
5851
  'tri-tr': f => `<polygon points="0,0 100,0 100,100" fill="${f}"/>`,
5844
5852
  'tri-bl': f => `<polygon points="0,0 100,100 0,100" fill="${f}"/>`,
5845
5853
  'tri-br': f => `<polygon points="100,0 100,100 0,100" fill="${f}"/>`,
5846
5854
  solid: () => ``,
5847
5855
  diamond: f => `<polygon points="50,12 88,50 50,88 12,50" fill="${f}"/>`,
5848
- 'small-r': f => `<path d="M38 32 L62 50 L38 68 L48 68 L72 50 L48 32 Z" fill="${f}"/>`,
5849
- 'small-l': f => `<path d="M62 32 L38 50 L62 68 L52 68 L28 50 L52 32 Z" fill="${f}"/>`,
5856
+ 'small-r': f => `<path d="M38 32 L62 50 L38 68" ${chevStyle(f, CHEV_SMALL_STROKE)}/>`,
5857
+ 'small-l': f => `<path d="M62 32 L38 50 L62 68" ${chevStyle(f, CHEV_SMALL_STROKE)}/>`,
5850
5858
  'arrow-r': f => `<path d="M10 42 L60 42 L60 28 L92 50 L60 72 L60 58 L10 58 Z" fill="${f}"/>`,
5851
5859
  'arrow-l': f => `<path d="M90 42 L40 42 L40 28 L8 50 L40 72 L40 58 L90 58 Z" fill="${f}"/>`,
5852
5860
  'house-d': f => `<polygon points="50,20 88,50 12,50" fill="${f}"/><rect x="28" y="50" width="44" height="32" fill="${f}"/>`,
@@ -5906,6 +5914,31 @@ function mulberry32(seed) {
5906
5914
  return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
5907
5915
  };
5908
5916
  }
5917
+ /**
5918
+ * Genera UN tile con motif/bg/fg respetando densidades + contraste.
5919
+ * Caller pasa rng (Math.random o seeded) — útil para reshuffle individual de
5920
+ * tiles en `val-pattern` sin regenerar la grid completa.
5921
+ */
5922
+ function generateRandomTile(palette, chevronDensity = 0.55, rng = Math.random) {
5923
+ const roll = rng();
5924
+ let key;
5925
+ if (roll < chevronDensity)
5926
+ key = CHEV_KEYS[Math.floor(rng() * CHEV_KEYS.length)];
5927
+ else if (roll < chevronDensity + 0.2)
5928
+ key = SOLID_KEYS[Math.floor(rng() * SOLID_KEYS.length)];
5929
+ else if (roll < chevronDensity + 0.35)
5930
+ key = SHAPE_KEYS[Math.floor(rng() * SHAPE_KEYS.length)];
5931
+ else
5932
+ key = TRI_KEYS[Math.floor(rng() * TRI_KEYS.length)];
5933
+ const bgIdx = Math.floor(rng() * palette.length);
5934
+ let fgIdx = Math.floor(rng() * palette.length);
5935
+ let tries = 0;
5936
+ while (Math.abs(fgIdx - bgIdx) < 3 && tries < 6) {
5937
+ fgIdx = Math.floor(rng() * palette.length);
5938
+ tries++;
5939
+ }
5940
+ return { motif: key, bg: palette[bgIdx], fg: palette[fgIdx] };
5941
+ }
5909
5942
  /** Genera matriz de tiles aplicando densidades + reglas de contraste. */
5910
5943
  function generatePatternTiles(cfg) {
5911
5944
  const { cols, rows, seed, palette } = cfg;
@@ -5913,25 +5946,7 @@ function generatePatternTiles(cfg) {
5913
5946
  const r = mulberry32(seed);
5914
5947
  const tiles = [];
5915
5948
  for (let i = 0; i < cols * rows; i++) {
5916
- const roll = r();
5917
- let key;
5918
- if (roll < chevronDensity)
5919
- key = CHEV_KEYS[Math.floor(r() * CHEV_KEYS.length)];
5920
- else if (roll < chevronDensity + 0.2)
5921
- key = SOLID_KEYS[Math.floor(r() * SOLID_KEYS.length)];
5922
- else if (roll < chevronDensity + 0.35)
5923
- key = SHAPE_KEYS[Math.floor(r() * SHAPE_KEYS.length)];
5924
- else
5925
- key = TRI_KEYS[Math.floor(r() * TRI_KEYS.length)];
5926
- // Pick bg + contrasting fg (índices con distancia ≥3 en la palette).
5927
- const bgIdx = Math.floor(r() * palette.length);
5928
- let fgIdx = Math.floor(r() * palette.length);
5929
- let tries = 0;
5930
- while (Math.abs(fgIdx - bgIdx) < 3 && tries < 6) {
5931
- fgIdx = Math.floor(r() * palette.length);
5932
- tries++;
5933
- }
5934
- tiles.push({ motif: key, bg: palette[bgIdx], fg: palette[fgIdx] });
5949
+ tiles.push(generateRandomTile(palette, chevronDensity, r));
5935
5950
  }
5936
5951
  return tiles;
5937
5952
  }
@@ -6004,6 +6019,9 @@ class PatternComponent {
6004
6019
  if (value.reshuffleInterval !== undefined && value.reshuffleInterval > 0) {
6005
6020
  this.reshuffleInterval.set(value.reshuffleInterval);
6006
6021
  }
6022
+ if (value.tilesPerTick !== undefined && value.tilesPerTick > 0) {
6023
+ this.tilesPerTick.set(Math.floor(value.tilesPerTick));
6024
+ }
6007
6025
  if (value.animated !== undefined)
6008
6026
  this.animated.set(!!value.animated);
6009
6027
  }
@@ -6016,15 +6034,16 @@ class PatternComponent {
6016
6034
  this.chevronDensity = signal(0.55);
6017
6035
  this.preserveAspect = signal('slice');
6018
6036
  this.animated = signal(false);
6019
- this.reshuffleInterval = signal(8000);
6020
- /** Tiles computed — se regenera cuando cambia seed/cols/rows/palette/density. */
6021
- this.tiles = computed(() => generatePatternTiles({
6022
- cols: this.cols(),
6023
- rows: this.rows(),
6024
- seed: this.seed(),
6025
- palette: this.paletteRef(),
6026
- chevronDensity: this.chevronDensity(),
6027
- }));
6037
+ /** ms entre updates individuales de tiles (modo animated). Default 1200ms. */
6038
+ this.reshuffleInterval = signal(1200);
6039
+ /** Cuántos tiles cambiar por tick (default 1 → cambio sutil). */
6040
+ this.tilesPerTick = signal(1);
6041
+ /**
6042
+ * Tiles signal — mutable. Se regenera completa cuando cambia seed/cols/rows/
6043
+ * palette/density. En modo animated, tiles individuales se sobrescriben sin
6044
+ * tocar el resto (efecto staggered).
6045
+ */
6046
+ this.tiles = signal([]);
6028
6047
  /** SVG completo como string sanitized para `[innerHTML]`. */
6029
6048
  this.svgHtml = computed(() => {
6030
6049
  const cols = this.cols();
@@ -6035,18 +6054,30 @@ class PatternComponent {
6035
6054
  const svg = `<svg viewBox="0 0 ${cols * 100} ${rows * 100}" preserveAspectRatio="${aspect}" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">${inner}</svg>`;
6036
6055
  return this.sanitizer.bypassSecurityTrustHtml(svg);
6037
6056
  });
6038
- // Animated reshuffle: cada N ms cambia seed para reshuffle visual.
6057
+ // Regenera grid completa cuando cambian props estructurales (cols/rows/
6058
+ // palette/density/seed). El seed solo cambia explícitamente via props o
6059
+ // mount inicial — NO se muta en modo animated.
6060
+ effect(() => {
6061
+ const cols = this.cols();
6062
+ const rows = this.rows();
6063
+ const seed = this.seed();
6064
+ const palette = this.paletteRef();
6065
+ const density = this.chevronDensity();
6066
+ this.tiles.set(generatePatternTiles({ cols, rows, seed, palette, chevronDensity: density }));
6067
+ });
6068
+ // Modo animated: cada `reshuffleInterval` ms, sobrescribe `tilesPerTick`
6069
+ // tiles random — efecto staggered (no toda la grid de una). Si el user
6070
+ // desactiva animated, el timer se limpia automáticamente.
6039
6071
  effect(onCleanup => {
6040
6072
  const isAnimated = this.animated();
6041
6073
  const interval = this.reshuffleInterval();
6074
+ const perTick = this.tilesPerTick();
6042
6075
  if (this.timer)
6043
6076
  clearInterval(this.timer);
6044
6077
  this.timer = undefined;
6045
6078
  if (!isAnimated)
6046
6079
  return;
6047
- this.timer = setInterval(() => {
6048
- this.seed.set(this.randomSeed());
6049
- }, interval);
6080
+ this.timer = setInterval(() => this.mutateRandomTiles(perTick), interval);
6050
6081
  onCleanup(() => {
6051
6082
  if (this.timer) {
6052
6083
  clearInterval(this.timer);
@@ -6055,6 +6086,23 @@ class PatternComponent {
6055
6086
  });
6056
6087
  });
6057
6088
  }
6089
+ /**
6090
+ * Reemplaza `count` tiles random del grid actual con tiles nuevos generados.
6091
+ * Usado por el modo animated para staggered reshuffle.
6092
+ */
6093
+ mutateRandomTiles(count) {
6094
+ const current = this.tiles();
6095
+ if (current.length === 0)
6096
+ return;
6097
+ const next = [...current];
6098
+ const palette = this.paletteRef();
6099
+ const density = this.chevronDensity();
6100
+ for (let n = 0; n < count; n++) {
6101
+ const idx = Math.floor(Math.random() * next.length);
6102
+ next[idx] = generateRandomTile(palette, density);
6103
+ }
6104
+ this.tiles.set(next);
6105
+ }
6058
6106
  ngOnDestroy() {
6059
6107
  if (this.timer)
6060
6108
  clearInterval(this.timer);
@@ -43238,5 +43286,5 @@ function buildFooterLinks(links, t, resolver) {
43238
43286
  * Generated bundle index. Do not edit.
43239
43287
  */
43240
43288
 
43241
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CHEV_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SHAPE_KEYS, SKELETON_PRESETS, SOLID_KEYS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, generatePatternTiles, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
43289
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CHEV_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SHAPE_KEYS, SKELETON_PRESETS, SOLID_KEYS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
43242
43290
  //# sourceMappingURL=valtech-components.mjs.map