contable 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/client/client.js +259 -0
  4. package/dist/client/img/bannersuperior.png +0 -0
  5. package/dist/client/menu.js +3 -0
  6. package/dist/client/redux-formulario.js +379 -0
  7. package/dist/client/render-components.js +750 -0
  8. package/dist/client/render-components.tsx +1117 -0
  9. package/dist/client/render-formulario.js +56 -0
  10. package/dist/client/render-formulario.tsx +72 -0
  11. package/dist/client/render-general.js +197 -0
  12. package/dist/client/render-general.tsx +212 -0
  13. package/dist/client/render-handlers.js +69 -0
  14. package/dist/client/tipos.js +13 -0
  15. package/dist/client/tsconfig.json +12 -0
  16. package/dist/server/app-contable.js +174 -0
  17. package/dist/server/def-config.js +100 -0
  18. package/dist/server/procedures-contable.js +508 -0
  19. package/dist/server/server-contable.js +17 -0
  20. package/dist/server/table-categorias_producto.js +29 -0
  21. package/dist/server/table-clientes.js +56 -0
  22. package/dist/server/table-condicion_iva.js +29 -0
  23. package/dist/server/table-estados_pedido.js +33 -0
  24. package/dist/server/table-estados_presupuesto.js +34 -0
  25. package/dist/server/table-insumos.js +44 -0
  26. package/dist/server/table-items_pedido.js +48 -0
  27. package/dist/server/table-items_presupuesto.js +48 -0
  28. package/dist/server/table-iva_productos.js +29 -0
  29. package/dist/server/table-parametros.js +38 -0
  30. package/dist/server/table-pedidos.js +48 -0
  31. package/dist/server/table-pedidos_pendientes.js +28 -0
  32. package/dist/server/table-pedidos_vencidos.js +28 -0
  33. package/dist/server/table-presupuestos.js +56 -0
  34. package/dist/server/table-productos.js +70 -0
  35. package/dist/server/table-productos_clientes.js +22 -0
  36. package/dist/server/table-productos_generales.js +22 -0
  37. package/dist/server/table-productos_insumos.js +47 -0
  38. package/dist/server/table-usuarios.js +44 -0
  39. package/dist/server/tsconfig.json +10 -0
  40. package/dist/server/types-contable.js +28 -0
  41. package/dist/unlogged/adapt.js +8 -0
  42. package/dist/unlogged/css/styles.styl +88 -0
  43. package/dist/unlogged/img/login-logo-icon.png.png +0 -0
  44. package/dist/unlogged/img/logo.png +0 -0
  45. package/dist/unlogged/tsconfig.json +15 -0
  46. package/dist/unlogged/unlogged.js +205 -0
  47. package/install/categorias_producto.tab +2 -0
  48. package/install/condicion_iva.tab +3 -0
  49. package/install/estados_pedido.tab +5 -0
  50. package/install/estados_presupuesto.tab +5 -0
  51. package/install/iva_productos.tab +3 -0
  52. package/install/productos.tab +2 -0
  53. package/install/usuarios.tab +2 -0
  54. package/package.json +58 -0
  55. package/unlogged/img/main-loading.gif +0 -0
  56. package/unlogged/main-loading.gif +0 -0
  57. package/unlogged/my-skin.js +0 -0
@@ -0,0 +1,750 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
23
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ (function (factory) {
49
+ if (typeof module === "object" && typeof module.exports === "object") {
50
+ var v = factory(require, exports);
51
+ if (v !== undefined) module.exports = v;
52
+ }
53
+ else if (typeof define === "function" && define.amd) {
54
+ define(["require", "exports", "react", "react-dom", "./render-general", "./redux-formulario", "@material-ui/core", "react", "react-redux", "like-ar"], factory);
55
+ }
56
+ })(function (require, exports) {
57
+ "use strict";
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.generarPedidoDesdePresupuesto = exports.ESTADO_ACEPTADO_PRESUPUESTO = void 0;
60
+ exports.Autocompleter = Autocompleter;
61
+ exports.TypedField = TypedField;
62
+ exports.ClienteComponent = ClienteComponent;
63
+ exports.EstadoPresupuesto = EstadoPresupuesto;
64
+ exports.EstadoPedido = EstadoPedido;
65
+ exports.ObservacionesPedido = ObservacionesPedido;
66
+ exports.Items = Items;
67
+ exports.ItemP = ItemP;
68
+ exports.PresupuestoComponent = PresupuestoComponent;
69
+ exports.PedidoComponent = PedidoComponent;
70
+ exports.desplegarPresupuesto = desplegarPresupuesto;
71
+ exports.desplegarPedido = desplegarPedido;
72
+ var React = require("react");
73
+ var ReactDOM = require("react-dom");
74
+ var render_general_1 = require("./render-general");
75
+ var redux_formulario_1 = require("./redux-formulario");
76
+ var core_1 = require("@material-ui/core");
77
+ var react_1 = require("react");
78
+ var react_redux_1 = require("react-redux");
79
+ var likeAr = require("like-ar");
80
+ exports.ESTADO_ACEPTADO_PRESUPUESTO = "aceptado";
81
+ var my = myOwn;
82
+ var generarPedidoDesdePresupuesto = function (datosPresupuesto) {
83
+ var cliente = datosPresupuesto.cliente, items = datosPresupuesto.items, presupuesto = datosPresupuesto.presupuesto;
84
+ var datosPedido = {
85
+ cliente: cliente,
86
+ items: items,
87
+ pedido: __assign({ presupuesto: presupuesto.presupuesto, cliente: presupuesto.cliente, descuento: presupuesto.descuento, subtotal: presupuesto.subtotal, total: presupuesto.total }, (0, redux_formulario_1.inicializarPedido)())
88
+ };
89
+ return datosPedido;
90
+ };
91
+ exports.generarPedidoDesdePresupuesto = generarPedidoDesdePresupuesto;
92
+ my.wScreens.presupuesto = function (addrParams) {
93
+ return __awaiter(this, void 0, void 0, function () {
94
+ var datosPresupuesto, store;
95
+ return __generator(this, function (_a) {
96
+ switch (_a.label) {
97
+ case 0:
98
+ datosPresupuesto = null;
99
+ if (!addrParams.presupuesto) return [3 /*break*/, 2];
100
+ return [4 /*yield*/, my.ajax.presupuesto_cargar({ presupuesto: addrParams.presupuesto })];
101
+ case 1:
102
+ //@ts-ignore existe
103
+ datosPresupuesto = _a.sent();
104
+ _a.label = 2;
105
+ case 2: return [4 /*yield*/, (0, redux_formulario_1.crearStore)({ useSessionStorage: true, datosPresupuesto: datosPresupuesto || undefined }, redux_formulario_1.createInitialStatePresupuesto)];
106
+ case 3:
107
+ store = _a.sent();
108
+ desplegarPresupuesto(store);
109
+ return [2 /*return*/];
110
+ }
111
+ });
112
+ });
113
+ };
114
+ my.wScreens.pedido = function (addrParams) {
115
+ return __awaiter(this, void 0, void 0, function () {
116
+ var datosPedido, datosPresupuesto, store;
117
+ return __generator(this, function (_a) {
118
+ switch (_a.label) {
119
+ case 0:
120
+ datosPedido = null;
121
+ if (!addrParams.pedido) return [3 /*break*/, 2];
122
+ return [4 /*yield*/, my.ajax.pedido_cargar({ pedido: addrParams.pedido })];
123
+ case 1:
124
+ //@ts-ignore existe
125
+ datosPedido = _a.sent();
126
+ return [3 /*break*/, 4];
127
+ case 2:
128
+ if (!addrParams.presupuesto) return [3 /*break*/, 4];
129
+ return [4 /*yield*/, my.ajax.presupuesto_cargar({ presupuesto: addrParams.presupuesto })];
130
+ case 3:
131
+ datosPresupuesto = _a.sent();
132
+ datosPedido = (0, exports.generarPedidoDesdePresupuesto)(datosPresupuesto);
133
+ _a.label = 4;
134
+ case 4: return [4 /*yield*/, (0, redux_formulario_1.crearStore)({ useSessionStorage: true, datosPedido: datosPedido || undefined }, redux_formulario_1.createInitialStatePedido)];
135
+ case 5:
136
+ store = _a.sent();
137
+ desplegarPedido(store);
138
+ return [2 /*return*/];
139
+ }
140
+ });
141
+ });
142
+ };
143
+ var useStyles = (0, core_1.makeStyles)(function (theme) {
144
+ var _a, _b;
145
+ return ({
146
+ appBar: {
147
+ position: 'relative',
148
+ },
149
+ layout: (_a = {
150
+ width: 'auto',
151
+ marginLeft: theme.spacing(2),
152
+ marginRight: theme.spacing(2)
153
+ },
154
+ _a[theme.breakpoints.up(600 + theme.spacing(2) * 2)] = {
155
+ //width: 600,
156
+ //marginLeft: 'auto',
157
+ //marginRight: 'auto',
158
+ },
159
+ _a),
160
+ paper: (_b = {
161
+ marginTop: theme.spacing(2),
162
+ marginBottom: theme.spacing(2),
163
+ padding: theme.spacing(2)
164
+ },
165
+ _b[theme.breakpoints.up(600 + theme.spacing(3) * 2)] = {
166
+ marginTop: theme.spacing(2),
167
+ marginBottom: theme.spacing(2),
168
+ padding: theme.spacing(3),
169
+ },
170
+ _b),
171
+ stepper: {
172
+ padding: theme.spacing(3, 0, 5),
173
+ },
174
+ buttons: {
175
+ display: 'flex',
176
+ justifyContent: 'flex-end',
177
+ },
178
+ button: {
179
+ marginTop: theme.spacing(1),
180
+ marginBottom: theme.spacing(1),
181
+ },
182
+ });
183
+ });
184
+ function Autocompleter(props) {
185
+ var rows = props.rows, value = props.value, searchKey = props.searchKey, searchType = props.searchType, onSelection = props.onSelection, id = props.id, className = props.className, label = props.label, name = props.name, matchInListConditionCallback = props.matchInListConditionCallback;
186
+ var anchorRef = (0, react_1.useRef)(null);
187
+ var _a = (0, react_1.useState)([]), filteredRows = _a[0], setFilteredRows = _a[1];
188
+ var _b = (0, react_1.useState)(false), open = _b[0], setOpen = _b[1];
189
+ var _c = (0, react_1.useState)(false), focusOnList = _c[0], setFocusOnList = _c[1];
190
+ var _d = (0, react_1.useState)(null), valorIngresado = _d[0], setValorIngresado = _d[1];
191
+ (0, react_1.useEffect)(function () {
192
+ setValorIngresado(value);
193
+ }, [value]);
194
+ (0, react_1.useEffect)(function () {
195
+ document.body.style.overflow = open ? 'hidden' : 'unset';
196
+ });
197
+ var focusToId = function (id, opts, cb) {
198
+ var element = document.getElementById(id);
199
+ var padre = element;
200
+ while (padre && padre.className != 'pregunta' && padre != document.body)
201
+ padre = padre.parentElement;
202
+ if (padre && padre.className == 'pregunta')
203
+ element = padre;
204
+ if (element) {
205
+ if (cb) {
206
+ cb(element);
207
+ }
208
+ else {
209
+ element.focus();
210
+ if (opts.moveToElement) {
211
+ element.scrollIntoView();
212
+ window.scroll({ behavior: opts.moveBehavior || 'auto', top: window.scrollY - 100, left: 0 });
213
+ }
214
+ }
215
+ }
216
+ };
217
+ var checkIfValue = function () {
218
+ var result = rows.find(function (row) { return row[searchKey].toString().toLowerCase() == (valorIngresado || '').toLowerCase(); });
219
+ if (result) {
220
+ setValorIngresado(result[searchKey]);
221
+ onSelection(result);
222
+ setOpen(false);
223
+ }
224
+ else {
225
+ setValorIngresado(null);
226
+ setFilteredRows([]);
227
+ onSelection(null);
228
+ setOpen(false);
229
+ }
230
+ };
231
+ var handleClose = function (event) {
232
+ if (anchorRef.current && anchorRef.current.contains(event.target)) {
233
+ return;
234
+ }
235
+ checkIfValue();
236
+ //y al borrar con backspace primero marca si no está marcado y después borra
237
+ focusToId(id, { moveToElement: false });
238
+ };
239
+ var handleSelection = function (row) {
240
+ onSelection(row);
241
+ setValorIngresado(row[searchKey]);
242
+ setFilteredRows([]);
243
+ setOpen(false);
244
+ focusToId(id, { moveToElement: false });
245
+ };
246
+ return React.createElement(React.Fragment, null,
247
+ React.createElement(core_1.TextField, { id: id, className: className, spellCheck: false, autoCapitalize: "off", autoComplete: "off", autoCorrect: "off", multiline: props.multiline, name: name, label: label, ref: anchorRef, fullWidth: true, type: searchType, disabled: props.disabled || false, value: valorIngresado || '', onChange: function (event) {
248
+ var value = event.target.value;
249
+ setValorIngresado(event.target.value || null);
250
+ setFilteredRows(rows.filter(function (row) {
251
+ return value.split(' ').every(function (palabraBuscada) {
252
+ return row[searchKey].toString().toLocaleLowerCase().includes(palabraBuscada.toLocaleLowerCase()) &&
253
+ (matchInListConditionCallback ? matchInListConditionCallback(row) : true);
254
+ });
255
+ }));
256
+ setOpen(event.target.value.length > 1 && filteredRows.length <= 10);
257
+ }, onFocus: function (_event) {
258
+ setFocusOnList(false);
259
+ //setOpen(!!valorIngresado && valorIngresado.length>1);
260
+ }, onBlur: function () {
261
+ if (!open) {
262
+ checkIfValue();
263
+ }
264
+ }, onKeyDown: function (event) {
265
+ //down key
266
+ if (event.keyCode == 40) {
267
+ if (open) {
268
+ setFocusOnList(true);
269
+ }
270
+ //enter key or tab key
271
+ }
272
+ else if ([13, 9].includes(event.keyCode)) {
273
+ checkIfValue();
274
+ }
275
+ }, "aria-controls": open ? 'menu-list-grow' : undefined, "aria-haspopup": "true" }),
276
+ React.createElement(core_1.Popper, { open: open, anchorEl: anchorRef.current, placement: "bottom-start", transition: true }, function (_a) {
277
+ var TransitionProps = _a.TransitionProps, placement = _a.placement;
278
+ return (React.createElement(core_1.Grow, __assign({}, TransitionProps, { style: { transformOrigin: placement === 'bottom' ? 'left top' : 'center bottom' } }),
279
+ React.createElement(core_1.Paper, null,
280
+ React.createElement(core_1.ClickAwayListener, { onClickAway: handleClose },
281
+ React.createElement(core_1.MenuList, { autoFocusItem: focusOnList, id: "menu-list-grow" }, filteredRows.length ?
282
+ filteredRows.map(function (row, i) {
283
+ return React.createElement(core_1.MenuItem, { key: i, value: i, onClick: function () { return handleSelection(row); }, onKeyDown: function (event) {
284
+ //esc key
285
+ if (event.keyCode == 27 && open) {
286
+ setOpen(false);
287
+ focusToId(id, { moveToElement: false });
288
+ }
289
+ //tab
290
+ if (event.keyCode == 9) {
291
+ handleSelection(row);
292
+ }
293
+ } }, row[searchKey]);
294
+ })
295
+ :
296
+ React.createElement(core_1.MenuItem, { key: -1, disabled: true }, "Sin resultados"))))));
297
+ }));
298
+ }
299
+ function TypedField(props) {
300
+ var value = props.value, type = props.type, id = props.id, className = props.className, name = props.name, label = props.label, onChange = props.onChange, matchInList = props.matchInList, disabled = props.disabled, textAlign = props.textAlign, inputAdornment = props.inputAdornment, adornmentPosition = props.adornmentPosition;
301
+ (0, react_1.useEffect)(function () {
302
+ setMyValue(value);
303
+ }, [value]);
304
+ var _a = (0, react_1.useState)(value), myValue = _a[0], setMyValue = _a[1];
305
+ var inputProps = {
306
+ style: { textAlign: textAlign }
307
+ };
308
+ var inputLabelProps = {
309
+ shrink: true,
310
+ };
311
+ var adornmentProps = {};
312
+ var adornment = inputAdornment ? React.createElement(core_1.InputAdornment, { position: "end" }, inputAdornment) : null;
313
+ adornmentPosition == 'start' ?
314
+ adornmentProps.startAdornment = adornment
315
+ :
316
+ adornmentProps.endAdornment = adornment;
317
+ return React.createElement(core_1.TextField, { inputProps: inputProps, spellCheck: false, autoCapitalize: "off", autoComplete: "off", autoCorrect: "off", value: myValue == null ? '' : myValue, disabled: disabled || false, id: id, multiline: props.multiline, className: className, name: name, label: label, type: type, fullWidth: true, onChange: function (event) {
318
+ var value = event.target.value;
319
+ setMyValue(value == '' ? null : value);
320
+ }, onBlur: function () {
321
+ var value = matchInList ? matchInList.find(function (elem) { return elem == myValue; }) : myValue;
322
+ setMyValue(value);
323
+ onChange(myValue);
324
+ }, InputLabelProps: inputLabelProps, InputProps: adornmentProps });
325
+ }
326
+ function ClienteComponent(props) {
327
+ var datosDesde = props.datosDesde;
328
+ var _a = (0, react_redux_1.useSelector)(function (estado) { return ({ clientes: estado.estructura.clientes, condicionesIva: estado.estructura.condicionesIva, clienteActual: estado[datosDesde].cliente }); }), clientes = _a.clientes, condicionesIva = _a.condicionesIva, clienteActual = _a.clienteActual;
329
+ var clientesArr = likeAr(clientes).array();
330
+ var dispatch = (0, react_redux_1.useDispatch)();
331
+ var condicionesIvaArr = likeAr(condicionesIva).array();
332
+ var classes = useStyles();
333
+ return React.createElement(core_1.Paper, { className: classes.paper },
334
+ React.createElement(core_1.Grid, { container: true, spacing: 3 },
335
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4, md: 1 },
336
+ React.createElement(TypedField, { value: clienteActual.cliente, type: "number", id: "cliente", name: "cliente", label: "Cliente", matchInList: clientesArr.map(function (cliente) { return cliente.cliente; }), disabled: !props.editando, onChange: function (value) {
337
+ var searchResult = null;
338
+ if (value) {
339
+ searchResult = clientesArr.find(function (cliente) { return cliente.cliente == value; }) || null;
340
+ }
341
+ dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: __assign({}, searchResult), datosDesde: datosDesde }));
342
+ } })),
343
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 8, md: 5 },
344
+ React.createElement(Autocompleter, { rows: clientesArr, value: clienteActual.razon_social || '', id: "razon-social", name: "razon-social", label: "Razon social", searchKey: "razon_social", searchType: "text", disabled: !props.editando, onSelection: function (clienteSeleccionado) { return dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: __assign({}, clienteSeleccionado), datosDesde: datosDesde })); } })),
345
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 6, md: 3 },
346
+ React.createElement(core_1.FormControl, { fullWidth: true },
347
+ React.createElement(core_1.InputLabel, { id: "condicion_iva_label" }, "Cond. IVA"),
348
+ React.createElement(core_1.Select, { disabled: true, labelId: "condicion_iva_label", id: "condicion_iva", value: clienteActual.condicion_iva || '', onChange: function (event) {
349
+ var condicion_iva = event.target.value || null;
350
+ dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: __assign(__assign({}, clienteActual), { condicion_iva: condicion_iva }), datosDesde: datosDesde }));
351
+ } }, condicionesIvaArr.map(function (condicionIva) {
352
+ return React.createElement(core_1.MenuItem, { key: condicionIva.condicion, value: condicionIva.condicion }, condicionIva.nombre);
353
+ })))),
354
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 6, md: 3 },
355
+ React.createElement(TypedField, { type: "number", disabled: true, value: clienteActual.cuit_dni, id: "cuit_dni", label: "CUIT/DNI", name: "cuit_dni", onChange: function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: __assign(__assign({}, clienteActual), { cuit_dni: Number(value) }), datosDesde: datosDesde })); } }))));
356
+ }
357
+ function EstadoPresupuesto(props) {
358
+ var _a = (0, react_redux_1.useSelector)(function (estado) { return ({ presupuesto: estado.datosPresupuesto.presupuesto, estadosPresupuesto: estado.estructura.estadosPresupuesto }); }), presupuesto = _a.presupuesto, estadosPresupuesto = _a.estadosPresupuesto;
359
+ var dispatch = (0, react_redux_1.useDispatch)();
360
+ var classes = useStyles();
361
+ return React.createElement(core_1.Paper, { className: classes.paper },
362
+ React.createElement(core_1.Grid, { container: true, spacing: 3 },
363
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
364
+ React.createElement(core_1.FormControl, { fullWidth: true },
365
+ React.createElement(core_1.InputLabel, { id: "estado_label" }, "Estado"),
366
+ React.createElement(core_1.Select, { labelId: "estado_label", id: "estado", value: presupuesto.estado || '', disabled: true, onChange: function (event) {
367
+ var estado = event.target.value || null;
368
+ dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "estado", valor: estado }));
369
+ } }, estadosPresupuesto
370
+ .map(function (estado) {
371
+ return React.createElement(core_1.MenuItem, { key: estado.estado, value: estado.estado }, estado.nombre);
372
+ })))),
373
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
374
+ React.createElement(TypedField, { type: "date", value: presupuesto.fecha, id: "fecha", label: "fecha", name: "fecha", disabled: !props.editando, onChange: (function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "fecha", valor: value })); }) })),
375
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
376
+ React.createElement(TypedField, { type: "date", value: presupuesto.valido_hasta, id: "valido_hasta", label: "valido hasta", name: "valido_hasta", disabled: !props.editando, onChange: (function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "valido_hasta", valor: value })); }) }))));
377
+ }
378
+ function EstadoPedido(props) {
379
+ var _a = (0, react_redux_1.useSelector)(function (estado) { return ({ pedido: estado.datosPedido.pedido, estadosPedido: estado.estructura.estadosPedido }); }), pedido = _a.pedido, estadosPedido = _a.estadosPedido;
380
+ var dispatch = (0, react_redux_1.useDispatch)();
381
+ var classes = useStyles();
382
+ return React.createElement(core_1.Paper, { className: classes.paper },
383
+ React.createElement(core_1.Grid, { container: true, spacing: 3 },
384
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
385
+ React.createElement(core_1.FormControl, { fullWidth: true },
386
+ React.createElement(core_1.InputLabel, { id: "estado_label" }, "Estado"),
387
+ React.createElement(core_1.Select, { labelId: "estado_label", id: "estado", value: pedido.estado || '', disabled: !props.editando, onChange: function (event) {
388
+ var estado = event.target.value || null;
389
+ dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "estado", valor: estado }));
390
+ } }, estadosPedido.map(function (estado) {
391
+ return React.createElement(core_1.MenuItem, { key: estado.estado, value: estado.estado }, estado.nombre);
392
+ })))),
393
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
394
+ React.createElement(TypedField, { type: "date", value: pedido.fecha, id: "fecha", label: "fecha", name: "fecha", disabled: !props.editando, onChange: (function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "fecha", valor: value })); }) })),
395
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
396
+ React.createElement(TypedField, { type: "date", value: pedido.fecha_entrega, id: "fecha_entrega", label: "fecha entrega", name: "fecha_entrega", disabled: !props.editando, onChange: (function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "fecha_entrega", valor: value })); }) }))));
397
+ }
398
+ function ObservacionesPedido(props) {
399
+ var pedido = (0, react_redux_1.useSelector)(function (estado) { return ({ pedido: estado.datosPedido.pedido }); }).pedido;
400
+ var dispatch = (0, react_redux_1.useDispatch)();
401
+ var classes = useStyles();
402
+ return React.createElement(core_1.Paper, { className: classes.paper },
403
+ React.createElement(core_1.Grid, { container: true, spacing: 3 },
404
+ React.createElement(core_1.Grid, { item: true, xs: 12, sm: 12 },
405
+ React.createElement(TypedField, { type: "text", disabled: !props.editando, value: pedido.observaciones, id: "observaciones", label: "Observaciones", name: "observaciones", onChange: function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "observaciones", valor: value })); } }))));
406
+ }
407
+ function Items(props) {
408
+ var conDescuentoEnItems = props.conDescuentoEnItems, conOpciones = props.conOpciones, datosDesde = props.datosDesde, presupuestoOPedido = props.presupuestoOPedido;
409
+ var _a = (0, react_redux_1.useSelector)(function (estado) { return estado[datosDesde]; }), items = _a.items, cliente = _a.cliente;
410
+ var classes = useStyles();
411
+ var dispatch = (0, react_redux_1.useDispatch)();
412
+ var handleAdd = function () {
413
+ dispatch(redux_formulario_1.dispatchers.ADD_ITEM({ datosDesde: datosDesde }));
414
+ setTimeout(function () { return (0, render_general_1.focusToId)("cantidad_" + (items.length - 1).toString(), { moveToElement: false }); }, 100);
415
+ };
416
+ return React.createElement(core_1.TableContainer, { component: core_1.Paper },
417
+ React.createElement(core_1.Table, { "aria-label": "customized table", id: "items-table" },
418
+ React.createElement(core_1.TableHead, null,
419
+ React.createElement(core_1.TableRow, null,
420
+ React.createElement(StyledTableCell, { style: { width: "50px" }, className: "not-print" }, "Items"),
421
+ React.createElement(StyledTableCell, { style: { width: "55px" } }, "Cantidad"),
422
+ React.createElement(StyledTableCell, { style: { width: "60px" } }, "Cod prod"),
423
+ React.createElement(StyledTableCell, { className: "not-print" }, "Nombre prod"),
424
+ React.createElement(StyledTableCell, null, "Descripcion"),
425
+ React.createElement(StyledTableCell, { style: { width: "80px" }, align: "right" }, "P unitario"),
426
+ conDescuentoEnItems ? React.createElement(StyledTableCell, { style: { width: "40px" }, align: "right" }, "Dto") : null,
427
+ conDescuentoEnItems ? React.createElement(StyledTableCell, { style: { width: "50px" }, align: "right" }, "Bonif") : null,
428
+ React.createElement(StyledTableCell, { style: { width: "80px" }, align: "right" }, "Total"))),
429
+ React.createElement(core_1.TableBody, null,
430
+ items.map(function (item, index) { return (React.createElement(ItemP, { key: index, index: index, item: item, editando: props.editando, cliente: cliente, conDescuentoEnItems: conDescuentoEnItems, datosDesde: datosDesde })); }),
431
+ React.createElement(core_1.TableRow, null,
432
+ React.createElement(StyledTableCell, { className: "not-print" },
433
+ React.createElement(core_1.Button, { size: "small", variant: "outlined", color: "primary", onClick: handleAdd, disabled: !props.editando, onKeyDown: function (event) {
434
+ //enter
435
+ if ([13].includes(event.keyCode)) {
436
+ handleAdd();
437
+ }
438
+ }, className: classes.button },
439
+ React.createElement(render_general_1.ICON.Add, null))),
440
+ React.createElement(StyledTableCell, { className: "not-print" }),
441
+ conDescuentoEnItems ? React.createElement(StyledTableCell, { colSpan: 2 }) : null,
442
+ conOpciones ?
443
+ React.createElement(StyledTableCell, { colSpan: 2, align: "right" })
444
+ :
445
+ React.createElement(React.Fragment, null,
446
+ React.createElement(StyledTableCell, { colSpan: 4, align: "right" }, "subtotal $"),
447
+ React.createElement(StyledTableCell, { align: "right", style: render_general_1.totalsStyles }, presupuestoOPedido.subtotal))),
448
+ conOpciones ? null : React.createElement(React.Fragment, null,
449
+ React.createElement(core_1.TableRow, null,
450
+ React.createElement(StyledTableCell, { className: "not-print" }),
451
+ React.createElement(StyledTableCell, { className: "not-print" }),
452
+ conDescuentoEnItems ? React.createElement(StyledTableCell, { colSpan: 2 }) : null,
453
+ React.createElement(StyledTableCell, { align: "right", colSpan: 4 }, "descuento general $"),
454
+ React.createElement(StyledTableCell, { align: "right" },
455
+ React.createElement(TypedField, { textAlign: "right", type: "number", disabled: !props.editando, value: presupuestoOPedido.descuento, id: "descuento", name: "descuento", onChange: function (value) {
456
+ return datosDesde == 'datosPresupuesto' ?
457
+ dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_PRESUPUESTO({ descuento: Number(value) }))
458
+ :
459
+ dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_PEDIDO({ descuento: Number(value) }));
460
+ } }))),
461
+ React.createElement(core_1.TableRow, null,
462
+ React.createElement(StyledTableCell, { className: "not-print" }),
463
+ React.createElement(StyledTableCell, { className: "not-print" }),
464
+ conDescuentoEnItems ? React.createElement(StyledTableCell, { colSpan: 3 }) : null,
465
+ React.createElement(StyledTableCell, { align: "right", colSpan: conDescuentoEnItems ? 3 : 4 }, "total $"),
466
+ React.createElement(StyledTableCell, { align: "right", style: render_general_1.totalsStyles }, presupuestoOPedido.total))))));
467
+ }
468
+ function ItemP(props) {
469
+ var _a, _b;
470
+ var productos = (0, react_redux_1.useSelector)(function (estado) { return estado.estructura; }).productos;
471
+ var productosArr = likeAr(productos).array();
472
+ var dispatch = (0, react_redux_1.useDispatch)();
473
+ var item = props.item, index = props.index, conDescuentoEnItems = props.conDescuentoEnItems, cliente = props.cliente, datosDesde = props.datosDesde;
474
+ var classes = useStyles();
475
+ var EDICION_LIBRE = item.producto == 0;
476
+ return React.createElement(core_1.Grow, { in: true },
477
+ React.createElement(StyledTableRow, { key: item.producto },
478
+ React.createElement(StyledTableCell, { className: "not-print" },
479
+ React.createElement(core_1.Button, { id: "agregar_" + index.toString(), size: "small", variant: "outlined", disabled: !props.editando, color: "secondary", onClick: function () {
480
+ dispatch(redux_formulario_1.dispatchers.REMOVE_ITEM({ index: index, datosDesde: datosDesde }));
481
+ }, className: classes.button },
482
+ React.createElement(render_general_1.ICON.DeleteOutline, null))),
483
+ React.createElement(StyledTableCell, { align: "right" },
484
+ React.createElement(TypedField, { id: "cantidad_" + index.toString(), type: "number", value: item.cantidad || null, name: "cantidad", disabled: !props.editando, onChange: function (value) { return dispatch(redux_formulario_1.dispatchers.SET_CANTIDAD_ITEM({ index: index, cantidad: Number(value), datosDesde: datosDesde })); } })),
485
+ React.createElement(StyledTableCell, { align: "right" },
486
+ React.createElement(TypedField, { value: item.producto || null, id: "poroducto_" + index.toString(), name: "producto", type: "number", disabled: !props.editando, matchInList: EDICION_LIBRE ? undefined : productosArr.map(function (producto) { return producto.producto; }), onChange: function (value) {
487
+ if (value == '0') {
488
+ dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index: index, campo: 'producto', valor: value, datosDesde: datosDesde }));
489
+ }
490
+ else {
491
+ var searchResult = null;
492
+ if (value) {
493
+ searchResult = productosArr.find(function (producto) { return producto.producto == value; }) || null;
494
+ }
495
+ dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index: index, producto: searchResult, datosDesde: datosDesde }));
496
+ }
497
+ } })),
498
+ React.createElement(StyledTableCell, { className: "not-print" },
499
+ React.createElement(render_general_1.AltoImpresionStyle, { charsPerLine: conDescuentoEnItems ? 60 : 75, componentId: "nombre-producto_" + index.toString(), lineHeight: 30, value: (item === null || item === void 0 ? void 0 : item.nombre) || '' }),
500
+ React.createElement(EDICION_LIBRE ? TypedField : Autocompleter, __assign({
501
+ value: (item === null || item === void 0 ? void 0 : item.nombre) || '',
502
+ id: "nombre-producto_" + index.toString(),
503
+ name: "nombre-producto",
504
+ disabled: !props.editando,
505
+ multiline: true,
506
+ matchInListConditionCallback: function (producto) {
507
+ return cliente.cliente == producto.cliente || producto.cliente == null;
508
+ }
509
+ }, (EDICION_LIBRE ? {
510
+ onChange: function (value) {
511
+ return dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index: index, campo: 'nombre', valor: value, datosDesde: datosDesde }));
512
+ }
513
+ } : {
514
+ rows: productosArr,
515
+ searchKey: "nombre",
516
+ searchType: "text",
517
+ onSelection: function (productoSeleccionado) {
518
+ return dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index: index, producto: productoSeleccionado, datosDesde: datosDesde }));
519
+ }
520
+ })))),
521
+ React.createElement(StyledTableCell, null,
522
+ React.createElement(render_general_1.AltoImpresionStyle, { charsPerLine: conDescuentoEnItems ? 60 : 75, componentId: "descripcion-producto_" + index.toString(), lineHeight: 30, value: (item === null || item === void 0 ? void 0 : item.descripcion) || '' }),
523
+ React.createElement(EDICION_LIBRE ? TypedField : Autocompleter, __assign({
524
+ value: (item === null || item === void 0 ? void 0 : item.descripcion) || '',
525
+ id: "descripcion-producto_" + index.toString(),
526
+ name: "descripcion-producto",
527
+ disabled: !props.editando,
528
+ multiline: true,
529
+ }, (EDICION_LIBRE ? {
530
+ onChange: function (value) {
531
+ return dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index: index, campo: 'descripcion', valor: value, datosDesde: datosDesde }));
532
+ }
533
+ } : {
534
+ rows: productosArr,
535
+ searchKey: "descripcion",
536
+ searchType: "text",
537
+ onSelection: function (productoSeleccionado) {
538
+ return dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index: index, producto: productoSeleccionado, datosDesde: datosDesde }));
539
+ }
540
+ })))),
541
+ React.createElement(StyledTableCell, { align: "right" }, EDICION_LIBRE ?
542
+ React.createElement(TypedField, { textAlign: "right", id: "precio_unitario" + index.toString(), type: "number", value: item.precio_unitario || null, name: "precio_unitario", disabled: !props.editando, onChange: function (value) { return dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index: index, campo: 'precio_unitario', valor: value, datosDesde: datosDesde })); } })
543
+ :
544
+ (_a = item.precio_unitario) === null || _a === void 0 ? void 0 : _a.toString()),
545
+ conDescuentoEnItems ?
546
+ React.createElement(React.Fragment, null,
547
+ React.createElement(StyledTableCell, { align: "right" },
548
+ React.createElement(TypedField, { textAlign: "right", value: item.porcentaje_descuento || 0, id: "porcentaje_descuento_" + index.toString(), name: "porcentaje_descuento", type: "number", disabled: !props.editando, onChange: function (value) {
549
+ dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_ITEM({ index: index, porcentaje: Number(value), datosDesde: datosDesde }));
550
+ }, inputAdornment: "%" })),
551
+ React.createElement(StyledTableCell, { align: "right" }, item.descuento))
552
+ : null,
553
+ React.createElement(StyledTableCell, { align: "right", style: render_general_1.totalsStyles }, (_b = item.total) === null || _b === void 0 ? void 0 : _b.toString())));
554
+ }
555
+ var StyledTableCell = (0, core_1.withStyles)(function (theme) {
556
+ return (0, core_1.createStyles)({
557
+ head: {
558
+ backgroundColor: theme.palette.common.black,
559
+ color: theme.palette.common.white,
560
+ },
561
+ body: {
562
+ fontSize: 14,
563
+ padding: 8
564
+ },
565
+ });
566
+ })(core_1.TableCell);
567
+ var StyledTableRow = (0, core_1.withStyles)(function (theme) {
568
+ return (0, core_1.createStyles)({
569
+ root: {
570
+ '&:nth-of-type(odd)': {
571
+ backgroundColor: theme.palette.action.hover,
572
+ },
573
+ },
574
+ });
575
+ })(core_1.TableRow);
576
+ function PresupuestoComponent(_props) {
577
+ var _this = this;
578
+ var _a;
579
+ var _b = (0, react_redux_1.useSelector)(function (estado) { return (estado.datosPresupuesto); }), cliente = _b.cliente, presupuesto = _b.presupuesto, items = _b.items;
580
+ var estadosPresupuesto = (0, react_redux_1.useSelector)(function (estado) { return ({ estadosPresupuesto: estado.estructura.estadosPresupuesto }); }).estadosPresupuesto;
581
+ var parametros = (0, react_redux_1.useSelector)(function (estado) { return (estado.estructura); }).parametros;
582
+ var classes = useStyles();
583
+ var dispatch = (0, react_redux_1.useDispatch)();
584
+ var _c = (0, react_1.useState)(false), open = _c[0], setOpen = _c[1];
585
+ var esNuevo = !(presupuesto.presupuesto);
586
+ var disabled = !((_a = estadosPresupuesto.find(function (estado) { return estado.estado == presupuesto.estado; })) === null || _a === void 0 ? void 0 : _a.permite_editar);
587
+ var _d = (0, react_1.useState)(esNuevo), editando = _d[0], setEditando = _d[1];
588
+ var _e = (0, react_1.useState)(''), snackBarMessage = _e[0], setSnackBarMessage = _e[1];
589
+ var hayDescuentosIngresados = items.some(function (item) { return item.descuento != 0; });
590
+ var handleClose = function (_event, reason) {
591
+ if (reason === 'clickaway') {
592
+ return;
593
+ }
594
+ setOpen(false);
595
+ };
596
+ return React.createElement("main", { className: classes.layout, id: "presupuesto" },
597
+ React.createElement("img", { id: "banner-superior-impresion", className: "only-for-print", src: "img/bannersuperior.png", alt: "bannersuperior.png" }),
598
+ React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-start", direction: "row" },
599
+ React.createElement("h2", null, presupuesto.presupuesto ? "Presupuesto N\u00BA ".concat(presupuesto.presupuesto) : "Nuevo presupuesto")),
600
+ React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
601
+ React.createElement(core_1.Button, { variant: "contained", color: editando ? "secondary" : "primary", onClick: function () {
602
+ setEditando(!editando);
603
+ }, disabled: disabled, className: classes.button }, editando ?
604
+ React.createElement(render_general_1.ICON.Cancel, null)
605
+ :
606
+ React.createElement(render_general_1.ICON.Edit, null)),
607
+ React.createElement(core_1.Button, { variant: "contained", disabled: editando, onClick: function () {
608
+ window.print();
609
+ }, className: classes.button },
610
+ React.createElement(render_general_1.ICON.Print, null))),
611
+ React.createElement(ClienteComponent, { editando: editando, datosDesde: "datosPresupuesto" }),
612
+ React.createElement(EstadoPresupuesto, { editando: editando }),
613
+ React.createElement(Items, { editando: editando, conDescuentoEnItems: presupuesto.con_descuento_en_items, conOpciones: presupuesto.con_opciones, datosDesde: 'datosPresupuesto', presupuestoOPedido: presupuesto }),
614
+ React.createElement(core_1.Grid, { container: true, className: "not-print", alignItems: "flex-start", justify: "flex-end", direction: "row" },
615
+ React.createElement(core_1.FormControlLabel, { control: React.createElement(core_1.Checkbox, { checked: presupuesto.con_opciones, onChange: (function (event) {
616
+ return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "con_opciones", valor: event.target.checked }));
617
+ }), disabled: !editando, name: "con_opciones", color: "primary" }), labelPlacement: "start", label: "ocultar totales" })),
618
+ React.createElement(core_1.Grid, { container: true, className: "not-print", alignItems: "flex-start", justify: "flex-end", direction: "row" },
619
+ React.createElement(core_1.FormControlLabel, { control: React.createElement(core_1.Checkbox, { checked: presupuesto.con_descuento_en_items, onChange: (function (event) {
620
+ return dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "con_descuento_en_items", valor: event.target.checked }));
621
+ }), disabled: !editando || hayDescuentosIngresados, name: "con_descuento_en_items", color: "primary" }), labelPlacement: "start", label: "descuento en items" })),
622
+ React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
623
+ React.createElement(core_1.Button, { variant: "contained", color: "primary", disabled: !editando, onClick: function () { return __awaiter(_this, void 0, void 0, function () {
624
+ var result, err_1;
625
+ return __generator(this, function (_a) {
626
+ switch (_a.label) {
627
+ case 0:
628
+ _a.trys.push([0, 2, , 3]);
629
+ return [4 /*yield*/, (0, redux_formulario_1.guardarPresupuesto)(cliente, presupuesto, items)];
630
+ case 1:
631
+ result = _a.sent();
632
+ dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "presupuesto", valor: result.presupuesto }));
633
+ setSnackBarMessage("Presupuesto ".concat(result.presupuesto, " guardado"));
634
+ setOpen(true);
635
+ setEditando(false);
636
+ return [3 /*break*/, 3];
637
+ case 2:
638
+ err_1 = _a.sent();
639
+ setSnackBarMessage("Error al guardar el presupuesto. ".concat(err_1.message));
640
+ setOpen(true);
641
+ return [3 /*break*/, 3];
642
+ case 3: return [2 /*return*/];
643
+ }
644
+ });
645
+ }); }, className: classes.button },
646
+ React.createElement(render_general_1.ICON.Save, null)),
647
+ React.createElement(core_1.Snackbar, { anchorOrigin: {
648
+ vertical: 'bottom',
649
+ horizontal: 'left',
650
+ }, open: open, autoHideDuration: 6000, onClose: handleClose, message: snackBarMessage, action: React.createElement(React.Fragment, null,
651
+ React.createElement(core_1.IconButton, { size: "small", "aria-label": "close", color: "inherit", onClick: handleClose },
652
+ React.createElement(render_general_1.ICON.Close, null))) })),
653
+ (parametros === null || parametros === void 0 ? void 0 : parametros.legales_presupuesto) ?
654
+ React.createElement(core_1.Paper, { className: classes.paper + " legales" },
655
+ React.createElement("p", null, parametros.legales_presupuesto))
656
+ :
657
+ null);
658
+ }
659
+ function PedidoComponent(_props) {
660
+ var _this = this;
661
+ var _a = (0, react_redux_1.useSelector)(function (estado) { return (estado.datosPedido); }), cliente = _a.cliente, pedido = _a.pedido, items = _a.items;
662
+ var classes = useStyles();
663
+ var dispatch = (0, react_redux_1.useDispatch)();
664
+ var _b = (0, react_1.useState)(false), open = _b[0], setOpen = _b[1];
665
+ var esNuevo = !(pedido.pedido);
666
+ var _c = (0, react_1.useState)(esNuevo), editando = _c[0], setEditando = _c[1];
667
+ var _d = (0, react_1.useState)(''), snackBarMessage = _d[0], setSnackBarMessage = _d[1];
668
+ var handleClose = function (_event, reason) {
669
+ if (reason === 'clickaway') {
670
+ return;
671
+ }
672
+ setOpen(false);
673
+ };
674
+ return React.createElement("main", { className: classes.layout, id: "pedido" },
675
+ React.createElement("img", { id: "banner-superior-impresion", className: "only-for-print", src: "img/bannersuperior.png", alt: "bannersuperior.png" }),
676
+ React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-start", direction: "row" },
677
+ React.createElement("h2", null, pedido.pedido ? "Pedido N\u00BA ".concat(pedido.pedido) : "Nuevo pedido")),
678
+ React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
679
+ React.createElement(core_1.Button, { variant: "contained", color: editando ? "secondary" : "primary", onClick: function () {
680
+ setEditando(!editando);
681
+ }, className: classes.button }, editando ?
682
+ React.createElement(render_general_1.ICON.Cancel, null)
683
+ :
684
+ React.createElement(render_general_1.ICON.Edit, null)),
685
+ React.createElement(core_1.Button, { variant: "contained", disabled: editando, onClick: function () {
686
+ window.print();
687
+ }, className: classes.button },
688
+ React.createElement(render_general_1.ICON.Print, null))),
689
+ React.createElement(ClienteComponent, { editando: editando, datosDesde: "datosPedido" }),
690
+ React.createElement(EstadoPedido, { editando: editando }),
691
+ React.createElement(Items, { editando: editando, conDescuentoEnItems: true, conOpciones: false, datosDesde: 'datosPedido', presupuestoOPedido: pedido }),
692
+ React.createElement(ObservacionesPedido, { editando: editando }),
693
+ React.createElement(core_1.Grid, { container: true, alignItems: "flex-start", justify: "flex-end", direction: "row" },
694
+ React.createElement(core_1.Button, { variant: "contained", color: "primary", disabled: !editando, onClick: function () { return __awaiter(_this, void 0, void 0, function () {
695
+ var result, err_2;
696
+ return __generator(this, function (_a) {
697
+ switch (_a.label) {
698
+ case 0:
699
+ _a.trys.push([0, 2, , 3]);
700
+ return [4 /*yield*/, (0, redux_formulario_1.guardarPedido)(cliente, pedido, items)];
701
+ case 1:
702
+ result = _a.sent();
703
+ dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "pedido", valor: result.pedido }));
704
+ setSnackBarMessage("Pedido ".concat(result.pedido, " guardado"));
705
+ setOpen(true);
706
+ setEditando(false);
707
+ return [3 /*break*/, 3];
708
+ case 2:
709
+ err_2 = _a.sent();
710
+ setSnackBarMessage("Error al guardar el pedido. ".concat(err_2.message));
711
+ setOpen(true);
712
+ return [3 /*break*/, 3];
713
+ case 3: return [2 /*return*/];
714
+ }
715
+ });
716
+ }); }, className: classes.button },
717
+ React.createElement(render_general_1.ICON.Save, null)),
718
+ React.createElement(core_1.Snackbar, { anchorOrigin: {
719
+ vertical: 'bottom',
720
+ horizontal: 'left',
721
+ }, open: open, autoHideDuration: 6000, onClose: handleClose, message: snackBarMessage, action: React.createElement(React.Fragment, null,
722
+ React.createElement(core_1.IconButton, { size: "small", "aria-label": "close", color: "inherit", onClick: handleClose },
723
+ React.createElement(render_general_1.ICON.Close, null))) })));
724
+ }
725
+ function desplegarPresupuesto(store) {
726
+ return __awaiter(this, void 0, void 0, function () {
727
+ return __generator(this, function (_a) {
728
+ ReactDOM.render(React.createElement(react_redux_1.Provider, { store: store },
729
+ React.createElement(PresupuestoComponent, null)), document.getElementById('main_layout'));
730
+ return [2 /*return*/];
731
+ });
732
+ });
733
+ }
734
+ function desplegarPedido(store) {
735
+ return __awaiter(this, void 0, void 0, function () {
736
+ return __generator(this, function (_a) {
737
+ ReactDOM.render(React.createElement(react_redux_1.Provider, { store: store },
738
+ React.createElement(PedidoComponent, null)), document.getElementById('main_layout'));
739
+ return [2 /*return*/];
740
+ });
741
+ });
742
+ }
743
+ if (typeof window !== 'undefined') {
744
+ // @ts-ignore para hacerlo
745
+ window.desplegarPresupuesto = desplegarPresupuesto;
746
+ // @ts-ignore para hacerlo
747
+ window.desplegarPedido = desplegarPedido;
748
+ }
749
+ });
750
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWNvbXBvbmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L3JlbmRlci1jb21wb25lbnRzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTBIQSxzQ0EwS0M7SUFDRCxnQ0E2REM7SUFFRCw0Q0EwRUM7SUFFRCw4Q0F1REM7SUFFRCxvQ0FxREM7SUFDRCxrREFxQkM7SUFFRCxzQkEyR0M7SUFFRCxzQkFvSkM7SUF5QkQsb0RBK0lDO0lBRUQsMENBZ0dDO0lBRUQsb0RBUUM7SUFFRCwwQ0FRQztJQXJsQ0QsNkJBQStCO0lBQy9CLG9DQUFzQztJQUN0QyxtREFRMEI7SUFDMUIsdURBQzBIO0lBQzFILDBDQVcyQjtJQUMzQiwrQkFBb0Q7SUFDcEQsMkNBQWlFO0lBQ2pFLGdDQUFrQztJQU1yQixRQUFBLDJCQUEyQixHQUF3QixVQUFVLENBQUM7SUFDM0UsSUFBSSxFQUFFLEdBQUMsS0FBSyxDQUFDO0lBRU4sSUFBSSw2QkFBNkIsR0FBRyxVQUFDLGdCQUFpQztRQUNwRSxJQUFBLE9BQU8sR0FBeUIsZ0JBQWdCLFFBQXpDLEVBQUUsS0FBSyxHQUFrQixnQkFBZ0IsTUFBbEMsRUFBRSxXQUFXLEdBQUssZ0JBQWdCLFlBQXJCLENBQXNCO1FBQ3RELElBQUksV0FBVyxHQUFlO1lBQzFCLE9BQU8sU0FBQTtZQUNQLEtBQUssT0FBQTtZQUNMLE1BQU0sYUFDRixXQUFXLEVBQUUsV0FBVyxDQUFDLFdBQVcsRUFDcEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQzVCLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUyxFQUNoQyxRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFDOUIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLElBQ3JCLElBQUEsb0NBQWlCLEdBQUUsQ0FDekI7U0FDSixDQUFBO1FBQ0Qs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QUFDLGVBQWUsT0FBRSxDQUNYLEVBRVgsUUFBUSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FDekMsQ0FBQTs7OztLQUNKO0lBRUQsSUFBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUMsQ0FBQztRQUM5QiwwQkFBMEI7UUFDMUIsTUFBTSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO1FBQ25ELDBCQUEwQjtRQUMxQixNQUFNLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcclxuaW1wb3J0IHsgIFxyXG4gICAgRm9jdXNPcHRzLCBSZW5kZXJQcmluY2lwYWwsIFxyXG4gICAgY2xzeCxcclxuICAgIElDT04sXHJcbiAgICBmb2N1c1RvSWQsXHJcbiAgICBzY3JvbGxUb1RvcCxcclxuICAgIHNjcm9sbFRvQm90dG9tLFxyXG4gICAgSW5wdXRUeXBlcywgdG90YWxzU3R5bGVzLCBBbHRvSW1wcmVzaW9uU3R5bGVcclxufSBmcm9tIFwiLi9yZW5kZXItZ2VuZXJhbFwiO1xyXG5pbXBvcnQgeyBkaXNwYXRjaGVycywgY3JlYXJTdG9yZSwgQWN0aW9uRm9ybXVsYXJpb1N0YXRlLCBndWFyZGFyUHJlc3VwdWVzdG8sIFxyXG4gICAgY3JlYXRlSW5pdGlhbFN0YXRlUHJlc3VwdWVzdG8sIGd1YXJkYXJQZWRpZG8sIGNyZWF0ZUluaXRpYWxTdGF0ZVBlZGlkbywgaW5pY2lhbGl6YXJQZWRpZG8gfSBmcm9tIFwiLi9yZWR1eC1mb3JtdWxhcmlvXCI7XHJcbmltcG9ydCB7XHJcbiAgICBBcHBCYXIsIEJhZGdlLCBCdXR0b24sIEJ1dHRvbkdyb3VwLCBDYXJkLCBDaGVja2JveCwgQ2hpcCwgQ2lyY3VsYXJQcm9ncmVzcywgQ3NzQmFzZWxpbmUsIFxyXG4gICAgRGlhbG9nLCBEaWFsb2dBY3Rpb25zLCBEaWFsb2dDb250ZW50LCBEaWFsb2dDb250ZW50VGV4dCwgXHJcbiAgICBEaWFsb2dUaXRsZSwgRGl2aWRlciwgRmFiLCBGb3JtQ29udHJvbExhYmVsLCBHcmlkLCBJY29uQnV0dG9uLCBJbnB1dEJhc2UsIElucHV0TGFiZWwsIFxyXG4gICAgTGluaywgTGlzdCwgTGlzdEl0ZW0sIExpc3RJdGVtSWNvbiwgTGlzdEl0ZW1UZXh0LCBEcmF3ZXIsIFxyXG4gICAgTWVudSwgTWVudUl0ZW0sIFBhcGVyLCBQb3BvdmVyLFxyXG4gICAgU2VsZWN0LCBTbmFja2JhciwgU3RlcCwgU3RlcHBlciwgU3RlcENvbnRlbnQsIFN0ZXBMYWJlbCwgXHJcbiAgICBTdmdJY29uLCBTd2l0Y2gsIFxyXG4gICAgVGFibGUsIFRhYmxlQm9keSwgVGFibGVDZWxsLCBUYWJsZUhlYWQsIFRhYmxlUm93LCBUZXh0RmllbGQsIFRoZW1lLCBUb29sYmFyLCBUeXBvZ3JhcGh5LCBab29tLFxyXG4gICAgdXNlU2Nyb2xsVHJpZ2dlcixcclxuICAgIGNyZWF0ZVN0eWxlcywgbWFrZVN0eWxlcywgSWNvbiwgUG9wcGVyLCBHcm93LCBDbGlja0F3YXlMaXN0ZW5lciwgTWVudUxpc3QsIEZvcm1Db250cm9sLCBUYWJsZUNvbnRhaW5lciwgd2l0aFN0eWxlcywgSW5wdXRBZG9ybm1lbnQsIElucHV0UHJvcHNcclxufSBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmVcIjtcclxuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCB7IHVzZVNlbGVjdG9yLCB1c2VEaXNwYXRjaCwgUHJvdmlkZXIgfSBmcm9tIFwicmVhY3QtcmVkdXhcIjsgXHJcbmltcG9ydCAqIGFzIGxpa2VBciBmcm9tIFwibGlrZS1hclwiO1xyXG5pbXBvcnQge3NhdmVEZXBvdH0gZnJvbSBcIi4vcmVuZGVyLWhhbmRsZXJzXCI7XHJcbmltcG9ydCB7IENsaWVudGUsIFByb2R1Y3RvLCBJdGVtLCBTdGF0ZSwgRGF0b3NQcmVzdXB1ZXN0bywgSWRDb25kSXZhLCBEYXRvc1BlZGlkbywgRGF0b3NEZXNkZSwgUHJlc3VwdWVzdG8sIFBlZGlkbywgSWRFc3RhZG9QcmVzdXB1ZXN0byB9IGZyb20gXCIuL3RpcG9zXCI7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSBcInJlZHV4XCI7XHJcbmltcG9ydCB7IEFjdGlvbnNGcm9tIH0gZnJvbSBcInJlZHV4LXR5cGVkLXJlZHVjZXJcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBFU1RBRE9fQUNFUFRBRE9fUFJFU1VQVUVTVE86IElkRXN0YWRvUHJlc3VwdWVzdG8gPSBcImFjZXB0YWRvXCI7XHJcbnZhciBteT1teU93bjtcclxuXHJcbmV4cG9ydCB2YXIgZ2VuZXJhclBlZGlkb0Rlc2RlUHJlc3VwdWVzdG8gPSAoZGF0b3NQcmVzdXB1ZXN0bzpEYXRvc1ByZXN1cHVlc3RvKT0+e1xyXG4gICAgbGV0IHtjbGllbnRlLCBpdGVtcywgcHJlc3VwdWVzdG99ICA9IGRhdG9zUHJlc3VwdWVzdG87XHJcbiAgICBsZXQgZGF0b3NQZWRpZG86RGF0b3NQZWRpZG8gPSB7XHJcbiAgICAgICAgY2xpZW50ZSxcclxuICAgICAgICBpdGVtcyxcclxuICAgICAgICBwZWRpZG86e1xyXG4gICAgICAgICAgICBwcmVzdXB1ZXN0bzogcHJlc3VwdWVzdG8ucHJlc3VwdWVzdG8sXHJcbiAgICAgICAgICAgIGNsaWVudGU6IHByZXN1cHVlc3RvLmNsaWVudGUsXHJcbiAgICAgICAgICAgIGRlc2N1ZW50bzogcHJlc3VwdWVzdG8uZGVzY3VlbnRvLFxyXG4gICAgICAgICAgICBzdWJ0b3RhbDogcHJlc3VwdWVzdG8uc3VidG90YWwsXHJcbiAgICAgICAgICAgIHRvdGFsOiBwcmVzdXB1ZXN0by50b3RhbCxcclxuICAgICAgICAgICAgLi4uaW5pY2lhbGl6YXJQZWRpZG8oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkYXRvc1BlZGlkb1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5teS53U2NyZWVucy5wcmVzdXB1ZXN0bz1hc3luYyBmdW5jdGlvbihhZGRyUGFyYW1zKXtcclxuICAgIHZhciBkYXRvc1ByZXN1cHVlc3RvOiBEYXRvc1ByZXN1cHVlc3RvfG51bGw9bnVsbDtcclxuICAgIC8vQHRzLWlnbm9yZSBleGlzdGVcclxuICAgIGlmKGFkZHJQYXJhbXMucHJlc3VwdWVzdG8pe1xyXG4gICAgICAgIC8vQHRzLWlnbm9yZSBleGlzdGVcclxuICAgICAgICBkYXRvc1ByZXN1cHVlc3RvID0gYXdhaXQgbXkuYWpheC5wcmVzdXB1ZXN0b19jYXJnYXIoe3ByZXN1cHVlc3RvOmFkZHJQYXJhbXMucHJlc3VwdWVzdG99KTtcclxuICAgIH1cclxuICAgIHZhciBzdG9yZSA9IGF3YWl0IGNyZWFyU3RvcmUoe3VzZVNlc3Npb25TdG9yYWdlOnRydWUsIGRhdG9zUHJlc3VwdWVzdG86IGRhdG9zUHJlc3VwdWVzdG8gfHwgdW5kZWZpbmVkfSwgY3JlYXRlSW5pdGlhbFN0YXRlUHJlc3VwdWVzdG8pO1xyXG4gICAgZGVzcGxlZ2FyUHJlc3VwdWVzdG8oc3RvcmUpO1xyXG59XHJcblxyXG5teS53U2NyZWVucy5wZWRpZG89YXN5bmMgZnVuY3Rpb24oYWRkclBhcmFtcyl7XHJcbiAgICB2YXIgZGF0b3NQZWRpZG86IERhdG9zUGVkaWRvfG51bGw9bnVsbDtcclxuICAgIC8vQHRzLWlnbm9yZSBleGlzdGVcclxuICAgIGlmKGFkZHJQYXJhbXMucGVkaWRvKXtcclxuICAgICAgICAvL0B0cy1pZ25vcmUgZXhpc3RlXHJcbiAgICAgICAgZGF0b3NQZWRpZG8gPSBhd2FpdCBteS5hamF4LnBlZGlkb19jYXJnYXIoe3BlZGlkbzphZGRyUGFyYW1zLnBlZGlkb30pO1xyXG4gICAgLy9AdHMtaWdub3JlIGV4aXN0ZVxyXG4gICAgfWVsc2UgaWYoYWRkclBhcmFtcy5wcmVzdXB1ZXN0byl7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlIGV4aXN0ZVxyXG4gICAgICAgIHZhciBkYXRvc1ByZXN1cHVlc3RvOiBEYXRvc1ByZXN1cHVlc3RvID0gYXdhaXQgbXkuYWpheC5wcmVzdXB1ZXN0b19jYXJnYXIoe3ByZXN1cHVlc3RvOmFkZHJQYXJhbXMucHJlc3VwdWVzdG99KTtcclxuICAgICAgICBkYXRvc1BlZGlkbyA9IGdlbmVyYXJQZWRpZG9EZXNkZVByZXN1cHVlc3RvKGRhdG9zUHJlc3VwdWVzdG8pO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0b3JlID0gYXdhaXQgY3JlYXJTdG9yZSh7dXNlU2Vzc2lvblN0b3JhZ2U6dHJ1ZSwgZGF0b3NQZWRpZG86IGRhdG9zUGVkaWRvIHx8IHVuZGVmaW5lZH0sIGNyZWF0ZUluaXRpYWxTdGF0ZVBlZGlkbyk7XHJcbiAgICBkZXNwbGVnYXJQZWRpZG8oc3RvcmUpO1xyXG59XHJcblxyXG5cclxuXHJcbmNvbnN0IHVzZVN0eWxlcyA9IG1ha2VTdHlsZXMoKHRoZW1lKSA9PiAoe1xyXG4gICAgYXBwQmFyOiB7XHJcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxyXG4gICAgfSxcclxuICAgIGxheW91dDoge1xyXG4gICAgICB3aWR0aDogJ2F1dG8nLFxyXG4gICAgICBtYXJnaW5MZWZ0OiB0aGVtZS5zcGFjaW5nKDIpLFxyXG4gICAgICBtYXJnaW5SaWdodDogdGhlbWUuc3BhY2luZygyKSxcclxuICAgICAgW3RoZW1lLmJyZWFrcG9pbnRzLnVwKDYwMCArIHRoZW1lLnNwYWNpbmcoMikgKiAyKV06IHtcclxuICAgICAgICAvL3dpZHRoOiA2MDAsXHJcbiAgICAgICAgLy9tYXJnaW5MZWZ0OiAnYXV0bycsXHJcbiAgICAgICAgLy9tYXJnaW5SaWdodDogJ2F1dG8nLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIHBhcGVyOiB7XHJcbiAgICAgIG1hcmdpblRvcDogdGhlbWUuc3BhY2luZygyKSxcclxuICAgICAgbWFyZ2luQm90dG9tOiB0aGVtZS5zcGFjaW5nKDIpLFxyXG4gICAgICBwYWRkaW5nOiB0aGVtZS5zcGFjaW5nKDIpLFxyXG4gICAgICBbdGhlbWUuYnJlYWtwb2ludHMudXAoNjAwICsgdGhlbWUuc3BhY2luZygzKSAqIDIpXToge1xyXG4gICAgICAgIG1hcmdpblRvcDogdGhlbWUuc3BhY2luZygyKSxcclxuICAgICAgICBtYXJnaW5Cb3R0b206IHRoZW1lLnNwYWNpbmcoMiksXHJcbiAgICAgICAgcGFkZGluZzogdGhlbWUuc3BhY2luZygzKSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBzdGVwcGVyOiB7XHJcbiAgICAgIHBhZGRpbmc6IHRoZW1lLnNwYWNpbmcoMywgMCwgNSksXHJcbiAgICB9LFxyXG4gICAgYnV0dG9uczoge1xyXG4gICAgICBkaXNwbGF5OiAnZmxleCcsXHJcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnZmxleC1lbmQnLFxyXG4gICAgfSxcclxuICAgIGJ1dHRvbjoge1xyXG4gICAgICBtYXJnaW5Ub3A6IHRoZW1lLnNwYWNpbmcoMSksXHJcbiAgICAgIG1hcmdpbkJvdHRvbTogdGhlbWUuc3BhY2luZygxKSxcclxuICAgIH0sXHJcbiAgfSkpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEF1dG9jb21wbGV0ZXIocHJvcHM6e1xyXG4gICAgcm93czphbnlbXSwgXHJcbiAgICB2YWx1ZTphbnksXHJcbiAgICBzZWFyY2hLZXk6c3RyaW5nLCBcclxuICAgIHNlYXJjaFR5cGU6J3RleHQnfCdudW1iZXInLCBcclxuICAgIG9uU2VsZWN0aW9uOihyb3c6YW55KT0+dm9pZFxyXG4gICAgaWQ6IHN0cmluZyxcclxuICAgIGNsYXNzTmFtZT86c3RyaW5nLFxyXG4gICAgbGFiZWw/OiBzdHJpbmcsXHJcbiAgICBuYW1lPzogc3RyaW5nLFxyXG4gICAgZGlzYWJsZWQ/OmJvb2xlYW5cclxuICAgIG11bHRpbGluZT86Ym9vbGVhblxyXG4gICAgbWF0Y2hJbkxpc3RDb25kaXRpb25DYWxsYmFjaz86KGVsZW06UHJvZHVjdG8pPT5ib29sZWFuXHJcbn0pe1xyXG4gICAgY29uc3Qge3Jvd3MsIHZhbHVlLCBzZWFyY2hLZXksIHNlYXJjaFR5cGUsIG9uU2VsZWN0aW9uLCBpZCwgY2xhc3NOYW1lLCBsYWJlbCwgbmFtZSwgbWF0Y2hJbkxpc3RDb25kaXRpb25DYWxsYmFja30gPSBwcm9wcztcclxuICAgIGNvbnN0IGFuY2hvclJlZiA9IHVzZVJlZjxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ+KG51bGwpO1xyXG4gICAgY29uc3QgW2ZpbHRlcmVkUm93cywgc2V0RmlsdGVyZWRSb3dzXSA9IHVzZVN0YXRlPGFueVtdPihbXSk7XHJcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XHJcbiAgICBjb25zdCBbZm9jdXNPbkxpc3QsIHNldEZvY3VzT25MaXN0XSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIGNvbnN0IFt2YWxvckluZ3Jlc2Fkbywgc2V0VmFsb3JJbmdyZXNhZG9dID0gdXNlU3RhdGU8c3RyaW5nfG51bGw+KG51bGwpO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBzZXRWYWxvckluZ3Jlc2Fkbyh2YWx1ZSlcclxuICAgIH0sW3ZhbHVlXSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9b3Blbj8naGlkZGVuJzondW5zZXQnXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGZvY3VzVG9JZCA9IChpZDpzdHJpbmcsIG9wdHM6Rm9jdXNPcHRzLCBjYj86KGU6SFRNTEVsZW1lbnQpPT52b2lkKT0+e1xyXG4gICAgICAgIHZhciBlbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuICAgICAgICB2YXIgcGFkcmU9ZWxlbWVudDtcclxuICAgICAgICB3aGlsZShwYWRyZSAmJiBwYWRyZS5jbGFzc05hbWUhPSdwcmVndW50YScgJiYgcGFkcmUhPWRvY3VtZW50LmJvZHkpIHBhZHJlID0gcGFkcmUucGFyZW50RWxlbWVudDtcclxuICAgICAgICBpZihwYWRyZSAmJiBwYWRyZS5jbGFzc05hbWU9PSdwcmVndW50YScpIGVsZW1lbnQ9cGFkcmU7XHJcbiAgICAgICAgaWYoZWxlbWVudCl7XHJcbiAgICAgICAgICAgIGlmKGNiKXtcclxuICAgICAgICAgICAgICAgIGNiKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGlmKG9wdHMubW92ZVRvRWxlbWVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGwoe2JlaGF2aW9yOm9wdHMubW92ZUJlaGF2aW9yfHwnYXV0bycsIHRvcDp3aW5kb3cuc2Nyb2xsWS0xMDAsIGxlZnQ6MH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGVja0lmVmFsdWUgPSAoKSA9PiB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJvd3MuZmluZCgocm93KT0+cm93W3NlYXJjaEtleV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpPT0odmFsb3JJbmdyZXNhZG98fCcnKS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZihyZXN1bHQpe1xyXG4gICAgICAgICAgICBzZXRWYWxvckluZ3Jlc2FkbyhyZXN1bHRbc2VhcmNoS2V5XSk7XHJcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIHNldE9wZW4oZmFsc2UpICAgXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHNldFZhbG9ySW5ncmVzYWRvKG51bGwpO1xyXG4gICAgICAgICAgICBzZXRGaWx0ZXJlZFJvd3MoW10pO1xyXG4gICAgICAgICAgICBvblNlbGVjdGlvbihudWxsKTtcclxuICAgICAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgICAgIFxyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQ8RXZlbnRUYXJnZXQ+KSA9PiB7XHJcbiAgICAgICAgaWYgKGFuY2hvclJlZi5jdXJyZW50ICYmIGFuY2hvclJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaGVja0lmVmFsdWUoKTtcclxuICAgICAgICAvL3kgYWwgYm9ycmFyIGNvbiBiYWNrc3BhY2UgcHJpbWVybyBtYXJjYSBzaSBubyBlc3TDoSBtYXJjYWRvIHkgZGVzcHXDqXMgYm9ycmFcclxuICAgICAgICBmb2N1c1RvSWQoaWQsIHttb3ZlVG9FbGVtZW50OmZhbHNlfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVNlbGVjdGlvbiA9IChyb3c6YW55KT0+e1xyXG4gICAgICAgIG9uU2VsZWN0aW9uKHJvdyk7XHJcbiAgICAgICAgc2V0VmFsb3JJbmdyZXNhZG8ocm93W3NlYXJjaEtleV0pO1xyXG4gICAgICAgIHNldEZpbHRlcmVkUm93cyhbXSk7XHJcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgICAgZm9jdXNUb0lkKGlkLCB7bW92ZVRvRWxlbWVudDpmYWxzZX0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIDw+XHJcbiAgICAgICAgPFRleHRGaWVsZFxyXG4gICAgICAgICAgICBpZD17aWR9XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxyXG4gICAgICAgICAgICBzcGVsbENoZWNrPXtmYWxzZX1cclxuICAgICAgICAgICAgYXV0b0NhcGl0YWxpemU9XCJvZmZcIlxyXG4gICAgICAgICAgICBhdXRvQ29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICBhdXRvQ29ycmVjdD1cIm9mZlwiXHJcbiAgICAgICAgICAgIG11bHRpbGluZT17cHJvcHMubXVsdGlsaW5lfVxyXG4gICAgICAgICAgICBuYW1lPXtuYW1lfVxyXG4gICAgICAgICAgICBsYWJlbD17bGFiZWx9XHJcbiAgICAgICAgICAgIHJlZj17YW5jaG9yUmVmfSBcclxuICAgICAgICAgICAgZnVsbFdpZHRoXHJcbiAgICAgICAgICAgIHR5cGU9e3NlYXJjaFR5cGV9XHJcbiAgICAgICAgICAgIGRpc2FibGVkPXtwcm9wcy5kaXNhYmxlZCB8fCBmYWxzZX1cclxuICAgICAgICAgICAgdmFsdWU9e3ZhbG9ySW5ncmVzYWRvIHx8ICcnfVxyXG4gICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgc2V0VmFsb3JJbmdyZXNhZG8oZXZlbnQudGFyZ2V0LnZhbHVlIHx8IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgc2V0RmlsdGVyZWRSb3dzKHJvd3MuZmlsdGVyKChyb3cpPT5cclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zcGxpdCgnICcpLmV2ZXJ5KHBhbGFicmFCdXNjYWRhPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93W3NlYXJjaEtleV0udG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHBhbGFicmFCdXNjYWRhLnRvTG9jYWxlTG93ZXJDYXNlKCkpICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoSW5MaXN0Q29uZGl0aW9uQ2FsbGJhY2s/bWF0Y2hJbkxpc3RDb25kaXRpb25DYWxsYmFjayhyb3cpOnRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgICAgICBzZXRPcGVuKGV2ZW50LnRhcmdldC52YWx1ZS5sZW5ndGg+MSAmJiBmaWx0ZXJlZFJvd3MubGVuZ3RoIDw9IDEwKVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICBvbkZvY3VzPXsoX2V2ZW50KT0+IHtcclxuICAgICAgICAgICAgICAgIHNldEZvY3VzT25MaXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vc2V0T3BlbighIXZhbG9ySW5ncmVzYWRvICYmIHZhbG9ySW5ncmVzYWRvLmxlbmd0aD4xKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgb25CbHVyPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgaWYoIW9wZW4pe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrSWZWYWx1ZSgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIG9uS2V5RG93bj17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgLy9kb3duIGtleVxyXG4gICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZSA9PSA0MCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYob3Blbil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvY3VzT25MaXN0KHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9lbnRlciBrZXkgb3IgdGFiIGtleVxyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoWzEzLDldLmluY2x1ZGVzKGV2ZW50LmtleUNvZGUpKXtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0lmVmFsdWUoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICBhcmlhLWNvbnRyb2xzPXtvcGVuID8gJ21lbnUtbGlzdC1ncm93JyA6IHVuZGVmaW5lZH1cclxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPFBvcHBlciBvcGVuPXtvcGVufSBhbmNob3JFbD17YW5jaG9yUmVmLmN1cnJlbnR9IHBsYWNlbWVudD1cImJvdHRvbS1zdGFydFwiIHRyYW5zaXRpb24+XHJcbiAgICAgICAgICB7KHsgVHJhbnNpdGlvblByb3BzLCBwbGFjZW1lbnQgfSkgPT4gKFxyXG4gICAgICAgICAgICA8R3Jvd1xyXG4gICAgICAgICAgICAgIHsuLi5UcmFuc2l0aW9uUHJvcHN9XHJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgdHJhbnNmb3JtT3JpZ2luOiBwbGFjZW1lbnQgPT09ICdib3R0b20nID8gJ2xlZnQgdG9wJyA6ICdjZW50ZXIgYm90dG9tJyB9fVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFBhcGVyPlxyXG4gICAgICAgICAgICAgICAgPENsaWNrQXdheUxpc3RlbmVyIG9uQ2xpY2tBd2F5PXtoYW5kbGVDbG9zZX0+XHJcbiAgICAgICAgICAgICAgICAgIDxNZW51TGlzdCBhdXRvRm9jdXNJdGVtPXtmb2N1c09uTGlzdH0gIGlkPVwibWVudS1saXN0LWdyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRSb3dzLmxlbmd0aD9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRSb3dzLm1hcCgocm93LCBpKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TWVudUl0ZW0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtpfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17aX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCk9PmhhbmRsZVNlbGVjdGlvbihyb3cpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VzYyBrZXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZSA9PSAyNyAmJiBvcGVuKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wZW4oZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c1RvSWQoaWQsIHttb3ZlVG9FbGVtZW50OmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90YWJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXZlbnQua2V5Q29kZSA9PSA5KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbihyb3cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cm93W3NlYXJjaEtleV19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L01lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbSBcclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXstMX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTaW4gcmVzdWx0YWRvc1xyXG4gICAgICAgICAgICAgICAgICAgIDwvTWVudUl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICA8L01lbnVMaXN0PlxyXG4gICAgICAgICAgICAgICAgPC9DbGlja0F3YXlMaXN0ZW5lcj5cclxuICAgICAgICAgICAgICA8L1BhcGVyPlxyXG4gICAgICAgICAgICA8L0dyb3c+XHJcbiAgICAgICAgICApfVxyXG4gICAgICAgIDwvUG9wcGVyPlxyXG4gICAgPC8+XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIFR5cGVkRmllbGQocHJvcHM6e1xyXG4gICAgdGV4dEFsaWduPzonbGVmdCd8J3JpZ2h0J3wnY2VudGVyJ3wnanVzdGlmeSd8J2luaGVyaXQnXHJcbiAgICB2YWx1ZTpzdHJpbmd8bnVtYmVyfG51bGwsXHJcbiAgICBkaXNhYmxlZD86Ym9vbGVhblxyXG4gICAgdHlwZTogJ3RleHQnfCdudW1iZXInfCdkYXRlJ3wndGltZSd8J3RlbCcsXHJcbiAgICBpZDpzdHJpbmcsXHJcbiAgICBjbGFzc05hbWU/OnN0cmluZyxcclxuICAgIG5hbWU/OnN0cmluZyxcclxuICAgIGxhYmVsPzpzdHJpbmdcclxuICAgIG9uQ2hhbmdlOih2YWx1ZTpzdHJpbmd8bnVtYmVyfG51bGwpPT52b2lkXHJcblxyXG4gICAgbWF0Y2hJbkxpc3Q/OmFueVtdLFxyXG4gICAgbXVsdGlsaW5lPzpib29sZWFuLFxyXG4gICAgaW5wdXRBZG9ybm1lbnQ/OnN0cmluZ1xyXG4gICAgYWRvcm5tZW50UG9zaXRpb24/OidzdGFydCd8J2VuZCdcclxufSl7XHJcbiAgICBjb25zdCB7dmFsdWUsIHR5cGUsIGlkLCBjbGFzc05hbWUsIG5hbWUsIGxhYmVsLCBvbkNoYW5nZSwgbWF0Y2hJbkxpc3QsIGRpc2FibGVkLCB0ZXh0QWxpZ24sIGlucHV0QWRvcm5tZW50LCBhZG9ybm1lbnRQb3NpdGlvbn0gPSBwcm9wcztcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgc2V0TXlWYWx1ZSh2YWx1ZSlcclxuICAgIH0sW3ZhbHVlXSk7XHJcbiAgICBjb25zdCBbbXlWYWx1ZSwgc2V0TXlWYWx1ZV0gPSB1c2VTdGF0ZSh2YWx1ZSk7XHJcbiAgICB2YXIgaW5wdXRQcm9wcz17XHJcbiAgICAgICBzdHlsZTogeyB0ZXh0QWxpZ246IHRleHRBbGlnbiB9XHJcbiAgICAgICBcclxuICAgIH1cclxuICAgIHZhciBpbnB1dExhYmVsUHJvcHM9e1xyXG4gICAgICBzaHJpbms6IHRydWUsXHJcbiAgICB9XHJcbiAgICB2YXIgYWRvcm5tZW50UHJvcHM6SW5wdXRQcm9wcyA9IHt9XHJcbiAgICB2YXIgYWRvcm5tZW50ID0gaW5wdXRBZG9ybm1lbnQ/PElucHV0QWRvcm5tZW50IHBvc2l0aW9uPVwiZW5kXCI+e2lucHV0QWRvcm5tZW50fTwvSW5wdXRBZG9ybm1lbnQ+Om51bGw7XHJcbiAgICBhZG9ybm1lbnRQb3NpdGlvbj09J3N0YXJ0Jz9cclxuICAgICAgICBhZG9ybm1lbnRQcm9wcy5zdGFydEFkb3JubWVudD1hZG9ybm1lbnRcclxuICAgIDpcclxuICAgICAgICBhZG9ybm1lbnRQcm9wcy5lbmRBZG9ybm1lbnQ9YWRvcm5tZW50XHJcbiAgICByZXR1cm4gPFRleHRGaWVsZFxyXG4gICAgICAgIGlucHV0UHJvcHM9e2lucHV0UHJvcHN9XHJcbiAgICAgICAgc3BlbGxDaGVjaz17ZmFsc2V9XHJcbiAgICAgICAgYXV0b0NhcGl0YWxpemU9XCJvZmZcIlxyXG4gICAgICAgIGF1dG9Db21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgYXV0b0NvcnJlY3Q9XCJvZmZcIlxyXG4gICAgICAgIHZhbHVlPXtteVZhbHVlPT1udWxsPycnOm15VmFsdWV9XHJcbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfHxmYWxzZX1cclxuICAgICAgICBpZD17aWR9XHJcbiAgICAgICAgbXVsdGlsaW5lPXtwcm9wcy5tdWx0aWxpbmV9XHJcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XHJcbiAgICAgICAgbmFtZT17bmFtZX1cclxuICAgICAgICBsYWJlbD17bGFiZWx9XHJcbiAgICAgICAgdHlwZT17dHlwZX1cclxuICAgICAgICBmdWxsV2lkdGhcclxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgICAgIHNldE15VmFsdWUodmFsdWU9PScnP251bGw6dmFsdWUpXHJcbiAgICAgICAgfX1cclxuICAgICAgICBvbkJsdXI9eygpPT57XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG1hdGNoSW5MaXN0P21hdGNoSW5MaXN0LmZpbmQoKGVsZW0pPT5lbGVtPT1teVZhbHVlKTpteVZhbHVlO1xyXG4gICAgICAgICAgICBzZXRNeVZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2UobXlWYWx1ZSlcclxuICAgICAgICB9fVxyXG4gICAgICAgIElucHV0TGFiZWxQcm9wcz17aW5wdXRMYWJlbFByb3BzfVxyXG4gICAgICAgIElucHV0UHJvcHM9e2Fkb3JubWVudFByb3BzfVxyXG4gICAgLz5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIENsaWVudGVDb21wb25lbnQocHJvcHM6e2VkaXRhbmRvOmJvb2xlYW4sIGRhdG9zRGVzZGU6RGF0b3NEZXNkZX0pe1xyXG4gICAgY29uc3Qge2RhdG9zRGVzZGV9ID0gcHJvcHM7XHJcbiAgICBjb25zdCB7Y2xpZW50ZXMsIGNvbmRpY2lvbmVzSXZhLCBjbGllbnRlQWN0dWFsfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oe2NsaWVudGVzOmVzdGFkby5lc3RydWN0dXJhLmNsaWVudGVzLCBjb25kaWNpb25lc0l2YTplc3RhZG8uZXN0cnVjdHVyYS5jb25kaWNpb25lc0l2YSwgY2xpZW50ZUFjdHVhbDplc3RhZG9bZGF0b3NEZXNkZV0uY2xpZW50ZX0pKTtcclxuICAgIGNvbnN0IGNsaWVudGVzQXJyID0gbGlrZUFyKGNsaWVudGVzKS5hcnJheSgpO1xyXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xyXG4gICAgY29uc3QgY29uZGljaW9uZXNJdmFBcnIgPSBsaWtlQXIoY29uZGljaW9uZXNJdmEpLmFycmF5KCk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICByZXR1cm4gPFBhcGVyIGNsYXNzTmFtZT17Y2xhc3Nlcy5wYXBlcn0+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIHNwYWNpbmc9ezN9PlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezR9IG1kPXsxfT5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NsaWVudGVBY3R1YWwuY2xpZW50ZX1cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICBpZD1cImNsaWVudGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjbGllbnRlXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkNsaWVudGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoSW5MaXN0PXtjbGllbnRlc0Fyci5tYXAoKGNsaWVudGUpPT5jbGllbnRlLmNsaWVudGUpfVxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99IFxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2hSZXN1bHQ9bnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0ID0gY2xpZW50ZXNBcnIuZmluZCgoY2xpZW50ZSk9PmNsaWVudGUuY2xpZW50ZT09dmFsdWUpIHx8IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0xJRU5URSh7Y2xpZW50ZTp7Li4uc2VhcmNoUmVzdWx0fSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17OH0gbWQ9ezV9PlxyXG4gICAgICAgICAgICAgICAgPEF1dG9jb21wbGV0ZXIgXHJcbiAgICAgICAgICAgICAgICAgICAgcm93cz17Y2xpZW50ZXNBcnJ9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NsaWVudGVBY3R1YWwucmF6b25fc29jaWFsIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicmF6b24tc29jaWFsXCJcclxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwicmF6b24tc29jaWFsXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIlJhem9uIHNvY2lhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoS2V5PVwicmF6b25fc29jaWFsXCJcclxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hUeXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb30gXHJcbiAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Rpb249eyhjbGllbnRlU2VsZWNjaW9uYWRvOkNsaWVudGUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0xJRU5URSh7Y2xpZW50ZTp7Li4uY2xpZW50ZVNlbGVjY2lvbmFkb30sIGRhdG9zRGVzZGV9KSl9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17Nn0gbWQ9ezN9PlxyXG4gICAgICAgICAgICAgICAgPEZvcm1Db250cm9sIGZ1bGxXaWR0aD5cclxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRMYWJlbCBpZD1cImNvbmRpY2lvbl9pdmFfbGFiZWxcIj5Db25kLiBJVkE8L0lucHV0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxJZD1cImNvbmRpY2lvbl9pdmFfbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImNvbmRpY2lvbl9pdmFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2xpZW50ZUFjdHVhbC5jb25kaWNpb25faXZhIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpY2lvbl9pdmEgPSBldmVudC50YXJnZXQudmFsdWUgYXMgSWRDb25kSXZhfHxudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NMSUVOVEUoe2NsaWVudGU6ey4uLmNsaWVudGVBY3R1YWwsIGNvbmRpY2lvbl9pdmF9LCBkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29uZGljaW9uZXNJdmFBcnIubWFwKChjb25kaWNpb25JdmEpPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbSBrZXk9e2NvbmRpY2lvbkl2YS5jb25kaWNpb259IHZhbHVlPXtjb25kaWNpb25JdmEuY29uZGljaW9ufT57Y29uZGljaW9uSXZhLm5vbWJyZX08L01lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9Gb3JtQ29udHJvbD5cclxuICAgICAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezZ9IG1kPXszfT5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NsaWVudGVBY3R1YWwuY3VpdF9kbml9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJjdWl0X2RuaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDVUlUL0ROSVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImN1aXRfZG5pXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DTElFTlRFKHtjbGllbnRlOnsuLi5jbGllbnRlQWN0dWFsLCBjdWl0X2RuaTpOdW1iZXIodmFsdWUpfSwgZGF0b3NEZXNkZX0pXHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRXN0YWRvUHJlc3VwdWVzdG8ocHJvcHM6e2VkaXRhbmRvOmJvb2xlYW59KXtcclxuICAgIGNvbnN0IHtwcmVzdXB1ZXN0bywgZXN0YWRvc1ByZXN1cHVlc3RvfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oe3ByZXN1cHVlc3RvOiBlc3RhZG8uZGF0b3NQcmVzdXB1ZXN0by5wcmVzdXB1ZXN0bywgZXN0YWRvc1ByZXN1cHVlc3RvOiBlc3RhZG8uZXN0cnVjdHVyYS5lc3RhZG9zUHJlc3VwdWVzdG99KSk7XHJcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICByZXR1cm4gPFBhcGVyIGNsYXNzTmFtZT17Y2xhc3Nlcy5wYXBlcn0+IFxyXG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBzcGFjaW5nPXszfT5cclxuICAgICAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IHNtPXs0fT5cclxuICAgICAgICAgICAgICAgIDxGb3JtQ29udHJvbCBmdWxsV2lkdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPElucHV0TGFiZWwgaWQ9XCJlc3RhZG9fbGFiZWxcIj5Fc3RhZG88L0lucHV0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbElkPVwiZXN0YWRvX2xhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlc3RhZG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG8uZXN0YWRvIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlc3RhZG8gPSBldmVudC50YXJnZXQudmFsdWUgYXMgc3RyaW5nfHxudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NBTVBPX1BSRVNVUFVFU1RPKHtjYW1wbzpcImVzdGFkb1wiLCB2YWxvcjplc3RhZG99KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtlc3RhZG9zUHJlc3VwdWVzdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGVzdGFkbyk9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbSBrZXk9e2VzdGFkby5lc3RhZG99IHZhbHVlPXtlc3RhZG8uZXN0YWRvfT57ZXN0YWRvLm5vbWJyZX08L01lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L0Zvcm1Db250cm9sPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17NH0+XHJcbiAgICAgICAgICAgICAgICA8VHlwZWRGaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG8uZmVjaGF9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImZlY2hhXCJcclxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QUkVTVVBVRVNUTyh7Y2FtcG86XCJmZWNoYVwiLCB2YWxvcjp2YWx1ZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17NH0+XHJcbiAgICAgICAgICAgICAgICA8VHlwZWRGaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG8udmFsaWRvX2hhc3RhfVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwidmFsaWRvX2hhc3RhXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInZhbGlkbyBoYXN0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbGlkb19oYXN0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICgodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUFJFU1VQVUVTVE8oe2NhbXBvOlwidmFsaWRvX2hhc3RhXCIsIHZhbG9yOnZhbHVlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRXN0YWRvUGVkaWRvKHByb3BzOntlZGl0YW5kbzpib29sZWFufSl7XHJcbiAgICBjb25zdCB7cGVkaWRvLCBlc3RhZG9zUGVkaWRvfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oe3BlZGlkbzogZXN0YWRvLmRhdG9zUGVkaWRvLnBlZGlkbywgZXN0YWRvc1BlZGlkbzogZXN0YWRvLmVzdHJ1Y3R1cmEuZXN0YWRvc1BlZGlkb30pKTtcclxuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcclxuICAgIGNvbnN0IGNsYXNzZXMgPSB1c2VTdHlsZXMoKTtcclxuICAgIHJldHVybiA8UGFwZXIgY2xhc3NOYW1lPXtjbGFzc2VzLnBhcGVyfT4gXHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIHNwYWNpbmc9ezN9PlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezR9PlxyXG4gICAgICAgICAgICAgICAgPEZvcm1Db250cm9sIGZ1bGxXaWR0aD5cclxuICAgICAgICAgICAgICAgICAgICA8SW5wdXRMYWJlbCBpZD1cImVzdGFkb19sYWJlbFwiPkVzdGFkbzwvSW5wdXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsSWQ9XCJlc3RhZG9fbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVzdGFkb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwZWRpZG8uZXN0YWRvIHx8ICcnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVzdGFkbyA9IGV2ZW50LnRhcmdldC52YWx1ZSBhcyBzdHJpbmd8fG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUEVESURPKHtjYW1wbzpcImVzdGFkb1wiLCB2YWxvcjplc3RhZG99KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtlc3RhZG9zUGVkaWRvLm1hcCgoZXN0YWRvKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TWVudUl0ZW0ga2V5PXtlc3RhZG8uZXN0YWRvfSB2YWx1ZT17ZXN0YWRvLmVzdGFkb30+e2VzdGFkby5ub21icmV9PC9NZW51SXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvRm9ybUNvbnRyb2w+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICAgICAgPEdyaWQgaXRlbSB4cz17MTJ9IHNtPXs0fT5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwZWRpZG8uZmVjaGF9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJmZWNoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImZlY2hhXCJcclxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QRURJRE8oe2NhbXBvOlwiZmVjaGFcIiwgdmFsb3I6dmFsdWV9KSlcclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgICAgICA8R3JpZCBpdGVtIHhzPXsxMn0gc209ezR9PlxyXG4gICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3BlZGlkby5mZWNoYV9lbnRyZWdhfVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZmVjaGFfZW50cmVnYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJmZWNoYSBlbnRyZWdhXCJcclxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZmVjaGFfZW50cmVnYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICgodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUEVESURPKHtjYW1wbzpcImZlY2hhX2VudHJlZ2FcIiwgdmFsb3I6dmFsdWV9KSlcclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgIDwvR3JpZD5cclxuICAgIDwvUGFwZXI+XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIE9ic2VydmFjaW9uZXNQZWRpZG8ocHJvcHM6e2VkaXRhbmRvOmJvb2xlYW59KXtcclxuICAgIGNvbnN0IHtwZWRpZG99ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9Pih7cGVkaWRvOiBlc3RhZG8uZGF0b3NQZWRpZG8ucGVkaWRvfSkpO1xyXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xyXG4gICAgY29uc3QgY2xhc3NlcyA9IHVzZVN0eWxlcygpO1xyXG4gICAgcmV0dXJuIDxQYXBlciBjbGFzc05hbWU9e2NsYXNzZXMucGFwZXJ9PiBcclxuICAgICAgICA8R3JpZCBjb250YWluZXIgc3BhY2luZz17M30+XHJcbiAgICAgICAgICAgIDxHcmlkIGl0ZW0geHM9ezEyfSBzbT17MTJ9PlxyXG4gICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cGVkaWRvLm9ic2VydmFjaW9uZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJvYnNlcnZhY2lvbmVzXCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIk9ic2VydmFjaW9uZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJvYnNlcnZhY2lvbmVzXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSk9PmRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QRURJRE8oe2NhbXBvOlwib2JzZXJ2YWNpb25lc1wiLCB2YWxvcjp2YWx1ZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICA8L1BhcGVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSXRlbXMocHJvcHM6e1xyXG4gICAgZWRpdGFuZG86Ym9vbGVhbixcclxuICAgIGNvbkRlc2N1ZW50b0VuSXRlbXM6Ym9vbGVhbixcclxuICAgIGNvbk9wY2lvbmVzOiBib29sZWFuLFxyXG4gICAgZGF0b3NEZXNkZTpEYXRvc0Rlc2RlXHJcbiAgICBwcmVzdXB1ZXN0b09QZWRpZG86UHJlc3VwdWVzdG98UGVkaWRvXHJcbn0pe1xyXG4gICAgY29uc3Qge2NvbkRlc2N1ZW50b0VuSXRlbXMsIGNvbk9wY2lvbmVzLCBkYXRvc0Rlc2RlLCBwcmVzdXB1ZXN0b09QZWRpZG99ID0gcHJvcHM7XHJcbiAgICBjb25zdCB7aXRlbXMsIGNsaWVudGV9ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9PmVzdGFkb1tkYXRvc0Rlc2RlXSk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICBjb25zdCBoYW5kbGVBZGQgPSAoKT0+e1xyXG4gICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLkFERF9JVEVNKHtkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgc2V0VGltZW91dCgoKT0+Zm9jdXNUb0lkKFwiY2FudGlkYWRfXCIrKGl0ZW1zLmxlbmd0aC0xKS50b1N0cmluZygpLHttb3ZlVG9FbGVtZW50OmZhbHNlfSksMTAwKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIDxUYWJsZUNvbnRhaW5lciBjb21wb25lbnQ9e1BhcGVyfT5cclxuICAgICAgICA8VGFibGUgYXJpYS1sYWJlbD1cImN1c3RvbWl6ZWQgdGFibGVcIiBpZD1cIml0ZW1zLXRhYmxlXCI+XHJcbiAgICAgICAgICAgIDxUYWJsZUhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8VGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBzdHlsZT17e3dpZHRoOlwiNTBweFwifX1jbGFzc05hbWU9XCJub3QtcHJpbnRcIj5JdGVtczwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgc3R5bGU9e3t3aWR0aDpcIjU1cHhcIn19PkNhbnRpZGFkPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBzdHlsZT17e3dpZHRoOlwiNjBweFwifX0+Q29kIHByb2Q8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNsYXNzTmFtZT1cIm5vdC1wcmludFwiPk5vbWJyZSBwcm9kPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbD5EZXNjcmlwY2lvbjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgc3R5bGU9e3t3aWR0aDpcIjgwcHhcIn19YWxpZ249XCJyaWdodFwiPlAgdW5pdGFyaW88L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICB7Y29uRGVzY3VlbnRvRW5JdGVtcz88U3R5bGVkVGFibGVDZWxsIHN0eWxlPXt7d2lkdGg6XCI0MHB4XCJ9fWFsaWduPVwicmlnaHRcIj5EdG88L1N0eWxlZFRhYmxlQ2VsbD46bnVsbH1cclxuICAgICAgICAgICAgICAgICAgICB7Y29uRGVzY3VlbnRvRW5JdGVtcz88U3R5bGVkVGFibGVDZWxsIHN0eWxlPXt7d2lkdGg6XCI1MHB4XCJ9fWFsaWduPVwicmlnaHRcIj5Cb25pZjwvU3R5bGVkVGFibGVDZWxsPjpudWxsfVxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgc3R5bGU9e3t3aWR0aDpcIjgwcHhcIn19YWxpZ249XCJyaWdodFwiPlRvdGFsPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxyXG4gICAgICAgICAgICA8L1RhYmxlSGVhZD5cclxuICAgICAgICAgICAgPFRhYmxlQm9keT5cclxuICAgICAgICAgICAgICAgIHtpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPEl0ZW1QIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT17aXRlbX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFuZG89e3Byb3BzLmVkaXRhbmRvfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ZT17Y2xpZW50ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uRGVzY3VlbnRvRW5JdGVtcz17Y29uRGVzY3VlbnRvRW5JdGVtc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b3NEZXNkZT17ZGF0b3NEZXNkZX1cclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgICAgICA8VGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBjbGFzc05hbWU9XCJub3QtcHJpbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQWRkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb30gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbktleURvd249eyhldmVudCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VudGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoWzEzXS5pbmNsdWRlcyhldmVudC5rZXlDb2RlKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUFkZCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJQ09OLkFkZC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAge2NvbkRlc2N1ZW50b0VuSXRlbXM/PFN0eWxlZFRhYmxlQ2VsbCBjb2xTcGFuPXsyfT48L1N0eWxlZFRhYmxlQ2VsbD46bnVsbH1cclxuICAgICAgICAgICAgICAgICAgICB7Y29uT3BjaW9uZXM/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY29sU3Bhbj17Mn0gYWxpZ249XCJyaWdodFwiPjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNvbFNwYW49ezR9IGFsaWduPVwicmlnaHRcIj5zdWJ0b3RhbCAkPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIiBzdHlsZT17dG90YWxzU3R5bGVzfT57cHJlc3VwdWVzdG9PUGVkaWRvLnN1YnRvdGFsfTwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L1RhYmxlUm93PlxyXG4gICAgICAgICAgICAgICAge2Nvbk9wY2lvbmVzP251bGw6PD5cclxuICAgICAgICAgICAgICAgICAgICA8VGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb25EZXNjdWVudG9Fbkl0ZW1zPzxTdHlsZWRUYWJsZUNlbGwgY29sU3Bhbj17Mn0+PC9TdHlsZWRUYWJsZUNlbGw+Om51bGx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgYWxpZ249XCJyaWdodFwiIGNvbFNwYW49ezR9PmRlc2N1ZW50byBnZW5lcmFsICQ8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBhbGlnbj1cInJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VHlwZWRGaWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJlc3VwdWVzdG9PUGVkaWRvLmRlc2N1ZW50b31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImRlc2N1ZW50b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRlc2N1ZW50b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUpPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdG9zRGVzZGU9PSdkYXRvc1ByZXN1cHVlc3RvJz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfREVTQ1VFTlRPX1BSRVNVUFVFU1RPKHtkZXNjdWVudG86TnVtYmVyKHZhbHVlKX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9ERVNDVUVOVE9fUEVESURPKHtkZXNjdWVudG86TnVtYmVyKHZhbHVlKX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlUm93PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNsYXNzTmFtZT1cIm5vdC1wcmludFwiPjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGNsYXNzTmFtZT1cIm5vdC1wcmludFwiPjwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29uRGVzY3VlbnRvRW5JdGVtcz88U3R5bGVkVGFibGVDZWxsIGNvbFNwYW49ezN9PjwvU3R5bGVkVGFibGVDZWxsPjpudWxsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIiBjb2xTcGFuPXtjb25EZXNjdWVudG9Fbkl0ZW1zPzM6NH0+dG90YWwgJDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIiBzdHlsZT17dG90YWxzU3R5bGVzfT57cHJlc3VwdWVzdG9PUGVkaWRvLnRvdGFsfTwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XHJcbiAgICAgICAgICAgICAgICA8Lz59XHJcbiAgICAgICAgICAgIDwvVGFibGVCb2R5PlxyXG4gICAgICAgIDwvVGFibGU+XHJcbiAgICA8L1RhYmxlQ29udGFpbmVyPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSXRlbVAocHJvcHM6e2l0ZW06SXRlbSwgaW5kZXg6bnVtYmVyLCBlZGl0YW5kbzpib29sZWFuLCBjb25EZXNjdWVudG9Fbkl0ZW1zOmJvb2xlYW4sIGNsaWVudGU6IENsaWVudGUsIGRhdG9zRGVzZGU6RGF0b3NEZXNkZX0pe1xyXG4gICAgY29uc3Qge3Byb2R1Y3Rvc30gPSB1c2VTZWxlY3RvcigoZXN0YWRvOlN0YXRlKT0+ZXN0YWRvLmVzdHJ1Y3R1cmEpO1xyXG4gICAgY29uc3QgcHJvZHVjdG9zQXJyID0gbGlrZUFyKHByb2R1Y3RvcykuYXJyYXkoKTtcclxuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcclxuICAgIGNvbnN0IHtpdGVtLCBpbmRleCwgY29uRGVzY3VlbnRvRW5JdGVtcywgY2xpZW50ZSwgZGF0b3NEZXNkZX09cHJvcHM7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICBjb25zdCBFRElDSU9OX0xJQlJFID0gaXRlbS5wcm9kdWN0bz09MDtcclxuICAgIHJldHVybiA8R3JvdyBpbj17dHJ1ZX0+XHJcbiAgICAgICAgPFN0eWxlZFRhYmxlUm93IGtleT17aXRlbS5wcm9kdWN0b30+XHJcbiAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgY2xhc3NOYW1lPVwibm90LXByaW50XCI+XHJcbiAgICAgICAgICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9e1wiYWdyZWdhcl9cIiArIGluZGV4LnRvU3RyaW5nKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlJFTU9WRV9JVEVNKHtpbmRleDogaW5kZXgsIGRhdG9zRGVzZGV9KSlcclxuICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPElDT04uRGVsZXRlT3V0bGluZS8+XHJcbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGwgYWxpZ249XCJyaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICBpZD17XCJjYW50aWRhZF9cIiArIGluZGV4LnRvU3RyaW5nKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2l0ZW0uY2FudGlkYWQgfHwgbnVsbH1cclxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY2FudGlkYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FOVElEQURfSVRFTSh7aW5kZXgsY2FudGlkYWQ6TnVtYmVyKHZhbHVlKSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2l0ZW0ucHJvZHVjdG8gfHwgbnVsbH1cclxuICAgICAgICAgICAgICAgICAgICBpZD17XCJwb3JvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpfVxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwcm9kdWN0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFwcm9wcy5lZGl0YW5kb31cclxuICAgICAgICAgICAgICAgICAgICBtYXRjaEluTGlzdD17RURJQ0lPTl9MSUJSRT91bmRlZmluZWQ6cHJvZHVjdG9zQXJyLm1hcCgocHJvZHVjdG8pPT5wcm9kdWN0by5wcm9kdWN0byl9XHJcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWU9PScwJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfRklFTERfQ1VTVE9NX0lURU0oe2luZGV4LCBjYW1wbzoncHJvZHVjdG8nLHZhbG9yOnZhbHVlLCBkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaFJlc3VsdD1udWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdCA9IHByb2R1Y3Rvc0Fyci5maW5kKChwcm9kdWN0byk9PnByb2R1Y3RvLnByb2R1Y3RvPT12YWx1ZSkgfHwgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX1BST0RVQ1RPX0lURU0oe2luZGV4LCBwcm9kdWN0bzpzZWFyY2hSZXN1bHQsIGRhdG9zRGVzZGV9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBjbGFzc05hbWU9XCJub3QtcHJpbnRcIj5cclxuICAgICAgICAgICAgICAgIDxBbHRvSW1wcmVzaW9uU3R5bGUgY2hhcnNQZXJMaW5lPXtjb25EZXNjdWVudG9Fbkl0ZW1zPzYwOjc1fSBjb21wb25lbnRJZD17XCJub21icmUtcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpfSBsaW5lSGVpZ2h0PXszMH0gdmFsdWU9e2l0ZW0/Lm5vbWJyZSB8fCAnJ30vPlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRURJQ0lPTl9MSUJSRT9UeXBlZEZpZWxkOkF1dG9jb21wbGV0ZXIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ue1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6aXRlbT8ubm9tYnJlIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6XCJub21icmUtcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpcIm5vbWJyZS1wcm9kdWN0b1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IXByb3BzLmVkaXRhbmRvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlsaW5lOnRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEluTGlzdENvbmRpdGlvbkNhbGxiYWNrOihwcm9kdWN0bzogUHJvZHVjdG8pPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRlLmNsaWVudGUgPT0gcHJvZHVjdG8uY2xpZW50ZSB8fCBwcm9kdWN0by5jbGllbnRlID09IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LC4uLihFRElDSU9OX0xJQlJFP3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlOih2YWx1ZTogc3RyaW5nKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0ZJRUxEX0NVU1RPTV9JVEVNKHtpbmRleCwgY2FtcG86J25vbWJyZScsdmFsb3I6dmFsdWUsIGRhdG9zRGVzZGV9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTp7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzOiBwcm9kdWN0b3NBcnIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hLZXk6XCJub21icmVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFR5cGU6XCJ0ZXh0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZHVjdG9TZWxlY2Npb25hZG86UHJvZHVjdG98bnVsbCk9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfUFJPRFVDVE9fSVRFTSh7aW5kZXgsIHByb2R1Y3RvOnByb2R1Y3RvU2VsZWNjaW9uYWRvLCBkYXRvc0Rlc2RlfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgIDxTdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICA8QWx0b0ltcHJlc2lvblN0eWxlIGNoYXJzUGVyTGluZT17Y29uRGVzY3VlbnRvRW5JdGVtcz82MDo3NX0gY29tcG9uZW50SWQ9e1wiZGVzY3JpcGNpb24tcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpfSBsaW5lSGVpZ2h0PXszMH0gdmFsdWU9e2l0ZW0/LmRlc2NyaXBjaW9uIHx8ICcnfS8+XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChFRElDSU9OX0xJQlJFP1R5cGVkRmllbGQ6QXV0b2NvbXBsZXRlciwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTppdGVtPy5kZXNjcmlwY2lvbiB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOlwiZGVzY3JpcGNpb24tcHJvZHVjdG9fXCIgKyBpbmRleC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpcImRlc2NyaXBjaW9uLXByb2R1Y3RvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDohcHJvcHMuZWRpdGFuZG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmU6dHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwuLi4oRURJQ0lPTl9MSUJSRT97XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZToodmFsdWU6c3RyaW5nKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0ZJRUxEX0NVU1RPTV9JVEVNKHtpbmRleCwgY2FtcG86J2Rlc2NyaXBjaW9uJyx2YWxvcjp2YWx1ZSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9OntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3M6IHByb2R1Y3Rvc0FycixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEtleTpcImRlc2NyaXBjaW9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hUeXBlOlwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Rpb246XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2R1Y3RvU2VsZWNjaW9uYWRvOlByb2R1Y3RvfG51bGwpPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX1BST0RVQ1RPX0lURU0oe2luZGV4LCBwcm9kdWN0bzpwcm9kdWN0b1NlbGVjY2lvbmFkbywgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvU3R5bGVkVGFibGVDZWxsPlxyXG4gICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIj57XHJcbiAgICAgICAgICAgICAgICBFRElDSU9OX0xJQlJFP1xyXG4gICAgICAgICAgICAgICAgICAgIDxUeXBlZEZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e1wicHJlY2lvX3VuaXRhcmlvXCIgKyBpbmRleC50b1N0cmluZygpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2l0ZW0ucHJlY2lvX3VuaXRhcmlvIHx8IG51bGx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwcmVjaW9fdW5pdGFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByb3BzLmVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUpPT5kaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfRklFTERfQ1VTVE9NX0lURU0oe2luZGV4LCBjYW1wbzoncHJlY2lvX3VuaXRhcmlvJyx2YWxvcjp2YWx1ZSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnByZWNpb191bml0YXJpbz8udG9TdHJpbmcoKX1cclxuICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgIHtjb25EZXNjdWVudG9Fbkl0ZW1zP1xyXG4gICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkVGFibGVDZWxsIGFsaWduPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFR5cGVkRmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbj1cInJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtpdGVtLnBvcmNlbnRhamVfZGVzY3VlbnRvfHwgMH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPXtcInBvcmNlbnRhamVfZGVzY3VlbnRvX1wiICsgaW5kZXgudG9TdHJpbmcoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwb3JjZW50YWplX2Rlc2N1ZW50b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshcHJvcHMuZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9ERVNDVUVOVE9fSVRFTSh7aW5kZXgsIHBvcmNlbnRhamU6TnVtYmVyKHZhbHVlKSwgZGF0b3NEZXNkZX0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QWRvcm5tZW50PVwiJVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBhbGlnbj1cInJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpdGVtLmRlc2N1ZW50b31cclxuICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZFRhYmxlQ2VsbD5cclxuICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICA6bnVsbH1cclxuICAgICAgICAgICAgPFN0eWxlZFRhYmxlQ2VsbCBhbGlnbj1cInJpZ2h0XCIgc3R5bGU9e3RvdGFsc1N0eWxlc30+e2l0ZW0udG90YWw/LnRvU3RyaW5nKCl9PC9TdHlsZWRUYWJsZUNlbGw+XHJcbiAgICAgICAgPC9TdHlsZWRUYWJsZVJvdz5cclxuICAgIDwvR3Jvdz5cclxufVxyXG5cclxuY29uc3QgU3R5bGVkVGFibGVDZWxsID0gd2l0aFN0eWxlcygodGhlbWU6IFRoZW1lKSA9PlxyXG4gIGNyZWF0ZVN0eWxlcyh7XHJcbiAgICBoZWFkOiB7XHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5jb21tb24uYmxhY2ssXHJcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmNvbW1vbi53aGl0ZSxcclxuICAgIH0sXHJcbiAgICBib2R5OiB7XHJcbiAgICAgIGZvbnRTaXplOiAxNCxcclxuICAgICAgcGFkZGluZzogOFxyXG4gICAgfSxcclxuICB9KSxcclxuKShUYWJsZUNlbGwpO1xyXG5cclxuY29uc3QgU3R5bGVkVGFibGVSb3cgPSB3aXRoU3R5bGVzKCh0aGVtZTogVGhlbWUpID0+XHJcbiAgY3JlYXRlU3R5bGVzKHtcclxuICAgIHJvb3Q6IHtcclxuICAgICAgJyY6bnRoLW9mLXR5cGUob2RkKSc6IHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmhvdmVyLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICB9KSxcclxuKShUYWJsZVJvdyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUHJlc3VwdWVzdG9Db21wb25lbnQoX3Byb3BzOnt9KXtcclxuICAgIGNvbnN0IHtjbGllbnRlLCBwcmVzdXB1ZXN0bywgaXRlbXN9ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9Pihlc3RhZG8uZGF0b3NQcmVzdXB1ZXN0bykpO1xyXG4gICAgY29uc3Qge2VzdGFkb3NQcmVzdXB1ZXN0b30gPSB1c2VTZWxlY3RvcigoZXN0YWRvOlN0YXRlKT0+KHtlc3RhZG9zUHJlc3VwdWVzdG86ZXN0YWRvLmVzdHJ1Y3R1cmEuZXN0YWRvc1ByZXN1cHVlc3RvfSkpO1xyXG4gICAgY29uc3Qge3BhcmFtZXRyb3N9ID0gdXNlU2VsZWN0b3IoKGVzdGFkbzpTdGF0ZSk9Pihlc3RhZG8uZXN0cnVjdHVyYSkpO1xyXG4gICAgY29uc3QgY2xhc3NlcyA9IHVzZVN0eWxlcygpO1xyXG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xyXG4gICAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgZXNOdWV2byA9ICEocHJlc3VwdWVzdG8ucHJlc3VwdWVzdG8pO1xyXG4gICAgY29uc3QgZGlzYWJsZWQgPSAhZXN0YWRvc1ByZXN1cHVlc3RvLmZpbmQoKGVzdGFkbyk9PmVzdGFkby5lc3RhZG8gPT0gcHJlc3VwdWVzdG8uZXN0YWRvKT8ucGVybWl0ZV9lZGl0YXI7XHJcbiAgICBjb25zdCBbZWRpdGFuZG8sIHNldEVkaXRhbmRvXSA9IHVzZVN0YXRlKGVzTnVldm8pO1xyXG4gICAgY29uc3QgW3NuYWNrQmFyTWVzc2FnZSwgc2V0U25hY2tCYXJNZXNzYWdlXSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IGhheURlc2N1ZW50b3NJbmdyZXNhZG9zID0gaXRlbXMuc29tZSgoaXRlbSk9Pml0ZW0uZGVzY3VlbnRvICE9IDApO1xyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoX2V2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCB8IFJlYWN0Lk1vdXNlRXZlbnQsIHJlYXNvbj86IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChyZWFzb24gPT09ICdjbGlja2F3YXknKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgIH07XHJcbiAgICByZXR1cm4gPG1haW4gY2xhc3NOYW1lPXtjbGFzc2VzLmxheW91dH0gaWQ9XCJwcmVzdXB1ZXN0b1wiPlxyXG4gICAgICAgIDxpbWcgaWQ9XCJiYW5uZXItc3VwZXJpb3ItaW1wcmVzaW9uXCIgY2xhc3NOYW1lPVwib25seS1mb3ItcHJpbnRcIiBzcmM9XCJpbWcvYmFubmVyc3VwZXJpb3IucG5nXCIgYWx0PVwiYmFubmVyc3VwZXJpb3IucG5nXCIvPlxyXG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBhbGlnbkl0ZW1zPVwiZmxleC1zdGFydFwiIGp1c3RpZnk9XCJmbGV4LXN0YXJ0XCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxoMj57cHJlc3VwdWVzdG8ucHJlc3VwdWVzdG8/YFByZXN1cHVlc3RvIE7CuiAke3ByZXN1cHVlc3RvLnByZXN1cHVlc3RvfWA6YE51ZXZvIHByZXN1cHVlc3RvYH08L2gyPlxyXG4gICAgICAgIDwvR3JpZD5cclxuICAgICAgICA8R3JpZCBjb250YWluZXIgYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIiBqdXN0aWZ5PVwiZmxleC1lbmRcIiBkaXJlY3Rpb249XCJyb3dcIj5cclxuICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj17ZWRpdGFuZG8/XCJzZWNvbmRhcnlcIjpcInByaW1hcnlcIn1cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RWRpdGFuZG8oIWVkaXRhbmRvKVxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHtlZGl0YW5kbz9cclxuICAgICAgICAgICAgICAgICAgICA8SUNPTi5DYW5jZWwvPlxyXG4gICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgICAgIDxJQ09OLkVkaXQvPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wcmludCgpXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmJ1dHRvbn1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPElDT04uUHJpbnQvPlxyXG4gICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgPENsaWVudGVDb21wb25lbnQgZWRpdGFuZG89e2VkaXRhbmRvfSBkYXRvc0Rlc2RlPVwiZGF0b3NQcmVzdXB1ZXN0b1wiLz5cclxuICAgICAgICA8RXN0YWRvUHJlc3VwdWVzdG8gZWRpdGFuZG89e2VkaXRhbmRvfS8+XHJcbiAgICAgICAgPEl0ZW1zIFxyXG4gICAgICAgICAgICBlZGl0YW5kbz17ZWRpdGFuZG99XHJcbiAgICAgICAgICAgIGNvbkRlc2N1ZW50b0VuSXRlbXM9e3ByZXN1cHVlc3RvLmNvbl9kZXNjdWVudG9fZW5faXRlbXN9XHJcbiAgICAgICAgICAgIGNvbk9wY2lvbmVzPXtwcmVzdXB1ZXN0by5jb25fb3BjaW9uZXN9XHJcbiAgICAgICAgICAgIGRhdG9zRGVzZGU9J2RhdG9zUHJlc3VwdWVzdG8nXHJcbiAgICAgICAgICAgIHByZXN1cHVlc3RvT1BlZGlkbz17cHJlc3VwdWVzdG99XHJcbiAgICAgICAgLz5cclxuICAgICAgICA8R3JpZCBjb250YWluZXIgY2xhc3NOYW1lPVwibm90LXByaW50XCIgYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIiBqdXN0aWZ5PVwiZmxleC1lbmRcIiBkaXJlY3Rpb249XCJyb3dcIj5cclxuICAgICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcclxuICAgICAgICAgICAgICAgIGNvbnRyb2w9e1xyXG4gICAgICAgICAgICAgICAgICAgIDxDaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtwcmVzdXB1ZXN0by5jb25fb3BjaW9uZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NBTVBPX1BSRVNVUFVFU1RPKHtjYW1wbzpcImNvbl9vcGNpb25lc1wiLCB2YWxvcjpldmVudC50YXJnZXQuY2hlY2tlZH0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWVkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29uX29wY2lvbmVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGFiZWxQbGFjZW1lbnQ9XCJzdGFydFwiXHJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIm9jdWx0YXIgdG90YWxlc1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBjbGFzc05hbWU9XCJub3QtcHJpbnRcIiBhbGlnbkl0ZW1zPVwiZmxleC1zdGFydFwiIGp1c3RpZnk9XCJmbGV4LWVuZFwiIGRpcmVjdGlvbj1cInJvd1wiPlxyXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxyXG4gICAgICAgICAgICAgICAgY29udHJvbD17XHJcbiAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3ByZXN1cHVlc3RvLmNvbl9kZXNjdWVudG9fZW5faXRlbXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KT0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goZGlzcGF0Y2hlcnMuU0VUX0NBTVBPX1BSRVNVUFVFU1RPKHtjYW1wbzpcImNvbl9kZXNjdWVudG9fZW5faXRlbXNcIiwgdmFsb3I6ZXZlbnQudGFyZ2V0LmNoZWNrZWR9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFlZGl0YW5kbyB8fCBoYXlEZXNjdWVudG9zSW5ncmVzYWRvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImNvbl9kZXNjdWVudG9fZW5faXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsYWJlbFBsYWNlbWVudD1cInN0YXJ0XCJcclxuICAgICAgICAgICAgICAgIGxhYmVsPVwiZGVzY3VlbnRvIGVuIGl0ZW1zXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIGFsaWduSXRlbXM9XCJmbGV4LXN0YXJ0XCIganVzdGlmeT1cImZsZXgtZW5kXCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGd1YXJkYXJQcmVzdXB1ZXN0byhjbGllbnRlLCBwcmVzdXB1ZXN0bywgaXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChkaXNwYXRjaGVycy5TRVRfQ0FNUE9fUFJFU1VQVUVTVE8oe2NhbXBvOlwicHJlc3VwdWVzdG9cIiwgdmFsb3I6cmVzdWx0LnByZXN1cHVlc3RvfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNuYWNrQmFyTWVzc2FnZShgUHJlc3VwdWVzdG8gJHtyZXN1bHQucHJlc3VwdWVzdG99IGd1YXJkYWRvYClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3Blbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdGFuZG8oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTbmFja0Jhck1lc3NhZ2UoYEVycm9yIGFsIGd1YXJkYXIgZWwgcHJlc3VwdWVzdG8uICR7ZXJyLm1lc3NhZ2V9YClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3Blbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmJ1dHRvbn1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPElDT04uU2F2ZS8+XHJcbiAgICAgICAgICAgIDwvQnV0dG9uPlxyXG4gICAgICAgICAgICA8U25hY2tiYXJcclxuICAgICAgICAgICAgICAgIGFuY2hvck9yaWdpbj17e1xyXG4gICAgICAgICAgICAgICAgdmVydGljYWw6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbDogJ2xlZnQnLFxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIG9wZW49e29wZW59XHJcbiAgICAgICAgICAgICAgICBhdXRvSGlkZUR1cmF0aW9uPXs2MDAwfVxyXG4gICAgICAgICAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2V9XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlPXtzbmFja0Jhck1lc3NhZ2V9XHJcbiAgICAgICAgICAgICAgICBhY3Rpb249e1xyXG4gICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b24gc2l6ZT1cInNtYWxsXCIgYXJpYS1sYWJlbD1cImNsb3NlXCIgY29sb3I9XCJpbmhlcml0XCIgb25DbGljaz17aGFuZGxlQ2xvc2V9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElDT04uQ2xvc2UvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ljb25CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAge3BhcmFtZXRyb3M/LmxlZ2FsZXNfcHJlc3VwdWVzdG8/XHJcbiAgICAgICAgICAgIDxQYXBlciBjbGFzc05hbWU9e2NsYXNzZXMucGFwZXIrXCIgbGVnYWxlc1wifT4gXHJcbiAgICAgICAgICAgICAgICA8cD57cGFyYW1ldHJvcy5sZWdhbGVzX3ByZXN1cHVlc3RvfTwvcD5cclxuICAgICAgICAgICAgPC9QYXBlcj5cclxuICAgICAgICA6XHJcbiAgICAgICAgICAgIG51bGxcclxuICAgICAgICB9XHJcbiAgICA8L21haW4+XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBQZWRpZG9Db21wb25lbnQoX3Byb3BzOnt9KXtcclxuICAgIGNvbnN0IHtjbGllbnRlLCBwZWRpZG8sIGl0ZW1zfSA9IHVzZVNlbGVjdG9yKChlc3RhZG86U3RhdGUpPT4oZXN0YWRvLmRhdG9zUGVkaWRvKSk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdXNlU3R5bGVzKCk7XHJcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XHJcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgICBjb25zdCBlc051ZXZvID0gIShwZWRpZG8ucGVkaWRvKTtcclxuICAgIGNvbnN0IFtlZGl0YW5kbywgc2V0RWRpdGFuZG9dID0gdXNlU3RhdGUoZXNOdWV2byk7XHJcbiAgICBjb25zdCBbc25hY2tCYXJNZXNzYWdlLCBzZXRTbmFja0Jhck1lc3NhZ2VdID0gdXNlU3RhdGUoJycpO1xyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoX2V2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCB8IFJlYWN0Lk1vdXNlRXZlbnQsIHJlYXNvbj86IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChyZWFzb24gPT09ICdjbGlja2F3YXknKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XHJcbiAgICAgIH07XHJcbiAgICByZXR1cm4gPG1haW4gY2xhc3NOYW1lPXtjbGFzc2VzLmxheW91dH0gaWQ9XCJwZWRpZG9cIj5cclxuICAgICAgICA8aW1nIGlkPVwiYmFubmVyLXN1cGVyaW9yLWltcHJlc2lvblwiIGNsYXNzTmFtZT1cIm9ubHktZm9yLXByaW50XCIgc3JjPVwiaW1nL2Jhbm5lcnN1cGVyaW9yLnBuZ1wiIGFsdD1cImJhbm5lcnN1cGVyaW9yLnBuZ1wiLz5cclxuICAgICAgICA8R3JpZCBjb250YWluZXIgYWxpZ25JdGVtcz1cImZsZXgtc3RhcnRcIiBqdXN0aWZ5PVwiZmxleC1zdGFydFwiIGRpcmVjdGlvbj1cInJvd1wiPlxyXG4gICAgICAgICAgICA8aDI+e3BlZGlkby5wZWRpZG8/YFBlZGlkbyBOwrogJHtwZWRpZG8ucGVkaWRvfWA6YE51ZXZvIHBlZGlkb2B9PC9oMj5cclxuICAgICAgICA8L0dyaWQ+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIGFsaWduSXRlbXM9XCJmbGV4LXN0YXJ0XCIganVzdGlmeT1cImZsZXgtZW5kXCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9e2VkaXRhbmRvP1wic2Vjb25kYXJ5XCI6XCJwcmltYXJ5XCJ9XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEVkaXRhbmRvKCFlZGl0YW5kbylcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuYnV0dG9ufVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7ZWRpdGFuZG8/XHJcbiAgICAgICAgICAgICAgICAgICAgPElDT04uQ2FuY2VsLz5cclxuICAgICAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgICAgICAgICA8SUNPTi5FZGl0Lz5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2VkaXRhbmRvfVxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCk9PntcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucHJpbnQoKVxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5idXR0b259XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxJQ09OLlByaW50Lz5cclxuICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgPC9HcmlkPlxyXG4gICAgICAgIDxDbGllbnRlQ29tcG9uZW50IGVkaXRhbmRvPXtlZGl0YW5kb30gZGF0b3NEZXNkZT1cImRhdG9zUGVkaWRvXCIvPlxyXG4gICAgICAgIDxFc3RhZG9QZWRpZG8gZWRpdGFuZG89e2VkaXRhbmRvfS8+XHJcbiAgICAgICAgPEl0ZW1zIFxyXG4gICAgICAgICAgICBlZGl0YW5kbz17ZWRpdGFuZG99XHJcbiAgICAgICAgICAgIGNvbkRlc2N1ZW50b0VuSXRlbXM9e3RydWV9XHJcbiAgICAgICAgICAgIGNvbk9wY2lvbmVzPXtmYWxzZX1cclxuICAgICAgICAgICAgZGF0b3NEZXNkZT0nZGF0b3NQZWRpZG8nXHJcbiAgICAgICAgICAgIHByZXN1cHVlc3RvT1BlZGlkbz17cGVkaWRvfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPE9ic2VydmFjaW9uZXNQZWRpZG8gZWRpdGFuZG89e2VkaXRhbmRvfS8+XHJcbiAgICAgICAgPEdyaWQgY29udGFpbmVyIGFsaWduSXRlbXM9XCJmbGV4LXN0YXJ0XCIganVzdGlmeT1cImZsZXgtZW5kXCIgZGlyZWN0aW9uPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshZWRpdGFuZG99XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXthc3luYyAoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGd1YXJkYXJQZWRpZG8oY2xpZW50ZSwgcGVkaWRvLCBpdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGRpc3BhdGNoZXJzLlNFVF9DQU1QT19QRURJRE8oe2NhbXBvOlwicGVkaWRvXCIsIHZhbG9yOnJlc3VsdC5wZWRpZG99KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U25hY2tCYXJNZXNzYWdlKGBQZWRpZG8gJHtyZXN1bHQucGVkaWRvfSBndWFyZGFkb2ApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wZW4odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRhbmRvKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U25hY2tCYXJNZXNzYWdlKGBFcnJvciBhbCBndWFyZGFyIGVsIHBlZGlkby4gJHtlcnIubWVzc2FnZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRPcGVuKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuYnV0dG9ufVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8SUNPTi5TYXZlLz5cclxuICAgICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgICAgIDxTbmFja2JhclxyXG4gICAgICAgICAgICAgICAgYW5jaG9yT3JpZ2luPXt7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbDogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgb3Blbj17b3Blbn1cclxuICAgICAgICAgICAgICAgIGF1dG9IaWRlRHVyYXRpb249ezYwMDB9XHJcbiAgICAgICAgICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZX1cclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3NuYWNrQmFyTWVzc2FnZX1cclxuICAgICAgICAgICAgICAgIGFjdGlvbj17XHJcbiAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8SWNvbkJ1dHRvbiBzaXplPVwic21hbGxcIiBhcmlhLWxhYmVsPVwiY2xvc2VcIiBjb2xvcj1cImluaGVyaXRcIiBvbkNsaWNrPXtoYW5kbGVDbG9zZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SUNPTi5DbG9zZS8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIDwvR3JpZD5cclxuICAgIDwvbWFpbj5cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc3BsZWdhclByZXN1cHVlc3RvKHN0b3JlOlN0b3JlPFN0YXRlLEFjdGlvbkZvcm11bGFyaW9TdGF0ZT4pe1xyXG4gICAgUmVhY3RET00ucmVuZGVyKFxyXG4gICAgICAgIDxQcm92aWRlciBzdG9yZT17c3RvcmV9PlxyXG4gICAgICAgICAgICA8UHJlc3VwdWVzdG9Db21wb25lbnQvPlxyXG4gICAgICAgIDwvUHJvdmlkZXI+XHJcbiAgICAgICAgLFxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluX2xheW91dCcpXHJcbiAgICApXHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXNwbGVnYXJQZWRpZG8oc3RvcmU6U3RvcmU8U3RhdGUsQWN0aW9uRm9ybXVsYXJpb1N0YXRlPil7XHJcbiAgICBSZWFjdERPTS5yZW5kZXIoXHJcbiAgICAgICAgPFByb3ZpZGVyIHN0b3JlPXtzdG9yZX0+XHJcbiAgICAgICAgICAgIDxQZWRpZG9Db21wb25lbnQvPlxyXG4gICAgICAgIDwvUHJvdmlkZXI+XHJcbiAgICAgICAgLFxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluX2xheW91dCcpXHJcbiAgICApXHJcbn1cclxuXHJcbmlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKXtcclxuICAgIC8vIEB0cy1pZ25vcmUgcGFyYSBoYWNlcmxvXHJcbiAgICB3aW5kb3cuZGVzcGxlZ2FyUHJlc3VwdWVzdG8gPSBkZXNwbGVnYXJQcmVzdXB1ZXN0bztcclxuICAgIC8vIEB0cy1pZ25vcmUgcGFyYSBoYWNlcmxvXHJcbiAgICB3aW5kb3cuZGVzcGxlZ2FyUGVkaWRvID0gZGVzcGxlZ2FyUGVkaWRvO1xyXG59Il19