contable 0.0.6 → 0.0.7

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 (118) hide show
  1. package/dist/client/client/client.js +240 -0
  2. package/dist/client/{menu.js → client/menu.js} +1 -1
  3. package/dist/client/client/redux-formulario.js +379 -0
  4. package/dist/client/client/render-components.js +750 -0
  5. package/dist/client/client/render-formulario.js +56 -0
  6. package/dist/client/client/render-general.js +197 -0
  7. package/dist/client/client/render-handlers.js +69 -0
  8. package/dist/client/client/tipos.js +13 -0
  9. package/dist/client/{tsconfig.json → client/tsconfig.json} +3 -4
  10. package/dist/{unlogged → client/unlogged}/tsconfig.json +1 -3
  11. package/dist/server/client/tipos.d.ts +119 -0
  12. package/dist/server/client/tipos.js +13 -0
  13. package/dist/server/{app-contable.d.ts → server/app-contable.d.ts} +63 -3
  14. package/dist/server/server/app-contable.js +192 -0
  15. package/dist/server/server/def-config.d.ts +1 -0
  16. package/dist/server/server/def-config.js +101 -0
  17. package/dist/server/server/procedures-contable.js +508 -0
  18. package/dist/server/{server-contable.js → server/server-contable.js} +1 -1
  19. package/dist/server/server/table-categorias_producto.js +29 -0
  20. package/dist/server/server/table-clientes.js +56 -0
  21. package/dist/server/server/table-condicion_iva.js +29 -0
  22. package/dist/server/server/table-estados_pedido.js +33 -0
  23. package/dist/server/server/table-estados_presupuesto.js +34 -0
  24. package/dist/server/server/table-insumos.js +44 -0
  25. package/dist/server/server/table-items_pedido.js +48 -0
  26. package/dist/server/server/table-items_presupuesto.js +48 -0
  27. package/dist/server/server/table-iva_productos.js +29 -0
  28. package/dist/server/server/table-parametros.js +38 -0
  29. package/dist/server/server/table-pedidos.js +48 -0
  30. package/dist/server/server/table-pedidos_pendientes.js +28 -0
  31. package/dist/server/server/table-pedidos_vencidos.js +28 -0
  32. package/dist/server/server/table-presupuestos.js +56 -0
  33. package/dist/server/server/table-productos.js +70 -0
  34. package/dist/server/server/table-productos_clientes.js +22 -0
  35. package/dist/server/server/table-productos_generales.js +22 -0
  36. package/dist/server/server/table-productos_insumos.js +47 -0
  37. package/dist/server/server/table-usuarios.js +44 -0
  38. package/dist/server/{types-contable.d.ts → server/types-contable.d.ts} +14 -3
  39. package/dist/server/server/types-contable.js +28 -0
  40. package/dist/unlogged/unlogged/adapt.js +8 -0
  41. package/dist/unlogged/unlogged/css/styles.styl +88 -0
  42. package/dist/unlogged/unlogged/img/login-logo-icon.png +0 -0
  43. package/dist/unlogged/unlogged/img/logo.png +0 -0
  44. package/dist/unlogged/unlogged/tsconfig.json +13 -0
  45. package/dist/unlogged/unlogged/unlogged.js +13 -0
  46. package/package.json +22 -5
  47. package/dist/client/client.js +0 -182
  48. package/dist/client/redux-formulario.js +0 -326
  49. package/dist/client/render-components.js +0 -617
  50. package/dist/client/render-formulario.js +0 -56
  51. package/dist/client/render-general.js +0 -172
  52. package/dist/client/render-handlers.js +0 -29
  53. package/dist/client/tipos.js +0 -13
  54. package/dist/server/app-contable.js +0 -192
  55. package/dist/server/def-config.d.ts +0 -1
  56. package/dist/server/def-config.js +0 -100
  57. package/dist/server/procedures-contable.js +0 -508
  58. package/dist/server/table-categorias_producto.js +0 -29
  59. package/dist/server/table-clientes.js +0 -56
  60. package/dist/server/table-condicion_iva.js +0 -29
  61. package/dist/server/table-estados_pedido.js +0 -33
  62. package/dist/server/table-estados_presupuesto.js +0 -34
  63. package/dist/server/table-insumos.js +0 -44
  64. package/dist/server/table-items_pedido.js +0 -48
  65. package/dist/server/table-items_presupuesto.js +0 -48
  66. package/dist/server/table-iva_productos.js +0 -29
  67. package/dist/server/table-parametros.js +0 -38
  68. package/dist/server/table-pedidos.js +0 -48
  69. package/dist/server/table-pedidos_pendientes.js +0 -28
  70. package/dist/server/table-pedidos_vencidos.js +0 -28
  71. package/dist/server/table-presupuestos.js +0 -56
  72. package/dist/server/table-productos.js +0 -70
  73. package/dist/server/table-productos_clientes.js +0 -22
  74. package/dist/server/table-productos_generales.js +0 -22
  75. package/dist/server/table-productos_insumos.js +0 -47
  76. package/dist/server/table-usuarios.js +0 -44
  77. package/dist/server/tsconfig.json +0 -10
  78. package/dist/server/types-contable.js +0 -28
  79. package/dist/unlogged/adapt.js +0 -8
  80. package/dist/unlogged/unlogged.js +0 -118
  81. /package/dist/client/{client.d.ts → client/client.d.ts} +0 -0
  82. /package/dist/client/{img → client/img}/bannersuperior.png +0 -0
  83. /package/dist/client/{menu.d.ts → client/menu.d.ts} +0 -0
  84. /package/dist/client/{redux-formulario.d.ts → client/redux-formulario.d.ts} +0 -0
  85. /package/dist/client/{render-components.d.ts → client/render-components.d.ts} +0 -0
  86. /package/dist/client/{render-components.tsx → client/render-components.tsx} +0 -0
  87. /package/dist/client/{render-formulario.d.ts → client/render-formulario.d.ts} +0 -0
  88. /package/dist/client/{render-formulario.tsx → client/render-formulario.tsx} +0 -0
  89. /package/dist/client/{render-general.d.ts → client/render-general.d.ts} +0 -0
  90. /package/dist/client/{render-general.tsx → client/render-general.tsx} +0 -0
  91. /package/dist/client/{render-handlers.d.ts → client/render-handlers.d.ts} +0 -0
  92. /package/dist/client/{tipos.d.ts → client/tipos.d.ts} +0 -0
  93. /package/dist/{unlogged → client/unlogged}/css/styles.styl +0 -0
  94. /package/dist/{unlogged/img/login-logo-icon.png.png → client/unlogged/img/login-logo-icon.png} +0 -0
  95. /package/dist/{unlogged → client/unlogged}/img/logo.png +0 -0
  96. /package/dist/server/{procedures-contable.d.ts → server/procedures-contable.d.ts} +0 -0
  97. /package/dist/server/{server-contable.d.ts → server/server-contable.d.ts} +0 -0
  98. /package/dist/server/{table-categorias_producto.d.ts → server/table-categorias_producto.d.ts} +0 -0
  99. /package/dist/server/{table-clientes.d.ts → server/table-clientes.d.ts} +0 -0
  100. /package/dist/server/{table-condicion_iva.d.ts → server/table-condicion_iva.d.ts} +0 -0
  101. /package/dist/server/{table-estados_pedido.d.ts → server/table-estados_pedido.d.ts} +0 -0
  102. /package/dist/server/{table-estados_presupuesto.d.ts → server/table-estados_presupuesto.d.ts} +0 -0
  103. /package/dist/server/{table-insumos.d.ts → server/table-insumos.d.ts} +0 -0
  104. /package/dist/server/{table-items_pedido.d.ts → server/table-items_pedido.d.ts} +0 -0
  105. /package/dist/server/{table-items_presupuesto.d.ts → server/table-items_presupuesto.d.ts} +0 -0
  106. /package/dist/server/{table-iva_productos.d.ts → server/table-iva_productos.d.ts} +0 -0
  107. /package/dist/server/{table-parametros.d.ts → server/table-parametros.d.ts} +0 -0
  108. /package/dist/server/{table-pedidos.d.ts → server/table-pedidos.d.ts} +0 -0
  109. /package/dist/server/{table-pedidos_pendientes.d.ts → server/table-pedidos_pendientes.d.ts} +0 -0
  110. /package/dist/server/{table-pedidos_vencidos.d.ts → server/table-pedidos_vencidos.d.ts} +0 -0
  111. /package/dist/server/{table-presupuestos.d.ts → server/table-presupuestos.d.ts} +0 -0
  112. /package/dist/server/{table-productos.d.ts → server/table-productos.d.ts} +0 -0
  113. /package/dist/server/{table-productos_clientes.d.ts → server/table-productos_clientes.d.ts} +0 -0
  114. /package/dist/server/{table-productos_generales.d.ts → server/table-productos_generales.d.ts} +0 -0
  115. /package/dist/server/{table-productos_insumos.d.ts → server/table-productos_insumos.d.ts} +0 -0
  116. /package/dist/server/{table-usuarios.d.ts → server/table-usuarios.d.ts} +0 -0
  117. /package/dist/unlogged/{adapt.d.ts → unlogged/adapt.d.ts} +0 -0
  118. /package/dist/unlogged/{unlogged.d.ts → unlogged/unlogged.d.ts} +0 -0
@@ -0,0 +1,508 @@
1
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
2
+ if (k2 === undefined) k2 = k;
3
+ var desc = Object.getOwnPropertyDescriptor(m, k);
4
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
5
+ desc = { enumerable: true, get: function() { return m[k]; } };
6
+ }
7
+ Object.defineProperty(o, k2, desc);
8
+ }) : (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ o[k2] = m[k];
11
+ }));
12
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
13
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
14
+ };
15
+ (function (factory) {
16
+ if (typeof module === "object" && typeof module.exports === "object") {
17
+ var v = factory(require, exports);
18
+ if (v !== undefined) module.exports = v;
19
+ }
20
+ else if (typeof define === "function" && define.amd) {
21
+ define(["require", "exports", "./types-contable", "best-globals"], factory);
22
+ }
23
+ })(function (require, exports) {
24
+ "use strict";
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ProceduresContable = void 0;
27
+ __exportStar(require("./types-contable"), exports);
28
+ const best_globals_1 = require("best-globals");
29
+ var path = require('path');
30
+ var sqlTools = require('sql-tools');
31
+ const ESTADO_ACEPTADO_PRESUPUESTO = 'aceptado';
32
+ const ESTADO_ANULADO_PRESUPUESTO = 'anulado';
33
+ const ESTADO_RECHAZADO_PRESUPUESTO = 'rechazado';
34
+ function json(sql, orderby) {
35
+ return `COALESCE((SELECT jsonb_agg(to_jsonb(j.*) ORDER BY ${orderby}) from (${sql}) as j),'[]'::jsonb)`;
36
+ }
37
+ function jsono(sql, indexedby) {
38
+ return `COALESCE((SELECT jsonb_object_agg(${indexedby},to_jsonb(j.*)) from (${sql}) as j),'{}'::jsonb)`;
39
+ }
40
+ var createStructure = function createStructure(context, tableName) {
41
+ var be = context.be;
42
+ var mainTableDef = be.tableStructures[tableName](context);
43
+ var getPkFromTableDef = function getPkFromTableDef(tableDef) {
44
+ return tableDef.primaryKey.map(function (pk) {
45
+ return { fieldName: pk };
46
+ });
47
+ };
48
+ var getFkFromTableDef = function getFkFromTableDef(tableDef) {
49
+ return tableDef.foreignKeys.map(function (fk) {
50
+ return fk.fields;
51
+ });
52
+ };
53
+ var struct = {
54
+ tableName: mainTableDef.name,
55
+ pkFields: getPkFromTableDef(mainTableDef),
56
+ };
57
+ struct.childTables = [];
58
+ if (mainTableDef.detailTables && mainTableDef.detailTables.length) {
59
+ mainTableDef.detailTables.forEach(function (detailTable) {
60
+ struct.childTables.push((0, best_globals_1.changing)(createStructure(context, detailTable.table), getFkFromTableDef(be.tableStructures[detailTable.table](context))));
61
+ });
62
+ }
63
+ return struct;
64
+ };
65
+ async function permiteEditarPresupuesto(nroPresup, client) {
66
+ if (!(await client.query(`
67
+ select *
68
+ from presupuestos inner join estados_presupuesto using (estado)
69
+ where presupuesto = $1
70
+ `, [nroPresup]).fetchOneRowIfExists()).row.permite_editar) {
71
+ //si el estado no permite editar tira error
72
+ throw Error('No se puede editar ya que su estado no lo permite.');
73
+ }
74
+ }
75
+ exports.ProceduresContable = [
76
+ {
77
+ action: 'estructura_crear',
78
+ parameters: [],
79
+ coreFunction: async function (context, _parameters) {
80
+ var client = context.client;
81
+ var query = `
82
+ SELECT
83
+ ${jsono(`
84
+ SELECT *
85
+ FROM clientes
86
+ `, 'cliente')} as clientes,
87
+ ${jsono(`
88
+ select p.*,
89
+ sum(i.costo_unitario*i.utilidad*pi.cantidad_insumo) as total_insumos,
90
+ precio_sin_insumos + coalesce(sum(i.costo_unitario*i.utilidad*pi.cantidad_insumo),0) as precio
91
+ from productos p
92
+ left join productos_insumos pi using (producto)
93
+ left join insumos i using (insumo)
94
+ where p.producto > 0
95
+ group by p.producto,
96
+ p.categoria,
97
+ p.nombre,
98
+ p.descripcion,
99
+ p.habilitado,
100
+ p.precio_sin_insumos,
101
+ p.stock,
102
+ p.stock_minimo,
103
+ p.stock_maximo,
104
+ p.iva
105
+ `, 'producto')} as productos,
106
+ ${jsono(`
107
+ SELECT *
108
+ FROM condicion_iva
109
+ `, 'condicion')} as "condicionesIva",
110
+ ${json(`
111
+ SELECT *
112
+ FROM estados_presupuesto
113
+ `, 'orden')} as "estadosPresupuesto",
114
+ ${json(`
115
+ SELECT *
116
+ FROM estados_pedido
117
+ `, 'orden')} as "estadosPedido",
118
+ (SELECT to_jsonb(j.*)
119
+ from (select legales_pedido, legales_presupuesto from parametros) as j) as parametros
120
+ `;
121
+ try {
122
+ var result = await client.query(query).fetchUniqueRow();
123
+ return result.row;
124
+ }
125
+ catch (err) {
126
+ console.log('ERROR', err.message);
127
+ throw err;
128
+ }
129
+ ;
130
+ }
131
+ },
132
+ {
133
+ action: 'presupuesto_cargar',
134
+ parameters: [
135
+ { name: 'presupuesto', typeName: 'integer' },
136
+ ],
137
+ coreFunction: async function (context, parameters) {
138
+ var client = context.client;
139
+ var query = `
140
+ SELECT
141
+ COALESCE(
142
+ (SELECT to_jsonb(j.*)
143
+ from (
144
+ SELECT *
145
+ from presupuestos
146
+ where presupuesto = $1
147
+ ) as j
148
+ )
149
+ ,'{}'::jsonb
150
+ ) as presupuesto,
151
+ COALESCE(
152
+ (SELECT to_jsonb(j.*)
153
+ from (
154
+ SELECT *
155
+ FROM clientes
156
+ where cliente = (select cliente from presupuestos where presupuesto = $1)
157
+ ) as j
158
+ ),'{}'::jsonb
159
+ ) as cliente,
160
+ ${json(`
161
+ SELECT *
162
+ FROM items_presupuesto
163
+ where presupuesto = $1
164
+ `, 'numero_linea')} as "items"
165
+ `;
166
+ try {
167
+ var result = await client.query(query, [parameters.presupuesto]).fetchUniqueRow();
168
+ return result.row;
169
+ }
170
+ catch (err) {
171
+ console.log('ERROR', err.message);
172
+ throw err;
173
+ }
174
+ ;
175
+ }
176
+ },
177
+ {
178
+ action: 'presupuesto_guardar',
179
+ parameters: [
180
+ { name: 'presupuesto', typeName: 'jsonb' },
181
+ { name: 'items', typeName: 'jsonb' },
182
+ { name: 'cliente', typeName: 'jsonb' },
183
+ ],
184
+ coreFunction: async function (context, parameters) {
185
+ var client = context.client;
186
+ var presup = parameters.presupuesto;
187
+ var cliente = parameters.cliente;
188
+ var numeroPresupuesto;
189
+ try {
190
+ var presupuestoFieldsSql = `(fecha, cliente, estado, valido_hasta, subtotal, descuento, total, con_opciones, con_descuento_en_items) `;
191
+ var presupuestoValuesSql = `($1,$2,$3,$4,$5,$6,$7,$8,$9) `;
192
+ var presupuestoValues = [
193
+ presup.fecha,
194
+ cliente.cliente,
195
+ presup.estado,
196
+ presup.valido_hasta,
197
+ presup.subtotal,
198
+ presup.descuento,
199
+ presup.total,
200
+ presup.con_opciones,
201
+ presup.con_descuento_en_items
202
+ ];
203
+ if (presup.presupuesto) {
204
+ await permiteEditarPresupuesto(presup.presupuesto, client);
205
+ numeroPresupuesto = presup.presupuesto;
206
+ await client.query(`delete from items_presupuesto where presupuesto = $1`, [numeroPresupuesto]).execute();
207
+ await client.query(`
208
+ update presupuestos
209
+ set ${presupuestoFieldsSql} = ${presupuestoValuesSql}
210
+ where presupuesto = $10
211
+ returning *
212
+ `, presupuestoValues.concat(presup.presupuesto)).fetchUniqueRow();
213
+ }
214
+ else {
215
+ numeroPresupuesto = (await client.query(`
216
+ insert into
217
+ presupuestos ${presupuestoFieldsSql}
218
+ values ${presupuestoValuesSql}
219
+ returning *
220
+ `, presupuestoValues).fetchUniqueRow()).row.presupuesto;
221
+ }
222
+ for (let item of parameters.items) {
223
+ await client.query(`
224
+ insert
225
+ into items_presupuesto (presupuesto, cantidad, producto, nombre, descripcion, precio_unitario, porcentaje_descuento, descuento, total)
226
+ values ($1,$2,$3,$4,$5,$6,$7,$8,$9)
227
+ `, [numeroPresupuesto, item.cantidad, item.producto, item.nombre, item.descripcion, item.precio_unitario, item.porcentaje_descuento, item.descuento, item.total])
228
+ .execute();
229
+ }
230
+ return { estado: 'ok', presupuesto: numeroPresupuesto };
231
+ }
232
+ catch (err) {
233
+ console.log('ERROR', err.message);
234
+ throw err;
235
+ }
236
+ ;
237
+ }
238
+ },
239
+ {
240
+ action: 'presupuesto_anular',
241
+ parameters: [
242
+ { name: 'presupuesto', typeName: 'integer' },
243
+ ],
244
+ coreFunction: async function (context, parameters) {
245
+ var client = context.client;
246
+ var db = context.be.db;
247
+ var nroPresup = parameters.presupuesto;
248
+ try {
249
+ await permiteEditarPresupuesto(nroPresup, client);
250
+ await client.query(`
251
+ update presupuestos
252
+ set estado = $2
253
+ where presupuesto = $1
254
+ returning *
255
+ `, [nroPresup, ESTADO_ANULADO_PRESUPUESTO]).fetchUniqueRow();
256
+ return { estado: 'ok' };
257
+ }
258
+ catch (err) {
259
+ console.log('ERROR', err.message);
260
+ throw err;
261
+ }
262
+ ;
263
+ }
264
+ },
265
+ {
266
+ action: 'presupuesto_rechazar',
267
+ parameters: [
268
+ { name: 'presupuesto', typeName: 'integer' },
269
+ ],
270
+ coreFunction: async function (context, parameters) {
271
+ var client = context.client;
272
+ var db = context.be.db;
273
+ var nroPresup = parameters.presupuesto;
274
+ try {
275
+ await permiteEditarPresupuesto(nroPresup, client);
276
+ await client.query(`
277
+ update presupuestos
278
+ set estado = $2
279
+ where presupuesto = $1
280
+ returning *
281
+ `, [nroPresup, ESTADO_RECHAZADO_PRESUPUESTO]).fetchUniqueRow();
282
+ return { estado: 'ok' };
283
+ }
284
+ catch (err) {
285
+ console.log('ERROR', err.message);
286
+ throw err;
287
+ }
288
+ ;
289
+ }
290
+ },
291
+ {
292
+ action: 'pedido_cargar',
293
+ parameters: [
294
+ { name: 'pedido', typeName: 'integer' },
295
+ ],
296
+ coreFunction: async function (context, parameters) {
297
+ var client = context.client;
298
+ var query = `
299
+ SELECT
300
+ COALESCE(
301
+ (SELECT to_jsonb(j.*)
302
+ from (
303
+ SELECT *
304
+ from pedidos
305
+ where pedido = $1
306
+ ) as j
307
+ )
308
+ ,'{}'::jsonb
309
+ ) as pedido,
310
+ COALESCE(
311
+ (SELECT to_jsonb(j.*)
312
+ from (
313
+ SELECT *
314
+ FROM clientes
315
+ where cliente = (select cliente from pedidos where pedido = $1)
316
+ ) as j
317
+ ),'{}'::jsonb
318
+ ) as cliente,
319
+ ${json(`
320
+ SELECT *
321
+ FROM items_pedido
322
+ where pedido = $1
323
+ `, 'numero_linea')} as "items"
324
+ `;
325
+ try {
326
+ var result = await client.query(query, [parameters.pedido]).fetchUniqueRow();
327
+ return result.row;
328
+ }
329
+ catch (err) {
330
+ console.log('ERROR', err.message);
331
+ throw err;
332
+ }
333
+ ;
334
+ }
335
+ },
336
+ {
337
+ // TODO -> stock (puede ir en trigger)
338
+ action: 'pedido_guardar',
339
+ parameters: [
340
+ { name: 'pedido', typeName: 'jsonb' },
341
+ { name: 'items', typeName: 'jsonb' },
342
+ { name: 'cliente', typeName: 'jsonb' },
343
+ ],
344
+ coreFunction: async function (context, parameters) {
345
+ var client = context.client;
346
+ var pedido = parameters.pedido;
347
+ var cliente = parameters.cliente;
348
+ var numeroPedido;
349
+ try {
350
+ var pedidoFieldsSql = `(presupuesto, fecha, cliente, estado, fecha_entrega, subtotal, descuento, total, observaciones) `;
351
+ var pedidoValuesSql = `($1,$2,$3,$4,$5,$6,$7,$8, $9) `;
352
+ var pedidoValues = [
353
+ pedido.presupuesto,
354
+ pedido.fecha,
355
+ cliente.cliente,
356
+ pedido.estado,
357
+ pedido.fecha_entrega,
358
+ pedido.subtotal,
359
+ pedido.descuento,
360
+ pedido.total,
361
+ pedido.observaciones
362
+ ];
363
+ if (pedido.pedido) {
364
+ numeroPedido = pedido.pedido;
365
+ await client.query(`delete from items_pedido where pedido = $1`, [numeroPedido]).execute();
366
+ await client.query(`
367
+ update pedidos
368
+ set ${pedidoFieldsSql} = ${pedidoValuesSql}
369
+ where pedido = $10
370
+ returning *
371
+ `, pedidoValues.concat(pedido.pedido)).fetchUniqueRow();
372
+ }
373
+ else {
374
+ pedido.presupuesto ? await permiteEditarPresupuesto(pedido.presupuesto, client) : null;
375
+ numeroPedido = (await client.query(`
376
+ insert into
377
+ pedidos ${pedidoFieldsSql}
378
+ values ${pedidoValuesSql}
379
+ returning *
380
+ `, pedidoValues).fetchUniqueRow()).row.pedido;
381
+ }
382
+ for (let item of parameters.items) {
383
+ await client.query(`
384
+ insert
385
+ into items_pedido (pedido, cantidad, producto, nombre, descripcion, precio_unitario, porcentaje_descuento, descuento, total)
386
+ values ($1,$2,$3,$4,$5,$6,$7,$8,$9)
387
+ `, [numeroPedido, item.cantidad, item.producto, item.nombre, item.descripcion, item.precio_unitario, item.porcentaje_descuento, item.descuento, item.total])
388
+ .execute();
389
+ }
390
+ if (pedido.presupuesto) {
391
+ await client.query(`
392
+ update presupuestos
393
+ set estado = $1
394
+ where presupuesto = $2
395
+ returning *
396
+ `, [ESTADO_ACEPTADO_PRESUPUESTO, pedido.presupuesto]).fetchUniqueRow();
397
+ try {
398
+ await client.query(`
399
+ select presupuesto
400
+ from pedidos
401
+ where presupuesto = $1
402
+ `, [pedido.presupuesto]).fetchUniqueValue();
403
+ }
404
+ catch (err) {
405
+ throw Error(`El presupuesto ${pedido.presupuesto} ya tiene un pedido creado. ` + err.message);
406
+ }
407
+ }
408
+ return { estado: 'ok', pedido: numeroPedido };
409
+ }
410
+ catch (err) {
411
+ console.log('ERROR', err.message);
412
+ throw err;
413
+ }
414
+ ;
415
+ }
416
+ },
417
+ {
418
+ action: 'producto_clonar',
419
+ parameters: [
420
+ { name: 'producto', typeName: 'integer' },
421
+ ],
422
+ coreFunction: async function (context, parameters) {
423
+ var client = context.client;
424
+ var be = context.be;
425
+ var producto = parameters.producto;
426
+ //clonacion producto
427
+ var productoAClonar = (await client.query(`select * from productos where producto = $1`, [producto]).fetchUniqueRow()).row;
428
+ delete (productoAClonar.producto);
429
+ delete (productoAClonar.stock);
430
+ delete (productoAClonar.stock_minimo);
431
+ delete (productoAClonar.stock_maximo);
432
+ var productoKeys = [];
433
+ var productoValues = [];
434
+ for (let key in productoAClonar) {
435
+ productoKeys.push(be.db.quoteIdent(key));
436
+ productoValues.push(be.db.quoteNullable(productoAClonar[key]));
437
+ }
438
+ var productoNuevo = (await client.query(`insert into productos (${productoKeys.join(',')}) values (${productoValues.join(',')}) returning *`, []).fetchUniqueRow()).row;
439
+ //clonacion insumos
440
+ var productosInsumosAClonar = (await client.query(`select * from productos_insumos where producto = $1`, [producto]).fetchAll()).rows;
441
+ var prodInsumosNuevos = [];
442
+ for (var prodInsumo of productosInsumosAClonar) {
443
+ prodInsumo.producto = productoNuevo.producto;
444
+ var prodInsumoKeys = [];
445
+ var prodInsumoValues = [];
446
+ for (let key in prodInsumo) {
447
+ prodInsumoKeys.push(be.db.quoteIdent(key));
448
+ prodInsumoValues.push(be.db.quoteNullable(prodInsumo[key]));
449
+ }
450
+ prodInsumosNuevos.push((await client.query(`
451
+ insert into
452
+ productos_insumos (${prodInsumoKeys.join(',')})
453
+ values (${prodInsumoValues.join(',')})
454
+ returning *`, []).fetchUniqueRow()).row);
455
+ }
456
+ return { estado: 'ok', productoNuevo, prodInsumosNuevos };
457
+ }
458
+ },
459
+ {
460
+ action: 'object_get',
461
+ parameters: [
462
+ { name: 'tablename', typeName: 'text' },
463
+ { name: 'pk_values', typeName: 'jsonb' },
464
+ ],
465
+ coreFunction: async function (context, parameters) {
466
+ var client = context.client;
467
+ var query = sqlTools.structuredData.sqlRead(parameters.pk_values, createStructure(context, parameters.tablename));
468
+ try {
469
+ var result = await client.query(query).fetchUniqueValue();
470
+ return result.value;
471
+ }
472
+ catch (err) {
473
+ console.log('ERROR', err.message);
474
+ throw err;
475
+ }
476
+ ;
477
+ }
478
+ },
479
+ {
480
+ action: 'object_save',
481
+ parameters: [
482
+ { name: 'tablename', typeName: 'text' },
483
+ { name: 'datos', typeName: 'jsonb' },
484
+ ],
485
+ coreFunction: async function (context, parameters) {
486
+ var be = context.be;
487
+ var client = context.client;
488
+ var queries = sqlTools.structuredData.sqlWrite(parameters.datos, createStructure(context, parameters.tablename));
489
+ console.log("#############", queries);
490
+ return await queries.reduce(function (promise, query) {
491
+ return promise.then(function () {
492
+ return client.query(query).execute().then(function () {
493
+ return 'ok';
494
+ });
495
+ });
496
+ }, Promise.resolve()).then(async function () {
497
+ //TODO: traer json refrescado
498
+ //var result = await be.procedure.object_get.coreFunction(context, {tablename:parameters.tablename, });
499
+ return 'ok';
500
+ }).catch(function (err) {
501
+ console.log("ENTRA EN EL CATCH: ", err);
502
+ throw err;
503
+ });
504
+ }
505
+ },
506
+ ];
507
+ });
508
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2VkdXJlcy1jb250YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvcHJvY2VkdXJlcy1jb250YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBLFlBQVksQ0FBQzs7O0lBT2IsbURBQWlDO0lBRWpDLCtDQUF1RDtJQUl2RCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBR3BDLE1BQU0sMkJBQTJCLEdBQUksVUFBVSxDQUFDO0lBQ2hELE1BQU0sMEJBQTBCLEdBQUssU0FBUyxDQUFDO0lBQy9DLE1BQU0sNEJBQTRCLEdBQUcsV0FBVyxDQUFDO0lBRWpELFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPO1FBQ3RCLE9BQU8scURBQXFELE9BQU8sV0FBVyxHQUFHLHNCQUFzQixDQUFBO0lBQzNHLENBQUM7SUFFRCxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUztRQUN6QixPQUFPLHFDQUFxQyxTQUFTLHlCQUF5QixHQUFHLHNCQUFzQixDQUFBO0lBQzNHLENBQUM7SUFFRCxJQUFJLGVBQWUsR0FBRyxTQUFTLGVBQWUsQ0FBQyxPQUFlLEVBQUUsU0FBZ0I7UUFDNUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwQixJQUFJLFlBQVksR0FBbUIsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRSxJQUFJLGlCQUFpQixHQUFHLFNBQVMsaUJBQWlCLENBQUMsUUFBd0I7WUFDdkUsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFTLEVBQUU7Z0JBQ3RDLE9BQU8sRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFDLENBQUM7WUFDMUIsQ0FBQyxDQUFD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O2dCQUNuRixJQUFJLEVBQUUsR0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLE1BQU0sR0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUMxQixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pILE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUNwQyxPQUFPLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFTLE9BQW9CLEVBQUUsS0FBWTtvQkFDbkUsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNoQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDOzRCQUN0QyxPQUFPLElBQUksQ0FBQzt3QkFDaEIsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO29CQUMzQiw2QkFBNkI7b0JBQzdCLHVHQUF1RztvQkFDdkcsT0FBTyxJQUFJLENBQUM7Z0JBQ2hCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFTLEdBQVM7b0JBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ3RDLE1BQU0sR0FBRyxDQUFBO2dCQUNiLENBQUMsQ0FBQyxDQUFBO1lBQ04sQ0FBQztTQUNKO0tBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgUHJvY2VkdXJlRGVmLCBUYWJsZURlZmluaXRpb24sIENsaWVudCB9IGZyb20gXCIuL3R5cGVzLWNvbnRhYmxlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyZUNvbnRleHQsIENvcmVGdW5jdGlvblBhcmFtZXRlcnMsIENvbnRleHQsIEZvcmVpZ25LZXksIGNvcmVGdW5jdGlvblBhcmFtZXRlcnMgfSBmcm9tIFwiYmFja2VuZC1wbHVzXCI7XHJcbmltcG9ydCB7IENsaWVudGUgfSBmcm9tIFwiLi4vY2xpZW50L3RpcG9zXCI7XHJcblxyXG5pbXBvcnQgKiBhcyBsaWtlQXIgZnJvbSBcImxpa2UtYXJcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMtY29udGFibGVcIjtcclxuaW1wb3J0IHtqc29uLCBqc29ub30gZnJvbSBcInBnLXByb21pc2Utc3RyaWN0XCI7XHJcbmltcG9ydCB7Y2hhbmdpbmcsIGRhdGV0aW1lLCBkYXRlIH0gZnJvbSAnYmVzdC1nbG9iYWxzJztcclxuXHJcbmltcG9ydCB7cHJvbWlzZXMgYXMgIGZzfSBmcm9tIFwiZnNcIjtcclxuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSBcImRvbWFpblwiO1xyXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxudmFyIHNxbFRvb2xzID0gcmVxdWlyZSgnc3FsLXRvb2xzJyk7XHJcbnR5cGUgQW55T2JqZWN0ID0ge1trOnN0cmluZ106YW55fVxyXG5cclxuY29uc3QgRVNUQURPX0FDRVBUQURPX1BSRVNVUFVFU1RPICA9ICdhY2VwdGFkbyc7XHJcbmNvbnN0IEVTVEFET19BTlVMQURPX1BSRVNVUFVFU1RPICAgPSAnYW51bGFkbyc7XHJcbmNvbnN0IEVTVEFET19SRUNIQVpBRE9fUFJFU1VQVUVTVE8gPSAncmVjaGF6YWRvJztcclxuXHJcbmZ1bmN0aW9uIGpzb24oc3FsLCBvcmRlcmJ5KXtcclxuICAgIHJldHVybiBgQ09BTEVTQ0UoKFNFTEVDVCBqc29uYl9hZ2codG9fanNvbmIoai4qKSBPUkRFUiBCWSAke29yZGVyYnl9KSBmcm9tICgke3NxbH0pIGFzIGopLCdbXSc6Ompzb25iKWBcclxufVxyXG5cclxuZnVuY3Rpb24ganNvbm8oc3FsLCBpbmRleGVkYnkpe1xyXG4gICAgcmV0dXJuIGBDT0FMRVNDRSgoU0VMRUNUIGpzb25iX29iamVjdF9hZ2coJHtpbmRleGVkYnl9LHRvX2pzb25iKGouKikpIGZyb20gKCR7c3FsfSkgYXMgaiksJ3t9Jzo6anNvbmIpYFxyXG59XHJcblxyXG52YXIgY3JlYXRlU3RydWN0dXJlID0gZnVuY3Rpb24gY3JlYXRlU3RydWN0dXJlKGNvbnRleHQ6Q29udGV4dCwgdGFibGVOYW1lOnN0cmluZyl7XHJcbiAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgdmFyIG1haW5UYWJsZURlZjpUYWJsZURlZmluaXRpb24gPSBiZS50YWJsZVN0cnVjdHVyZXNbdGFibGVOYW1lXShjb250ZXh0KTtcclxuICAgIHZhciBnZXRQa0Zyb21UYWJsZURlZiA9IGZ1bmN0aW9uIGdldFBrRnJvbVRhYmxlRGVmKHRhYmxlRGVmOlRhYmxlRGVmaW5pdGlvbil7XHJcbiAgICAgICAgcmV0dXJuIHRhYmxlRGVmLnByaW1hcnlLZXkubWFwKGZ1bmN0aW9uKHBrKXtcclxuICAgICAgICAgICAgcmV0dXJuIHtmaWVsZE5hbWU6cGt9O1xyXG4gICAgICAgIH0pXHJcbiAgICB9O1xyXG4gICAgdmFyIGdldEZrRnJvbVRhYmxlRGVmID0gZnVuY3Rpb24gZ2V0RmtGcm9tVGFibGVEZWYodGFibGVEZWY6VGFibGVEZWZpbml0aW9uKXtcclxuICAgICAgICByZXR1cm4gdGFibGVEZWYuZm9yZWlnbktleXMubWFwKGZ1bmN0aW9uKGZrKXtcclxuICAgICAgICAgICAgcmV0dXJuIGZrLmZpZWxkc1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0cnVjdD17XHJcbiAgICAgICAgdGFibGVOYW1lOm1haW5UYWJsZURlZi5uYW1lLFxyXG4gICAgICAgIHBrRmllbGRzOmdldFBrRnJvbVRhYmxlRGVmKG1haW5UYWJsZURlZiksXHJcbiAgICB9O1xyXG4gICAgc3RydWN0LmNoaWxkVGFibGVzPVtdO1xyXG4gICAgaWYobWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcyAmJiBtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzLmxlbmd0aCl7XHJcbiAgICAgICAgbWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGRldGFpbFRhYmxlKXtcclxuICAgICAgICAgICAgc3RydWN0LmNoaWxkVGFibGVzLnB1c2goXHJcbiAgICAgICAgICAgICAgICBjaGFuZ2luZyhcclxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgZGV0YWlsVGFibGUudGFibGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGdldEZrRnJvbVRhYmxlRGVmKGJlLnRhYmxlU3RydWN0dXJlc1tkZXRhaWxUYWJsZS50YWJsZV0oY29udGV4dCkpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIHJldHVybiBzdHJ1Y3Q7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHBlcm1pdGVFZGl0YXJQcmVzdXB1ZXN0byhucm9QcmVzdXA6bnVtYmVyLCBjbGllbnQ6Q2xpZW50KXtcclxuICAgIGlmKCEoYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICBzZWxlY3QgKiBcclxuICAgICAgICAgICAgZnJvbSBwcmVzdXB1ZXN0b3MgaW5uZXIgam9pbiBlc3RhZG9zX3ByZXN1cHVlc3RvIHVzaW5nIChlc3RhZG8pXHJcbiAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDFcclxuICAgIGAsW25yb1ByZXN1cF0pLmZldGNoT25lUm93SWZFeGlzdHMoKSkucm93LnBlcm1pdGVfZWRpdGFyKXtcclxuICAgICAgICAvL3NpIGVsIGVzdGFkbyBubyBwZXJtaXRlIGVkaXRhciB0aXJhIGVycm9yXHJcbiAgICAgICAgdGhyb3cgRXJyb3IgKCdObyBzZSBwdWVkZSBlZGl0YXIgeWEgcXVlIHN1IGVzdGFkbyBubyBsbyBwZXJtaXRlLicpIFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUHJvY2VkdXJlc0NvbnRhYmxlIDogUHJvY2VkdXJlRGVmW10gPSBbXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZXN0cnVjdHVyYV9jcmVhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW10sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIF9wYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHF1ZXJ5ID1gXHJcbiAgICAgICAgICAgICAgICBTRUxFQ1QgXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29ubyhgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGNsaWVudGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjbGllbnRlJ1xyXG4gICAgICAgICAgICAgICAgICAgICl9IGFzIGNsaWVudGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICR7anNvbm8oYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgcC4qLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oaS5jb3N0b191bml0YXJpbyppLnV0aWxpZGFkKnBpLmNhbnRpZGFkX2luc3VtbykgYXMgdG90YWxfaW5zdW1vcywgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX3Npbl9pbnN1bW9zICsgY29hbGVzY2Uoc3VtKGkuY29zdG9fdW5pdGFyaW8qaS51dGlsaWRhZCpwaS5jYW50aWRhZF9pbnN1bW8pLDApIGFzIHByZWNpb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwcm9kdWN0b3MgcCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gcHJvZHVjdG9zX2luc3Vtb3MgcGkgdXNpbmcgKHByb2R1Y3RvKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gaW5zdW1vcyBpIHVzaW5nIChpbnN1bW8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwLnByb2R1Y3RvID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgYnkgcC5wcm9kdWN0byxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jYXRlZ29yaWEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAubm9tYnJlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmRlc2NyaXBjaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmhhYmlsaXRhZG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAucHJlY2lvX3Npbl9pbnN1bW9zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnN0b2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnN0b2NrX21pbmltbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zdG9ja19tYXhpbW8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuaXZhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9kdWN0bydcclxuICAgICAgICAgICAgICAgICAgICApfSBhcyBwcm9kdWN0b3MsXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29ubyhgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGNvbmRpY2lvbl9pdmFcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpY2lvbidcclxuICAgICAgICAgICAgICAgICAgICApfSBhcyBcImNvbmRpY2lvbmVzSXZhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29uKGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gZXN0YWRvc19wcmVzdXB1ZXN0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnb3JkZW4nXHJcbiAgICAgICAgICAgICAgICAgICAgKX0gYXMgXCJlc3RhZG9zUHJlc3VwdWVzdG9cIixcclxuICAgICAgICAgICAgICAgICAgICAke2pzb24oYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBlc3RhZG9zX3BlZGlkb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnb3JkZW4nXHJcbiAgICAgICAgICAgICAgICAgICAgKX0gYXMgXCJlc3RhZG9zUGVkaWRvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgKFNFTEVDVCB0b19qc29uYihqLiopIFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbSAoc2VsZWN0IGxlZ2FsZXNfcGVkaWRvLCBsZWdhbGVzX3ByZXN1cHVlc3RvIGZyb20gcGFyYW1ldHJvcykgYXMgaikgYXMgcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICBgO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5KS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3c7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdwcmVzdXB1ZXN0b19jYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAge25hbWU6J3ByZXN1cHVlc3RvJyAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBxdWVyeSA9YFxyXG4gICAgICAgICAgICAgICAgU0VMRUNUIFxyXG4gICAgICAgICAgICAgICAgICAgIENPQUxFU0NFKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoU0VMRUNUIHRvX2pzb25iKGouKikgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwcmVzdXB1ZXN0b3MgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgalxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICwne30nOjpqc29uYlxyXG4gICAgICAgICAgICAgICAgICAgICkgYXMgcHJlc3VwdWVzdG8sXHJcbiAgICAgICAgICAgICAgICAgICAgQ09BTEVTQ0UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChTRUxFQ1QgdG9fanNvbmIoai4qKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gY2xpZW50ZXMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGNsaWVudGUgPSAoc2VsZWN0IGNsaWVudGUgZnJvbSBwcmVzdXB1ZXN0b3Mgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgalxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLCd7fSc6Ompzb25iXHJcbiAgICAgICAgICAgICAgICAgICAgKSBhcyBjbGllbnRlLFxyXG4gICAgICAgICAgICAgICAgJHtqc29uKGBcclxuICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGl0ZW1zX3ByZXN1cHVlc3RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDFcclxuICAgICAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgICAgICdudW1lcm9fbGluZWEnXHJcbiAgICAgICAgICAgICAgICApfSBhcyBcIml0ZW1zXCJcclxuICAgICAgICAgICAgYDtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeShxdWVyeSxbcGFyYW1ldGVycy5wcmVzdXB1ZXN0b10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvdztcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3ByZXN1cHVlc3RvX2d1YXJkYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncHJlc3VwdWVzdG8nICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgICAgIHtuYW1lOidpdGVtcycgICAgICAgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICAgICAge25hbWU6J2NsaWVudGUnICAgICAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IGNvcmVGdW5jdGlvblBhcmFtZXRlcnMpe1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgcHJlc3VwID0gcGFyYW1ldGVycy5wcmVzdXB1ZXN0bztcclxuICAgICAgICAgICAgdmFyIGNsaWVudGUgPSBwYXJhbWV0ZXJzLmNsaWVudGU7XHJcbiAgICAgICAgICAgIHZhciBudW1lcm9QcmVzdXB1ZXN0bztcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZXN1cHVlc3RvRmllbGRzU3FsID0gYChmZWNoYSwgY2xpZW50ZSwgZXN0YWRvLCB2YWxpZG9faGFzdGEsIHN1YnRvdGFsLCBkZXNjdWVudG8sIHRvdGFsLCBjb25fb3BjaW9uZXMsIGNvbl9kZXNjdWVudG9fZW5faXRlbXMpIGA7XHJcbiAgICAgICAgICAgICAgICB2YXIgcHJlc3VwdWVzdG9WYWx1ZXNTcWwgPSBgKCQxLCQyLCQzLCQ0LCQ1LCQ2LCQ3LCQ4LCQ5KSBgO1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZXN1cHVlc3RvVmFsdWVzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC5mZWNoYSxcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRlLmNsaWVudGUsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJlc3VwLmVzdGFkbyxcclxuICAgICAgICAgICAgICAgICAgICBwcmVzdXAudmFsaWRvX2hhc3RhLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC5zdWJ0b3RhbCxcclxuICAgICAgICAgICAgICAgICAgICBwcmVzdXAuZGVzY3VlbnRvLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC50b3RhbCxcclxuICAgICAgICAgICAgICAgICAgICBwcmVzdXAuY29uX29wY2lvbmVzLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXN1cC5jb25fZGVzY3VlbnRvX2VuX2l0ZW1zXHJcbiAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgaWYocHJlc3VwLnByZXN1cHVlc3RvKXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwZXJtaXRlRWRpdGFyUHJlc3VwdWVzdG8ocHJlc3VwLnByZXN1cHVlc3RvLCBjbGllbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWVyb1ByZXN1cHVlc3RvPXByZXN1cC5wcmVzdXB1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYGRlbGV0ZSBmcm9tIGl0ZW1zX3ByZXN1cHVlc3RvIHdoZXJlIHByZXN1cHVlc3RvID0gJDFgLFtudW1lcm9QcmVzdXB1ZXN0b10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUgcHJlc3VwdWVzdG9zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0ICR7cHJlc3VwdWVzdG9GaWVsZHNTcWx9ID0gJHtwcmVzdXB1ZXN0b1ZhbHVlc1NxbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHByZXN1cHVlc3RvID0gJDEwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAscHJlc3VwdWVzdG9WYWx1ZXMuY29uY2F0KHByZXN1cC5wcmVzdXB1ZXN0bykpLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBudW1lcm9QcmVzdXB1ZXN0byA9IChhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgaW50byBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXN1cHVlc3RvcyAke3ByZXN1cHVlc3RvRmllbGRzU3FsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICR7cHJlc3VwdWVzdG9WYWx1ZXNTcWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAscHJlc3VwdWVzdG9WYWx1ZXMpLmZldGNoVW5pcXVlUm93KCkpLnJvdy5wcmVzdXB1ZXN0b1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpdGVtIG9mIHBhcmFtZXRlcnMuaXRlbXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gaXRlbXNfcHJlc3VwdWVzdG8gKHByZXN1cHVlc3RvLCBjYW50aWRhZCwgcHJvZHVjdG8sIG5vbWJyZSwgZGVzY3JpcGNpb24sIHByZWNpb191bml0YXJpbywgcG9yY2VudGFqZV9kZXNjdWVudG8sIGRlc2N1ZW50bywgdG90YWwpIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICgkMSwkMiwkMywkNCwkNSwkNiwkNywkOCwkOSlcclxuICAgICAgICAgICAgICAgICAgICBgLFtudW1lcm9QcmVzdXB1ZXN0bywgaXRlbS5jYW50aWRhZCwgaXRlbS5wcm9kdWN0bywgaXRlbS5ub21icmUsIGl0ZW0uZGVzY3JpcGNpb24sIGl0ZW0ucHJlY2lvX3VuaXRhcmlvLCBpdGVtLnBvcmNlbnRhamVfZGVzY3VlbnRvLCBpdGVtLmRlc2N1ZW50bywgaXRlbS50b3RhbF0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB7ZXN0YWRvOidvaycsIHByZXN1cHVlc3RvOiBudW1lcm9QcmVzdXB1ZXN0b307XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdwcmVzdXB1ZXN0b19hbnVsYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W1xyXG4gICAgICAgICAgICB7bmFtZToncHJlc3VwdWVzdG8nICAgICAgICwgdHlwZU5hbWU6J2ludGVnZXInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIGRiID0gIGNvbnRleHQuYmUuZGI7XHJcbiAgICAgICAgICAgIHZhciBucm9QcmVzdXAgPSBwYXJhbWV0ZXJzLnByZXN1cHVlc3RvO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBwZXJtaXRlRWRpdGFyUHJlc3VwdWVzdG8obnJvUHJlc3VwLCBjbGllbnQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGUgcHJlc3VwdWVzdG9zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgYCxbbnJvUHJlc3VwLCBFU1RBRE9fQU5VTEFET19QUkVTVVBVRVNUT10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge2VzdGFkbzonb2snfTtcclxuICAgICAgICAgICAgfWNhdGNoKGVycil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1InLGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ3ByZXN1cHVlc3RvX3JlY2hhemFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J3ByZXN1cHVlc3RvJyAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBkYiA9ICBjb250ZXh0LmJlLmRiO1xyXG4gICAgICAgICAgICB2YXIgbnJvUHJlc3VwID0gcGFyYW1ldGVycy5wcmVzdXB1ZXN0bztcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgcGVybWl0ZUVkaXRhclByZXN1cHVlc3RvKG5yb1ByZXN1cCwgY2xpZW50KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlIHByZXN1cHVlc3RvcyBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgcHJlc3VwdWVzdG8gPSAkMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgYCxbbnJvUHJlc3VwLCBFU1RBRE9fUkVDSEFaQURPX1BSRVNVUFVFU1RPXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7ZXN0YWRvOidvayd9O1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAncGVkaWRvX2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7bmFtZToncGVkaWRvJyAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBxdWVyeSA9YFxyXG4gICAgICAgICAgICAgICAgU0VMRUNUIFxyXG4gICAgICAgICAgICAgICAgICAgIENPQUxFU0NFKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoU0VMRUNUIHRvX2pzb25iKGouKikgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgKiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwZWRpZG9zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwZWRpZG8gPSAkMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLCd7fSc6Ompzb25iXHJcbiAgICAgICAgICAgICAgICAgICAgKSBhcyBwZWRpZG8sXHJcbiAgICAgICAgICAgICAgICAgICAgQ09BTEVTQ0UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChTRUxFQ1QgdG9fanNvbmIoai4qKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gY2xpZW50ZXMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGNsaWVudGUgPSAoc2VsZWN0IGNsaWVudGUgZnJvbSBwZWRpZG9zIHdoZXJlIHBlZGlkbyA9ICQxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksJ3t9Jzo6anNvbmJcclxuICAgICAgICAgICAgICAgICAgICApIGFzIGNsaWVudGUsXHJcbiAgICAgICAgICAgICAgICAke2pzb24oYFxyXG4gICAgICAgICAgICAgICAgICAgIFNFTEVDVCAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gaXRlbXNfcGVkaWRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHBlZGlkbyA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgICAgICAnbnVtZXJvX2xpbmVhJ1xyXG4gICAgICAgICAgICAgICAgKX0gYXMgXCJpdGVtc1wiXHJcbiAgICAgICAgICAgIGA7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnksW3BhcmFtZXRlcnMucGVkaWRvXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93O1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgLy8gVE9ETyAtPiBzdG9jayAocHVlZGUgaXIgZW4gdHJpZ2dlcilcclxuICAgICAgICBhY3Rpb246ICdwZWRpZG9fZ3VhcmRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczpbXHJcbiAgICAgICAgICAgIHtuYW1lOidwZWRpZG8nICAgICAgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICAgICAge25hbWU6J2l0ZW1zJyAgICAgICAgICAgICAsIHR5cGVOYW1lOidqc29uYid9LFxyXG4gICAgICAgICAgICB7bmFtZTonY2xpZW50ZScgICAgICAgICAgICwgdHlwZU5hbWU6J2pzb25iJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBwZWRpZG8gPSBwYXJhbWV0ZXJzLnBlZGlkbztcclxuICAgICAgICAgICAgdmFyIGNsaWVudGUgPSBwYXJhbWV0ZXJzLmNsaWVudGU7XHJcbiAgICAgICAgICAgIHZhciBudW1lcm9QZWRpZG87XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciBwZWRpZG9GaWVsZHNTcWwgPSBgKHByZXN1cHVlc3RvLCBmZWNoYSwgY2xpZW50ZSwgZXN0YWRvLCBmZWNoYV9lbnRyZWdhLCBzdWJ0b3RhbCwgZGVzY3VlbnRvLCB0b3RhbCwgb2JzZXJ2YWNpb25lcykgYDtcclxuICAgICAgICAgICAgICAgIHZhciBwZWRpZG9WYWx1ZXNTcWwgPSBgKCQxLCQyLCQzLCQ0LCQ1LCQ2LCQ3LCQ4LCAkOSkgYDtcclxuICAgICAgICAgICAgICAgIHZhciBwZWRpZG9WYWx1ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvLnByZXN1cHVlc3RvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBlZGlkby5mZWNoYSxcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRlLmNsaWVudGUsXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvLmVzdGFkbyxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8uZmVjaGFfZW50cmVnYSxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8uc3VidG90YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvLmRlc2N1ZW50byxcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8udG90YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcGVkaWRvLm9ic2VydmFjaW9uZXNcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICBpZihwZWRpZG8ucGVkaWRvKXtcclxuICAgICAgICAgICAgICAgICAgICBudW1lcm9QZWRpZG89cGVkaWRvLnBlZGlkbztcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYGRlbGV0ZSBmcm9tIGl0ZW1zX3BlZGlkbyB3aGVyZSBwZWRpZG8gPSAkMWAsW251bWVyb1BlZGlkb10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUgcGVkaWRvcyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCAke3BlZGlkb0ZpZWxkc1NxbH0gPSAke3BlZGlkb1ZhbHVlc1NxbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHBlZGlkbyA9ICQxMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpcclxuICAgICAgICAgICAgICAgICAgICBgLHBlZGlkb1ZhbHVlcy5jb25jYXQocGVkaWRvLnBlZGlkbykpLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBwZWRpZG8ucHJlc3VwdWVzdG8/YXdhaXQgcGVybWl0ZUVkaXRhclByZXN1cHVlc3RvKHBlZGlkby5wcmVzdXB1ZXN0bywgY2xpZW50KTpudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWVyb1BlZGlkbyA9IChhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgaW50byBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZGlkb3MgJHtwZWRpZG9GaWVsZHNTcWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgJHtwZWRpZG9WYWx1ZXNTcWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAscGVkaWRvVmFsdWVzKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3cucGVkaWRvXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGl0ZW0gb2YgcGFyYW1ldGVycy5pdGVtcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBpdGVtc19wZWRpZG8gKHBlZGlkbywgY2FudGlkYWQsIHByb2R1Y3RvLCBub21icmUsIGRlc2NyaXBjaW9uLCBwcmVjaW9fdW5pdGFyaW8sIHBvcmNlbnRhamVfZGVzY3VlbnRvLCBkZXNjdWVudG8sIHRvdGFsKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyAoJDEsJDIsJDMsJDQsJDUsJDYsJDcsJDgsJDkpXHJcbiAgICAgICAgICAgICAgICAgICAgYCxbbnVtZXJvUGVkaWRvLCBpdGVtLmNhbnRpZGFkLCBpdGVtLnByb2R1Y3RvLCBpdGVtLm5vbWJyZSwgaXRlbS5kZXNjcmlwY2lvbiwgaXRlbS5wcmVjaW9fdW5pdGFyaW8sIGl0ZW0ucG9yY2VudGFqZV9kZXNjdWVudG8sIGl0ZW0uZGVzY3VlbnRvLCBpdGVtLnRvdGFsXSlcclxuICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYocGVkaWRvLnByZXN1cHVlc3RvKXtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUgcHJlc3VwdWVzdG9zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwcmVzdXB1ZXN0byA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAsW0VTVEFET19BQ0VQVEFET19QUkVTVVBVRVNUTywgcGVkaWRvLnByZXN1cHVlc3RvXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgcHJlc3VwdWVzdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBlZGlkb3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBwcmVzdXB1ZXN0byA9ICQxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGAsW3BlZGlkby5wcmVzdXB1ZXN0b10pLmZldGNoVW5pcXVlVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEVsIHByZXN1cHVlc3RvICR7cGVkaWRvLnByZXN1cHVlc3RvfSB5YSB0aWVuZSB1biBwZWRpZG8gY3JlYWRvLiBgICsgZXJyLm1lc3NhZ2UpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtlc3RhZG86J29rJywgcGVkaWRvOiBudW1lcm9QZWRpZG99O1xyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicsZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAncHJvZHVjdG9fY2xvbmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J3Byb2R1Y3RvJyAgICAgICAsIHR5cGVOYW1lOidpbnRlZ2VyJ30sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogY29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQ9Y29udGV4dC5jbGllbnQ7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciBwcm9kdWN0byA9IHBhcmFtZXRlcnMucHJvZHVjdG87XHJcblxyXG4gICAgICAgICAgICAvL2Nsb25hY2lvbiBwcm9kdWN0b1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG9BQ2xvbmFyID0gKGF3YWl0IGNsaWVudC5xdWVyeShgc2VsZWN0ICogZnJvbSBwcm9kdWN0b3Mgd2hlcmUgcHJvZHVjdG8gPSAkMWAsW3Byb2R1Y3RvXSkuZmV0Y2hVbmlxdWVSb3coKSkucm93O1xyXG4gICAgICAgICAgICBkZWxldGUocHJvZHVjdG9BQ2xvbmFyLnByb2R1Y3RvKTtcclxuICAgICAgICAgICAgZGVsZXRlKHByb2R1Y3RvQUNsb25hci5zdG9jayk7XHJcbiAgICAgICAgICAgIGRlbGV0ZShwcm9kdWN0b0FDbG9uYXIuc3RvY2tfbWluaW1vKTtcclxuICAgICAgICAgICAgZGVsZXRlKHByb2R1Y3RvQUNsb25hci5zdG9ja19tYXhpbW8pO1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG9LZXlzPVtdO1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG9WYWx1ZXM9W107XHJcbiAgICAgICAgICAgIGZvcihsZXQga2V5IGluIHByb2R1Y3RvQUNsb25hcil7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b0tleXMucHVzaChiZS5kYi5xdW90ZUlkZW50KGtleSkpO1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9WYWx1ZXMucHVzaChiZS5kYi5xdW90ZU51bGxhYmxlKHByb2R1Y3RvQUNsb25hcltrZXldKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHByb2R1Y3RvTnVldm8gPSAoYXdhaXQgY2xpZW50LnF1ZXJ5KGBpbnNlcnQgaW50byBwcm9kdWN0b3MgKCR7cHJvZHVjdG9LZXlzLmpvaW4oJywnKX0pIHZhbHVlcyAoJHtwcm9kdWN0b1ZhbHVlcy5qb2luKCcsJyl9KSByZXR1cm5pbmcgKmAsW10pLmZldGNoVW5pcXVlUm93KCkpLnJvd1xyXG4gICAgICAgICAgICAvL2Nsb25hY2lvbiBpbnN1bW9zXHJcbiAgICAgICAgICAgIHZhciBwcm9kdWN0b3NJbnN1bW9zQUNsb25hciA9IChhd2FpdCBjbGllbnQucXVlcnkoYHNlbGVjdCAqIGZyb20gcHJvZHVjdG9zX2luc3Vtb3Mgd2hlcmUgcHJvZHVjdG8gPSAkMWAsW3Byb2R1Y3RvXSkuZmV0Y2hBbGwoKSkucm93cztcclxuICAgICAgICAgICAgdmFyIHByb2RJbnN1bW9zTnVldm9zPVtdO1xyXG4gICAgICAgICAgICBmb3IodmFyIHByb2RJbnN1bW8gb2YgcHJvZHVjdG9zSW5zdW1vc0FDbG9uYXIpe1xyXG4gICAgICAgICAgICAgICAgcHJvZEluc3Vtby5wcm9kdWN0bz1wcm9kdWN0b051ZXZvLnByb2R1Y3RvO1xyXG4gICAgICAgICAgICAgICAgdmFyIHByb2RJbnN1bW9LZXlzPVtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIHByb2RJbnN1bW9WYWx1ZXM9W107XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGtleSBpbiBwcm9kSW5zdW1vKXtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kSW5zdW1vS2V5cy5wdXNoKGJlLmRiLnF1b3RlSWRlbnQoa2V5KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZEluc3Vtb1ZhbHVlcy5wdXNoKGJlLmRiLnF1b3RlTnVsbGFibGUocHJvZEluc3Vtb1trZXldKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwcm9kSW5zdW1vc051ZXZvcy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgaW50byBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc19pbnN1bW9zICgke3Byb2RJbnN1bW9LZXlzLmpvaW4oJywnKX0pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICgke3Byb2RJbnN1bW9WYWx1ZXMuam9pbignLCcpfSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsW10pLmZldGNoVW5pcXVlUm93KClcclxuICAgICAgICAgICAgICAgICAgICApLnJvd1xyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7ZXN0YWRvOidvaycsIHByb2R1Y3RvTnVldm8sIHByb2RJbnN1bW9zTnVldm9zfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ29iamVjdF9nZXQnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAge25hbWU6J3RhYmxlbmFtZScgICAgICwgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAge25hbWU6J3BrX3ZhbHVlcycgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBjb3JlRnVuY3Rpb25QYXJhbWV0ZXJzKXtcclxuICAgICAgICAgICAgdmFyIGNsaWVudD1jb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gc3FsVG9vbHMuc3RydWN0dXJlZERhdGEuc3FsUmVhZChwYXJhbWV0ZXJzLnBrX3ZhbHVlcywgY3JlYXRlU3RydWN0dXJlKGNvbnRleHQsIHBhcmFtZXRlcnMudGFibGVuYW1lKSk7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkocXVlcnkpLmZldGNoVW5pcXVlVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SJyxlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246J29iamVjdF9zYXZlJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOltcclxuICAgICAgICAgICAge25hbWU6J3RhYmxlbmFtZScgICAsIHR5cGVOYW1lOid0ZXh0J30sXHJcbiAgICAgICAgICAgIHtuYW1lOidkYXRvcycgICAgICAgLCB0eXBlTmFtZTonanNvbmInfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVycyl7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgcXVlcmllcyA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFdyaXRlKHBhcmFtZXRlcnMuZGF0b3MsIGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBwYXJhbWV0ZXJzLnRhYmxlbmFtZSkpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiMjIyMjIyMjIyMjIyNcIixxdWVyaWVzKVxyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcXVlcmllcy5yZWR1Y2UoZnVuY3Rpb24ocHJvbWlzZTpQcm9taXNlPGFueT4sIHF1ZXJ5OnN0cmluZyl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQucXVlcnkocXVlcnkpLmV4ZWN1dGUoKS50aGVuKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oYXN5bmMgZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIC8vVE9ETzogdHJhZXIganNvbiByZWZyZXNjYWRvXHJcbiAgICAgICAgICAgICAgICAvL3ZhciByZXN1bHQgPSBhd2FpdCBiZS5wcm9jZWR1cmUub2JqZWN0X2dldC5jb3JlRnVuY3Rpb24oY29udGV4dCwge3RhYmxlbmFtZTpwYXJhbWV0ZXJzLnRhYmxlbmFtZSwgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyOkVycm9yKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRU5UUkEgRU4gRUwgQ0FUQ0g6IFwiLGVycilcclxuICAgICAgICAgICAgICAgIHRocm93IGVyclxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbl07Il19
@@ -12,4 +12,4 @@
12
12
  const app_contable_1 = require("./app-contable");
13
13
  new app_contable_1.AppContable().start();
14
14
  });
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNvbnRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zZXJ2ZXItY29udGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0lBQUEsWUFBWSxDQUFDOztJQUViLGlEQUE0QztJQUU1QyxJQUFJLDBCQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgQXBwQ29udGFibGV9IGZyb20gXCIuL2FwcC1jb250YWJsZVwiO1xyXG5cclxubmV3IEFwcENvbnRhYmxlKCkuc3RhcnQoKTtcclxuXHJcbiJdfQ==
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNvbnRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci9zZXJ2ZXItY29udGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0lBQUEsWUFBWSxDQUFDOztJQUViLGlEQUE0QztJQUU1QyxJQUFJLDBCQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IHsgQXBwQ29udGFibGV9IGZyb20gXCIuL2FwcC1jb250YWJsZVwiO1xyXG5cclxubmV3IEFwcENvbnRhYmxlKCkuc3RhcnQoKTtcclxuXHJcbiJdfQ==
@@ -0,0 +1,29 @@
1
+ (function (factory) {
2
+ if (typeof module === "object" && typeof module.exports === "object") {
3
+ var v = factory(require, exports);
4
+ if (v !== undefined) module.exports = v;
5
+ }
6
+ else if (typeof define === "function" && define.amd) {
7
+ define(["require", "exports"], factory);
8
+ }
9
+ })(function (require, exports) {
10
+ "use strict";
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.categorias_producto = categorias_producto;
13
+ function categorias_producto(context) {
14
+ var admin = context.user.rol === 'admin';
15
+ return {
16
+ name: 'categorias_producto',
17
+ allow: {
18
+ "vertical-edit": false,
19
+ },
20
+ editable: admin,
21
+ fields: [
22
+ { name: 'categoria', typeName: 'text', nullable: false },
23
+ { name: 'nombre', typeName: 'text', isName: true, nullable: false },
24
+ ],
25
+ primaryKey: ['categoria']
26
+ };
27
+ }
28
+ });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY2F0ZWdvcmlhc19wcm9kdWN0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvdGFibGUtY2F0ZWdvcmlhc19wcm9kdWN0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7SUFBQSxZQUFZLENBQUM7O0lBSWIsa0RBY0M7SUFkRCxTQUFnQixtQkFBbUIsQ0FBQyxPQUFvQjtRQUNwRCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBRyxPQUFPLENBQUM7UUFDdkMsT0FBTztZQUNILElBQUksRUFBQyxxQkFBcUI7WUFDMUIsS0FBSyxFQUFDO2dCQUNGLGVBQWUsRUFBQyxLQUFLO2FBQ3hCO1lBQ0QsUUFBUSxFQUFDLEtBQUs7WUFDZCxNQUFNLEVBQUM7Z0JBQ0gsRUFBQyxJQUFJLEVBQUMsV0FBVyxFQUFLLFFBQVEsRUFBQyxNQUFNLEVBQUcsUUFBUSxFQUFDLEtBQUssRUFBQztnQkFDdkQsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFRLFFBQVEsRUFBQyxNQUFNLEVBQUcsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsS0FBSyxFQUFDO2FBQ3ZFO1lBQ0QsVUFBVSxFQUFDLENBQUMsV0FBVyxDQUFDO1NBQzNCLENBQUM7SUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7VGFibGVEZWZpbml0aW9uLCBUYWJsZUNvbnRleHR9IGZyb20gXCIuL3R5cGVzLWNvbnRhYmxlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpYXNfcHJvZHVjdG8oY29udGV4dDpUYWJsZUNvbnRleHQpOlRhYmxlRGVmaW5pdGlvbntcbiAgICB2YXIgYWRtaW4gPSBjb250ZXh0LnVzZXIucm9sPT09J2FkbWluJztcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOidjYXRlZ29yaWFzX3Byb2R1Y3RvJyxcbiAgICAgICAgYWxsb3c6e1xuICAgICAgICAgICAgXCJ2ZXJ0aWNhbC1lZGl0XCI6ZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGVkaXRhYmxlOmFkbWluLFxuICAgICAgICBmaWVsZHM6W1xuICAgICAgICAgICAge25hbWU6J2NhdGVnb3JpYScgICAsIHR5cGVOYW1lOid0ZXh0JyAsIG51bGxhYmxlOmZhbHNlfSxcbiAgICAgICAgICAgIHtuYW1lOidub21icmUnICAgICAgLCB0eXBlTmFtZTondGV4dCcgLCBpc05hbWU6dHJ1ZSwgbnVsbGFibGU6ZmFsc2V9LFxuICAgICAgICBdLFxuICAgICAgICBwcmltYXJ5S2V5OlsnY2F0ZWdvcmlhJ11cbiAgICB9O1xufVxuIl19