contable 0.0.1 → 0.0.3

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 (45) hide show
  1. package/dist/client/client.d.ts +1 -0
  2. package/dist/client/client.js +63 -140
  3. package/dist/client/menu.d.ts +0 -0
  4. package/dist/client/redux-formulario.d.ts +477 -0
  5. package/dist/client/redux-formulario.js +236 -289
  6. package/dist/client/render-components.d.ts +66 -0
  7. package/dist/client/render-components.js +293 -426
  8. package/dist/client/render-formulario.d.ts +1 -0
  9. package/dist/client/render-formulario.js +4 -4
  10. package/dist/client/render-general.d.ts +124 -0
  11. package/dist/client/render-general.js +38 -63
  12. package/dist/client/render-handlers.d.ts +1 -0
  13. package/dist/client/render-handlers.js +14 -54
  14. package/dist/client/tipos.d.ts +119 -0
  15. package/dist/client/tsconfig.json +3 -1
  16. package/dist/server/app-contable.d.ts +233 -0
  17. package/dist/server/app-contable.js +5 -2
  18. package/dist/server/def-config.d.ts +1 -0
  19. package/dist/server/procedures-contable.d.ts +3 -0
  20. package/dist/server/server-contable.d.ts +1 -0
  21. package/dist/server/table-categorias_producto.d.ts +2 -0
  22. package/dist/server/table-clientes.d.ts +2 -0
  23. package/dist/server/table-condicion_iva.d.ts +2 -0
  24. package/dist/server/table-estados_pedido.d.ts +2 -0
  25. package/dist/server/table-estados_presupuesto.d.ts +2 -0
  26. package/dist/server/table-insumos.d.ts +2 -0
  27. package/dist/server/table-items_pedido.d.ts +2 -0
  28. package/dist/server/table-items_presupuesto.d.ts +2 -0
  29. package/dist/server/table-iva_productos.d.ts +2 -0
  30. package/dist/server/table-parametros.d.ts +2 -0
  31. package/dist/server/table-pedidos.d.ts +2 -0
  32. package/dist/server/table-pedidos_pendientes.d.ts +2 -0
  33. package/dist/server/table-pedidos_vencidos.d.ts +2 -0
  34. package/dist/server/table-presupuestos.d.ts +2 -0
  35. package/dist/server/table-productos.d.ts +2 -0
  36. package/dist/server/table-productos_clientes.d.ts +2 -0
  37. package/dist/server/table-productos_generales.d.ts +2 -0
  38. package/dist/server/table-productos_insumos.d.ts +2 -0
  39. package/dist/server/table-usuarios.d.ts +2 -0
  40. package/dist/server/types-contable.d.ts +29 -0
  41. package/dist/unlogged/adapt.d.ts +0 -0
  42. package/dist/unlogged/tsconfig.json +1 -1
  43. package/dist/unlogged/unlogged.d.ts +1 -0
  44. package/dist/unlogged/unlogged.js +83 -170
  45. package/package.json +1 -1
@@ -1,50 +1,3 @@
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
1
  (function (factory) {
49
2
  if (typeof module === "object" && typeof module.exports === "object") {
50
3
  var v = factory(require, exports);
@@ -69,132 +22,109 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
69
22
  exports.PedidoComponent = PedidoComponent;
70
23
  exports.desplegarPresupuesto = desplegarPresupuesto;
71
24
  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");
25
+ const React = require("react");
26
+ const ReactDOM = require("react-dom");
27
+ const render_general_1 = require("./render-general");
28
+ const redux_formulario_1 = require("./redux-formulario");
29
+ const core_1 = require("@material-ui/core");
30
+ const react_1 = require("react");
31
+ const react_redux_1 = require("react-redux");
32
+ const likeAr = require("like-ar");
80
33
  exports.ESTADO_ACEPTADO_PRESUPUESTO = "aceptado";
81
34
  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)())
35
+ var generarPedidoDesdePresupuesto = (datosPresupuesto) => {
36
+ let { cliente, items, presupuesto } = datosPresupuesto;
37
+ let datosPedido = {
38
+ cliente,
39
+ items,
40
+ pedido: {
41
+ presupuesto: presupuesto.presupuesto,
42
+ cliente: presupuesto.cliente,
43
+ descuento: presupuesto.descuento,
44
+ subtotal: presupuesto.subtotal,
45
+ total: presupuesto.total,
46
+ ...(0, redux_formulario_1.inicializarPedido)()
47
+ }
88
48
  };
89
49
  return datosPedido;
90
50
  };
91
51
  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
- });
52
+ my.wScreens.presupuesto = async function (addrParams) {
53
+ var datosPresupuesto = null;
54
+ //@ts-ignore existe
55
+ if (addrParams.presupuesto) {
56
+ //@ts-ignore existe
57
+ datosPresupuesto = await my.ajax.presupuesto_cargar({ presupuesto: addrParams.presupuesto });
58
+ }
59
+ var store = await (0, redux_formulario_1.crearStore)({ useSessionStorage: true, datosPresupuesto: datosPresupuesto || undefined }, redux_formulario_1.createInitialStatePresupuesto);
60
+ desplegarPresupuesto(store);
113
61
  };
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
- });
62
+ my.wScreens.pedido = async function (addrParams) {
63
+ var datosPedido = null;
64
+ //@ts-ignore existe
65
+ if (addrParams.pedido) {
66
+ //@ts-ignore existe
67
+ datosPedido = await my.ajax.pedido_cargar({ pedido: addrParams.pedido });
68
+ //@ts-ignore existe
69
+ }
70
+ else if (addrParams.presupuesto) {
71
+ //@ts-ignore existe
72
+ var datosPresupuesto = await my.ajax.presupuesto_cargar({ presupuesto: addrParams.presupuesto });
73
+ datosPedido = (0, exports.generarPedidoDesdePresupuesto)(datosPresupuesto);
74
+ }
75
+ var store = await (0, redux_formulario_1.crearStore)({ useSessionStorage: true, datosPedido: datosPedido || undefined }, redux_formulario_1.createInitialStatePedido);
76
+ desplegarPedido(store);
142
77
  };
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',
78
+ const useStyles = (0, core_1.makeStyles)((theme) => ({
79
+ appBar: {
80
+ position: 'relative',
81
+ },
82
+ layout: {
83
+ width: 'auto',
84
+ marginLeft: theme.spacing(2),
85
+ marginRight: theme.spacing(2),
86
+ [theme.breakpoints.up(600 + theme.spacing(2) * 2)]: {
87
+ //width: 600,
88
+ //marginLeft: 'auto',
89
+ //marginRight: 'auto',
177
90
  },
178
- button: {
179
- marginTop: theme.spacing(1),
180
- marginBottom: theme.spacing(1),
91
+ },
92
+ paper: {
93
+ marginTop: theme.spacing(2),
94
+ marginBottom: theme.spacing(2),
95
+ padding: theme.spacing(2),
96
+ [theme.breakpoints.up(600 + theme.spacing(3) * 2)]: {
97
+ marginTop: theme.spacing(2),
98
+ marginBottom: theme.spacing(2),
99
+ padding: theme.spacing(3),
181
100
  },
182
- });
183
- });
101
+ },
102
+ stepper: {
103
+ padding: theme.spacing(3, 0, 5),
104
+ },
105
+ buttons: {
106
+ display: 'flex',
107
+ justifyContent: 'flex-end',
108
+ },
109
+ button: {
110
+ marginTop: theme.spacing(1),
111
+ marginBottom: theme.spacing(1),
112
+ },
113
+ }));
184
114
  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 () {
115
+ const { rows, value, searchKey, searchType, onSelection, id, className, label, name, matchInListConditionCallback } = props;
116
+ const anchorRef = (0, react_1.useRef)(null);
117
+ const [filteredRows, setFilteredRows] = (0, react_1.useState)([]);
118
+ const [open, setOpen] = (0, react_1.useState)(false);
119
+ const [focusOnList, setFocusOnList] = (0, react_1.useState)(false);
120
+ const [valorIngresado, setValorIngresado] = (0, react_1.useState)(null);
121
+ (0, react_1.useEffect)(() => {
192
122
  setValorIngresado(value);
193
123
  }, [value]);
194
- (0, react_1.useEffect)(function () {
124
+ (0, react_1.useEffect)(() => {
195
125
  document.body.style.overflow = open ? 'hidden' : 'unset';
196
126
  });
197
- var focusToId = function (id, opts, cb) {
127
+ const focusToId = (id, opts, cb) => {
198
128
  var element = document.getElementById(id);
199
129
  var padre = element;
200
130
  while (padre && padre.className != 'pregunta' && padre != document.body)
@@ -214,8 +144,8 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
214
144
  }
215
145
  }
216
146
  };
217
- var checkIfValue = function () {
218
- var result = rows.find(function (row) { return row[searchKey].toString().toLowerCase() == (valorIngresado || '').toLowerCase(); });
147
+ const checkIfValue = () => {
148
+ var result = rows.find((row) => row[searchKey].toString().toLowerCase() == (valorIngresado || '').toLowerCase());
219
149
  if (result) {
220
150
  setValorIngresado(result[searchKey]);
221
151
  onSelection(result);
@@ -228,7 +158,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
228
158
  setOpen(false);
229
159
  }
230
160
  };
231
- var handleClose = function (event) {
161
+ const handleClose = (event) => {
232
162
  if (anchorRef.current && anchorRef.current.contains(event.target)) {
233
163
  return;
234
164
  }
@@ -236,7 +166,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
236
166
  //y al borrar con backspace primero marca si no está marcado y después borra
237
167
  focusToId(id, { moveToElement: false });
238
168
  };
239
- var handleSelection = function (row) {
169
+ const handleSelection = (row) => {
240
170
  onSelection(row);
241
171
  setValorIngresado(row[searchKey]);
242
172
  setFilteredRows([]);
@@ -244,24 +174,20 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
244
174
  focusToId(id, { moveToElement: false });
245
175
  };
246
176
  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;
177
+ 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: (event) => {
178
+ let value = event.target.value;
249
179
  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
- }));
180
+ setFilteredRows(rows.filter((row) => value.split(' ').every(palabraBuscada => row[searchKey].toString().toLocaleLowerCase().includes(palabraBuscada.toLocaleLowerCase()) &&
181
+ (matchInListConditionCallback ? matchInListConditionCallback(row) : true))));
256
182
  setOpen(event.target.value.length > 1 && filteredRows.length <= 10);
257
- }, onFocus: function (_event) {
183
+ }, onFocus: (_event) => {
258
184
  setFocusOnList(false);
259
185
  //setOpen(!!valorIngresado && valorIngresado.length>1);
260
- }, onBlur: function () {
186
+ }, onBlur: () => {
261
187
  if (!open) {
262
188
  checkIfValue();
263
189
  }
264
- }, onKeyDown: function (event) {
190
+ }, onKeyDown: (event) => {
265
191
  //down key
266
192
  if (event.keyCode == 40) {
267
193
  if (open) {
@@ -273,35 +199,30 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
273
199
  checkIfValue();
274
200
  }
275
201
  }, "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
- }));
202
+ React.createElement(core_1.Popper, { open: open, anchorEl: anchorRef.current, placement: "bottom-start", transition: true }, ({ TransitionProps, placement }) => (React.createElement(core_1.Grow, { ...TransitionProps, style: { transformOrigin: placement === 'bottom' ? 'left top' : 'center bottom' } },
203
+ React.createElement(core_1.Paper, null,
204
+ React.createElement(core_1.ClickAwayListener, { onClickAway: handleClose },
205
+ React.createElement(core_1.MenuList, { autoFocusItem: focusOnList, id: "menu-list-grow" }, filteredRows.length ?
206
+ filteredRows.map((row, i) => React.createElement(core_1.MenuItem, { key: i, value: i, onClick: () => handleSelection(row), onKeyDown: (event) => {
207
+ //esc key
208
+ if (event.keyCode == 27 && open) {
209
+ setOpen(false);
210
+ focusToId(id, { moveToElement: false });
211
+ }
212
+ //tab
213
+ if (event.keyCode == 9) {
214
+ handleSelection(row);
215
+ }
216
+ } }, row[searchKey]))
217
+ :
218
+ React.createElement(core_1.MenuItem, { key: -1, disabled: true }, "Sin resultados"))))))));
298
219
  }
299
220
  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 () {
221
+ const { value, type, id, className, name, label, onChange, matchInList, disabled, textAlign, inputAdornment, adornmentPosition } = props;
222
+ (0, react_1.useEffect)(() => {
302
223
  setMyValue(value);
303
224
  }, [value]);
304
- var _a = (0, react_1.useState)(value), myValue = _a[0], setMyValue = _a[1];
225
+ const [myValue, setMyValue] = (0, react_1.useState)(value);
305
226
  var inputProps = {
306
227
  style: { textAlign: textAlign }
307
228
  };
@@ -314,104 +235,98 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
314
235
  adornmentProps.startAdornment = adornment
315
236
  :
316
237
  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) {
238
+ 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: (event) => {
318
239
  var value = event.target.value;
319
240
  setMyValue(value == '' ? null : value);
320
- }, onBlur: function () {
321
- var value = matchInList ? matchInList.find(function (elem) { return elem == myValue; }) : myValue;
241
+ }, onBlur: () => {
242
+ var value = matchInList ? matchInList.find((elem) => elem == myValue) : myValue;
322
243
  setMyValue(value);
323
244
  onChange(myValue);
324
245
  }, InputLabelProps: inputLabelProps, InputProps: adornmentProps });
325
246
  }
326
247
  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();
248
+ const { datosDesde } = props;
249
+ const { clientes, condicionesIva, clienteActual } = (0, react_redux_1.useSelector)((estado) => ({ clientes: estado.estructura.clientes, condicionesIva: estado.estructura.condicionesIva, clienteActual: estado[datosDesde].cliente }));
250
+ const clientesArr = likeAr(clientes).array();
251
+ const dispatch = (0, react_redux_1.useDispatch)();
252
+ const condicionesIvaArr = likeAr(condicionesIva).array();
253
+ const classes = useStyles();
333
254
  return React.createElement(core_1.Paper, { className: classes.paper },
334
255
  React.createElement(core_1.Grid, { container: true, spacing: 3 },
335
256
  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) {
257
+ React.createElement(TypedField, { value: clienteActual.cliente, type: "number", id: "cliente", name: "cliente", label: "Cliente", matchInList: clientesArr.map((cliente) => cliente.cliente), disabled: !props.editando, onChange: (value) => {
337
258
  var searchResult = null;
338
259
  if (value) {
339
- searchResult = clientesArr.find(function (cliente) { return cliente.cliente == value; }) || null;
260
+ searchResult = clientesArr.find((cliente) => cliente.cliente == value) || null;
340
261
  }
341
- dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: __assign({}, searchResult), datosDesde: datosDesde }));
262
+ dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: { ...searchResult }, datosDesde }));
342
263
  } })),
343
264
  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 })); } })),
265
+ 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: (clienteSeleccionado) => dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: { ...clienteSeleccionado }, datosDesde })) })),
345
266
  React.createElement(core_1.Grid, { item: true, xs: 12, sm: 6, md: 3 },
346
267
  React.createElement(core_1.FormControl, { fullWidth: true },
347
268
  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) {
269
+ React.createElement(core_1.Select, { disabled: true, labelId: "condicion_iva_label", id: "condicion_iva", value: clienteActual.condicion_iva || '', onChange: (event) => {
349
270
  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
- })))),
271
+ dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: { ...clienteActual, condicion_iva }, datosDesde }));
272
+ } }, condicionesIvaArr.map((condicionIva) => React.createElement(core_1.MenuItem, { key: condicionIva.condicion, value: condicionIva.condicion }, condicionIva.nombre))))),
354
273
  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 })); } }))));
274
+ React.createElement(TypedField, { type: "number", disabled: true, value: clienteActual.cuit_dni, id: "cuit_dni", label: "CUIT/DNI", name: "cuit_dni", onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_CLIENTE({ cliente: { ...clienteActual, cuit_dni: Number(value) }, datosDesde })) }))));
356
275
  }
357
276
  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();
277
+ const { presupuesto, estadosPresupuesto } = (0, react_redux_1.useSelector)((estado) => ({ presupuesto: estado.datosPresupuesto.presupuesto, estadosPresupuesto: estado.estructura.estadosPresupuesto }));
278
+ const dispatch = (0, react_redux_1.useDispatch)();
279
+ const classes = useStyles();
361
280
  return React.createElement(core_1.Paper, { className: classes.paper },
362
281
  React.createElement(core_1.Grid, { container: true, spacing: 3 },
363
282
  React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
364
283
  React.createElement(core_1.FormControl, { fullWidth: true },
365
284
  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) {
285
+ React.createElement(core_1.Select, { labelId: "estado_label", id: "estado", value: presupuesto.estado || '', disabled: true, onChange: (event) => {
367
286
  var estado = event.target.value || null;
368
287
  dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "estado", valor: estado }));
369
288
  } }, estadosPresupuesto
370
- .map(function (estado) {
371
- return React.createElement(core_1.MenuItem, { key: estado.estado, value: estado.estado }, estado.nombre);
372
- })))),
289
+ .map((estado) => React.createElement(core_1.MenuItem, { key: estado.estado, value: estado.estado }, estado.nombre))))),
373
290
  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 })); }) })),
291
+ React.createElement(TypedField, { type: "date", value: presupuesto.fecha, id: "fecha", label: "fecha", name: "fecha", disabled: !props.editando, onChange: ((value) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "fecha", valor: value }))) })),
375
292
  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 })); }) }))));
293
+ React.createElement(TypedField, { type: "date", value: presupuesto.valido_hasta, id: "valido_hasta", label: "valido hasta", name: "valido_hasta", disabled: !props.editando, onChange: ((value) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "valido_hasta", valor: value }))) }))));
377
294
  }
378
295
  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();
296
+ const { pedido, estadosPedido } = (0, react_redux_1.useSelector)((estado) => ({ pedido: estado.datosPedido.pedido, estadosPedido: estado.estructura.estadosPedido }));
297
+ const dispatch = (0, react_redux_1.useDispatch)();
298
+ const classes = useStyles();
382
299
  return React.createElement(core_1.Paper, { className: classes.paper },
383
300
  React.createElement(core_1.Grid, { container: true, spacing: 3 },
384
301
  React.createElement(core_1.Grid, { item: true, xs: 12, sm: 4 },
385
302
  React.createElement(core_1.FormControl, { fullWidth: true },
386
303
  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) {
304
+ React.createElement(core_1.Select, { labelId: "estado_label", id: "estado", value: pedido.estado || '', disabled: !props.editando, onChange: (event) => {
388
305
  var estado = event.target.value || null;
389
306
  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
- })))),
307
+ } }, estadosPedido.map((estado) => React.createElement(core_1.MenuItem, { key: estado.estado, value: estado.estado }, estado.nombre))))),
393
308
  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 })); }) })),
309
+ React.createElement(TypedField, { type: "date", value: pedido.fecha, id: "fecha", label: "fecha", name: "fecha", disabled: !props.editando, onChange: ((value) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "fecha", valor: value }))) })),
395
310
  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 })); }) }))));
311
+ React.createElement(TypedField, { type: "date", value: pedido.fecha_entrega, id: "fecha_entrega", label: "fecha entrega", name: "fecha_entrega", disabled: !props.editando, onChange: ((value) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "fecha_entrega", valor: value }))) }))));
397
312
  }
398
313
  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();
314
+ const { pedido } = (0, react_redux_1.useSelector)((estado) => ({ pedido: estado.datosPedido.pedido }));
315
+ const dispatch = (0, react_redux_1.useDispatch)();
316
+ const classes = useStyles();
402
317
  return React.createElement(core_1.Paper, { className: classes.paper },
403
318
  React.createElement(core_1.Grid, { container: true, spacing: 3 },
404
319
  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 })); } }))));
320
+ React.createElement(TypedField, { type: "text", disabled: !props.editando, value: pedido.observaciones, id: "observaciones", label: "Observaciones", name: "observaciones", onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "observaciones", valor: value })) }))));
406
321
  }
407
322
  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);
323
+ const { conDescuentoEnItems, conOpciones, datosDesde, presupuestoOPedido } = props;
324
+ const { items, cliente } = (0, react_redux_1.useSelector)((estado) => estado[datosDesde]);
325
+ const classes = useStyles();
326
+ const dispatch = (0, react_redux_1.useDispatch)();
327
+ const handleAdd = () => {
328
+ dispatch(redux_formulario_1.dispatchers.ADD_ITEM({ datosDesde }));
329
+ setTimeout(() => (0, render_general_1.focusToId)("cantidad_" + (items.length - 1).toString(), { moveToElement: false }), 100);
415
330
  };
416
331
  return React.createElement(core_1.TableContainer, { component: core_1.Paper },
417
332
  React.createElement(core_1.Table, { "aria-label": "customized table", id: "items-table" },
@@ -427,10 +342,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
427
342
  conDescuentoEnItems ? React.createElement(StyledTableCell, { style: { width: "50px" }, align: "right" }, "Bonif") : null,
428
343
  React.createElement(StyledTableCell, { style: { width: "80px" }, align: "right" }, "Total"))),
429
344
  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 })); }),
345
+ items.map((item, index) => (React.createElement(ItemP, { key: index, index: index, item: item, editando: props.editando, cliente: cliente, conDescuentoEnItems: conDescuentoEnItems, datosDesde: datosDesde }))),
431
346
  React.createElement(core_1.TableRow, null,
432
347
  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) {
348
+ React.createElement(core_1.Button, { size: "small", variant: "outlined", color: "primary", onClick: handleAdd, disabled: !props.editando, onKeyDown: (event) => {
434
349
  //enter
435
350
  if ([13].includes(event.keyCode)) {
436
351
  handleAdd();
@@ -452,12 +367,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
452
367
  conDescuentoEnItems ? React.createElement(StyledTableCell, { colSpan: 2 }) : null,
453
368
  React.createElement(StyledTableCell, { align: "right", colSpan: 4 }, "descuento general $"),
454
369
  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
- } }))),
370
+ React.createElement(TypedField, { textAlign: "right", type: "number", disabled: !props.editando, value: presupuestoOPedido.descuento, id: "descuento", name: "descuento", onChange: (value) => datosDesde == 'datosPresupuesto' ?
371
+ dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_PRESUPUESTO({ descuento: Number(value) }))
372
+ :
373
+ dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_PEDIDO({ descuento: Number(value) })) }))),
461
374
  React.createElement(core_1.TableRow, null,
462
375
  React.createElement(StyledTableCell, { className: "not-print" }),
463
376
  React.createElement(StyledTableCell, { className: "not-print" }),
@@ -467,127 +380,116 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
467
380
  }
468
381
  function ItemP(props) {
469
382
  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;
383
+ const { productos } = (0, react_redux_1.useSelector)((estado) => estado.estructura);
384
+ const productosArr = likeAr(productos).array();
385
+ const dispatch = (0, react_redux_1.useDispatch)();
386
+ const { item, index, conDescuentoEnItems, cliente, datosDesde } = props;
387
+ const classes = useStyles();
388
+ const EDICION_LIBRE = item.producto == 0;
476
389
  return React.createElement(core_1.Grow, { in: true },
477
390
  React.createElement(StyledTableRow, { key: item.producto },
478
391
  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 }));
392
+ React.createElement(core_1.Button, { id: "agregar_" + index.toString(), size: "small", variant: "outlined", disabled: !props.editando, color: "secondary", onClick: () => {
393
+ dispatch(redux_formulario_1.dispatchers.REMOVE_ITEM({ index: index, datosDesde }));
481
394
  }, className: classes.button },
482
395
  React.createElement(render_general_1.ICON.DeleteOutline, null))),
483
396
  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 })); } })),
397
+ React.createElement(TypedField, { id: "cantidad_" + index.toString(), type: "number", value: item.cantidad || null, name: "cantidad", disabled: !props.editando, onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_CANTIDAD_ITEM({ index, cantidad: Number(value), datosDesde })) })),
485
398
  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) {
399
+ React.createElement(TypedField, { value: item.producto || null, id: "poroducto_" + index.toString(), name: "producto", type: "number", disabled: !props.editando, matchInList: EDICION_LIBRE ? undefined : productosArr.map((producto) => producto.producto), onChange: (value) => {
487
400
  if (value == '0') {
488
- dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index: index, campo: 'producto', valor: value, datosDesde: datosDesde }));
401
+ dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index, campo: 'producto', valor: value, datosDesde }));
489
402
  }
490
403
  else {
491
404
  var searchResult = null;
492
405
  if (value) {
493
- searchResult = productosArr.find(function (producto) { return producto.producto == value; }) || null;
406
+ searchResult = productosArr.find((producto) => producto.producto == value) || null;
494
407
  }
495
- dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index: index, producto: searchResult, datosDesde: datosDesde }));
408
+ dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index, producto: searchResult, datosDesde }));
496
409
  }
497
410
  } })),
498
411
  React.createElement(StyledTableCell, { className: "not-print" },
499
412
  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
- })))),
413
+ React.createElement(EDICION_LIBRE ? TypedField : Autocompleter, {
414
+ ...{
415
+ value: (item === null || item === void 0 ? void 0 : item.nombre) || '',
416
+ id: "nombre-producto_" + index.toString(),
417
+ name: "nombre-producto",
418
+ disabled: !props.editando,
419
+ multiline: true,
420
+ matchInListConditionCallback: (producto) => cliente.cliente == producto.cliente || producto.cliente == null
421
+ }, ...(EDICION_LIBRE ? {
422
+ onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index, campo: 'nombre', valor: value, datosDesde }))
423
+ } : {
424
+ rows: productosArr,
425
+ searchKey: "nombre",
426
+ searchType: "text",
427
+ onSelection: (productoSeleccionado) => dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index, producto: productoSeleccionado, datosDesde }))
428
+ })
429
+ })),
521
430
  React.createElement(StyledTableCell, null,
522
431
  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
- })))),
432
+ React.createElement(EDICION_LIBRE ? TypedField : Autocompleter, {
433
+ ...{
434
+ value: (item === null || item === void 0 ? void 0 : item.descripcion) || '',
435
+ id: "descripcion-producto_" + index.toString(),
436
+ name: "descripcion-producto",
437
+ disabled: !props.editando,
438
+ multiline: true,
439
+ }, ...(EDICION_LIBRE ? {
440
+ onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index, campo: 'descripcion', valor: value, datosDesde }))
441
+ } : {
442
+ rows: productosArr,
443
+ searchKey: "descripcion",
444
+ searchType: "text",
445
+ onSelection: (productoSeleccionado) => dispatch(redux_formulario_1.dispatchers.SET_PRODUCTO_ITEM({ index, producto: productoSeleccionado, datosDesde }))
446
+ })
447
+ })),
541
448
  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 })); } })
449
+ React.createElement(TypedField, { textAlign: "right", id: "precio_unitario" + index.toString(), type: "number", value: item.precio_unitario || null, name: "precio_unitario", disabled: !props.editando, onChange: (value) => dispatch(redux_formulario_1.dispatchers.SET_FIELD_CUSTOM_ITEM({ index, campo: 'precio_unitario', valor: value, datosDesde })) })
543
450
  :
544
451
  (_a = item.precio_unitario) === null || _a === void 0 ? void 0 : _a.toString()),
545
452
  conDescuentoEnItems ?
546
453
  React.createElement(React.Fragment, null,
547
454
  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 }));
455
+ React.createElement(TypedField, { textAlign: "right", value: item.porcentaje_descuento || 0, id: "porcentaje_descuento_" + index.toString(), name: "porcentaje_descuento", type: "number", disabled: !props.editando, onChange: (value) => {
456
+ dispatch(redux_formulario_1.dispatchers.SET_DESCUENTO_ITEM({ index, porcentaje: Number(value), datosDesde }));
550
457
  }, inputAdornment: "%" })),
551
458
  React.createElement(StyledTableCell, { align: "right" }, item.descuento))
552
459
  : null,
553
460
  React.createElement(StyledTableCell, { align: "right", style: render_general_1.totalsStyles }, (_b = item.total) === null || _b === void 0 ? void 0 : _b.toString())));
554
461
  }
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,
462
+ const StyledTableCell = (0, core_1.withStyles)((theme) => (0, core_1.createStyles)({
463
+ head: {
464
+ backgroundColor: theme.palette.common.black,
465
+ color: theme.palette.common.white,
466
+ },
467
+ body: {
468
+ fontSize: 14,
469
+ padding: 8
470
+ },
471
+ }))(core_1.TableCell);
472
+ const StyledTableRow = (0, core_1.withStyles)((theme) => (0, core_1.createStyles)({
473
+ root: {
474
+ '&:nth-of-type(odd)': {
475
+ backgroundColor: theme.palette.action.hover,
560
476
  },
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);
477
+ },
478
+ }))(core_1.TableRow);
576
479
  function PresupuestoComponent(_props) {
577
- var _this = this;
578
480
  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) {
481
+ const { cliente, presupuesto, items } = (0, react_redux_1.useSelector)((estado) => (estado.datosPresupuesto));
482
+ const { estadosPresupuesto } = (0, react_redux_1.useSelector)((estado) => ({ estadosPresupuesto: estado.estructura.estadosPresupuesto }));
483
+ const { parametros } = (0, react_redux_1.useSelector)((estado) => (estado.estructura));
484
+ const classes = useStyles();
485
+ const dispatch = (0, react_redux_1.useDispatch)();
486
+ const [open, setOpen] = (0, react_1.useState)(false);
487
+ const esNuevo = !(presupuesto.presupuesto);
488
+ const disabled = !((_a = estadosPresupuesto.find((estado) => estado.estado == presupuesto.estado)) === null || _a === void 0 ? void 0 : _a.permite_editar);
489
+ const [editando, setEditando] = (0, react_1.useState)(esNuevo);
490
+ const [snackBarMessage, setSnackBarMessage] = (0, react_1.useState)('');
491
+ const hayDescuentosIngresados = items.some((item) => item.descuento != 0);
492
+ const handleClose = (_event, reason) => {
591
493
  if (reason === 'clickaway') {
592
494
  return;
593
495
  }
@@ -596,15 +498,15 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
596
498
  return React.createElement("main", { className: classes.layout, id: "presupuesto" },
597
499
  React.createElement("img", { id: "banner-superior-impresion", className: "only-for-print", src: "img/bannersuperior.png", alt: "bannersuperior.png" }),
598
500
  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")),
501
+ React.createElement("h2", null, presupuesto.presupuesto ? `Presupuesto Nº ${presupuesto.presupuesto}` : `Nuevo presupuesto`)),
600
502
  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 () {
503
+ React.createElement(core_1.Button, { variant: "contained", color: editando ? "secondary" : "primary", onClick: () => {
602
504
  setEditando(!editando);
603
505
  }, disabled: disabled, className: classes.button }, editando ?
604
506
  React.createElement(render_general_1.ICON.Cancel, null)
605
507
  :
606
508
  React.createElement(render_general_1.ICON.Edit, null)),
607
- React.createElement(core_1.Button, { variant: "contained", disabled: editando, onClick: function () {
509
+ React.createElement(core_1.Button, { variant: "contained", disabled: editando, onClick: () => {
608
510
  window.print();
609
511
  }, className: classes.button },
610
512
  React.createElement(render_general_1.ICON.Print, null))),
@@ -612,37 +514,23 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
612
514
  React.createElement(EstadoPresupuesto, { editando: editando }),
613
515
  React.createElement(Items, { editando: editando, conDescuentoEnItems: presupuesto.con_descuento_en_items, conOpciones: presupuesto.con_opciones, datosDesde: 'datosPresupuesto', presupuestoOPedido: presupuesto }),
614
516
  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" })),
517
+ React.createElement(core_1.FormControlLabel, { control: React.createElement(core_1.Checkbox, { checked: presupuesto.con_opciones, onChange: ((event) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "con_opciones", valor: event.target.checked }))), disabled: !editando, name: "con_opciones", color: "primary" }), labelPlacement: "start", label: "ocultar totales" })),
618
518
  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" })),
519
+ React.createElement(core_1.FormControlLabel, { control: React.createElement(core_1.Checkbox, { checked: presupuesto.con_descuento_en_items, onChange: ((event) => dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "con_descuento_en_items", valor: event.target.checked }))), disabled: !editando || hayDescuentosIngresados, name: "con_descuento_en_items", color: "primary" }), labelPlacement: "start", label: "descuento en items" })),
622
520
  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 },
521
+ React.createElement(core_1.Button, { variant: "contained", color: "primary", disabled: !editando, onClick: async () => {
522
+ try {
523
+ let result = await (0, redux_formulario_1.guardarPresupuesto)(cliente, presupuesto, items);
524
+ dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PRESUPUESTO({ campo: "presupuesto", valor: result.presupuesto }));
525
+ setSnackBarMessage(`Presupuesto ${result.presupuesto} guardado`);
526
+ setOpen(true);
527
+ setEditando(false);
528
+ }
529
+ catch (err) {
530
+ setSnackBarMessage(`Error al guardar el presupuesto. ${err.message}`);
531
+ setOpen(true);
532
+ }
533
+ }, className: classes.button },
646
534
  React.createElement(render_general_1.ICON.Save, null)),
647
535
  React.createElement(core_1.Snackbar, { anchorOrigin: {
648
536
  vertical: 'bottom',
@@ -657,15 +545,14 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
657
545
  null);
658
546
  }
659
547
  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) {
548
+ const { cliente, pedido, items } = (0, react_redux_1.useSelector)((estado) => (estado.datosPedido));
549
+ const classes = useStyles();
550
+ const dispatch = (0, react_redux_1.useDispatch)();
551
+ const [open, setOpen] = (0, react_1.useState)(false);
552
+ const esNuevo = !(pedido.pedido);
553
+ const [editando, setEditando] = (0, react_1.useState)(esNuevo);
554
+ const [snackBarMessage, setSnackBarMessage] = (0, react_1.useState)('');
555
+ const handleClose = (_event, reason) => {
669
556
  if (reason === 'clickaway') {
670
557
  return;
671
558
  }
@@ -674,15 +561,15 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
674
561
  return React.createElement("main", { className: classes.layout, id: "pedido" },
675
562
  React.createElement("img", { id: "banner-superior-impresion", className: "only-for-print", src: "img/bannersuperior.png", alt: "bannersuperior.png" }),
676
563
  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")),
564
+ React.createElement("h2", null, pedido.pedido ? `Pedido Nº ${pedido.pedido}` : `Nuevo pedido`)),
678
565
  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 () {
566
+ React.createElement(core_1.Button, { variant: "contained", color: editando ? "secondary" : "primary", onClick: () => {
680
567
  setEditando(!editando);
681
568
  }, className: classes.button }, editando ?
682
569
  React.createElement(render_general_1.ICON.Cancel, null)
683
570
  :
684
571
  React.createElement(render_general_1.ICON.Edit, null)),
685
- React.createElement(core_1.Button, { variant: "contained", disabled: editando, onClick: function () {
572
+ React.createElement(core_1.Button, { variant: "contained", disabled: editando, onClick: () => {
686
573
  window.print();
687
574
  }, className: classes.button },
688
575
  React.createElement(render_general_1.ICON.Print, null))),
@@ -691,29 +578,19 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
691
578
  React.createElement(Items, { editando: editando, conDescuentoEnItems: true, conOpciones: false, datosDesde: 'datosPedido', presupuestoOPedido: pedido }),
692
579
  React.createElement(ObservacionesPedido, { editando: editando }),
693
580
  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 },
581
+ React.createElement(core_1.Button, { variant: "contained", color: "primary", disabled: !editando, onClick: async () => {
582
+ try {
583
+ let result = await (0, redux_formulario_1.guardarPedido)(cliente, pedido, items);
584
+ dispatch(redux_formulario_1.dispatchers.SET_CAMPO_PEDIDO({ campo: "pedido", valor: result.pedido }));
585
+ setSnackBarMessage(`Pedido ${result.pedido} guardado`);
586
+ setOpen(true);
587
+ setEditando(false);
588
+ }
589
+ catch (err) {
590
+ setSnackBarMessage(`Error al guardar el pedido. ${err.message}`);
591
+ setOpen(true);
592
+ }
593
+ }, className: classes.button },
717
594
  React.createElement(render_general_1.ICON.Save, null)),
718
595
  React.createElement(core_1.Snackbar, { anchorOrigin: {
719
596
  vertical: 'bottom',
@@ -722,23 +599,13 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
722
599
  React.createElement(core_1.IconButton, { size: "small", "aria-label": "close", color: "inherit", onClick: handleClose },
723
600
  React.createElement(render_general_1.ICON.Close, null))) })));
724
601
  }
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
- });
602
+ async function desplegarPresupuesto(store) {
603
+ ReactDOM.render(React.createElement(react_redux_1.Provider, { store: store },
604
+ React.createElement(PresupuestoComponent, null)), document.getElementById('main_layout'));
733
605
  }
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
- });
606
+ async function desplegarPedido(store) {
607
+ ReactDOM.render(React.createElement(react_redux_1.Provider, { store: store },
608
+ React.createElement(PedidoComponent, null)), document.getElementById('main_layout'));
742
609
  }
743
610
  if (typeof window !== 'undefined') {
744
611
  // @ts-ignore para hacerlo
@@ -747,4 +614,4 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
747
614
  window.desplegarPedido = desplegarPedido;
748
615
  }
749
616
  });
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
617
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWNvbXBvbmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L3JlbmRlci1jb21wb25lbnRzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7SUEwSEEsc0NBMEtDO0lBQ0QsZ0NBNkRDO0lBRUQsNENBMEVDO0lBRUQsOENBdURDO0lBRUQsb0NBcURDO0lBQ0Qsa0RBcUJDO0lBRUQsc0JBMkdDO0lBRUQsc0JBb0pDO0lBeUJELG9EQStJQztJQUVELDBDQWdHQztJQUVELG9EQVFDO0lBRUQsMENBUUM7SUFybENELCtCQUErQjtJQUMvQixzQ0FBc0M7SUFDdEMscURBUTBCO0lBQzFCLHlEQUMwSDtJQUMxSCw0Q0FXMkI7SUFDM0IsaUNBQW9EO0lBQ3BELDZDQUFpRTtJQUNqRSxrQ0FBa0M7SUFNckIsUUFBQSwyQkFBMkIsR0FBd0IsVUFBVSxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFDLEtBQUssQ0FBQztJQUVOLElBQUksNkJBQTZCLEdBQUcsQ0FBQyxnQkFBaUMsRUFBQyxFQUFFO1FBQzVFLElBQUksRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBQyxHQUFJLGdCQUFnQixDQUFDO1FBQ3RELElBQUksV0FBVyxHQUFlO1lBQzFCLE9BQU87WUFDUCxLQUFLO1lBQ0wsTUFBTSxFQUFDO2dCQUNILFdBQVcsRUFBRSxXQUFXLENBQUMsV0FBVztnQkFDcEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO2dCQUM1QixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7Z0JBQ2hDLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUTtnQkFDOUIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLO2dCQUN4QixHQUFHLElBQUEsb0NBQWlCLEdBQUU7YUFDekI7U0FDSixDQUFBO1FBQ0QsT0FBTyxXQUFXLENBQUE7SUFDdEIsQ0FBQyxDQUFBO0lBZlUsUUFBQSw2QkFBNkIsaUNBZXZDO0lBS0QsRUFBRSxD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LE1BQU0sQ0FDWCxvQkFBQyxzQkFBUSxJQUFDLEtBQUssRUFBRSxLQUFLO1lBQ2xCLG9CQUFDLG9CQUFvQixPQUFFLENBQ2hCLEVBRVgsUUFBUSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FDekMsQ0FBQTtJQUNMLENBQUM7SUFFTSxLQUFLLFVBQVUsZUFBZSxDQUFDLEtBQXdDO1FBQzFFLFFBQVEsQ0FBQyxNQUFNLENBQ1gsb0JBQUMsc0JBQVEsSUFBQyxLQUFLLEVBQUUsS0FBSztZQUNsQixvQkFBQyxlQUFlLE9BQUUsQ0FDWCxFQUVYLFFBQVEsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQ3pDLENBQUE7SUFDTCxDQUFDO0lBRUQsSUFBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUMsQ0FBQztRQUM5QiwwQkFBMEI7UUFDMUIsTUFBTSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO1FBQ25ELDBCQUEwQjtRQUMxQixNQUFNLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcclxuaW1wb3J0IHsgIFxyXG4gICAgRm9jdXNPcHRzLCBSZW5kZXJQcmluY2lwYWwsIFxyXG4gICAgY2xzeCxcclxuICAgIElDT04sXHJcbiAgICBmb2N1c1RvSWQsXHJcbiAgICBzY3JvbGxUb1RvcCxcclxuICAgIHNjcm9sbFRvQm90dG9tLFxyXG4gICAgSW5wdXRUeXBlcywgdG90YWxzU3R5bGVzLCBBbHRvSW1wcmVzaW9uU3R5bGVcclxufSBmcm9tIFwiLi9yZW5kZXItZ2VuZXJhbFwiO1xyXG5pbXBvcnQgeyBkaXNwYXRjaGVycywgY3JlYXJTdG9yZSwgQWN0aW9uRm9ybXVsYXJpb1N0YXRlLCBndWFyZGFyUHJlc3VwdWVzdG8sIFxyXG4gICAgY3JlYXRlSW5pdGlhbFN0YXRlUHJlc3VwdWVzdG8sIGd1YXJkYXJQZWRpZG8sIGNyZWF0ZUluaXRpYWxTdGF0ZVBlZGlkbywgaW5pY2lhbGl6YXJQZWRpZG8gfSBmcm9tIFwiLi9yZWR1eC1mb3JtdWxhcmlvXCI7XHJcbmltcG9ydCB7XHJcbiAgICBBcHBCYXIsIEJhZGdlLCBCdXR0b24sIEJ1dHRvbkdyb3VwLCBDYXJkLCBDaGVja2JveCwgQ2hpcCwgQ2lyY3VsYXJQcm9ncmVzcywgQ3NzQmFzZWxpbmUsIFxyXG4gICAgRGlhbG9nLCBEaWFsb2dBY3Rpb25zLCBEaWFsb2dDb250ZW50LCBEaWFsb2dDb250ZW50VGV4dCwgXHJcbiAgICBEaWFsb2dUaXRsZSwgRGl2aWRlciwgRmFiLCBGb3JtQ29udHJvbExhYmVsLCBHcmlkLCBJY29uQnV0dG9uLCBJbnB1dEJhc2UsIElucHV0TGFiZWwsIFxyXG4gICAgTGluaywgTGlzdCwgTGlzdEl0ZW0sIExpc3RJdGVtSWNvbiwgTGlzdEl0ZW1UZXh0LCBEcmF3ZXIsIFxyXG4gICAgTWVudSwgTWVudUl0ZW0sIFBhcGVyLCBQb3BvdmVyLFxyXG4gICAgU2VsZWN0LCBTbmFja2JhciwgU3RlcCwgU3RlcHBlciwgU3RlcENvbnRlbnQsIFN0ZXBMYWJlbCwgXHJcbiAgICBTdmdJY29uLCBTd2l0Y2gsIFxyXG4gICAgVGFibGUsIFRhYmxlQm9keSwgVGFibGVDZWxsLCBUYWJsZUhlYWQsIFRhYmxlUm93LCBUZXh0RmllbGQsIFRoZW1lLCBUb29sYmFyLCBUeXBvZ3JhcGh5LCBab29tLFxyXG4gICAgdXNlU2Nyb2xsVHJpZ2dlcixcclxuICAgIGNyZWF0ZVN0eWxlcywgbWFrZVN0eWxlcywgSWNvbiwgUG9wcGVyLCBHcm93LCBDbGlja0F3YXlMaXN0ZW5lciwgTWVudUxpc3QsIEZvcm1Db250cm9sLCBUYWJsZUNvbnRhaW5lciwgd2l0aFN0eWxlcywgSW5wdXRBZG9ybm1lbnQsIElucHV0UHJvcHNcclxufSBmcm9tIFwiQG1hdGVyaWFsLXVpL2NvcmVcIjtcclxuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCB7IHVzZVNlbGVjdG9yLCB1c2VEaXNwYXRjaCwgUHJvdmlkZXIgfSBmcm9tIFwicmVhY3QtcmVkdXhcIjsgXHJcbmltcG9ydCAqIGFzIGxpa2VBciBmcm9tIFwibGlrZS1hclwiO1xyXG5pbXBvcnQge3NhdmVEZXBvdH0gZnJvbSBcIi4vcmVuZGVyLWhhbmRsZXJzXCI7XHJcbmltcG9ydCB7IENsaWVudGUsIFByb2R1Y3RvLCBJdGVtLCBTdGF0ZSwgRGF0b3NQcmVzdXB1ZXN0bywgSWRDb25kSXZhLCBEYXRvc1BlZGlkbywgRGF0b3NEZXNkZSwgUHJlc3VwdWVzdG8sIFBlZGlkbywgSWRFc3RhZG9QcmVzdXB1ZXN0byB9IGZyb20gXCIuL3RpcG9zXCI7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSBcInJlZHV4XCI7XHJcbmltcG9ydCB7IEFjdGlvbnNGcm9tIH0gZnJvbSBcInJlZHV4LXR5cGVkLXJlZHVjZXJcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBFU1RBRE9fQUNFUFRBRE9fUFJFU1VQVUVTVE86IElkRXN0YWRvUHJlc3VwdWVzdG8gPSBcImFjZXB0YWRvXCI7XHJcbnZhciBteT1teU93bjtcclxuXHJcbmV4cG9ydCB2YXIgZ2VuZXJhclBlZGlkb0Rlc2RlUHJlc3VwdWVzdG8gPSAoZGF0b3NQcmVzdXB1ZXN0bzpEYXRvc1ByZXN1cHVlc3RvKT0+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