sonamu 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +2 -1
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +6 -1
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +178 -409
  44. package/dist/api/config.d.ts +27 -13
  45. package/dist/api/config.d.ts.map +1 -1
  46. package/dist/api/config.js +19 -26
  47. package/dist/api/context.d.ts +4 -3
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +1 -1
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +111 -18
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +3 -3
  56. package/dist/api/sonamu.d.ts +7 -7
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +83 -51
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +5 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +5 -2
  65. package/dist/bin/cli.js +165 -64
  66. package/dist/bin/loader-register.d.ts +2 -0
  67. package/dist/bin/loader-register.d.ts.map +1 -0
  68. package/dist/bin/loader-register.js +34 -0
  69. package/dist/database/_batch_update.d.ts +5 -3
  70. package/dist/database/_batch_update.d.ts.map +1 -1
  71. package/dist/database/_batch_update.js +30 -13
  72. package/dist/database/base-model.d.ts +96 -10
  73. package/dist/database/base-model.d.ts.map +1 -1
  74. package/dist/database/base-model.js +232 -89
  75. package/dist/database/base-model.types.d.ts +93 -0
  76. package/dist/database/base-model.types.d.ts.map +1 -0
  77. package/dist/database/base-model.types.js +10 -0
  78. package/dist/database/code-generator.d.ts +1 -1
  79. package/dist/database/code-generator.d.ts.map +1 -1
  80. package/dist/database/code-generator.js +11 -10
  81. package/dist/database/db.d.ts +5 -6
  82. package/dist/database/db.d.ts.map +1 -1
  83. package/dist/database/db.js +22 -25
  84. package/dist/database/puri-subset.test-d.js +81 -0
  85. package/dist/database/puri-subset.types.d.ts +123 -0
  86. package/dist/database/puri-subset.types.d.ts.map +1 -0
  87. package/dist/database/puri-subset.types.js +16 -0
  88. package/dist/database/puri-wrapper.d.ts +13 -11
  89. package/dist/database/puri-wrapper.d.ts.map +1 -1
  90. package/dist/database/puri-wrapper.js +2 -2
  91. package/dist/database/puri.d.ts +25 -14
  92. package/dist/database/puri.d.ts.map +1 -1
  93. package/dist/database/puri.js +83 -21
  94. package/dist/database/puri.types.d.ts +21 -7
  95. package/dist/database/puri.types.d.ts.map +1 -1
  96. package/dist/database/puri.types.js +4 -1
  97. package/dist/database/transaction-context.d.ts +1 -1
  98. package/dist/database/transaction-context.d.ts.map +1 -1
  99. package/dist/database/transaction-context.js +1 -1
  100. package/dist/database/upsert-builder.d.ts +9 -3
  101. package/dist/database/upsert-builder.d.ts.map +1 -1
  102. package/dist/database/upsert-builder.js +227 -78
  103. package/dist/entity/entity-manager.d.ts +165 -2
  104. package/dist/entity/entity-manager.d.ts.map +1 -1
  105. package/dist/entity/entity-manager.js +26 -10
  106. package/dist/entity/entity.d.ts +5 -3
  107. package/dist/entity/entity.d.ts.map +1 -1
  108. package/dist/entity/entity.js +153 -54
  109. package/dist/exceptions/error-handler.d.ts +1 -1
  110. package/dist/exceptions/error-handler.d.ts.map +1 -1
  111. package/dist/exceptions/error-handler.js +1 -1
  112. package/dist/exceptions/so-exceptions.d.ts +1 -1
  113. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  114. package/dist/exceptions/so-exceptions.js +1 -1
  115. package/dist/file-storage/driver.d.ts +1 -1
  116. package/dist/file-storage/driver.d.ts.map +1 -1
  117. package/dist/file-storage/driver.js +1 -1
  118. package/dist/file-storage/file-storage.js +2 -2
  119. package/dist/index.d.ts +18 -11
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +19 -13
  122. package/dist/migration/code-generation.d.ts +1 -1
  123. package/dist/migration/code-generation.d.ts.map +1 -1
  124. package/dist/migration/code-generation.js +123 -67
  125. package/dist/migration/migration-set.d.ts +2 -10
  126. package/dist/migration/migration-set.d.ts.map +1 -1
  127. package/dist/migration/migration-set.js +67 -218
  128. package/dist/migration/migrator.d.ts +24 -73
  129. package/dist/migration/migrator.d.ts.map +1 -1
  130. package/dist/migration/migrator.js +121 -301
  131. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  132. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  133. package/dist/migration/postgresql-schema-reader.js +245 -0
  134. package/dist/migration/types.d.ts +6 -38
  135. package/dist/migration/types.d.ts.map +1 -1
  136. package/dist/migration/types.js +1 -1
  137. package/dist/naite/messaging-types.d.ts +43 -0
  138. package/dist/naite/messaging-types.d.ts.map +1 -0
  139. package/dist/naite/messaging-types.js +7 -0
  140. package/dist/naite/naite-reporter.d.ts +41 -0
  141. package/dist/naite/naite-reporter.d.ts.map +1 -0
  142. package/dist/naite/naite-reporter.js +102 -0
  143. package/dist/naite/naite.d.ts +91 -8
  144. package/dist/naite/naite.d.ts.map +1 -1
  145. package/dist/naite/naite.js +285 -41
  146. package/dist/stream/sse.d.ts +2 -2
  147. package/dist/stream/sse.d.ts.map +1 -1
  148. package/dist/stream/sse.js +1 -1
  149. package/dist/syncer/api-parser.d.ts +3 -13
  150. package/dist/syncer/api-parser.d.ts.map +1 -1
  151. package/dist/syncer/api-parser.js +67 -56
  152. package/dist/syncer/checksum.d.ts +2 -2
  153. package/dist/syncer/checksum.d.ts.map +1 -1
  154. package/dist/syncer/checksum.js +11 -11
  155. package/dist/syncer/code-generator.d.ts +3 -3
  156. package/dist/syncer/code-generator.d.ts.map +1 -1
  157. package/dist/syncer/code-generator.js +37 -17
  158. package/dist/syncer/entity-operations.d.ts +2 -2
  159. package/dist/syncer/entity-operations.d.ts.map +1 -1
  160. package/dist/syncer/entity-operations.js +9 -8
  161. package/dist/syncer/file-patterns.d.ts +1 -1
  162. package/dist/syncer/file-patterns.d.ts.map +1 -1
  163. package/dist/syncer/file-patterns.js +1 -1
  164. package/dist/syncer/index.d.ts +4 -4
  165. package/dist/syncer/index.d.ts.map +1 -1
  166. package/dist/syncer/index.js +5 -5
  167. package/dist/syncer/module-loader.d.ts +4 -4
  168. package/dist/syncer/module-loader.d.ts.map +1 -1
  169. package/dist/syncer/module-loader.js +17 -12
  170. package/dist/syncer/syncer.d.ts +31 -24
  171. package/dist/syncer/syncer.d.ts.map +1 -1
  172. package/dist/syncer/syncer.js +92 -45
  173. package/dist/template/entity-converter.d.ts +1 -1
  174. package/dist/template/entity-converter.d.ts.map +1 -1
  175. package/dist/template/entity-converter.js +15 -8
  176. package/dist/template/helpers.d.ts +2 -2
  177. package/dist/template/helpers.d.ts.map +1 -1
  178. package/dist/template/helpers.js +3 -3
  179. package/dist/template/implementations/entity.template.d.ts +2 -2
  180. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  181. package/dist/template/implementations/entity.template.js +4 -5
  182. package/dist/template/implementations/generated.template.d.ts +2 -3
  183. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  184. package/dist/template/implementations/generated.template.js +46 -29
  185. package/dist/template/implementations/generated_http.template.d.ts +2 -3
  186. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  187. package/dist/template/implementations/generated_http.template.js +9 -9
  188. package/dist/template/implementations/generated_sso.template.d.ts +3 -4
  189. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  190. package/dist/template/implementations/generated_sso.template.js +54 -25
  191. package/dist/template/implementations/init_types.template.d.ts +2 -2
  192. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  193. package/dist/template/implementations/init_types.template.js +2 -2
  194. package/dist/template/implementations/model.template.d.ts +2 -2
  195. package/dist/template/implementations/model.template.d.ts.map +1 -1
  196. package/dist/template/implementations/model.template.js +47 -37
  197. package/dist/template/implementations/model_test.template.d.ts +2 -2
  198. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  199. package/dist/template/implementations/model_test.template.js +2 -2
  200. package/dist/template/implementations/service.template.d.ts +4 -4
  201. package/dist/template/implementations/service.template.d.ts.map +1 -1
  202. package/dist/template/implementations/service.template.js +24 -16
  203. package/dist/template/implementations/view_enums_buttonset.template.d.ts +2 -2
  204. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -1
  205. package/dist/template/implementations/view_enums_buttonset.template.js +1 -1
  206. package/dist/template/implementations/view_enums_dropdown.template.d.ts +2 -2
  207. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -1
  208. package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
  209. package/dist/template/implementations/view_enums_select.template.d.ts +2 -2
  210. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
  211. package/dist/template/implementations/view_enums_select.template.js +2 -2
  212. package/dist/template/implementations/view_form.template.d.ts +2 -2
  213. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  214. package/dist/template/implementations/view_form.template.js +4 -4
  215. package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
  216. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  217. package/dist/template/implementations/view_id_all_select.template.js +1 -1
  218. package/dist/template/implementations/view_id_async_select.template.d.ts +2 -2
  219. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
  220. package/dist/template/implementations/view_id_async_select.template.js +1 -1
  221. package/dist/template/implementations/view_list.template.d.ts +2 -2
  222. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  223. package/dist/template/implementations/view_list.template.js +29 -19
  224. package/dist/template/implementations/view_list_columns.template.d.ts +3 -3
  225. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -1
  226. package/dist/template/implementations/view_list_columns.template.js +1 -1
  227. package/dist/template/implementations/view_search_input.template.d.ts +2 -2
  228. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  229. package/dist/template/implementations/view_search_input.template.js +1 -1
  230. package/dist/template/index.d.ts +4 -2
  231. package/dist/template/index.d.ts.map +1 -1
  232. package/dist/template/index.js +5 -3
  233. package/dist/template/template-manager.d.ts +56 -0
  234. package/dist/template/template-manager.d.ts.map +1 -0
  235. package/dist/template/template-manager.js +125 -0
  236. package/dist/template/template-types.d.ts +16 -0
  237. package/dist/template/template-types.d.ts.map +1 -0
  238. package/dist/template/template-types.js +7 -0
  239. package/dist/template/template.d.ts +12 -2
  240. package/dist/template/template.d.ts.map +1 -1
  241. package/dist/template/template.js +19 -6
  242. package/dist/template/zod-converter.d.ts +40 -7
  243. package/dist/template/zod-converter.d.ts.map +1 -1
  244. package/dist/template/zod-converter.js +386 -58
  245. package/dist/testing/_relation-graph.d.ts +1 -1
  246. package/dist/testing/_relation-graph.d.ts.map +1 -1
  247. package/dist/testing/_relation-graph.js +12 -3
  248. package/dist/testing/fixture-manager.d.ts +42 -11
  249. package/dist/testing/fixture-manager.d.ts.map +1 -1
  250. package/dist/testing/fixture-manager.js +338 -236
  251. package/dist/types/types.d.ts +709 -104
  252. package/dist/types/types.d.ts.map +1 -1
  253. package/dist/types/types.js +309 -52
  254. package/dist/typings/knex.d.js +2 -2
  255. package/dist/utils/async-utils.d.ts.map +1 -1
  256. package/dist/utils/async-utils.js +3 -3
  257. package/dist/utils/console-util.js +1 -1
  258. package/dist/utils/controller.d.ts +1 -0
  259. package/dist/utils/controller.d.ts.map +1 -1
  260. package/dist/utils/controller.js +4 -1
  261. package/dist/utils/esm-utils.d.ts +0 -6
  262. package/dist/utils/esm-utils.d.ts.map +1 -1
  263. package/dist/utils/esm-utils.js +2 -9
  264. package/dist/utils/formatter.d.ts +3 -0
  265. package/dist/utils/formatter.d.ts.map +1 -0
  266. package/dist/utils/formatter.js +110 -0
  267. package/dist/utils/fs-utils.d.ts +1 -1
  268. package/dist/utils/fs-utils.d.ts.map +1 -1
  269. package/dist/utils/fs-utils.js +1 -1
  270. package/dist/utils/lodash-able.d.ts.map +1 -1
  271. package/dist/utils/lodash-able.js +1 -1
  272. package/dist/utils/object-utils.d.ts +44 -0
  273. package/dist/utils/object-utils.d.ts.map +1 -0
  274. package/dist/utils/object-utils.js +191 -0
  275. package/dist/utils/path-utils.d.ts +1 -1
  276. package/dist/utils/path-utils.d.ts.map +1 -1
  277. package/dist/utils/path-utils.js +3 -3
  278. package/dist/utils/process-utils.js +1 -1
  279. package/dist/utils/sql-parser.d.ts +5 -1
  280. package/dist/utils/sql-parser.d.ts.map +1 -1
  281. package/dist/utils/sql-parser.js +14 -3
  282. package/dist/utils/type-utils.d.ts +23 -0
  283. package/dist/utils/type-utils.d.ts.map +1 -0
  284. package/dist/utils/type-utils.js +45 -0
  285. package/dist/utils/utils.d.ts +7 -1
  286. package/dist/utils/utils.d.ts.map +1 -1
  287. package/dist/utils/utils.js +44 -5
  288. package/dist/utils/zod-error.d.ts +1 -1
  289. package/dist/utils/zod-error.d.ts.map +1 -1
  290. package/dist/utils/zod-error.js +1 -1
  291. package/package.json +55 -30
  292. package/src/ai/agents/agent.ts +87 -0
  293. package/src/ai/agents/index.ts +2 -0
  294. package/src/ai/agents/types.ts +47 -0
  295. package/src/ai/index.ts +1 -0
  296. package/src/ai/providers/rtzr/api.ts +37 -0
  297. package/src/ai/providers/rtzr/error.ts +34 -0
  298. package/src/ai/providers/rtzr/index.ts +4 -0
  299. package/src/ai/providers/rtzr/model.ts +201 -0
  300. package/src/ai/providers/rtzr/options.ts +49 -0
  301. package/src/ai/providers/rtzr/provider.ts +91 -0
  302. package/src/ai/providers/rtzr/utils.ts +127 -0
  303. package/src/api/base-frame.ts +4 -2
  304. package/src/api/caster.ts +17 -23
  305. package/src/api/code-converters.ts +176 -533
  306. package/src/api/config.ts +39 -56
  307. package/src/api/context.ts +7 -18
  308. package/src/api/decorators.ts +175 -46
  309. package/src/api/index.ts +2 -2
  310. package/src/api/sonamu.ts +133 -124
  311. package/src/api/validator.ts +83 -0
  312. package/src/bin/build-config.ts +7 -1
  313. package/src/bin/cli.ts +192 -110
  314. package/src/bin/loader-register.ts +38 -0
  315. package/src/database/_batch_update.ts +46 -31
  316. package/src/database/base-model.ts +390 -182
  317. package/src/database/base-model.types.ts +155 -0
  318. package/src/database/code-generator.ts +13 -32
  319. package/src/database/db.ts +36 -50
  320. package/src/database/puri-subset.test-d.ts +471 -0
  321. package/src/database/puri-subset.types.ts +195 -0
  322. package/src/database/puri-wrapper.ts +58 -67
  323. package/src/database/puri.ts +182 -126
  324. package/src/database/puri.types.ts +64 -31
  325. package/src/database/transaction-context.ts +1 -1
  326. package/src/database/upsert-builder.ts +261 -132
  327. package/src/entity/entity-manager.ts +36 -28
  328. package/src/entity/entity.ts +330 -249
  329. package/src/exceptions/error-handler.ts +3 -3
  330. package/src/exceptions/so-exceptions.ts +11 -11
  331. package/src/file-storage/driver.ts +5 -5
  332. package/src/file-storage/file-storage.ts +2 -2
  333. package/src/index.ts +18 -12
  334. package/src/migration/code-generation.ts +185 -172
  335. package/src/migration/migration-set.ts +80 -293
  336. package/src/migration/migrator.ts +182 -425
  337. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  338. package/src/migration/postgresql-schema-reader.ts +310 -0
  339. package/src/migration/types.ts +6 -39
  340. package/src/naite/messaging-types.ts +51 -0
  341. package/src/naite/naite-reporter.ts +128 -0
  342. package/src/naite/naite.ts +378 -33
  343. package/src/shared/web.shared.ts.txt +20 -24
  344. package/src/stream/sse.ts +5 -5
  345. package/src/syncer/api-parser.ts +52 -69
  346. package/src/syncer/checksum.ts +25 -37
  347. package/src/syncer/code-generator.ts +58 -62
  348. package/src/syncer/entity-operations.ts +12 -15
  349. package/src/syncer/file-patterns.ts +2 -2
  350. package/src/syncer/index.ts +4 -4
  351. package/src/syncer/module-loader.ts +28 -25
  352. package/src/syncer/syncer.ts +155 -162
  353. package/src/template/entity-converter.ts +18 -27
  354. package/src/template/helpers.ts +8 -11
  355. package/src/template/implementations/entity.template.ts +6 -6
  356. package/src/template/implementations/generated.template.ts +99 -99
  357. package/src/template/implementations/generated_http.template.ts +21 -54
  358. package/src/template/implementations/generated_sso.template.ts +78 -65
  359. package/src/template/implementations/init_types.template.ts +4 -6
  360. package/src/template/implementations/model.template.ts +47 -38
  361. package/src/template/implementations/model_test.template.ts +3 -3
  362. package/src/template/implementations/service.template.ts +56 -80
  363. package/src/template/implementations/view_enums_buttonset.template.ts +2 -2
  364. package/src/template/implementations/view_enums_dropdown.template.ts +4 -4
  365. package/src/template/implementations/view_enums_select.template.ts +3 -3
  366. package/src/template/implementations/view_form.template.ts +34 -75
  367. package/src/template/implementations/view_id_all_select.template.ts +2 -2
  368. package/src/template/implementations/view_id_async_select.template.ts +9 -23
  369. package/src/template/implementations/view_list.template.ts +54 -95
  370. package/src/template/implementations/view_list_columns.template.ts +4 -10
  371. package/src/template/implementations/view_search_input.template.ts +2 -2
  372. package/src/template/index.ts +4 -2
  373. package/src/template/template-manager.ts +166 -0
  374. package/src/template/template-types.ts +16 -0
  375. package/src/template/template.ts +29 -10
  376. package/src/template/zod-converter.ts +459 -101
  377. package/src/testing/_relation-graph.ts +18 -11
  378. package/src/testing/fixture-manager.ts +468 -362
  379. package/src/types/types.ts +516 -248
  380. package/src/typings/knex.d.ts +7 -9
  381. package/src/utils/async-utils.ts +8 -12
  382. package/src/utils/console-util.ts +1 -1
  383. package/src/utils/controller.ts +3 -0
  384. package/src/utils/esm-utils.ts +8 -18
  385. package/src/utils/formatter.ts +109 -0
  386. package/src/utils/fs-utils.ts +1 -1
  387. package/src/utils/lodash-able.ts +1 -4
  388. package/src/utils/object-utils.ts +217 -0
  389. package/src/utils/path-utils.ts +3 -6
  390. package/src/utils/process-utils.ts +1 -1
  391. package/src/utils/sql-parser.ts +23 -5
  392. package/src/utils/type-utils.ts +83 -0
  393. package/src/utils/utils.ts +58 -9
  394. package/src/utils/zod-error.ts +3 -3
  395. package/dist/bin/cli-wrapper.d.ts +0 -3
  396. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  397. package/dist/bin/cli-wrapper.js +0 -72
  398. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  399. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  400. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -39
  401. package/dist/entity/entity-utils.d.ts +0 -61
  402. package/dist/entity/entity-utils.d.ts.map +0 -1
  403. package/dist/entity/entity-utils.js +0 -210
  404. package/src/bin/cli-wrapper.ts +0 -82
  405. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  406. package/src/entity/entity-utils.ts +0 -291
@@ -1,5 +1,5 @@
1
+ /** biome-ignore-all lint/suspicious/noThenProperty: Puri는 thenable 인터페이스를 구현하고 있습니다. */ /** biome-ignore-all lint/suspicious/noExplicitAny: Puri는 다양한 타입을 사용하고 있습니다. */ import assert from "assert";
1
2
  import chalk from "chalk";
2
- import assert from "assert";
3
3
  import { Naite } from "../naite/naite.js";
4
4
  export class Puri {
5
5
  knex;
@@ -35,7 +35,7 @@ export class Puri {
35
35
  return {
36
36
  _type: "sql_expression",
37
37
  _return: "number",
38
- _sql: `COUNT(${column})`
38
+ _sql: `COUNT(${column})::integer`
39
39
  };
40
40
  }
41
41
  static sum(column) {
@@ -147,6 +147,23 @@ export class Puri {
147
147
  this.knexQuery.select("*");
148
148
  return this;
149
149
  }
150
+ // CLEAR
151
+ clear(statement) {
152
+ this.knexQuery.clear(statement);
153
+ return this;
154
+ }
155
+ // knex에 없어서 직접 구현함
156
+ clearJoin(alias) {
157
+ this.knexQuery._statements = this.knexQuery._statements.filter((s)=>{
158
+ if ("joinType" in s) {
159
+ const [_alias, _table] = Object.entries(s.table)[0];
160
+ return _alias !== alias;
161
+ } else {
162
+ return true;
163
+ }
164
+ });
165
+ return this;
166
+ }
150
167
  // JOIN 실제 구현
151
168
  join(tableNameOrSpec, ...args) {
152
169
  return this.__commonJoin("join", tableNameOrSpec, ...args);
@@ -217,16 +234,17 @@ export class Puri {
217
234
  return this;
218
235
  }
219
236
  // WHERE: 컬럼 - 사용: .where("u.id", "like", "%test%")
220
- where(columnOrConditions, operatorOrValue, value) {
237
+ where(...args) {
238
+ const [columnOrConditions, operatorOrValue, value] = args;
221
239
  if (typeof columnOrConditions === "object") {
222
240
  this.knexQuery.where(columnOrConditions);
223
- } else if (arguments.length === 2) {
241
+ } else if (typeof value === "undefined") {
224
242
  if (operatorOrValue === null) {
225
243
  this.knexQuery.whereNull(columnOrConditions);
226
244
  return this;
227
245
  }
228
246
  this.knexQuery.where(columnOrConditions, operatorOrValue);
229
- } else if (arguments.length === 3) {
247
+ } else if (typeof value !== "undefined") {
230
248
  if (value === null) {
231
249
  if (operatorOrValue === "!=") {
232
250
  this.knexQuery.whereNotNull(columnOrConditions);
@@ -249,7 +267,7 @@ export class Puri {
249
267
  }
250
268
  // WHERE NOT IN
251
269
  whereNotIn(column, values) {
252
- this.knexQuery.whereIn(column, values);
270
+ this.knexQuery.whereNotIn(column, values);
253
271
  return this;
254
272
  }
255
273
  // WHERE MATCH
@@ -295,10 +313,10 @@ export class Puri {
295
313
  having(...conditions) {
296
314
  if (conditions.length === 1) {
297
315
  // having("COUNT(*) > 10")
298
- this.knexQuery.having(conditions[0]);
316
+ this.knexQuery.having(this.knex.raw(conditions[0]));
299
317
  } else if (conditions.length === 3) {
300
318
  // having("count", ">", 10)
301
- this.knexQuery.having(conditions[0], conditions[1], conditions[2]);
319
+ this.knexQuery.having(this.knex.raw(conditions[0]), conditions[1], this.knex.raw(conditions[2]));
302
320
  } else {
303
321
  throw new Error("Invalid having arguments");
304
322
  }
@@ -306,7 +324,7 @@ export class Puri {
306
324
  }
307
325
  // 실행 메서드들 - thenable 구현
308
326
  then(onfulfilled, onrejected) {
309
- Naite.t("puri-query", this.toQuery());
327
+ Naite.t("puri:executed-query", this.toQuery());
310
328
  return this.knexQuery.then(onfulfilled, onrejected);
311
329
  }
312
330
  catch(onrejected) {
@@ -318,22 +336,22 @@ export class Puri {
318
336
  // 하나만 쿼리
319
337
  first() {
320
338
  this.knexQuery.first();
321
- return new ResolvedPuri(this.knexQuery);
339
+ return new ResolvedPuri(this.knexQuery, this.knex);
322
340
  }
323
341
  // 쿼리한 레코드에서 특정 컬럼만 추출한 배열 리턴
324
342
  pluck(column) {
325
343
  this.knexQuery.pluck(column);
326
- return new ResolvedPuri(this.knexQuery);
344
+ return new ResolvedPuri(this.knexQuery, this.knex);
327
345
  }
328
346
  // INSERT
329
347
  insert(data) {
330
348
  this.knexQuery.insert(data);
331
- return new ResolvedPuri(this.knexQuery);
349
+ return new ResolvedPuri(this.knexQuery, this.knex);
332
350
  }
333
351
  // UPDATE
334
352
  update(data) {
335
353
  this.knexQuery.update(data);
336
- return new ResolvedPuri(this.knexQuery);
354
+ return new ResolvedPuri(this.knexQuery, this.knex);
337
355
  }
338
356
  // Increment
339
357
  increment(column, value) {
@@ -341,7 +359,7 @@ export class Puri {
341
359
  throw new Error("Increment value must be greater than 0");
342
360
  }
343
361
  this.knexQuery.increment(column, value);
344
- return new ResolvedPuri(this.knexQuery);
362
+ return new ResolvedPuri(this.knexQuery, this.knex);
345
363
  }
346
364
  // Decrement
347
365
  decrement(column, value) {
@@ -349,12 +367,12 @@ export class Puri {
349
367
  throw new Error("Decrement value must be greater than 0");
350
368
  }
351
369
  this.knexQuery.decrement(column, value);
352
- return new ResolvedPuri(this.knexQuery);
370
+ return new ResolvedPuri(this.knexQuery, this.knex);
353
371
  }
354
372
  // DELETE
355
373
  delete() {
356
374
  this.knexQuery.delete();
357
- return new ResolvedPuri(this.knexQuery);
375
+ return new ResolvedPuri(this.knexQuery, this.knex);
358
376
  }
359
377
  // 확인 쿼리 리턴
360
378
  toQuery() {
@@ -365,6 +383,12 @@ export class Puri {
365
383
  console.log(`${chalk.cyan("[Puri Debug]")} ${chalk.yellow(this.toQuery())}`);
366
384
  return this;
367
385
  }
386
+ clone() {
387
+ // 'dual'은 더미 테이블이며, 바로 아래 줄에서 knexQuery가 덮어씌워집니다.
388
+ const newPuri = new Puri(this.knex, "dual");
389
+ newPuri.knexQuery = this.knexQuery.clone();
390
+ return newPuri;
391
+ }
368
392
  formatSQL(unformatted) {
369
393
  // SQL 예약어 목록
370
394
  const keywords = [
@@ -441,7 +465,7 @@ export class Puri {
441
465
  const lines = formatted.split("\n");
442
466
  const indentedLines = [];
443
467
  let indentLevel = 0;
444
- for (let line of lines){
468
+ for (const line of lines){
445
469
  const trimmedLine = line.trim();
446
470
  if (!trimmedLine) continue;
447
471
  // 닫는 괄호가 있으면 들여쓰기 레벨 감소
@@ -511,11 +535,13 @@ export class JoinClauseGroup {
511
535
  }
512
536
  /*
513
537
  TResolved: 쿼리 실행 후 반환될 결과 타입
514
- _TReturning: 추후 RETURNING 절에 사용될 타입
538
+ TReturning: RETURNING 절에 사용될 타입
515
539
  */ export class ResolvedPuri {
516
540
  knexQuery;
517
- constructor(knexQuery){
541
+ knex;
542
+ constructor(knexQuery, knex){
518
543
  this.knexQuery = knexQuery;
544
+ this.knex = knex;
519
545
  }
520
546
  toQuery() {
521
547
  return this.knexQuery.toQuery();
@@ -525,7 +551,7 @@ export class JoinClauseGroup {
525
551
  return this;
526
552
  }
527
553
  then(onfulfilled, onrejected) {
528
- Naite.t("puri-query", this.toQuery());
554
+ Naite.t("puri:executed-query", this.toQuery());
529
555
  return this.knexQuery.then(onfulfilled, onrejected);
530
556
  }
531
557
  catch(onrejected) {
@@ -534,6 +560,42 @@ export class JoinClauseGroup {
534
560
  finally(onfinally) {
535
561
  return this.knexQuery.finally(onfinally);
536
562
  }
563
+ // ON CONFLICT - 컬럼 기반
564
+ onConflict(columns, action) {
565
+ const target = Array.isArray(columns) ? columns : [
566
+ columns
567
+ ];
568
+ if (!action || action === "nothing") {
569
+ // DO NOTHING
570
+ this.knexQuery.onConflict(target).ignore();
571
+ } else {
572
+ // DO UPDATE
573
+ const { update } = action;
574
+ // action.update 배열 형태 : ["name", "email"]
575
+ if (Array.isArray(update)) {
576
+ this.knexQuery.onConflict(target).merge(update);
577
+ } else {
578
+ // action.update 객체 형태: { name: "John", count: raw(...) }
579
+ const mergeObj = {};
580
+ for (const [key, value] of Object.entries(update)){
581
+ if (value && typeof value === "object" && "_type" in value && value._type === "sql_expression") {
582
+ // SqlExpression → knex.raw()로 변환
583
+ mergeObj[key] = this.knex.raw(value._sql);
584
+ } else {
585
+ // 일반 값
586
+ mergeObj[key] = value;
587
+ }
588
+ }
589
+ this.knexQuery.onConflict(target).merge(mergeObj);
590
+ }
591
+ }
592
+ return this;
593
+ }
594
+ // RETURNING 구현
595
+ returning(columnOrColumns) {
596
+ this.knexQuery.returning(columnOrColumns);
597
+ return new ResolvedPuri(this.knexQuery, this.knex);
598
+ }
537
599
  }
538
600
 
539
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF2YWlsYWJsZUNvbHVtbnMsXG4gIFNlbGVjdE9iamVjdCxcbiAgUGFyc2VTZWxlY3RPYmplY3QsXG4gIFdoZXJlQ29uZGl0aW9uLFxuICBDb21wYXJpc29uT3BlcmF0b3IsXG4gIEV4dHJhY3RDb2x1bW5UeXBlLFxuICBTcWxFeHByZXNzaW9uLFxuICBFeHBhbmQsXG4gIEZ1bGx0ZXh0Q29sdW1ucyxcbiAgUmVzdWx0QXZhaWxhYmxlQ29sdW1ucyxcbiAgSW5zZXJ0RGF0YSxcbiAgU2luZ2xlVGFibGVWYWx1ZSxcbn0gZnJvbSBcIi4vcHVyaS50eXBlc1wiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuXG5leHBvcnQgY2xhc3MgUHVyaTxUU2NoZW1hLCBUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgVFJlc3VsdD4ge1xuICBwcml2YXRlIGtuZXhRdWVyeTogS25leC5RdWVyeUJ1aWxkZXI7XG5cbiAgLy8g7IOd7ISx7J6QIOyLnOq3uOuLiOyymOuTpFxuICBjb25zdHJ1Y3RvcihrbmV4OiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZyk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGtuZXg6IEtuZXgsXG4gICAgdGFibGVTcGVjOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBQdXJpPFRTY2hlbWEsIGFueSwgYW55Pj5cbiAgKTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtuZXg6IEtuZXgsXG4gICAgdGFibGVOYW1lT3JTcGVjOiBhbnlcbiAgKSB7XG4gICAgaWYgKHR5cGVvZiB0YWJsZU5hbWVPclNwZWMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIC8vIENhc2U6IG5ldyBQdXJpKGtuZXgsIFwidXNlcnNcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4KHRhYmxlTmFtZU9yU3BlYykuZnJvbSh0YWJsZU5hbWVPclNwZWMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhYmxlTmFtZU9yU3BlYyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlTmFtZU9yU3BlYyk7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFibGUgc3BlYyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZW50cnlcIik7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZW50cmllc1swXSk7XG4gICAgICBjb25zdCBbYWxpYXMsIHNwZWNdID0gZW50cmllc1swXTtcbiAgICAgIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leChzcGVjKS5mcm9tKHsgW2FsaWFzXTogc3BlYyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIFB1cmkpIHtcbiAgICAgICAgY29uc3Qgc3VicXVlcnlCdWlsZGVyID0gc3BlYy5yYXcoKTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXguZnJvbShzdWJxdWVyeUJ1aWxkZXIuYXMoYWxpYXMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpYyBTUUwgaGVscGVyIGZ1bmN0aW9ucyBmb3IgU0VMRUNUXG4gIHN0YXRpYyBjb3VudChjb2x1bW46IHN0cmluZyA9IFwiKlwiKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYENPVU5UKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHN1bShjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBTVU0oJHtjb2x1bW59KWAsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgYXZnKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYEFWRygke2NvbHVtbn0pYCxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBtYXgoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgTUFYKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIG1pbihjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBNSU4oJHtjb2x1bW59KWAsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29uY2F0KC4uLmFyZ3M6IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYENPTkNBVCgke2FyZ3Muam9pbihcIiwgXCIpfSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwcGVyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYFVQUEVSKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGxvd2VyKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcInN0cmluZ1wiLFxuICAgICAgX3NxbDogYExPV0VSKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cblxuICAvLyBSYXcgZnVuY3Rpb25zIGZvciBTRUxFQ1RcbiAgc3RhdGljIHJhd1N0cmluZyhzcWw6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwic3RyaW5nXCIsIF9zcWw6IHNxbCB9O1xuICB9XG4gIHN0YXRpYyByYXdOdW1iZXIoc3FsOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcIm51bWJlclwiLCBfc3FsOiBzcWwgfTtcbiAgfVxuICBzdGF0aWMgcmF3Qm9vbGVhbihzcWw6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJib29sZWFuXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImJvb2xlYW5cIiwgX3NxbDogc3FsIH07XG4gIH1cbiAgc3RhdGljIHJhd0RhdGUoc3FsOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwiZGF0ZVwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJkYXRlXCIsIF9zcWw6IHNxbCB9O1xuICB9XG5cbiAgLy8gU0VMRUNUIChvdmVyd3JpdGUpXG4gIHNlbGVjdDxUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+PihcbiAgICBzZWxlY3RPYmo6IFRTZWxlY3RcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBQYXJzZVNlbGVjdE9iamVjdDxUVGFibGVzLCBUU2VsZWN0Pj4ge1xuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlbGVjdE9iaikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGNvbHVtbk9yRnVuY3Rpb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgY29sdW1uT3JGdW5jdGlvbi5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiXG4gICAgICApIHtcbiAgICAgICAgLy8gU1FMIO2VqOyImOyduCDqsr3smrBcbiAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKFxuICAgICAgICAgIHRoaXMua25leC5yYXcoYCR7Y29sdW1uT3JGdW5jdGlvbi5fc3FsfSBhcyAke2FsaWFzfWApXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDsnbzrsJgg7Lus65+87J24IOqyveyasFxuICAgICAgICBjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uT3JGdW5jdGlvbiBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChhbGlhcyA9PT0gY29sdW1uUGF0aCkge1xuICAgICAgICAgIC8vIGFsaWFz7JmAIOy7rOufvOuqheydtCDqsJnsnLzrqbQgYWxpYXMg7IOd6561XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGNvbHVtblBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFsaWFzIOyngOyglVxuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChgJHtjb2x1bW5QYXRofSBhcyAke2FsaWFzfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNlbGVjdENsYXVzZXMpO1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAoc2VsZWN064qUIG92ZXJ3cml0ZSwgYXBwZW5kU2VsZWN064qUIGFwcGVuZClcbiAgYXBwZW5kU2VsZWN0PFRTZWxlY3QgZXh0ZW5kcyBTZWxlY3RPYmplY3Q8VFRhYmxlcz4+KFxuICAgIHNlbGVjdE9iajogVFNlbGVjdFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQgJiBQYXJzZVNlbGVjdE9iamVjdDxUVGFibGVzLCBUU2VsZWN0Pj4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdChzZWxlY3RPYmopIGFzIGFueTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAqXG4gIHNlbGVjdEFsbCgpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXCIqXCIpO1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke2tleW9mIFRTdWJSZXN1bHQgJiBzdHJpbmd9YFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0PiwgLy8g7ISc67iM7L+866as7J2YIFRSZXN1bHRcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7a2V5b2YgVFNjaGVtYVtUSm9pblRhYmxlXSAmIHN0cmluZ31gXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyBUVGFibGVzIO2ZleyepSFcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtrZXlvZiBUU2NoZW1hW1RKb2luVGFibGVdICYgc3RyaW5nfWBcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIC8vIO2FjOydtOu4lOuqheydtCDtgqRcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzICsg7L2c67CxXG4gIGpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKFxuICAgICAgajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0Pj5cbiAgICApID0+IHZvaWRcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTjog7YWM7J2067iUICsgQWxpYXMgKyDsvZzrsLFcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChcbiAgICAgIGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4+XG4gICAgKSA9PiB2b2lkXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhSArIOy9nOuwsVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChcbiAgICAgIGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4+XG4gICAgKSA9PiB2b2lkXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEpPSU4g7Iuk7KCcIOq1rO2YhFxuICBqb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX19jb21tb25Kb2luKFwiam9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gTEVGVCBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhc1xuICBsZWZ0Sm9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7a2V5b2YgVFN1YlJlc3VsdCAmIHN0cmluZ31gXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtrZXlvZiBUU2NoZW1hW1RKb2luVGFibGVdICYgc3RyaW5nfWBcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIC8vIFRUYWJsZXMg7ZmV7J6lIVxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJTrqoVcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke2tleW9mIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBzdHJpbmd9YFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgLy8g7YWM7J2067iU66qF7J20IO2CpFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gTEVGVCBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhcyArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGNhbGxiYWNrOiAoXG4gICAgICBqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PlxuICAgICkgPT4gdm9pZFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lCArIEFsaWFzICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBjYWxsYmFjazogKFxuICAgICAgajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPj5cbiAgICApID0+IHZvaWRcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJTrqoUgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBjYWxsYmFjazogKFxuICAgICAgajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPj5cbiAgICApID0+IHZvaWRcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOIOyLpOygnCDqtaztmIRcbiAgbGVmdEpvaW4odGFibGVOYW1lT3JTcGVjOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fX2NvbW1vbkpvaW4oXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgX19jb21tb25Kb2luKFxuICAgIGpvaW5UeXBlOiBcImpvaW5cIiB8IFwibGVmdEpvaW5cIixcbiAgICB0YWJsZU5hbWVPclNwZWM6IGFueSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiB0aGlzIHtcbiAgICBpZiAodHlwZW9mIHRhYmxlTmFtZU9yU3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gQ2FzZSAxOiBqb2luKFwicG9zdHNcIiwgLi4uKVxuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lT3JTcGVjO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgY2FsbGJhY2spXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHRhYmxlTmFtZSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgbGVmdCwgcmlnaHQpXG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCBsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTcGVjID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvLyBDYXNlIDI6IGpvaW4oeyBhbGlhczogXCJ0YWJsZVwiIH0sIC4uLikgb3Igam9pbih7IGFsaWFzOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFtbYWxpYXMsIHNwZWNdXSA9IGVudHJpZXM7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAvLyDthYzsnbTruJQ6IGpvaW4oeyBwOiBcInBvc3RzXCIgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbXBsZVxuICAgICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNwZWMgaW5zdGFuY2VvZiBQdXJpKSB7XG4gICAgICAgIC8vIOyEnOu4jOy/vOumrDogam9pbih7IHNxOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3KCkuYXMoYWxpYXMpLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3KCkuYXMoYWxpYXMpLCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHNcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRTog6rCd7LK0IC0g7IKs7JqpOiAud2hlcmUoeyBcInUuaWRcIjogMSwgXCJ1LnN0YXR1c1wiOiBcImFjdGl2ZVwiIH0pXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCAxKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPlxuICApOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIFwiPlwiLCAxMClcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJsaWtlXCIgfCBcIm5vdCBsaWtlXCIsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+XG4gICk6IHRoaXM7XG4gIC8vIFdIRVJFOiDsu6zrn7wgLSDsgqzsmqk6IC53aGVyZShcInUuaWRcIiwgXCJsaWtlXCIsIFwiJXRlc3QlXCIpXG4gIHdoZXJlKGNvbHVtbk9yQ29uZGl0aW9uczogYW55LCBvcGVyYXRvck9yVmFsdWU/OiBhbnksIHZhbHVlPzogYW55KTogdGhpcyB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5PckNvbmRpdGlvbnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBcIiE9XCIpIHtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IFwiPVwiKSB7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgSU5cbiAgd2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXVxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZUluKGNvbHVtbiwgdmFsdWVzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBXSEVSRSBOT1QgSU5cbiAgd2hlcmVOb3RJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXVxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZUluKGNvbHVtbiwgdmFsdWVzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBXSEVSRSBNQVRDSFxuICB3aGVyZU1hdGNoPFRDb2x1bW4gZXh0ZW5kcyBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nXG4gICk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoY29sdW1uKX0pIEFHQUlOU1QgKD8pYCwgW3ZhbHVlXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSDqtITtmLgg6re466O57ZWRXG4gIHdoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoKGJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gbmV3IFdoZXJlR3JvdXA8VFRhYmxlcz4oYnVpbGRlcik7XG4gICAgICBjYWxsYmFjayhncm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5Lm9yV2hlcmUoKGJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gbmV3IFdoZXJlR3JvdXA8VFRhYmxlcz4oYnVpbGRlcik7XG4gICAgICBjYWxsYmFjayhncm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBPUkRFUiBCWVxuICBvcmRlckJ5PFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgZGlyZWN0aW9uOiBcImFzY1wiIHwgXCJkZXNjXCJcbiAgKTogdGhpcztcbiAgb3JkZXJCeShjb2x1bW46IHN0cmluZywgZGlyZWN0aW9uOiBcImFzY1wiIHwgXCJkZXNjXCIgPSBcImFzY1wiKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeShjb2x1bW4sIGRpcmVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDquLDrs7gg7L+866asIOuplOyEnOuTnOuTpFxuICBsaW1pdChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkubGltaXQoY291bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb2Zmc2V0KGNvdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5vZmZzZXQoY291bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gR1JPVVAgQllcbiAgZ3JvdXBCeTxUQ29sdW1ucyBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIC4uLmNvbHVtbnM6IFRDb2x1bW5zW11cbiAgKTogdGhpcztcbiAgZ3JvdXBCeSguLi5jb2x1bW5zOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5Lmdyb3VwQnkoLi4uKGNvbHVtbnMgYXMgc3RyaW5nW10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEhBVklOR1xuICBoYXZpbmcoY29uZGl0aW9uOiBzdHJpbmcpOiB0aGlzO1xuICBoYXZpbmc8VENvbHVtbiBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogdGhpcztcbiAgLy8gSEFWSU5HIOq1rO2YhFxuICBoYXZpbmcoLi4uY29uZGl0aW9uczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGhhdmluZyhcIkNPVU5UKCopID4gMTBcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5LmhhdmluZyhjb25kaXRpb25zWzBdKTtcbiAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBoYXZpbmcoXCJjb3VudFwiLCBcIj5cIiwgMTApXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcoY29uZGl0aW9uc1swXSwgY29uZGl0aW9uc1sxXSwgY29uZGl0aW9uc1syXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaGF2aW5nIGFyZ3VtZW50c1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDsi6Ttlokg66mU7ISc65Oc65OkIC0gdGhlbmFibGUg6rWs7ZiEXG4gIHRoZW48VFJlc3VsdDEgPSBFeHBhbmQ8VFJlc3VsdD5bXSwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OlxuICAgICAgfCAoKHZhbHVlOiBFeHBhbmQ8VFJlc3VsdD5bXSkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pXG4gICAgICB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmktcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGxcbiAgKTogUHJvbWlzZTxUUmVzdWx0IHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuY2F0Y2gob25yZWplY3RlZCk7XG4gIH1cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmZpbmFsbHkob25maW5hbGx5KTtcbiAgfVxuXG4gIC8vIO2VmOuCmOunjCDsv7zrpqxcbiAgZmlyc3QoKTogUmVzb2x2ZWRQdXJpPEV4cGFuZDxUUmVzdWx0PiwgbmV2ZXI+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5maXJzdCgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5KTtcbiAgfVxuXG4gIC8vIOy/vOumrO2VnCDroIjsvZTrk5zsl5DshJwg7Yq57KCVIOy7rOufvOunjCDstpTstpztlZwg67Cw7Je0IOumrO2EtFxuICBwbHVjazxcbiAgICBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdCB8IFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4sXG4gID4oXG4gICAgY29sdW1uOiBUQ29sdW1uXG4gICk6IFJlc29sdmVkUHVyaTxcbiAgICBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdFxuICAgICAgPyBUUmVzdWx0W1RDb2x1bW5dW11cbiAgICAgIDogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgICBuZXZlclxuICA+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5wbHVjayhjb2x1bW4gYXMgc3RyaW5nKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSk7XG4gIH1cblxuICAvLyBJTlNFUlRcbiAgaW5zZXJ0KFxuICAgIGRhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj5cbiAgKTogUmVzb2x2ZWRQdXJpPFtudW1iZXJdLCBuZXZlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5Lmluc2VydChkYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSk7XG4gIH1cblxuICAvLyBVUERBVEVcbiAgdXBkYXRlKGRhdGE6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogUmVzb2x2ZWRQdXJpPFRSZXN1bHQsIG51bWJlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnVwZGF0ZShkYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSk7XG4gIH1cblxuICAvLyBJbmNyZW1lbnRcbiAgaW5jcmVtZW50PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBuZXZlcj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuaW5jcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5KTtcbiAgfVxuICAvLyBEZWNyZW1lbnRcbiAgZGVjcmVtZW50PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBuZXZlcj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVjcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5KTtcbiAgfVxuXG4gIC8vIERFTEVURVxuICBkZWxldGUoKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgbmV2ZXI+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5kZWxldGUoKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSk7XG4gIH1cblxuICAvLyDtmZXsnbgg7L+866asIOumrO2EtFxuICB0b1F1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRvUXVlcnkoKTtcbiAgfVxuXG4gIC8vIOy/vOumrCDrlJTrsoTquYUg66Gc6re4IOy2nOugpVxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAke2NoYWxrLmN5YW4oXCJbUHVyaSBEZWJ1Z11cIil9ICR7Y2hhbGsueWVsbG93KHRoaXMudG9RdWVyeSgpKX1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZvcm1hdFNRTCh1bmZvcm1hdHRlZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBTUUwg7JiI7JW97Ja0IOuqqeuhnVxuICAgIGNvbnN0IGtleXdvcmRzID0gW1xuICAgICAgXCJTRUxFQ1RcIixcbiAgICAgIFwiRlJPTVwiLFxuICAgICAgXCJXSEVSRVwiLFxuICAgICAgXCJJTlNFUlRcIixcbiAgICAgIFwiSU5UT1wiLFxuICAgICAgXCJWQUxVRVNcIixcbiAgICAgIFwiVVBEQVRFXCIsXG4gICAgICBcIkRFTEVURVwiLFxuICAgICAgXCJDUkVBVEVcIixcbiAgICAgIFwiVEFCTEVcIixcbiAgICAgIFwiQUxURVJcIixcbiAgICAgIFwiRFJPUFwiLFxuICAgICAgXCJKT0lOXCIsXG4gICAgICBcIk9OXCIsXG4gICAgICBcIklOTkVSXCIsXG4gICAgICBcIkxFRlRcIixcbiAgICAgIFwiUklHSFRcIixcbiAgICAgIFwiRlVMTFwiLFxuICAgICAgXCJPVVRFUlwiLFxuICAgICAgXCJHUk9VUFwiLFxuICAgICAgXCJCWVwiLFxuICAgICAgXCJPUkRFUlwiLFxuICAgICAgXCJIQVZJTkdcIixcbiAgICAgIFwiRElTVElOQ1RcIixcbiAgICAgIFwiTElNSVRcIixcbiAgICAgIFwiT0ZGU0VUXCIsXG4gICAgICBcIkFTXCIsXG4gICAgICBcIkFORFwiLFxuICAgICAgXCJPUlwiLFxuICAgICAgXCJOT1RcIixcbiAgICAgIFwiSU5cIixcbiAgICAgIFwiTElLRVwiLFxuICAgICAgXCJJU1wiLFxuICAgICAgXCJOVUxMXCIsXG4gICAgICBcIkNBU0VcIixcbiAgICAgIFwiV0hFTlwiLFxuICAgICAgXCJUSEVOXCIsXG4gICAgICBcIkVMU0VcIixcbiAgICAgIFwiRU5EXCIsXG4gICAgICBcIlVOSU9OXCIsXG4gICAgICBcIkFMTFwiLFxuICAgICAgXCJFWElTVFNcIixcbiAgICAgIFwiQkVUV0VFTlwiLFxuICAgIF07XG5cbiAgICBsZXQgZm9ybWF0dGVkID0gdW5mb3JtYXR0ZWQ7XG5cbiAgICAvLyDsmIjslb3slrTrpbwg64yA66y47J6Q66GcIOuzgO2ZmFxuICAgIGtleXdvcmRzLmZvckVhY2goKGtleXdvcmQpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXGIke2tleXdvcmR9XFxcXGJgLCBcImdpXCIpO1xuICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UocmVnZXgsIGtleXdvcmQudG9VcHBlckNhc2UoKSk7XG4gICAgfSk7XG5cbiAgICAvLyDso7zsmpQg7KCIIOyVnuyXkCDspITrsJTqv4gg7LaU6rCAXG4gICAgY29uc3QgbWFqb3JDbGF1c2VzID0gW1xuICAgICAgXCJTRUxFQ1RcIixcbiAgICAgIFwiRlJPTVwiLFxuICAgICAgXCJXSEVSRVwiLFxuICAgICAgXCJHUk9VUCBCWVwiLFxuICAgICAgXCJPUkRFUiBCWVwiLFxuICAgICAgXCJIQVZJTkdcIixcbiAgICAgIFwiTElNSVRcIixcbiAgICAgIFwiVU5JT05cIixcbiAgICBdO1xuICAgIG1ham9yQ2xhdXNlcy5mb3JFYWNoKChjbGF1c2UpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXHMrKCR7Y2xhdXNlfSlcXFxccytgLCBcImdpXCIpO1xuICAgICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UocmVnZXgsIGBcXG4ke2NsYXVzZS50b1VwcGVyQ2FzZSgpfSBgKTtcbiAgICB9KTtcblxuICAgIC8vIEpPSU4g7KCIIOyymOumrFxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKFxuICAgICAgL1xccysoKD86SU5ORVJ8TEVGVHxSSUdIVHxGVUxMIE9VVEVSKVxccyspP0pPSU5cXHMrL2dpLFxuICAgICAgXCJcXG4kMUpPSU4gXCJcbiAgICApO1xuXG4gICAgLy8gQU5ELCBPUiDsobDqsbQg7LKY66asXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xccysoQU5EfE9SKVxccysvZ2ksIFwiXFxuICAkMSBcIik7XG5cbiAgICAvLyDqtITtmLgg7LKY66asIOuwjyDrk6Tsl6zsk7DquLBcbiAgICBjb25zdCBsaW5lcyA9IGZvcm1hdHRlZC5zcGxpdChcIlxcblwiKTtcbiAgICBjb25zdCBpbmRlbnRlZExpbmVzID0gW107XG4gICAgbGV0IGluZGVudExldmVsID0gMDtcblxuICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgICBpZiAoIXRyaW1tZWRMaW5lKSBjb250aW51ZTtcblxuICAgICAgLy8g64ur64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDqsJDshoxcbiAgICAgIGNvbnN0IGNsb3NpbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKS9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgY29uc3Qgb3BlbmluZ1BhcmVucyA9ICh0cmltbWVkTGluZS5tYXRjaCgvXFwoL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgIGlmIChjbG9zaW5nUGFyZW5zID4gMCAmJiBvcGVuaW5nUGFyZW5zID09PSAwKSB7XG4gICAgICAgIGluZGVudExldmVsID0gTWF0aC5tYXgoMCwgaW5kZW50TGV2ZWwgLSBjbG9zaW5nUGFyZW5zKTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIOuTpOyXrOyTsOq4sCDsoIHsmqlcbiAgICAgIGNvbnN0IGluZGVudCA9IFwiICBcIi5yZXBlYXQoaW5kZW50TGV2ZWwpO1xuICAgICAgaW5kZW50ZWRMaW5lcy5wdXNoKGluZGVudCArIHRyaW1tZWRMaW5lKTtcblxuICAgICAgLy8g7Jes64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDspp3qsIBcbiAgICAgIGlmIChvcGVuaW5nUGFyZW5zID4gY2xvc2luZ1BhcmVucykge1xuICAgICAgICBpbmRlbnRMZXZlbCArPSBvcGVuaW5nUGFyZW5zIC0gY2xvc2luZ1BhcmVucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZW50ZWRMaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgfVxuXG4gIC8vIEtuZXgg7L+866asIOu5jOuNlCDsp4HsoJEg7KCR6re8XG4gIHJhdygpOiBLbmV4LlF1ZXJ5QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXaGVyZUdyb3VwPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnVpbGRlcjogS25leC5RdWVyeUJ1aWxkZXIpIHt9XG5cbiAgLy8gd2hlcmUg66mU7ISc65Oc65OkXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5cbiAgKTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPlxuICApOiB0aGlzO1xuICB3aGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIG9yV2hlcmUg66mU7ISc65Oc65OkXG4gIG9yV2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+XG4gICk6IHRoaXM7XG4gIG9yV2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPlxuICApOiB0aGlzO1xuICBvcldoZXJlKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmUoYXJnc1swXSwgLi4uYXJncy5zbGljZSgxKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDspJHssqkg6re466O5XG4gIHdoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmUoKHN1YkJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwID0gbmV3IFdoZXJlR3JvdXA8VFRhYmxlcz4oc3ViQnVpbGRlcik7XG4gICAgICBjYWxsYmFjayhzdWJHcm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IHRoaXM7XG4gIG9yV2hlcmVHcm91cChcbiAgICBjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWRcbiAgKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmUoKHN1YkJ1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwID0gbmV3IFdoZXJlR3JvdXA8VFRhYmxlcz4oc3ViQnVpbGRlcik7XG4gICAgICBjYWxsYmFjayhzdWJHcm91cCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEpvaW5DbGF1c2VHcm91cDxcbiAgVExlZnQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUUmlnaHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsbGJhY2s6IEtuZXguSm9pbkNsYXVzZSkge31cblxuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsu6zrn7wgKOyXsOyCsOyekCkg7Lus65+8XG4gIG9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PlxuICApOiB0aGlzO1xuICAvLyBPTihBTkQpOiDsvZzrsLFcbiAgb24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUTGVmdCwgVFJpZ2h0PikgPT4gdm9pZCk6IHRoaXM7XG4gIC8vIE9OKEFORCkg6rWs7ZiEXG4gIG9uKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5jYWxsYmFjay5vbiguLi4oYXJncyBhcyBbc3RyaW5nLCBzdHJpbmddKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBPTihPUik6IOy7rOufvCA9IOy7rOufvFxuICBvck9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+KTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg7Lus65+8XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+XG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7L2c67CxXG4gIG9yT24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUTGVmdCwgVFJpZ2h0PikgPT4gdm9pZCk6IHRoaXM7XG4gIC8vIE9OKE9SKSDqtaztmIRcbiAgb3JPbiguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIHRoaXMuY2FsbGJhY2sub3JPbiguLi4oYXJncyBhcyBbc3RyaW5nLCBzdHJpbmddKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuLypcbiAgVFJlc29sdmVkOiDsv7zrpqwg7Iuk7ZaJIO2bhCDrsJjtmZjrkKAg6rKw6rO8IO2DgOyehVxuICBfVFJldHVybmluZzog7LaU7ZuEIFJFVFVSTklORyDsoIjsl5Ag7IKs7Jqp65CgIO2DgOyehVxuKi9cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZFB1cmk8VFJlc29sdmVkLCBfVFJldHVybmluZz4ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMga25leFF1ZXJ5OiBLbmV4LlF1ZXJ5QnVpbGRlcikge31cblxuICB0b1F1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRvUXVlcnkoKTtcbiAgfVxuXG4gIGRlYnVnKCk6IHRoaXMge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCR7Y2hhbGsuY3lhbihcIltQdXJpIERlYnVnXVwiKX0gJHtjaGFsay55ZWxsb3codGhpcy50b1F1ZXJ5KCkpfWBcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFRSZXNvbHZlZCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OlxuICAgICAgfCAoKHZhbHVlOiBUUmVzb2x2ZWQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KVxuICAgICAgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudGhlbihvbmZ1bGZpbGxlZCBhcyBhbnksIG9ucmVqZWN0ZWQpO1xuICB9XG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsXG4gICk6IFByb21pc2U8VFJlc29sdmVkIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuY2F0Y2gob25yZWplY3RlZCk7XG4gIH1cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJhc3NlcnQiLCJOYWl0ZSIsIlB1cmkiLCJrbmV4UXVlcnkiLCJrbmV4IiwidGFibGVOYW1lT3JTcGVjIiwiZnJvbSIsImVudHJpZXMiLCJPYmplY3QiLCJsZW5ndGgiLCJFcnJvciIsImFsaWFzIiwic3BlYyIsInN1YnF1ZXJ5QnVpbGRlciIsInJhdyIsImFzIiwiY291bnQiLCJjb2x1bW4iLCJfdHlwZSIsIl9yZXR1cm4iLCJfc3FsIiwic3VtIiwiYXZnIiwibWF4IiwibWluIiwiY29uY2F0IiwiYXJncyIsImpvaW4iLCJ1cHBlciIsImxvd2VyIiwicmF3U3RyaW5nIiwic3FsIiwicmF3TnVtYmVyIiwicmF3Qm9vbGVhbiIsInJhd0RhdGUiLCJzZWxlY3QiLCJzZWxlY3RPYmoiLCJzZWxlY3RDbGF1c2VzIiwiY29sdW1uT3JGdW5jdGlvbiIsInB1c2giLCJjb2x1bW5QYXRoIiwiYXBwZW5kU2VsZWN0Iiwic2VsZWN0QWxsIiwiX19jb21tb25Kb2luIiwibGVmdEpvaW4iLCJqb2luVHlwZSIsInRhYmxlTmFtZSIsImNhbGxiYWNrIiwiam9pbkNsYXVzZSIsIkpvaW5DbGF1c2VHcm91cCIsImxlZnQiLCJyaWdodCIsIndoZXJlIiwiY29sdW1uT3JDb25kaXRpb25zIiwib3BlcmF0b3JPclZhbHVlIiwidmFsdWUiLCJhcmd1bWVudHMiLCJ3aGVyZU51bGwiLCJ3aGVyZU5vdE51bGwiLCJ3aGVyZUluIiwidmFsdWVzIiwid2hlcmVOb3RJbiIsIndoZXJlTWF0Y2giLCJ3aGVyZVJhdyIsIlN0cmluZyIsIndoZXJlR3JvdXAiLCJidWlsZGVyIiwiZ3JvdXAiLCJXaGVyZUdyb3VwIiwib3JXaGVyZUdyb3VwIiwib3JXaGVyZSIsIm9yZGVyQnkiLCJkaXJlY3Rpb24iLCJsaW1pdCIsIm9mZnNldCIsImdyb3VwQnkiLCJjb2x1bW5zIiwiaGF2aW5nIiwiY29uZGl0aW9ucyIsInRoZW4iLCJvbmZ1bGZpbGxlZCIsIm9ucmVqZWN0ZWQiLCJ0IiwidG9RdWVyeSIsImNhdGNoIiwiZmluYWxseSIsIm9uZmluYWxseSIsImZpcnN0IiwiUmVzb2x2ZWRQdXJpIiwicGx1Y2siLCJpbnNlcnQiLCJkYXRhIiwidXBkYXRlIiwiaW5jcmVtZW50IiwiZGVjcmVtZW50IiwiZGVsZXRlIiwiZGVidWciLCJjb25zb2xlIiwibG9nIiwiY3lhbiIsInllbGxvdyIsImZvcm1hdFNRTCIsInVuZm9ybWF0dGVkIiwia2V5d29yZHMiLCJmb3JtYXR0ZWQiLCJmb3JFYWNoIiwia2V5d29yZCIsInJlZ2V4IiwiUmVnRXhwIiwicmVwbGFjZSIsInRvVXBwZXJDYXNlIiwibWFqb3JDbGF1c2VzIiwiY2xhdXNlIiwibGluZXMiLCJzcGxpdCIsImluZGVudGVkTGluZXMiLCJpbmRlbnRMZXZlbCIsImxpbmUiLCJ0cmltbWVkTGluZSIsInRyaW0iLCJjbG9zaW5nUGFyZW5zIiwibWF0Y2giLCJvcGVuaW5nUGFyZW5zIiwiTWF0aCIsImluZGVudCIsInJlcGVhdCIsInNsaWNlIiwic3ViQnVpbGRlciIsInN1Ykdyb3VwIiwib24iLCJvck9uIl0sIm1hcHBpbmdzIjoiQUFlQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFFdkMsT0FBTyxNQUFNQzs7SUFDSEMsVUFBNkI7SUFRckMsWUFDRSxBQUFPQyxJQUFVLEVBQ2pCQyxlQUFvQixDQUNwQjthQUZPRCxPQUFBQTtRQUdQLElBQUksT0FBT0Msb0JBQW9CLFVBQVU7WUFDdkMsZ0NBQWdDO1lBQ2hDLElBQUksQ0FBQ0YsU0FBUyxHQUFHLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxpQkFBaUJDLElBQUksQ0FBQ0Q7UUFDbkQsT0FBTyxJQUFJLE9BQU9BLG9CQUFvQixVQUFVO1lBQzlDLE1BQU1FLFVBQVVDLE9BQU9ELE9BQU8sQ0FBQ0Y7WUFDL0IsSUFBSUUsUUFBUUUsTUFBTSxLQUFLLEdBQUc7Z0JBQ3hCLE1BQU0sSUFBSUMs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
601
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub1RoZW5Qcm9wZXJ0eTogUHVyaeuKlCB0aGVuYWJsZSDsnbjthLDtjpjsnbTsiqTrpbwg6rWs7ZiE7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cbi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXZhaWxhYmxlQ29sdW1ucyxcbiAgQ29sdW1uS2V5cyxcbiAgQ29tcGFyaXNvbk9wZXJhdG9yLFxuICBFeHBhbmQsXG4gIEV4dHJhY3RDb2x1bW5UeXBlLFxuICBGdWxsdGV4dENvbHVtbnMsXG4gIEluc2VydERhdGEsXG4gIEluc2VydFJlc3VsdCxcbiAgT25Db25mbGljdEFjdGlvbixcbiAgUGFyc2VTZWxlY3RPYmplY3QsXG4gIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnMsXG4gIFNlbGVjdE9iamVjdCxcbiAgU2luZ2xlVGFibGVWYWx1ZSxcbiAgU3FsRXhwcmVzc2lvbixcbiAgV2hlcmVDb25kaXRpb24sXG59IGZyb20gXCIuL3B1cmkudHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ2xlYXJTdGF0ZW1lbnRzIH0gZnJvbSBcIi4vcHVyaS1zdWJzZXQudHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFB1cmk8VFNjaGVtYSwgVFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFRSZXN1bHQ+IHtcbiAgcHJpdmF0ZSBrbmV4UXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyO1xuXG4gIC8vIOyDneyEseyekCDsi5zqt7jri4jsspjrk6RcbiAgY29uc3RydWN0b3Ioa25leDogS25leCwgdGFibGVOYW1lOiBzdHJpbmcpO1xuICBjb25zdHJ1Y3RvcihrbmV4OiBLbmV4LCB0YWJsZVNwZWM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFB1cmk8VFNjaGVtYSwgYW55LCBhbnk+Pik7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4OiBLbmV4LFxuICAgIHRhYmxlTmFtZU9yU3BlYzogYW55LFxuICApIHtcbiAgICBpZiAodHlwZW9mIHRhYmxlTmFtZU9yU3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gQ2FzZTogbmV3IFB1cmkoa25leCwgXCJ1c2Vyc1wiKVxuICAgICAgdGhpcy5rbmV4UXVlcnkgPSB0aGlzLmtuZXgodGFibGVOYW1lT3JTcGVjKS5mcm9tKHRhYmxlTmFtZU9yU3BlYyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTcGVjID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFthbGlhcywgc3BlY10gPSBlbnRyaWVzWzBdO1xuICAgICAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4KHNwZWMpLmZyb20oeyBbYWxpYXNdOiBzcGVjIH0pO1xuICAgICAgfSBlbHNlIGlmIChzcGVjIGluc3RhbmNlb2YgUHVyaSkge1xuICAgICAgICBjb25zdCBzdWJxdWVyeUJ1aWxkZXIgPSBzcGVjLnJhdygpO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leC5mcm9tKHN1YnF1ZXJ5QnVpbGRlci5hcyhhbGlhcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0YWJsZSBzcGVjaWZpY2F0aW9uXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljIFNRTCBoZWxwZXIgZnVuY3Rpb25zIGZvciBTRUxFQ1RcbiAgc3RhdGljIGNvdW50KGNvbHVtbjogc3RyaW5nID0gXCIqXCIpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgQ09VTlQoJHtjb2x1bW59KTo6aW50ZWdlcmAsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgc3VtKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYFNVTSgke2NvbHVtbn0pYCxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBhdmcoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgQVZHKCR7Y29sdW1ufSlgLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIG1heChjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBNQVgoJHtjb2x1bW59KWAsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgbWluKGNvbHVtbjogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYE1JTigke2NvbHVtbn0pYCxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBjb25jYXQoLi4uYXJnczogc3RyaW5nW10pOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgQ09OQ0FUKCR7YXJncy5qb2luKFwiLCBcIil9KWAsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgdXBwZXIoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgVVBQRVIoJHtjb2x1bW59KWAsXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgbG93ZXIoY29sdW1uOiBzdHJpbmcpOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwic3RyaW5nXCIsXG4gICAgICBfc3FsOiBgTE9XRVIoJHtjb2x1bW59KWAsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJhdyBmdW5jdGlvbnMgZm9yIFNFTEVDVFxuICBzdGF0aWMgcmF3U3RyaW5nKHNxbDogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJzdHJpbmdcIiwgX3NxbDogc3FsIH07XG4gIH1cbiAgc3RhdGljIHJhd051bWJlcihzcWw6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbCB9O1xuICB9XG4gIHN0YXRpYyByYXdCb29sZWFuKHNxbDogc3RyaW5nKTogU3FsRXhwcmVzc2lvbjxcImJvb2xlYW5cIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiYm9vbGVhblwiLCBfc3FsOiBzcWwgfTtcbiAgfVxuICBzdGF0aWMgcmF3RGF0ZShzcWw6IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJkYXRlXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImRhdGVcIiwgX3NxbDogc3FsIH07XG4gIH1cblxuICAvLyBTRUxFQ1QgKG92ZXJ3cml0ZSlcbiAgc2VsZWN0PFRTZWxlY3QgZXh0ZW5kcyBTZWxlY3RPYmplY3Q8VFRhYmxlcz4+KFxuICAgIHNlbGVjdE9iajogVFNlbGVjdCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBQYXJzZVNlbGVjdE9iamVjdDxUVGFibGVzLCBUU2VsZWN0Pj4ge1xuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlbGVjdE9iaikpIHtcbiAgICAgIGlmICh0eXBlb2YgY29sdW1uT3JGdW5jdGlvbiA9PT0gXCJvYmplY3RcIiAmJiBjb2x1bW5PckZ1bmN0aW9uLl90eXBlID09PSBcInNxbF9leHByZXNzaW9uXCIpIHtcbiAgICAgICAgLy8gU1FMIO2VqOyImOyduCDqsr3smrBcbiAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKHRoaXMua25leC5yYXcoYCR7Y29sdW1uT3JGdW5jdGlvbi5fc3FsfSBhcyAke2FsaWFzfWApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDsu6zrn7zsnbgg6rK97JqwXG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgLy8gYWxpYXPsmYAg7Lus65+866qF7J20IOqwmeycvOuptCBhbGlhcyDsg53rnrVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goY29sdW1uUGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYWxpYXMg7KeA7KCVXG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGAke2NvbHVtblBhdGh9IGFzICR7YWxpYXN9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gU0VMRUNUIChzZWxlY3TripQgb3ZlcndyaXRlLCBhcHBlbmRTZWxlY3TripQgYXBwZW5kKVxuICBhcHBlbmRTZWxlY3Q8VFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPj4oXG4gICAgc2VsZWN0T2JqOiBUU2VsZWN0LFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQgJiBQYXJzZVNlbGVjdE9iamVjdDxUVGFibGVzLCBUU2VsZWN0Pj4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdChzZWxlY3RPYmopIGFzIGFueTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAqXG4gIHNlbGVjdEFsbCgpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoXCIqXCIpO1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIENMRUFSXG4gIGNsZWFyKHN0YXRlbWVudDogQ2xlYXJTdGF0ZW1lbnRzKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoc3RhdGVtZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGtuZXjsl5Ag7JeG7Ja07IScIOyngeygkSDqtaztmITtlahcbiAgY2xlYXJKb2luKGFsaWFzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAodGhpcy5rbmV4UXVlcnkgYXMgYW55KS5fc3RhdGVtZW50cyA9ICh0aGlzLmtuZXhRdWVyeSBhcyBhbnkpLl9zdGF0ZW1lbnRzLmZpbHRlcigoczogYW55KSA9PiB7XG4gICAgICBpZiAoXCJqb2luVHlwZVwiIGluIHMpIHtcbiAgICAgICAgY29uc3QgW19hbGlhcywgX3RhYmxlXSA9IE9iamVjdC5lbnRyaWVzKHMudGFibGUpWzBdO1xuICAgICAgICByZXR1cm4gX2FsaWFzICE9PSBhbGlhcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSk9JTjog7ISc67iM7L+866asICsgQWxpYXNcbiAgam9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU3ViUmVzdWx0Pn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0PiwgLy8g7ISc67iM7L+866as7J2YIFRSZXN1bHRcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IO2FjOydtOu4lCArIEFsaWFzXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgLy8gVFRhYmxlcyDtmZXsnqUhXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDthYzsnbTruJTrqoVcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luVGFibGUgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUU2NoZW1hW1RKb2luVGFibGVdPn1gLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgLy8g7YWM7J2067iU66qF7J20IO2CpFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7ISc67iM7L+866asICsgQWxpYXMgKyDsvZzrsLFcbiAgam9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0Pj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU3ViUmVzdWx0PiwgVFJlc3VsdD47XG4gIC8vIEpPSU46IO2FjOydtOu4lCArIEFsaWFzICsg7L2c67CxXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEpPSU46IO2FjOydtOu4lOuqhSArIOy9nOuwsVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gSk9JTiDsi6TsoJwg6rWs7ZiEXG4gIGpvaW4odGFibGVOYW1lT3JTcGVjOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fX2NvbW1vbkpvaW4oXCJqb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgLi4uYXJncyk7XG4gIH1cblxuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTdWJSZXN1bHQ+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCAvLyDshJzruIzsv7zrpqzsnZggVFJlc3VsdFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyBUVGFibGVzIO2ZleyepSFcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iU66qFXG4gIGxlZnRKb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hPihcbiAgICB0YWJsZU5hbWU6IFRKb2luVGFibGUsXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgICByaWdodDogYCR7VEpvaW5UYWJsZSAmIHN0cmluZ30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luVGFibGUsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCAvLyDthYzsnbTruJTrqoXsnbQg7YKkXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBUSm9pblRhYmxlIH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0+LCBUUmVzdWx0PjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJTrqoUgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU4g7Iuk7KCcIOq1rO2YhFxuICBsZWZ0Sm9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fY29tbW9uSm9pbihcImxlZnRKb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgLi4uYXJncyk7XG4gIH1cblxuICBfX2NvbW1vbkpvaW4oam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAodHlwZW9mIHRhYmxlTmFtZU9yU3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gQ2FzZSAxOiBqb2luKFwicG9zdHNcIiwgLi4uKVxuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lT3JTcGVjO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgY2FsbGJhY2spXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHRhYmxlTmFtZSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgbGVmdCwgcmlnaHQpXG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCBsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTcGVjID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvLyBDYXNlIDI6IGpvaW4oeyBhbGlhczogXCJ0YWJsZVwiIH0sIC4uLikgb3Igam9pbih7IGFsaWFzOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFtbYWxpYXMsIHNwZWNdXSA9IGVudHJpZXM7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAvLyDthYzsnbTruJQ6IGpvaW4oeyBwOiBcInBvc3RzXCIgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbXBsZVxuICAgICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNwZWMgaW5zdGFuY2VvZiBQdXJpKSB7XG4gICAgICAgIC8vIOyEnOu4jOy/vOumrDogam9pbih7IHNxOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3KCkuYXMoYWxpYXMpLCAoam9pbkNsYXVzZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEpvaW5DbGF1c2VHcm91cChqb2luQ2xhdXNlKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2ltcGxlXG4gICAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IGFyZ3M7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3KCkuYXMoYWxpYXMpLCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHNcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRTog6rCd7LK0IC0g7IKs7JqpOiAud2hlcmUoeyBcInUuaWRcIjogMSwgXCJ1LnN0YXR1c1wiOiBcImFjdGl2ZVwiIH0pXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCAxKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcIj5cIiwgMTApXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciB8IFwibGlrZVwiIHwgXCJub3QgbGlrZVwiLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gV0hFUkU6IOy7rOufvCAtIOyCrOyaqTogLndoZXJlKFwidS5pZFwiLCBcImxpa2VcIiwgXCIldGVzdCVcIilcbiAgd2hlcmUoLi4uYXJnczogW2NvbHVtbk9yQ29uZGl0aW9uczogYW55LCBvcGVyYXRvck9yVmFsdWU/OiBhbnksIHZhbHVlPzogYW55XSk6IHRoaXMge1xuICAgIGNvbnN0IFtjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSwgdmFsdWVdID0gYXJncztcbiAgICBpZiAodHlwZW9mIGNvbHVtbk9yQ29uZGl0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMsIG9wZXJhdG9yT3JWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBcIiE9XCIpIHtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IFwiPVwiKSB7XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOdWxsKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgSU5cbiAgd2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTk9UIElOXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90SW4oY29sdW1uLCB2YWx1ZXMpO1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIFdIRVJFIE1BVENIXG4gIHdoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhjb2x1bW4pfSkgQUdBSU5TVCAoPylgLCBbdmFsdWVdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIOq0hO2YuCDqt7jro7ntlZFcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZSgoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihidWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKGdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkub3JXaGVyZSgoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihidWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKGdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9SREVSIEJZXG4gIG9yZGVyQnk8VENvbHVtbiBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIixcbiAgKTogdGhpcztcbiAgb3JkZXJCeShjb2x1bW46IHN0cmluZywgZGlyZWN0aW9uOiBcImFzY1wiIHwgXCJkZXNjXCIgPSBcImFzY1wiKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeShjb2x1bW4sIGRpcmVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDquLDrs7gg7L+866asIOuplOyEnOuTnOuTpFxuICBsaW1pdChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkubGltaXQoY291bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb2Zmc2V0KGNvdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5vZmZzZXQoY291bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gR1JPVVAgQllcbiAgZ3JvdXBCeTxUQ29sdW1ucyBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KC4uLmNvbHVtbnM6IFRDb2x1bW5zW10pOiB0aGlzO1xuICBncm91cEJ5KC4uLmNvbHVtbnM6IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZ3JvdXBCeSguLi4oY29sdW1ucyBhcyBzdHJpbmdbXSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gSEFWSU5HXG4gIGhhdmluZyhjb25kaXRpb246IHN0cmluZyk6IHRoaXM7XG4gIGhhdmluZzxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgdmFsdWU6IGFueSxcbiAgKTogdGhpcztcbiAgLy8gSEFWSU5HIOq1rO2YhFxuICBoYXZpbmcoLi4uY29uZGl0aW9uczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGhhdmluZyhcIkNPVU5UKCopID4gMTBcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5LmhhdmluZyh0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMF0pKTtcbiAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBoYXZpbmcoXCJjb3VudFwiLCBcIj5cIiwgMTApXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcoXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1swXSksXG4gICAgICAgIGNvbmRpdGlvbnNbMV0sXG4gICAgICAgIHRoaXMua25leC5yYXcoY29uZGl0aW9uc1syXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGhhdmluZyBhcmd1bWVudHNcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g7Iuk7ZaJIOuplOyEnOuTnOuTpCAtIHRoZW5hYmxlIOq1rO2YhFxuICB0aGVuPFRSZXN1bHQxID0gRXhwYW5kPFRSZXN1bHQ+W10sIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogRXhwYW5kPFRSZXN1bHQ+W10pID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudGhlbihvbmZ1bGZpbGxlZCBhcyBhbnksIG9ucmVqZWN0ZWQpO1xuICB9XG4gIGNhdGNoPFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXN1bHQgfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5jYXRjaChvbnJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IG51bGwpOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG5cbiAgLy8g7ZWY64KY66eMIOy/vOumrFxuICBmaXJzdCgpOiBSZXNvbHZlZFB1cmk8RXhwYW5kPFRSZXN1bHQ+LCBuZXZlcj4ge1xuICAgIHRoaXMua25leFF1ZXJ5LmZpcnN0KCk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyDsv7zrpqztlZwg66CI7L2U65Oc7JeQ7IScIO2KueyglSDsu6zrn7zrp4wg7LaU7Lac7ZWcIOuwsOyXtCDrpqzthLRcbiAgcGx1Y2s8VENvbHVtbiBleHRlbmRzIGtleW9mIFRSZXN1bHQgfCBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICk6IFJlc29sdmVkUHVyaTxcbiAgICBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdFxuICAgICAgPyBUUmVzdWx0W1RDb2x1bW5dW11cbiAgICAgIDogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgICBuZXZlclxuICA+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5wbHVjayhjb2x1bW4gYXMgc3RyaW5nKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIElOU0VSVFxuICBpbnNlcnQoXG4gICAgZGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PixcbiAgKTogUmVzb2x2ZWRQdXJpPEluc2VydFJlc3VsdCwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIHRoaXMua25leFF1ZXJ5Lmluc2VydChkYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIFVQREFURVxuICB1cGRhdGUoZGF0YTogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkudXBkYXRlKGRhdGEpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8gSW5jcmVtZW50XG4gIGluY3JlbWVudDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICk6IFJlc29sdmVkUHVyaTxudW1iZXIsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICBpZiAodmFsdWUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5jcmVtZW50IHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5LmluY3JlbWVudChjb2x1bW4sIHZhbHVlKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuICAvLyBEZWNyZW1lbnRcbiAgZGVjcmVtZW50PFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVjcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8gREVMRVRFXG4gIGRlbGV0ZSgpOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVsZXRlKCk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyDtmZXsnbgg7L+866asIOumrO2EtFxuICB0b1F1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRvUXVlcnkoKTtcbiAgfVxuXG4gIC8vIOy/vOumrCDrlJTrsoTquYUg66Gc6re4IOy2nOugpVxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICAvLyAnZHVhbCfsnYAg642U66+4IO2FjOydtOu4lOydtOupsCwg67CU66GcIOyVhOuemCDspITsl5DshJwga25leFF1ZXJ56rCAIOuNruyWtOyUjOybjOynkeuLiOuLpC5cbiAgICBjb25zdCBuZXdQdXJpID0gbmV3IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4odGhpcy5rbmV4LCBcImR1YWxcIik7XG4gICAgbmV3UHVyaS5rbmV4UXVlcnkgPSB0aGlzLmtuZXhRdWVyeS5jbG9uZSgpO1xuICAgIHJldHVybiBuZXdQdXJpO1xuICB9XG5cbiAgZm9ybWF0U1FMKHVuZm9ybWF0dGVkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNRTCDsmIjslb3slrQg66qp66GdXG4gICAgY29uc3Qga2V5d29yZHMgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgXCJGUk9NXCIsXG4gICAgICBcIldIRVJFXCIsXG4gICAgICBcIklOU0VSVFwiLFxuICAgICAgXCJJTlRPXCIsXG4gICAgICBcIlZBTFVFU1wiLFxuICAgICAgXCJVUERBVEVcIixcbiAgICAgIFwiREVMRVRFXCIsXG4gICAgICBcIkNSRUFURVwiLFxuICAgICAgXCJUQUJMRVwiLFxuICAgICAgXCJBTFRFUlwiLFxuICAgICAgXCJEUk9QXCIsXG4gICAgICBcIkpPSU5cIixcbiAgICAgIFwiT05cIixcbiAgICAgIFwiSU5ORVJcIixcbiAgICAgIFwiTEVGVFwiLFxuICAgICAgXCJSSUdIVFwiLFxuICAgICAgXCJGVUxMXCIsXG4gICAgICBcIk9VVEVSXCIsXG4gICAgICBcIkdST1VQXCIsXG4gICAgICBcIkJZXCIsXG4gICAgICBcIk9SREVSXCIsXG4gICAgICBcIkhBVklOR1wiLFxuICAgICAgXCJESVNUSU5DVFwiLFxuICAgICAgXCJMSU1JVFwiLFxuICAgICAgXCJPRkZTRVRcIixcbiAgICAgIFwiQVNcIixcbiAgICAgIFwiQU5EXCIsXG4gICAgICBcIk9SXCIsXG4gICAgICBcIk5PVFwiLFxuICAgICAgXCJJTlwiLFxuICAgICAgXCJMSUtFXCIsXG4gICAgICBcIklTXCIsXG4gICAgICBcIk5VTExcIixcbiAgICAgIFwiQ0FTRVwiLFxuICAgICAgXCJXSEVOXCIsXG4gICAgICBcIlRIRU5cIixcbiAgICAgIFwiRUxTRVwiLFxuICAgICAgXCJFTkRcIixcbiAgICAgIFwiVU5JT05cIixcbiAgICAgIFwiQUxMXCIsXG4gICAgICBcIkVYSVNUU1wiLFxuICAgICAgXCJCRVRXRUVOXCIsXG4gICAgXTtcblxuICAgIGxldCBmb3JtYXR0ZWQgPSB1bmZvcm1hdHRlZDtcblxuICAgIC8vIOyYiOyVveyWtOulvCDrjIDrrLjsnpDroZwg67OA7ZmYXG4gICAga2V5d29yZHMuZm9yRWFjaCgoa2V5d29yZCkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7a2V5d29yZH1cXFxcYmAsIFwiZ2lcIik7XG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShyZWdleCwga2V5d29yZC50b1VwcGVyQ2FzZSgpKTtcbiAgICB9KTtcblxuICAgIC8vIOyjvOyalCDsoIgg7JWe7JeQIOykhOuwlOq/iCDstpTqsIBcbiAgICBjb25zdCBtYWpvckNsYXVzZXMgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgXCJGUk9NXCIsXG4gICAgICBcIldIRVJFXCIsXG4gICAgICBcIkdST1VQIEJZXCIsXG4gICAgICBcIk9SREVSIEJZXCIsXG4gICAgICBcIkhBVklOR1wiLFxuICAgICAgXCJMSU1JVFwiLFxuICAgICAgXCJVTklPTlwiLFxuICAgIF07XG4gICAgbWFqb3JDbGF1c2VzLmZvckVhY2goKGNsYXVzZSkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxccysoJHtjbGF1c2V9KVxcXFxzK2AsIFwiZ2lcIik7XG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShyZWdleCwgYFxcbiR7Y2xhdXNlLnRvVXBwZXJDYXNlKCl9IGApO1xuICAgIH0pO1xuXG4gICAgLy8gSk9JTiDsoIgg7LKY66asXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xccysoKD86SU5ORVJ8TEVGVHxSSUdIVHxGVUxMIE9VVEVSKVxccyspP0pPSU5cXHMrL2dpLCBcIlxcbiQxSk9JTiBcIik7XG5cbiAgICAvLyBBTkQsIE9SIOyhsOqxtCDsspjrpqxcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFxzKyhBTkR8T1IpXFxzKy9naSwgXCJcXG4gICQxIFwiKTtcblxuICAgIC8vIOq0hO2YuCDsspjrpqwg67CPIOuTpOyXrOyTsOq4sFxuICAgIGNvbnN0IGxpbmVzID0gZm9ybWF0dGVkLnNwbGl0KFwiXFxuXCIpO1xuICAgIGNvbnN0IGluZGVudGVkTGluZXMgPSBbXTtcbiAgICBsZXQgaW5kZW50TGV2ZWwgPSAwO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKCF0cmltbWVkTGluZSkgY29udGludWU7XG5cbiAgICAgIC8vIOuLq+uKlCDqtITtmLjqsIAg7J6I7Jy866m0IOuTpOyXrOyTsOq4sCDroIjrsqgg6rCQ7IaMXG4gICAgICBjb25zdCBjbG9zaW5nUGFyZW5zID0gKHRyaW1tZWRMaW5lLm1hdGNoKC9cXCkvZykgfHwgW10pLmxlbmd0aDtcbiAgICAgIGNvbnN0IG9wZW5pbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKC9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICBpZiAoY2xvc2luZ1BhcmVucyA+IDAgJiYgb3BlbmluZ1BhcmVucyA9PT0gMCkge1xuICAgICAgICBpbmRlbnRMZXZlbCA9IE1hdGgubWF4KDAsIGluZGVudExldmVsIC0gY2xvc2luZ1BhcmVucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIO2YhOyerCDrk6Tsl6zsk7DquLAg7KCB7JqpXG4gICAgICBjb25zdCBpbmRlbnQgPSBcIiAgXCIucmVwZWF0KGluZGVudExldmVsKTtcbiAgICAgIGluZGVudGVkTGluZXMucHVzaChpbmRlbnQgKyB0cmltbWVkTGluZSk7XG5cbiAgICAgIC8vIOyXrOuKlCDqtITtmLjqsIAg7J6I7Jy866m0IOuTpOyXrOyTsOq4sCDroIjrsqgg7Kad6rCAXG4gICAgICBpZiAob3BlbmluZ1BhcmVucyA+IGNsb3NpbmdQYXJlbnMpIHtcbiAgICAgICAgaW5kZW50TGV2ZWwgKz0gb3BlbmluZ1BhcmVucyAtIGNsb3NpbmdQYXJlbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGVudGVkTGluZXMuam9pbihcIlxcblwiKS50cmltKCk7XG4gIH1cblxuICAvLyBLbmV4IOy/vOumrCDruYzrjZQg7KeB7KCRIOygkeq3vFxuICByYXcoKTogS25leC5RdWVyeUJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2hlcmVHcm91cDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJ1aWxkZXI6IEtuZXguUXVlcnlCdWlsZGVyKSB7fVxuXG4gIC8vIHdoZXJlIOuplOyEnOuTnOuTpFxuICB3aGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IHRoaXM7XG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICB3aGVyZSguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIG9yV2hlcmUg66mU7ISc65Oc65OkXG4gIG9yV2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmUoLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOykkeyyqSDqt7jro7lcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzO1xuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKChzdWJCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KHN1YkJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKb2luQ2xhdXNlR3JvdXA8XG4gIFRMZWZ0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVFJpZ2h0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pixcbj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhbGxiYWNrOiBLbmV4LkpvaW5DbGF1c2UpIHt9XG5cbiAgLy8gT04oQU5EKTog7Lus65+8ID0g7Lus65+8XG4gIG9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+KTogdGhpcztcbiAgLy8gT04oQU5EKTog7Lus65+8ICjsl7DsgrDsnpApIOy7rOufvFxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy9nOuwsVxuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRMZWZ0LCBUUmlnaHQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oQU5EKSDqtaztmIRcbiAgb24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmNhbGxiYWNrLm9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OKE9SKTog7Lus65+8ID0g7Lus65+8XG4gIG9yT24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICAvLyBPTihPUik6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKE9SKTog7L2c67CxXG4gIG9yT24oY2FsbGJhY2s6IChuZXN0ZWQ6IEpvaW5DbGF1c2VHcm91cDxUTGVmdCwgVFJpZ2h0PikgPT4gdm9pZCk6IHRoaXM7XG4gIC8vIE9OKE9SKSDqtaztmIRcbiAgb3JPbiguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIHRoaXMuY2FsbGJhY2sub3JPbiguLi4oYXJncyBhcyBbc3RyaW5nLCBzdHJpbmddKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuLypcbiAgVFJlc29sdmVkOiDsv7zrpqwg7Iuk7ZaJIO2bhCDrsJjtmZjrkKAg6rKw6rO8IO2DgOyehVxuICBUUmV0dXJuaW5nOiBSRVRVUk5JTkcg7KCI7JeQIOyCrOyaqeuQoCDtg4DsnoVcbiovXG5leHBvcnQgY2xhc3MgUmVzb2x2ZWRQdXJpPFRSZXNvbHZlZCwgVFJldHVybmluZz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga25leFF1ZXJ5OiBLbmV4LlF1ZXJ5QnVpbGRlcixcbiAgICBwcml2YXRlIGtuZXg6IEtuZXgsXG4gICkge31cblxuICB0b1F1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRvUXVlcnkoKTtcbiAgfVxuXG4gIGRlYnVnKCk6IHRoaXMge1xuICAgIGNvbnNvbGUubG9nKGAke2NoYWxrLmN5YW4oXCJbUHVyaSBEZWJ1Z11cIil9ICR7Y2hhbGsueWVsbG93KHRoaXMudG9RdWVyeSgpKX1gKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoZW48VFJlc3VsdDEgPSBUUmVzb2x2ZWQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVFJlc29sdmVkKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICBOYWl0ZS50KFwicHVyaTpleGVjdXRlZC1xdWVyeVwiLCB0aGlzLnRvUXVlcnkoKSk7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRoZW4ob25mdWxmaWxsZWQgYXMgYW55LCBvbnJlamVjdGVkKTtcbiAgfVxuICBjYXRjaDxUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzb2x2ZWQgfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5jYXRjaChvbnJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IG51bGwpOiBQcm9taXNlPFRSZXNvbHZlZD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyBPTiBDT05GTElDVCAtIOy7rOufvCDquLDrsJhcbiAgb25Db25mbGljdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgVFJldHVybmluZz4+KFxuICAgIGNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIGFjdGlvbj86IE9uQ29uZmxpY3RBY3Rpb248VFRhYmxlcz4sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHRhcmdldCA9IEFycmF5LmlzQXJyYXkoY29sdW1ucykgPyBjb2x1bW5zIDogW2NvbHVtbnNdO1xuXG4gICAgaWYgKCFhY3Rpb24gfHwgYWN0aW9uID09PSBcIm5vdGhpbmdcIikge1xuICAgICAgLy8gRE8gTk9USElOR1xuICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLmlnbm9yZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBETyBVUERBVEVcbiAgICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBhY3Rpb247XG5cbiAgICAgIC8vIGFjdGlvbi51cGRhdGUg67Cw7Je0IO2Yle2DnCA6IFtcIm5hbWVcIiwgXCJlbWFpbFwiXVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodXBkYXRlKSkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkubWVyZ2UodXBkYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFjdGlvbi51cGRhdGUg6rCd7LK0IO2Yle2DnDogeyBuYW1lOiBcIkpvaG5cIiwgY291bnQ6IHJhdyguLi4pIH1cbiAgICAgICAgY29uc3QgbWVyZ2VPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1cGRhdGUpKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgXCJfdHlwZVwiIGluIHZhbHVlICYmXG4gICAgICAgICAgICB2YWx1ZS5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBTcWxFeHByZXNzaW9uIOKGkiBrbmV4LnJhdygp66GcIOuzgO2ZmFxuICAgICAgICAgICAgbWVyZ2VPYmpba2V5XSA9IHRoaXMua25leC5yYXcoKHZhbHVlIGFzIFNxbEV4cHJlc3Npb248YW55PikuX3NxbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOydvOuwmCDqsJJcbiAgICAgICAgICAgIG1lcmdlT2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkubWVyZ2UobWVyZ2VPYmopO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gUkVUVVJOSU5HOiBcIipcIiAtIOyghOyytCDsu6zrn7xcbiAgcmV0dXJuaW5nKGNvbHVtbjogXCIqXCIpOiBSZXNvbHZlZFB1cmk8VFJldHVybmluZ1tdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog64uo7J28IOy7rOufvFxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkc6IOuzteyImCDsu6zrn7wgKOuwsOyXtClcbiAgcmV0dXJuaW5nPFRDb2x1bW4gZXh0ZW5kcyBDb2x1bW5LZXlzPFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBUQ29sdW1uW10sXG4gICk6IFJlc29sdmVkUHVyaTxQaWNrPFRSZXR1cm5pbmcsIFRDb2x1bW4+W10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HIOq1rO2YhFxuICByZXR1cm5pbmcoY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFJlc29sdmVkUHVyaTxhbnlbXSwgbmV2ZXI+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5yZXR1cm5pbmcoY29sdW1uT3JDb2x1bW5zKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImFzc2VydCIsImNoYWxrIiwiTmFpdGUiLCJQdXJpIiwia25leFF1ZXJ5Iiwia25leCIsInRhYmxlTmFtZU9yU3BlYyIsImZyb20iLCJlbnRyaWVzIiwiT2JqZWN0IiwibGVuZ3RoIiwiRXJyb3IiLCJhbGlhcyIsInNwZWMiLCJzdWJxdWVyeUJ1aWxkZXIiLCJyYXciLCJhcyIsImNvdW50IiwiY29sdW1uIiwiX3R5cGUiLCJfcmV0dXJuIiwiX3NxbCIsInN1bSIsImF2ZyIsIm1heCIsIm1pbiIsImNvbmNhdCIsImFyZ3MiLCJqb2luIiwidXBwZXIiLCJsb3dlciIsInJhd1N0cmluZyIsInNxbCIsInJhd051bWJlciIsInJhd0Jvb2xlYW4iLCJyYXdEYXRlIiwic2VsZWN0Iiwic2VsZWN0T2JqIiwic2VsZWN0Q2xhdXNlcyIsImNvbHVtbk9yRnVuY3Rpb24iLCJwdXNoIiwiY29sdW1uUGF0aCIsImFwcGVuZFNlbGVjdCIsInNlbGVjdEFsbCIsImNsZWFyIiwic3RhdGVtZW50IiwiY2xlYXJKb2luIiwiX3N0YXRlbWVudHMiLCJmaWx0ZXIiLCJzIiwiX2FsaWFzIiwiX3RhYmxlIiwidGFibGUiLCJfX2NvbW1vbkpvaW4iLCJsZWZ0Sm9pbiIsImpvaW5UeXBlIiwidGFibGVOYW1lIiwiY2FsbGJhY2siLCJqb2luQ2xhdXNlIiwiSm9pbkNsYXVzZUdyb3VwIiwibGVmdCIsInJpZ2h0Iiwid2hlcmUiLCJjb2x1bW5PckNvbmRpdGlvbnMiLCJvcGVyYXRvck9yVmFsdWUiLCJ2YWx1ZSIsIndoZXJlTnVsbCIsIndoZXJlTm90TnVsbCIsIndoZXJlSW4iLCJ2YWx1ZXMiLCJ3aGVyZU5vdEluIiwid2hlcmVNYXRjaCIsIndoZXJlUmF3IiwiU3RyaW5nIiwid2hlcmVHcm91cCIsImJ1aWxkZXIiLCJncm91cCIsIldoZXJlR3JvdXAiLCJvcldoZXJlR3JvdXAiLCJvcldoZXJlIiwib3JkZXJCeSIsImRpcmVjdGlvbiIsImxpbWl0Iiwib2Zmc2V0IiwiZ3JvdXBCeSIsImNvbHVtbnMiLCJoYXZpbmciLCJjb25kaXRpb25zIiwidGhlbiIsIm9uZnVsZmlsbGVkIiwib25yZWplY3RlZCIsInQiLCJ0b1F1ZXJ5IiwiY2F0Y2giLCJmaW5hbGx5Iiwib25maW5hbGx5IiwiZmlyc3QiLCJSZXNvbHZlZFB1cmkiLCJwbHVjayIsImluc2VydCIsImRhdGEiLCJ1cGRhdGUiLCJpbmNyZW1lbnQiLCJkZWNyZW1lbnQiLCJkZWxldGUiLCJkZWJ1ZyIsImNvbnNvbGUiLCJsb2ciLCJjeWFuIiwieWVsbG93IiwiY2xvbmUiLCJuZXdQdXJpIiwiZm9ybWF0U1FMIiwidW5mb3JtYXR0ZWQiLCJrZXl3b3JkcyIsImZvcm1hdHRlZCIsImZvckVhY2giLCJrZXl3b3JkIiwicmVnZXgiLCJSZWdFeHAiLCJyZXBsYWNlIiwidG9VcHBlckNhc2UiLCJtYWpvckNsYXVzZXMiLCJjbGF1c2UiLCJsaW5lcyIsInNwbGl0IiwiaW5kZW50ZWRMaW5lcyIsImluZGVudExldmVsIiwibGluZSIsInRyaW1tZWRMaW5lIiwidHJpbSIsImNsb3NpbmdQYXJlbnMiLCJtYXRjaCIsIm9wZW5pbmdQYXJlbnMiLCJNYXRoIiwiaW5kZW50IiwicmVwZWF0Iiwic2xpY2UiLCJzdWJCdWlsZGVyIiwic3ViR3JvdXAiLCJvbiIsIm9yT24iLCJvbkNvbmZsaWN0IiwiYWN0aW9uIiwidGFyZ2V0IiwiQXJyYXkiLCJpc0FycmF5IiwiaWdub3JlIiwibWVyZ2UiLCJtZXJnZU9iaiIsImtleSIsInJldHVybmluZyIsImNvbHVtbk9yQ29sdW1ucyJdLCJtYXBwaW5ncyI6IkFBQUEsc0ZBQXNGLEdBQ3RGLDZFQUE2RSxHQUU3RSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBRTFCLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFvQnZDLE9BQU8sTUFBTUM7O0lBQ0hDLFVBQTZCO0lBS3JDLFlBQ0UsQUFBT0MsSUFBVSxFQUNqQkMsZUFBb0IsQ0FDcEI7YUFGT0QsT0FBQUE7UUFHUCxJQUFJLE9BQU9DLG9CQUFvQixVQUFVO1lBQ3ZDLGdDQUFnQztZQUNoQyxJQUFJLENBQUNGLFNBQVMsR0FBRyxJQUFJLENBQUNDLElBQUksQ0FBQ0MsaUJBQWlCQyxJQUFJLENBQUNEO1FBQ25ELE9BQU8sSUFBSSxPQUFPQSxvQkFBb0IsVUFBVTtZQUM5QyxNQUFNRSxVQUFVQyxPQUFPRCxPQUFPLENBQUNGO1lBQy9CLElBQUlFLFFBQVFFLE1BQU0sS0FBSyxHQUFHO2dCQUN4QixNQUFNLElBQUlDLE1BQU07WUFDbEI7WUFDQVgsT0FBT1EsT0FBTyxDQUFDLEVBQUU7WUFDakIsTUFBTSxDQUFDSSxPQUFPQyxLQUFLLEdBQUdMLE9BQU8sQ0FBQyxFQUFFO1lBQ2hDLElB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
@@ -1,10 +1,19 @@
1
- import { DatabaseSchemaExtend } from "../types/types";
2
- import { Puri } from "./puri";
3
- import { PuriWrapper } from "./puri-wrapper";
4
- type ExcludeMetadataColumns<T> = Exclude<T, "__fulltext__">;
1
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Puri.types.ts는 다양한 타입을 사용하고 있습니다. */
2
+ import type { QueryResult } from "pg";
3
+ import type { DatabaseSchemaExtend } from "../types/types";
4
+ import type { Puri } from "./puri";
5
+ import type { PuriWrapper } from "./puri-wrapper";
6
+ type MetadataColumns = "__fulltext__" | "__virtual__";
7
+ type VirtualKeys<T> = T extends {
8
+ __virtual__: readonly (infer V)[];
9
+ } ? V & string : never;
10
+ type StripVirtual<T> = Omit<T, VirtualKeys<T>>;
11
+ export type ColumnKeys<T> = Exclude<keyof StripVirtual<T>, MetadataColumns> & string;
12
+ export type PuriTable<T> = Omit<StripVirtual<T>, "__virtual__">;
13
+ export type OmitMetadataColumns<T> = Omit<T, MetadataColumns>;
5
14
  export type AvailableColumns<TTables extends Record<string, any>> = {
6
- [TAlias in keyof TTables]: `${TAlias & string}.${ExcludeMetadataColumns<keyof TTables[TAlias]> & string}`;
7
- }[keyof TTables] | (IsSingleKey<TTables> extends true ? ExcludeMetadataColumns<keyof TTables[keyof TTables]> : never);
15
+ [TAlias in keyof TTables]: `${TAlias & string}.${ColumnKeys<TTables[TAlias]>}`;
16
+ }[keyof TTables] | (IsSingleKey<TTables> extends true ? ColumnKeys<TTables[keyof TTables]> : never);
8
17
  export type ResultAvailableColumns<TTables extends Record<string, any>, TResult = any> = AvailableColumns<TTables> | `${keyof TResult & string}`;
9
18
  export type SelectValue<TTables extends Record<string, any>> = AvailableColumns<TTables> | SqlExpression<"string" | "number" | "boolean" | "date">;
10
19
  export type SelectObject<TTables extends Record<string, any>> = Record<string, SelectValue<TTables>>;
@@ -38,10 +47,15 @@ type NullableToOptional<T> = {
38
47
  } & Partial<{
39
48
  [K in keyof T as T[K] extends null | undefined ? never : K]: T[K];
40
49
  }>;
41
- export type InsertData<T> = NullableToOptional<Omit<T, "id" | "created_at" | "__fulltext__">>;
50
+ export type InsertData<T> = NullableToOptional<Omit<PuriTable<T>, "id" | "created_at" | MetadataColumns>>;
51
+ export type InsertResult = Pick<QueryResult<any>, "command" | "rowCount" | "rows" | "oid">;
42
52
  type ExtractTTables<T extends Puri<any, any, any>> = T extends Puri<any, infer TTables, any> ? TTables : never;
43
53
  export type UnionExtractedTTables<SubsetKey extends string, SubsetQueries extends Record<SubsetKey, (qbWrapper: PuriWrapper<DatabaseSchemaExtend>) => Puri<any, any, any>>> = {
44
54
  [K in SubsetKey]: ExtractTTables<ReturnType<SubsetQueries[K]>>;
45
55
  }[SubsetKey];
56
+ export type OnConflictTarget = string | string[];
57
+ export type OnConflictAction<TTables extends Record<string, unknown>> = "nothing" | {
58
+ update: AvailableColumns<TTables>[] | WhereCondition<TTables>;
59
+ };
46
60
  export {};
47
61
  //# sourceMappingURL=puri.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"puri.types.d.ts","sourceRoot":"","sources":["../../src/database/puri.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,KAAK,sBAAsB,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AAG5D,MAAM,MAAM,gBAAgB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAC5D;KACG,MAAM,IAAI,MAAM,OAAO,GAAG,GAAG,MAAM,GAAG,MAAM,IAAI,sBAAsB,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE;CAC1G,CAAC,MAAM,OAAO,CAAC,GAChB,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,IAAI,GAC9B,sBAAsB,CAAC,MAAM,OAAO,CAAC,MAAM,OAAO,CAAC,CAAC,GACpD,KAAK,CAAC,CAAC;AAEf,MAAM,MAAM,sBAAsB,CAChC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,OAAO,GAAG,GAAG,IACX,gBAAgB,CAAC,OAAO,CAAC,GAAG,GAAG,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;AAG5D,MAAM,MAAM,WAAW,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IACvD,gBAAgB,CAAC,OAAO,CAAC,GACzB,aAAa,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;AAG5D,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CACpE,MAAM,EACN,WAAW,CAAC,OAAO,CAAC,CACrB,CAAC;AAGF,MAAM,MAAM,iBAAiB,CAC3B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,OAAO,SAAS,YAAY,CAAC,OAAO,CAAC,IACnC;KACD,CAAC,IAAI,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAC3D,CAAC,SAAS,QAAQ,GAChB,MAAM,GACN,CAAC,SAAS,QAAQ,GAChB,MAAM,GACN,CAAC,SAAS,SAAS,GACjB,OAAO,GACP,CAAC,SAAS,MAAM,GACd,IAAI,GACJ,KAAK,GACb,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;CACpD,CAAC;AAGF,MAAM,MAAM,iBAAiB,CAC3B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,IAAI,SAAS,MAAM,IACjB,IAAI,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,OAAO,EAAE,GAC/C,MAAM,SAAS,MAAM,OAAO,GAC1B,OAAO,SAAS,MAAM,OAAO,CAAC,MAAM,CAAC,GACnC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GACxB,KAAK,GACP,KAAK,GACP,WAAW,CAAC,OAAO,CAAC,SAAS,IAAI,GAC/B,IAAI,SAAS,MAAM,OAAO,CAAC,MAAM,OAAO,CAAC,GACvC,OAAO,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,GAC5B,KAAK,GACP,KAAK,CAAC;AAGZ,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;KAC/D,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CAAC;CAC9E,CAAC;AAGF,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;KAChE,MAAM,IAAI,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS;QACjD,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;KACtC,GACG,GAAG,SAAS,MAAM,GAChB,GAAG,MAAM,GAAG,MAAM,IAAI,GAAG,EAAE,GAC3B,KAAK,GACP,KAAK;CACV,CAAC,MAAM,OAAO,CAAC,CAAC;AAGjB,MAAM,MAAM,kBAAkB,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAG7E,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,IAC1E;IACE,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAGJ,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,GACnC;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,EAAE,GAChC,CAAC,SAAS,MAAM,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GACxB,CAAC,CAAC;AAER,KAAK,WAAW,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAClD,MAAM,OAAO,SAAS,MAAM,CAAC,GACzB,CAAC,SAAS,MAAM,OAAO,GACrB,MAAM,OAAO,SAAS,CAAC,GACrB,IAAI,GACJ,KAAK,GACP,KAAK,GACP,KAAK,CAAC;AAEZ,MAAM,MAAM,gBAAgB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAC9D,WAAW,CAAC,OAAO,CAAC,SAAS,IAAI,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC;AAGrE,KAAK,kBAAkB,CAAC,CAAC,IAAI;KAC1B,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,OAAO,CACnE,CAAC,CAAC,CAAC,CAAC,EACJ,IAAI,GAAG,SAAS,CACjB;CACF,GAAG,OAAO,CAAC;KACT,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,SAAS,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAClE,CAAC,CAAC;AAGH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,kBAAkB,CAC5C,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,YAAY,GAAG,cAAc,CAAC,CAC9C,CAAC;AAGF,KAAK,cAAc,CAAC,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAC/C,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,MAAM,OAAO,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC;AAC5D,MAAM,MAAM,qBAAqB,CAC/B,SAAS,SAAS,MAAM,EACxB,aAAa,SAAS,MAAM,CAC1B,SAAS,EACT,CAAC,SAAS,EAAE,WAAW,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CACtE,IACC;KACD,CAAC,IAAI,SAAS,GAAG,cAAc,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/D,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"puri.types.d.ts","sourceRoot":"","sources":["../../src/database/puri.types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,6 @@
1
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Puri.types.ts는 다양한 타입을 사용하고 있습니다. */ // ON CONFLICT 액션 타입
2
+ // - "nothing": DO NOTHING
3
+ // - { update: [...] }: DO UPDATE
1
4
  export { };
2
5
 
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHsgUHVyaVdyYXBwZXIgfSBmcm9tIFwiLi9wdXJpLXdyYXBwZXJcIjtcblxuLy8g66mU7YOA642w7J207YSwIOy7rOufvCDsoJzsmbhcbnR5cGUgRXhjbHVkZU1ldGFkYXRhQ29sdW1uczxUPiA9IEV4Y2x1ZGU8VCwgXCJfX2Z1bGx0ZXh0X19cIj47XG5cbi8vIFRUYWJsZXPsnZgg66qo65OgIO2FjOydtOu4lOyXkOyEnCDsgqzsmqkg6rCA64ql7ZWcIOy7rOufvCDqsr3roZxcbmV4cG9ydCB0eXBlIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID1cbiAgfCB7XG4gICAgICBbVEFsaWFzIGluIGtleW9mIFRUYWJsZXNdOiBgJHtUQWxpYXMgJiBzdHJpbmd9LiR7RXhjbHVkZU1ldGFkYXRhQ29sdW1uczxrZXlvZiBUVGFibGVzW1RBbGlhc10+ICYgc3RyaW5nfWA7XG4gICAgfVtrZXlvZiBUVGFibGVzXVxuICB8IChJc1NpbmdsZUtleTxUVGFibGVzPiBleHRlbmRzIHRydWVcbiAgICAgID8gRXhjbHVkZU1ldGFkYXRhQ29sdW1uczxrZXlvZiBUVGFibGVzW2tleW9mIFRUYWJsZXNdPiAvLyDri6jsnbwg7YWM7J2067iU7J2066m0IOy7rOufvOuqheunjOuPhCDtl4jsmqlcbiAgICAgIDogbmV2ZXIpO1xuLy8gR3JvdXAgQnksIE9yZGVyIEJ5LCBIYXZpbmcg65Ox7JeQ7IScIOyEoO2DnSDqsIDriqXtlZwg7Lus65+8XG5leHBvcnQgdHlwZSBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFxuICBUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVFJlc3VsdCA9IGFueSxcbj4gPSBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+IHwgYCR7a2V5b2YgVFJlc3VsdCAmIHN0cmluZ31gO1xuXG4vLyBTZWxlY3Qg6rCSIO2DgOyehSDtmZXsnqVcbmV4cG9ydCB0eXBlIFNlbGVjdFZhbHVlPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPlxuICB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIiB8IFwiZGF0ZVwiPjtcblxuLy8gU2VsZWN0IOqwneyytCDtg4DsnoUgKO2YhOyerOuKlCDsu6zrn7wg6rK966Gc66eMIOyngOybkClcbmV4cG9ydCB0eXBlIFNlbGVjdE9iamVjdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgU2VsZWN0VmFsdWU8VFRhYmxlcz4gLy8gQXZhaWxhYmxlQ29sdW1ucyDrjIDsi6Bcbj47XG5cbi8vIFNlbGVjdCDqsrDqs7wg7YOA7J6FIOy2lOuhoFxuZXhwb3J0IHR5cGUgUGFyc2VTZWxlY3RPYmplY3Q8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuPiA9IHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPGluZmVyIFI+XG4gICAgPyBSIGV4dGVuZHMgXCJzdHJpbmdcIlxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogUiBleHRlbmRzIFwibnVtYmVyXCJcbiAgICAgICAgPyBudW1iZXJcbiAgICAgICAgOiBSIGV4dGVuZHMgXCJib29sZWFuXCJcbiAgICAgICAgICA/IGJvb2xlYW5cbiAgICAgICAgICA6IFIgZXh0ZW5kcyBcImRhdGVcIlxuICAgICAgICAgICAgPyBEYXRlXG4gICAgICAgICAgICA6IG5ldmVyXG4gICAgOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUU2VsZWN0W0tdICYgc3RyaW5nPjtcbn07XG5cbi8vIOy7rOufvCDqsr3roZzsl5DshJwg7YOA7J6FIOy2lOy2nFxuZXhwb3J0IHR5cGUgRXh0cmFjdENvbHVtblR5cGU8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBUVGFibGVzW1RBbGlhc11bVENvbHVtbl1cbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyXG4gIDogSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlIC8vIOy2lOqwgFxuICAgID8gUGF0aCBleHRlbmRzIGtleW9mIFRUYWJsZXNba2V5b2YgVFRhYmxlc11cbiAgICAgID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXVtQYXRoXVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG4vLyBXaGVyZSDsobDqsbQg6rCd7LK0IO2DgOyehVxuLy8g7JiIOiB7IFwidS5pZFwiOiAxLCBcInUuc3RhdHVzXCI6IFwiYWN0aXZlXCIgfVxuZXhwb3J0IHR5cGUgV2hlcmVDb25kaXRpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBba2V5IGluIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz5dPzogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywga2V5ICYgc3RyaW5nPjtcbn07XG5cbi8vIEZ1bGx0ZXh0IGluZGV4IOy7rOufvCDstpTstpwg7YOA7J6FXG5leHBvcnQgdHlwZSBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBbVEFsaWFzIGluIGtleW9mIFRUYWJsZXNdOiBUVGFibGVzW1RBbGlhc10gZXh0ZW5kcyB7XG4gICAgX19mdWxsdGV4dF9fOiByZWFkb25seSAoaW5mZXIgQ29sKVtdO1xuICB9XG4gICAgPyBDb2wgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8gYCR7VEFsaWFzICYgc3RyaW5nfS4ke0NvbH1gXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlcjtcbn1ba2V5b2YgVFRhYmxlc107XG5cbi8vIOu5hOq1kCDsl7DsgrDsnpBcbmV4cG9ydCB0eXBlIENvbXBhcmlzb25PcGVyYXRvciA9IFwiPVwiIHwgXCI+XCIgfCBcIj49XCIgfCBcIjxcIiB8IFwiPD1cIiB8IFwiPD5cIiB8IFwiIT1cIjtcblxuLy8gU1FMIEV4cHJlc3Npb24g7YOA7J6FIOygleydmFxuZXhwb3J0IHR5cGUgU3FsRXhwcmVzc2lvbjxUIGV4dGVuZHMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIiB8IFwiZGF0ZVwiPiA9XG4gIHtcbiAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiOyAvLyDrmJDripQgXCJjb21wdXRlZF92YWx1ZVwiXG4gICAgX3JldHVybjogVDtcbiAgICBfc3FsOiBzdHJpbmc7XG4gIH07XG5cbi8vIOqysOqzvCDtg4DsnoUg6rCA64+F7ISx7J2EIOychO2VnCDtg4DsnoUg7ZmV7J6lXG5leHBvcnQgdHlwZSBFeHBhbmQ8VD4gPSBUIGV4dGVuZHMgYW55W11cbiAgPyB7IFtLIGluIGtleW9mIFRbMF1dOiBUWzBdW0tdIH1bXSAvLyDrsLDsl7TsnbTrqbQg7LKrIOuyiOynuCDsmpTshozrpbwgRXhwYW5k7ZWY6rOgIOuwsOyXtOuhnCDqsJDsjIhcbiAgOiBUIGV4dGVuZHMgb2JqZWN0XG4gICAgPyB7IFtLIGluIGtleW9mIFRdOiBUW0tdIH1cbiAgICA6IFQ7XG5cbnR5cGUgSXNTaW5nbGVLZXk8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID1cbiAga2V5b2YgVFRhYmxlcyBleHRlbmRzIGluZmVyIEtcbiAgICA/IEsgZXh0ZW5kcyBrZXlvZiBUVGFibGVzXG4gICAgICA/IGtleW9mIFRUYWJsZXMgZXh0ZW5kcyBLIC8vIOyXreuwqe2WpSDssrTtgazroZwg64uo7J28IO2CpCDtmZXsnbhcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogZmFsc2VcbiAgICAgIDogZmFsc2VcbiAgICA6IGZhbHNlO1xuXG5leHBvcnQgdHlwZSBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZSA/IFRUYWJsZXNba2V5b2YgVFRhYmxlc10gOiBuZXZlcjtcblxuLy8gTnVsbGFibGXsnYQgT3B0aW9uYWzroZwg67OA7ZmYXG50eXBlIE51bGxhYmxlVG9PcHRpb25hbDxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgbnVsbCB8IHVuZGVmaW5lZCA/IEsgOiBuZXZlcl0/OiBFeGNsdWRlPFxuICAgIFRbS10sXG4gICAgbnVsbCB8IHVuZGVmaW5lZFxuICA+O1xufSAmIFBhcnRpYWw8e1xuICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBudWxsIHwgdW5kZWZpbmVkID8gbmV2ZXIgOiBLXTogVFtLXTtcbn0+O1xuXG4vLyBJbnNlcnQg7YOA7J6FOiBpZCwgY3JlYXRlZF9hdCDsoJzsmbhcbmV4cG9ydCB0eXBlIEluc2VydERhdGE8VD4gPSBOdWxsYWJsZVRvT3B0aW9uYWw8XG4gIE9taXQ8VCwgXCJpZFwiIHwgXCJjcmVhdGVkX2F0XCIgfCBcIl9fZnVsbHRleHRfX1wiPlxuPjtcblxuLy8gU3Vic2V0UXVlcnnrpbwg7JyE7ZWcIO2DgOyehSDsnKDti7jrpqzti7BcbnR5cGUgRXh0cmFjdFRUYWJsZXM8VCBleHRlbmRzIFB1cmk8YW55LCBhbnksIGFueT4+ID1cbiAgVCBleHRlbmRzIFB1cmk8YW55LCBpbmZlciBUVGFibGVzLCBhbnk+ID8gVFRhYmxlcyA6IG5ldmVyO1xuZXhwb3J0IHR5cGUgVW5pb25FeHRyYWN0ZWRUVGFibGVzPFxuICBTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8XG4gICAgU3Vic2V0S2V5LFxuICAgIChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gUHVyaTxhbnksIGFueSwgYW55PlxuICA+LFxuPiA9IHtcbiAgW0sgaW4gU3Vic2V0S2V5XTogRXh0cmFjdFRUYWJsZXM8UmV0dXJuVHlwZTxTdWJzZXRRdWVyaWVzW0tdPj47XG59W1N1YnNldEtleV07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0lBLFdBUWEifQ==
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJpLnR5cGVzLnRz64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHR5cGUgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuXG4vLyDrqZTtg4DrjbDsnbTthLAg7Lus65+8IOycoO2LuFxudHlwZSBNZXRhZGF0YUNvbHVtbnMgPSBcIl9fZnVsbHRleHRfX1wiIHwgXCJfX3ZpcnR1YWxfX1wiO1xuXG4vLyB2aXJ0dWFsIOy7rOufvCDtg4DsnoUg7LaU7LacXG50eXBlIFZpcnR1YWxLZXlzPFQ+ID0gVCBleHRlbmRzIHsgX192aXJ0dWFsX186IHJlYWRvbmx5IChpbmZlciBWKVtdIH0gPyBWICYgc3RyaW5nIDogbmV2ZXI7XG5cbi8vIHZpcnR1YWwg7Lus65+8IOygnOqxsFxudHlwZSBTdHJpcFZpcnR1YWw8VD4gPSBPbWl0PFQsIFZpcnR1YWxLZXlzPFQ+PjtcblxuLy8g66mU7YOA642w7J207YSwIO2VhOuTnCDsoJzsmbjtlZwg7Iuk7KCcIOyXlO2LsO2LsCDsu6zrn7xcbmV4cG9ydCB0eXBlIENvbHVtbktleXM8VD4gPSBFeGNsdWRlPGtleW9mIFN0cmlwVmlydHVhbDxUPiwgTWV0YWRhdGFDb2x1bW5zPiAmIHN0cmluZztcblxuLy8gdmlydHVhbCDsu6zrn7wg7KCc6rGwIO2bhCBfX2Z1bGx0ZXh0X18g66mU7YOA642w7J207YSwIOycoOyngFxuZXhwb3J0IHR5cGUgUHVyaVRhYmxlPFQ+ID0gT21pdDxTdHJpcFZpcnR1YWw8VD4sIFwiX192aXJ0dWFsX19cIj47XG5cbi8vIOuplO2DgOuNsOydtO2EsCDsu6zrn7wg7KCc7Jm4IO2DgOyehSDsoJXsnZhcbmV4cG9ydCB0eXBlIE9taXRNZXRhZGF0YUNvbHVtbnM8VD4gPSBPbWl0PFQsIE1ldGFkYXRhQ29sdW1ucz47XG5cbi8vIFRUYWJsZXPsnZgg66qo65OgIO2FjOydtOu4lOyXkOyEnCDsgqzsmqkg6rCA64ql7ZWcIOy7rOufvCDqsr3roZxcbmV4cG9ydCB0eXBlIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID1cbiAgfCB7XG4gICAgICBbVEFsaWFzIGluIGtleW9mIFRUYWJsZXNdOiBgJHtUQWxpYXMgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUVGFibGVzW1RBbGlhc10+fWA7XG4gICAgfVtrZXlvZiBUVGFibGVzXVxuICB8IChJc1NpbmdsZUtleTxUVGFibGVzPiBleHRlbmRzIHRydWVcbiAgICAgID8gQ29sdW1uS2V5czxUVGFibGVzW2tleW9mIFRUYWJsZXNdPiAvLyDri6jsnbwg7YWM7J2067iU7J2066m0IOy7rOufvOuqheunjOuPhCDtl4jsmqlcbiAgICAgIDogbmV2ZXIpO1xuXG4vLyBHcm91cCBCeSwgT3JkZXIgQnksIEhhdmluZyDrk7Hsl5DshJwg7ISg7YOdIOqwgOuKpe2VnCDsu6zrn7xcbmV4cG9ydCB0eXBlIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFRSZXN1bHQgPSBhbnk+ID1cbiAgfCBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+XG4gIHwgYCR7a2V5b2YgVFJlc3VsdCAmIHN0cmluZ31gO1xuXG4vLyBTZWxlY3Qg6rCSIO2DgOyehSDtmZXsnqVcbmV4cG9ydCB0eXBlIFNlbGVjdFZhbHVlPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPlxuICB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIiB8IFwiZGF0ZVwiPjtcblxuLy8gU2VsZWN0IOqwneyytCDtg4DsnoUgKO2YhOyerOuKlCDsu6zrn7wg6rK966Gc66eMIOyngOybkClcbmV4cG9ydCB0eXBlIFNlbGVjdE9iamVjdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgU2VsZWN0VmFsdWU8VFRhYmxlcz4gLy8gQXZhaWxhYmxlQ29sdW1ucyDrjIDsi6Bcbj47XG5cbi8vIFNlbGVjdCDqsrDqs7wg7YOA7J6FIOy2lOuhoFxuZXhwb3J0IHR5cGUgUGFyc2VTZWxlY3RPYmplY3Q8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuPiA9IHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPGluZmVyIFI+XG4gICAgPyBSIGV4dGVuZHMgXCJzdHJpbmdcIlxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogUiBleHRlbmRzIFwibnVtYmVyXCJcbiAgICAgICAgPyBudW1iZXJcbiAgICAgICAgOiBSIGV4dGVuZHMgXCJib29sZWFuXCJcbiAgICAgICAgICA/IGJvb2xlYW5cbiAgICAgICAgICA6IFIgZXh0ZW5kcyBcImRhdGVcIlxuICAgICAgICAgICAgPyBEYXRlXG4gICAgICAgICAgICA6IG5ldmVyXG4gICAgOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUU2VsZWN0W0tdICYgc3RyaW5nPjtcbn07XG5cbi8vIOy7rOufvCDqsr3roZzsl5DshJwg7YOA7J6FIOy2lOy2nFxuZXhwb3J0IHR5cGUgRXh0cmFjdENvbHVtblR5cGU8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBUVGFibGVzW1RBbGlhc11bVENvbHVtbl1cbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyXG4gIDogSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlIC8vIOy2lOqwgFxuICAgID8gUGF0aCBleHRlbmRzIGtleW9mIFRUYWJsZXNba2V5b2YgVFRhYmxlc11cbiAgICAgID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXVtQYXRoXVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG4vLyBXaGVyZSDsobDqsbQg6rCd7LK0IO2DgOyehVxuLy8g7JiIOiB7IFwidS5pZFwiOiAxLCBcInUuc3RhdHVzXCI6IFwiYWN0aXZlXCIgfVxuZXhwb3J0IHR5cGUgV2hlcmVDb25kaXRpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBba2V5IGluIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz5dPzogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywga2V5ICYgc3RyaW5nPjtcbn07XG5cbi8vIEZ1bGx0ZXh0IGluZGV4IOy7rOufvCDstpTstpwg7YOA7J6FXG5leHBvcnQgdHlwZSBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBbVEFsaWFzIGluIGtleW9mIFRUYWJsZXNdOiBUVGFibGVzW1RBbGlhc10gZXh0ZW5kcyB7XG4gICAgX19mdWxsdGV4dF9fOiByZWFkb25seSAoaW5mZXIgQ29sKVtdO1xuICB9XG4gICAgPyBDb2wgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8gYCR7VEFsaWFzICYgc3RyaW5nfS4ke0NvbH1gXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlcjtcbn1ba2V5b2YgVFRhYmxlc107XG5cbi8vIOu5hOq1kCDsl7DsgrDsnpBcbmV4cG9ydCB0eXBlIENvbXBhcmlzb25PcGVyYXRvciA9IFwiPVwiIHwgXCI+XCIgfCBcIj49XCIgfCBcIjxcIiB8IFwiPD1cIiB8IFwiPD5cIiB8IFwiIT1cIjtcblxuLy8gU1FMIEV4cHJlc3Npb24g7YOA7J6FIOygleydmFxuZXhwb3J0IHR5cGUgU3FsRXhwcmVzc2lvbjxUIGV4dGVuZHMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIiB8IFwiZGF0ZVwiPiA9IHtcbiAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIjsgLy8g65iQ64qUIFwiY29tcHV0ZWRfdmFsdWVcIlxuICBfcmV0dXJuOiBUO1xuICBfc3FsOiBzdHJpbmc7XG59O1xuXG4vLyDqsrDqs7wg7YOA7J6FIOqwgOuPheyEseydhCDsnITtlZwg7YOA7J6FIO2ZleyepVxuZXhwb3J0IHR5cGUgRXhwYW5kPFQ+ID0gVCBleHRlbmRzIGFueVtdXG4gID8geyBbSyBpbiBrZXlvZiBUWzBdXTogVFswXVtLXSB9W10gLy8g67Cw7Je07J2066m0IOyyqyDrsojsp7gg7JqU7IaM66W8IEV4cGFuZO2VmOqzoCDrsLDsl7TroZwg6rCQ7IyIXG4gIDogVCBleHRlbmRzIG9iamVjdFxuICAgID8geyBbSyBpbiBrZXlvZiBUXTogVFtLXSB9XG4gICAgOiBUO1xuXG50eXBlIElzU2luZ2xlS2V5PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IGtleW9mIFRUYWJsZXMgZXh0ZW5kcyBpbmZlciBLXG4gID8gSyBleHRlbmRzIGtleW9mIFRUYWJsZXNcbiAgICA/IGtleW9mIFRUYWJsZXMgZXh0ZW5kcyBLIC8vIOyXreuwqe2WpSDssrTtgazroZwg64uo7J28IO2CpCDtmZXsnbhcbiAgICAgID8gdHJ1ZVxuICAgICAgOiBmYWxzZVxuICAgIDogZmFsc2VcbiAgOiBmYWxzZTtcblxuZXhwb3J0IHR5cGUgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPVxuICBJc1NpbmdsZUtleTxUVGFibGVzPiBleHRlbmRzIHRydWUgPyBUVGFibGVzW2tleW9mIFRUYWJsZXNdIDogbmV2ZXI7XG5cbi8vIE51bGxhYmxl7J2EIE9wdGlvbmFs66GcIOuzgO2ZmFxudHlwZSBOdWxsYWJsZVRvT3B0aW9uYWw8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIG51bGwgfCB1bmRlZmluZWQgPyBLIDogbmV2ZXJdPzogRXhjbHVkZTxUW0tdLCBudWxsIHwgdW5kZWZpbmVkPjtcbn0gJiBQYXJ0aWFsPHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgbnVsbCB8IHVuZGVmaW5lZCA/IG5ldmVyIDogS106IFRbS107XG59PjtcblxuLy8gSW5zZXJ0IO2DgOyehTogaWQsIGNyZWF0ZWRfYXQg7KCc7Jm4XG5leHBvcnQgdHlwZSBJbnNlcnREYXRhPFQ+ID0gTnVsbGFibGVUb09wdGlvbmFsPFxuICBPbWl0PFB1cmlUYWJsZTxUPiwgXCJpZFwiIHwgXCJjcmVhdGVkX2F0XCIgfCBNZXRhZGF0YUNvbHVtbnM+XG4+O1xuXG4vLyBJbnNlcnQgUmVzdWx0IO2DgOyehVxuZXhwb3J0IHR5cGUgSW5zZXJ0UmVzdWx0ID0gUGljazxRdWVyeVJlc3VsdDxhbnk+LCBcImNvbW1hbmRcIiB8IFwicm93Q291bnRcIiB8IFwicm93c1wiIHwgXCJvaWRcIj47XG5cbi8vIFN1YnNldFF1ZXJ566W8IOychO2VnCDtg4DsnoUg7Jyg7Yu466as7YuwXG50eXBlIEV4dHJhY3RUVGFibGVzPFQgZXh0ZW5kcyBQdXJpPGFueSwgYW55LCBhbnk+PiA9IFQgZXh0ZW5kcyBQdXJpPGFueSwgaW5mZXIgVFRhYmxlcywgYW55PlxuICA/IFRUYWJsZXNcbiAgOiBuZXZlcjtcbmV4cG9ydCB0eXBlIFVuaW9uRXh0cmFjdGVkVFRhYmxlczxcbiAgU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFxuICAgIFN1YnNldEtleSxcbiAgICAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IFB1cmk8YW55LCBhbnksIGFueT5cbiAgPixcbj4gPSB7XG4gIFtLIGluIFN1YnNldEtleV06IEV4dHJhY3RUVGFibGVzPFJldHVyblR5cGU8U3Vic2V0UXVlcmllc1tLXT4+O1xufVtTdWJzZXRLZXldO1xuXG4vLyBPTiBDT05GTElDVCDrjIDsg4Eg7YOA7J6FXG4vLyAtIOuLqOydvCDsu6zrn7w6IFwiZW1haWxcIlxuLy8gLSDrs7XsiJgg7Lus65+8OiBbXCJ1c2VyX2lkXCIsIFwicHJvZHVjdF9pZFwiXVxuZXhwb3J0IHR5cGUgT25Db25mbGljdFRhcmdldCA9IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4vLyBPTiBDT05GTElDVCDslaHshZgg7YOA7J6FXG4vLyAtIFwibm90aGluZ1wiOiBETyBOT1RISU5HXG4vLyAtIHsgdXBkYXRlOiBbLi4uXSB9OiBETyBVUERBVEVcbmV4cG9ydCB0eXBlIE9uQ29uZmxpY3RBY3Rpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIHwgXCJub3RoaW5nXCJcbiAgfCB7XG4gICAgICB1cGRhdGU6XG4gICAgICAgIHwgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPltdIC8vIOuwsOyXtCDtmJXtg5wgLSBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgICAgfCBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPjsgLy8g6rCd7LK0IO2Yle2DnCAtIHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiBQdXJpLnJhd051bWJlciguLi4pIH1cbiAgICB9O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNGQUFzRixHQWtLdEYsb0JBQW9CO0FBQ3BCLDBCQUEwQjtBQUMxQixpQ0FBaUM7QUFDakMsV0FNTSJ9
@@ -1,5 +1,5 @@
1
- import type { PuriTransactionWrapper } from "./puri-wrapper";
2
1
  import type { DBPreset } from "./db";
2
+ import type { PuriTransactionWrapper } from "./puri-wrapper";
3
3
  export declare class TransactionContext {
4
4
  private transactions;
5
5
  getTransaction(preset: DBPreset): PuriTransactionWrapper | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-context.d.ts","sourceRoot":"","sources":["../../src/database/transaction-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,YAAY,CAAoD;IAExE,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,sBAAsB,GAAG,SAAS;IAIpE,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAInE,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI;CAG1C"}
1
+ {"version":3,"file":"transaction-context.d.ts","sourceRoot":"","sources":["../../src/database/transaction-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,YAAY,CAAoD;IAExE,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,sBAAsB,GAAG,SAAS;IAIpE,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAInE,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI;CAG1C"}
@@ -11,4 +11,4 @@ export class TransactionContext {
11
11
  }
12
12
  }
13
13
 
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS90cmFuc2FjdGlvbi1jb250ZXh0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHVyaVRyYW5zYWN0aW9uV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuaW1wb3J0IHR5cGUgeyBEQlByZXNldCB9IGZyb20gXCIuL2RiXCI7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkNvbnRleHQge1xuICBwcml2YXRlIHRyYW5zYWN0aW9uczogTWFwPERCUHJlc2V0LCBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyPiA9IG5ldyBNYXAoKTtcblxuICBnZXRUcmFuc2FjdGlvbihwcmVzZXQ6IERCUHJlc2V0KTogUHVyaVRyYW5zYWN0aW9uV3JhcHBlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25zLmdldChwcmVzZXQpO1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24ocHJlc2V0OiBEQlByZXNldCwgdHJ4OiBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyKTogdm9pZCB7XG4gICAgdGhpcy50cmFuc2FjdGlvbnMuc2V0KHByZXNldCwgdHJ4KTtcbiAgfVxuXG4gIGRlbGV0ZVRyYW5zYWN0aW9uKHByZXNldDogREJQcmVzZXQpOiB2b2lkIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9ucy5kZWxldGUocHJlc2V0KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlRyYW5zYWN0aW9uQ29udGV4dCIsInRyYW5zYWN0aW9ucyIsIk1hcCIsImdldFRyYW5zYWN0aW9uIiwicHJlc2V0IiwiZ2V0Iiwic2V0VHJhbnNhY3Rpb24iLCJ0cngiLCJzZXQiLCJkZWxldGVUcmFuc2FjdGlvbiIsImRlbGV0ZSJdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxNQUFNQTtJQUNIQyxlQUFzRCxJQUFJQyxNQUFNO0lBRXhFQyxlQUFlQyxNQUFnQixFQUFzQztRQUNuRSxPQUFPLElBQUksQ0FBQ0gsWUFBWSxDQUFDSSxHQUFHLENBQUNEO0lBQy9CO0lBRUFFLGVBQWVGLE1BQWdCLEVBQUVHLEdBQTJCLEVBQVE7UUFDbEUsSUFBSSxDQUFDTixZQUFZLENBQUNPLEdBQUcsQ0FBQ0osUUFBUUc7SUFDaEM7SUFFQUUsa0JBQWtCTCxNQUFnQixFQUFRO1FBQ3hDLElBQUksQ0FBQ0gsWUFBWSxDQUFDUyxNQUFNLENBQUNOO0lBQzNCO0FBQ0YifQ==
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS90cmFuc2FjdGlvbi1jb250ZXh0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgREJQcmVzZXQgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHR5cGUgeyBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkNvbnRleHQge1xuICBwcml2YXRlIHRyYW5zYWN0aW9uczogTWFwPERCUHJlc2V0LCBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyPiA9IG5ldyBNYXAoKTtcblxuICBnZXRUcmFuc2FjdGlvbihwcmVzZXQ6IERCUHJlc2V0KTogUHVyaVRyYW5zYWN0aW9uV3JhcHBlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25zLmdldChwcmVzZXQpO1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24ocHJlc2V0OiBEQlByZXNldCwgdHJ4OiBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyKTogdm9pZCB7XG4gICAgdGhpcy50cmFuc2FjdGlvbnMuc2V0KHByZXNldCwgdHJ4KTtcbiAgfVxuXG4gIGRlbGV0ZVRyYW5zYWN0aW9uKHByZXNldDogREJQcmVzZXQpOiB2b2lkIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9ucy5kZWxldGUocHJlc2V0KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlRyYW5zYWN0aW9uQ29udGV4dCIsInRyYW5zYWN0aW9ucyIsIk1hcCIsImdldFRyYW5zYWN0aW9uIiwicHJlc2V0IiwiZ2V0Iiwic2V0VHJhbnNhY3Rpb24iLCJ0cngiLCJzZXQiLCJkZWxldGVUcmFuc2FjdGlvbiIsImRlbGV0ZSJdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxNQUFNQTtJQUNIQyxlQUFzRCxJQUFJQyxNQUFNO0lBRXhFQyxlQUFlQyxNQUFnQixFQUFzQztRQUNuRSxPQUFPLElBQUksQ0FBQ0gsWUFBWSxDQUFDSSxHQUFHLENBQUNEO0lBQy9CO0lBRUFFLGVBQWVGLE1BQWdCLEVBQUVHLEdBQTJCLEVBQVE7UUFDbEUsSUFBSSxDQUFDTixZQUFZLENBQUNPLEdBQUcsQ0FBQ0osUUFBUUc7SUFDaEM7SUFFQUUsa0JBQWtCTCxNQUFnQixFQUFRO1FBQ3hDLElBQUksQ0FBQ0gsWUFBWSxDQUFDUyxNQUFNLENBQUNOO0lBQzNCO0FBQ0YifQ==