velocious 1.0.428 → 1.0.430

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 (933) hide show
  1. package/README.md +2 -0
  2. package/build/src/application.d.ts +96 -9
  3. package/build/src/application.d.ts.map +1 -1
  4. package/build/src/application.js +127 -28
  5. package/build/src/authorization/ability.d.ts +72 -31
  6. package/build/src/authorization/ability.d.ts.map +1 -1
  7. package/build/src/authorization/ability.js +59 -22
  8. package/build/src/authorization/base-resource.d.ts +47 -20
  9. package/build/src/authorization/base-resource.d.ts.map +1 -1
  10. package/build/src/authorization/base-resource.js +43 -14
  11. package/build/src/background-jobs/client.d.ts +4 -2
  12. package/build/src/background-jobs/client.d.ts.map +1 -1
  13. package/build/src/background-jobs/client.js +4 -2
  14. package/build/src/background-jobs/cron-expression.d.ts +9 -5
  15. package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
  16. package/build/src/background-jobs/cron-expression.js +16 -6
  17. package/build/src/background-jobs/forked-runner-child.js +12 -5
  18. package/build/src/background-jobs/job-registry.d.ts +7 -1
  19. package/build/src/background-jobs/job-registry.d.ts.map +1 -1
  20. package/build/src/background-jobs/job-registry.js +8 -2
  21. package/build/src/background-jobs/job-runner.d.ts +1 -0
  22. package/build/src/background-jobs/job-runner.d.ts.map +1 -1
  23. package/build/src/background-jobs/job-runner.js +8 -3
  24. package/build/src/background-jobs/job.d.ts +12 -8
  25. package/build/src/background-jobs/job.d.ts.map +1 -1
  26. package/build/src/background-jobs/job.js +12 -6
  27. package/build/src/background-jobs/json-socket.d.ts +17 -5
  28. package/build/src/background-jobs/json-socket.d.ts.map +1 -1
  29. package/build/src/background-jobs/json-socket.js +18 -6
  30. package/build/src/background-jobs/main.d.ts +118 -32
  31. package/build/src/background-jobs/main.d.ts.map +1 -1
  32. package/build/src/background-jobs/main.js +123 -35
  33. package/build/src/background-jobs/normalize-error.d.ts +2 -1
  34. package/build/src/background-jobs/normalize-error.d.ts.map +1 -1
  35. package/build/src/background-jobs/normalize-error.js +5 -3
  36. package/build/src/background-jobs/scheduler.d.ts +31 -10
  37. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  38. package/build/src/background-jobs/scheduler.js +33 -11
  39. package/build/src/background-jobs/socket-request.d.ts +2 -0
  40. package/build/src/background-jobs/socket-request.d.ts.map +1 -1
  41. package/build/src/background-jobs/socket-request.js +11 -3
  42. package/build/src/background-jobs/status-reporter.d.ts +5 -2
  43. package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
  44. package/build/src/background-jobs/status-reporter.js +6 -3
  45. package/build/src/background-jobs/store.d.ts +57 -19
  46. package/build/src/background-jobs/store.d.ts.map +1 -1
  47. package/build/src/background-jobs/store.js +70 -20
  48. package/build/src/background-jobs/types.d.ts +7 -7
  49. package/build/src/background-jobs/types.d.ts.map +1 -1
  50. package/build/src/background-jobs/types.js +6 -6
  51. package/build/src/background-jobs/web/authorization.d.ts.map +1 -1
  52. package/build/src/background-jobs/web/authorization.js +3 -1
  53. package/build/src/background-jobs/web/controller.d.ts +40 -14
  54. package/build/src/background-jobs/web/controller.d.ts.map +1 -1
  55. package/build/src/background-jobs/web/controller.js +46 -15
  56. package/build/src/background-jobs/web/registry.d.ts +5 -0
  57. package/build/src/background-jobs/web/registry.d.ts.map +1 -1
  58. package/build/src/background-jobs/web/registry.js +4 -1
  59. package/build/src/background-jobs/worker.d.ts +41 -8
  60. package/build/src/background-jobs/worker.d.ts.map +1 -1
  61. package/build/src/background-jobs/worker.js +64 -16
  62. package/build/src/beacon/client.d.ts +39 -12
  63. package/build/src/beacon/client.d.ts.map +1 -1
  64. package/build/src/beacon/client.js +45 -15
  65. package/build/src/beacon/in-process-broker.d.ts +4 -0
  66. package/build/src/beacon/in-process-broker.d.ts.map +1 -1
  67. package/build/src/beacon/in-process-broker.js +8 -3
  68. package/build/src/beacon/in-process-client.d.ts +28 -9
  69. package/build/src/beacon/in-process-client.d.ts.map +1 -1
  70. package/build/src/beacon/in-process-client.js +27 -9
  71. package/build/src/beacon/server.d.ts +13 -2
  72. package/build/src/beacon/server.d.ts.map +1 -1
  73. package/build/src/beacon/server.js +21 -5
  74. package/build/src/beacon/types.d.ts +3 -3
  75. package/build/src/beacon/types.d.ts.map +1 -1
  76. package/build/src/beacon/types.js +2 -2
  77. package/build/src/cli/base-command.d.ts +18 -4
  78. package/build/src/cli/base-command.d.ts.map +1 -1
  79. package/build/src/cli/base-command.js +15 -4
  80. package/build/src/cli/browser-cli.d.ts +3 -0
  81. package/build/src/cli/browser-cli.d.ts.map +1 -1
  82. package/build/src/cli/browser-cli.js +7 -2
  83. package/build/src/cli/commands/background-jobs-main.d.ts +0 -1
  84. package/build/src/cli/commands/background-jobs-main.d.ts.map +1 -1
  85. package/build/src/cli/commands/background-jobs-runner.d.ts +0 -1
  86. package/build/src/cli/commands/background-jobs-runner.d.ts.map +1 -1
  87. package/build/src/cli/commands/background-jobs-worker.d.ts +0 -1
  88. package/build/src/cli/commands/background-jobs-worker.d.ts.map +1 -1
  89. package/build/src/cli/commands/beacon.d.ts +0 -1
  90. package/build/src/cli/commands/beacon.d.ts.map +1 -1
  91. package/build/src/cli/commands/console.d.ts +0 -2
  92. package/build/src/cli/commands/console.d.ts.map +1 -1
  93. package/build/src/cli/commands/console.js +5 -2
  94. package/build/src/cli/commands/db/base-command.d.ts +11 -2
  95. package/build/src/cli/commands/db/base-command.d.ts.map +1 -1
  96. package/build/src/cli/commands/db/base-command.js +12 -3
  97. package/build/src/cli/commands/db/create.d.ts +3 -0
  98. package/build/src/cli/commands/db/create.d.ts.map +1 -1
  99. package/build/src/cli/commands/db/create.js +4 -1
  100. package/build/src/cli/commands/db/drop.d.ts +3 -0
  101. package/build/src/cli/commands/db/drop.d.ts.map +1 -1
  102. package/build/src/cli/commands/db/drop.js +4 -1
  103. package/build/src/cli/commands/db/schema/dump.d.ts +0 -2
  104. package/build/src/cli/commands/db/schema/dump.d.ts.map +1 -1
  105. package/build/src/cli/commands/db/schema/dump.js +5 -2
  106. package/build/src/cli/commands/db/schema/load.d.ts +0 -2
  107. package/build/src/cli/commands/db/schema/load.d.ts.map +1 -1
  108. package/build/src/cli/commands/db/schema/load.js +5 -2
  109. package/build/src/cli/commands/db/seed.d.ts +0 -2
  110. package/build/src/cli/commands/db/seed.d.ts.map +1 -1
  111. package/build/src/cli/commands/db/seed.js +5 -2
  112. package/build/src/cli/commands/db/tenants/check.d.ts +4 -1
  113. package/build/src/cli/commands/db/tenants/check.d.ts.map +1 -1
  114. package/build/src/cli/commands/db/tenants/check.js +5 -2
  115. package/build/src/cli/commands/db/tenants/create.d.ts +4 -1
  116. package/build/src/cli/commands/db/tenants/create.d.ts.map +1 -1
  117. package/build/src/cli/commands/db/tenants/create.js +5 -2
  118. package/build/src/cli/commands/db/tenants/migrate.d.ts +4 -1
  119. package/build/src/cli/commands/db/tenants/migrate.d.ts.map +1 -1
  120. package/build/src/cli/commands/db/tenants/migrate.js +5 -2
  121. package/build/src/cli/commands/destroy/migration.d.ts +0 -1
  122. package/build/src/cli/commands/destroy/migration.d.ts.map +1 -1
  123. package/build/src/cli/commands/generate/base-models.d.ts +0 -1
  124. package/build/src/cli/commands/generate/base-models.d.ts.map +1 -1
  125. package/build/src/cli/commands/generate/frontend-models.d.ts +0 -2
  126. package/build/src/cli/commands/generate/frontend-models.d.ts.map +1 -1
  127. package/build/src/cli/commands/generate/frontend-models.js +5 -2
  128. package/build/src/cli/commands/generate/migration.d.ts +0 -1
  129. package/build/src/cli/commands/generate/migration.d.ts.map +1 -1
  130. package/build/src/cli/commands/generate/model.d.ts +0 -1
  131. package/build/src/cli/commands/generate/model.d.ts.map +1 -1
  132. package/build/src/cli/commands/init.d.ts +0 -1
  133. package/build/src/cli/commands/init.d.ts.map +1 -1
  134. package/build/src/cli/commands/routes.d.ts +0 -1
  135. package/build/src/cli/commands/routes.d.ts.map +1 -1
  136. package/build/src/cli/commands/run-script.d.ts +0 -2
  137. package/build/src/cli/commands/run-script.d.ts.map +1 -1
  138. package/build/src/cli/commands/run-script.js +5 -2
  139. package/build/src/cli/commands/runner.d.ts +0 -2
  140. package/build/src/cli/commands/runner.d.ts.map +1 -1
  141. package/build/src/cli/commands/runner.js +5 -2
  142. package/build/src/cli/commands/server.d.ts +0 -1
  143. package/build/src/cli/commands/server.d.ts.map +1 -1
  144. package/build/src/cli/commands/test.d.ts +0 -1
  145. package/build/src/cli/commands/test.d.ts.map +1 -1
  146. package/build/src/cli/index.d.ts +18 -5
  147. package/build/src/cli/index.d.ts.map +1 -1
  148. package/build/src/cli/index.js +25 -8
  149. package/build/src/cli/tenant-database-command-helper.d.ts +24 -9
  150. package/build/src/cli/tenant-database-command-helper.d.ts.map +1 -1
  151. package/build/src/cli/tenant-database-command-helper.js +30 -11
  152. package/build/src/cli/use-browser-cli.d.ts +1 -0
  153. package/build/src/cli/use-browser-cli.d.ts.map +1 -1
  154. package/build/src/cli/use-browser-cli.js +5 -2
  155. package/build/src/configuration-resolver.d.ts +1 -0
  156. package/build/src/configuration-resolver.d.ts.map +1 -1
  157. package/build/src/configuration-resolver.js +2 -1
  158. package/build/src/configuration-types.d.ts +44 -44
  159. package/build/src/configuration-types.d.ts.map +1 -1
  160. package/build/src/configuration-types.js +27 -27
  161. package/build/src/configuration.d.ts +350 -114
  162. package/build/src/configuration.d.ts.map +1 -1
  163. package/build/src/configuration.js +416 -128
  164. package/build/src/controller.d.ts +67 -18
  165. package/build/src/controller.d.ts.map +1 -1
  166. package/build/src/controller.js +88 -23
  167. package/build/src/current-configuration.d.ts +2 -0
  168. package/build/src/current-configuration.d.ts.map +1 -1
  169. package/build/src/current-configuration.js +6 -2
  170. package/build/src/current.d.ts +16 -9
  171. package/build/src/current.d.ts.map +1 -1
  172. package/build/src/current.js +15 -8
  173. package/build/src/database/annotations-async-hooks.js +13 -6
  174. package/build/src/database/annotations.d.ts +7 -1
  175. package/build/src/database/annotations.d.ts.map +1 -1
  176. package/build/src/database/annotations.js +12 -5
  177. package/build/src/database/drivers/base-column.d.ts +21 -3
  178. package/build/src/database/drivers/base-column.d.ts.map +1 -1
  179. package/build/src/database/drivers/base-column.js +21 -3
  180. package/build/src/database/drivers/base-columns-index.d.ts +9 -0
  181. package/build/src/database/drivers/base-columns-index.d.ts.map +1 -1
  182. package/build/src/database/drivers/base-columns-index.js +10 -1
  183. package/build/src/database/drivers/base-foreign-key.d.ts +15 -3
  184. package/build/src/database/drivers/base-foreign-key.d.ts.map +1 -1
  185. package/build/src/database/drivers/base-foreign-key.js +15 -3
  186. package/build/src/database/drivers/base-table.d.ts +16 -3
  187. package/build/src/database/drivers/base-table.d.ts.map +1 -1
  188. package/build/src/database/drivers/base-table.js +16 -3
  189. package/build/src/database/drivers/base.d.ts +174 -37
  190. package/build/src/database/drivers/base.d.ts.map +1 -1
  191. package/build/src/database/drivers/base.js +156 -40
  192. package/build/src/database/drivers/mssql/column.d.ts +3 -2
  193. package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
  194. package/build/src/database/drivers/mssql/column.js +3 -2
  195. package/build/src/database/drivers/mssql/index.d.ts +5 -6
  196. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  197. package/build/src/database/drivers/mssql/index.js +38 -7
  198. package/build/src/database/drivers/mssql/options.d.ts +1 -0
  199. package/build/src/database/drivers/mssql/options.d.ts.map +1 -1
  200. package/build/src/database/drivers/mssql/options.js +8 -2
  201. package/build/src/database/drivers/mssql/sql/create-database.d.ts +1 -0
  202. package/build/src/database/drivers/mssql/sql/create-database.d.ts.map +1 -1
  203. package/build/src/database/drivers/mssql/sql/create-database.js +2 -1
  204. package/build/src/database/drivers/mssql/sql/drop-database.d.ts.map +1 -1
  205. package/build/src/database/drivers/mssql/sql/drop-database.js +2 -1
  206. package/build/src/database/drivers/mssql/structure-sql.d.ts +5 -2
  207. package/build/src/database/drivers/mssql/structure-sql.d.ts.map +1 -1
  208. package/build/src/database/drivers/mssql/structure-sql.js +5 -2
  209. package/build/src/database/drivers/mssql/table.d.ts +1 -0
  210. package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
  211. package/build/src/database/drivers/mssql/table.js +9 -4
  212. package/build/src/database/drivers/mysql/column.d.ts +3 -2
  213. package/build/src/database/drivers/mysql/column.d.ts.map +1 -1
  214. package/build/src/database/drivers/mysql/column.js +4 -3
  215. package/build/src/database/drivers/mysql/index.d.ts +11 -3
  216. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  217. package/build/src/database/drivers/mysql/index.js +54 -10
  218. package/build/src/database/drivers/mysql/options.d.ts +1 -0
  219. package/build/src/database/drivers/mysql/options.d.ts.map +1 -1
  220. package/build/src/database/drivers/mysql/options.js +4 -2
  221. package/build/src/database/drivers/mysql/query.d.ts +3 -2
  222. package/build/src/database/drivers/mysql/query.d.ts.map +1 -1
  223. package/build/src/database/drivers/mysql/query.js +6 -3
  224. package/build/src/database/drivers/mysql/sql/create-database.d.ts.map +1 -1
  225. package/build/src/database/drivers/mysql/sql/create-database.js +3 -1
  226. package/build/src/database/drivers/mysql/structure-sql.d.ts +7 -2
  227. package/build/src/database/drivers/mysql/structure-sql.d.ts.map +1 -1
  228. package/build/src/database/drivers/mysql/structure-sql.js +7 -2
  229. package/build/src/database/drivers/mysql/table.d.ts +1 -0
  230. package/build/src/database/drivers/mysql/table.d.ts.map +1 -1
  231. package/build/src/database/drivers/mysql/table.js +7 -3
  232. package/build/src/database/drivers/pgsql/column.d.ts +3 -2
  233. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  234. package/build/src/database/drivers/pgsql/column.js +3 -2
  235. package/build/src/database/drivers/pgsql/index.d.ts +1 -1
  236. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  237. package/build/src/database/drivers/pgsql/index.js +36 -11
  238. package/build/src/database/drivers/pgsql/options.d.ts +2 -0
  239. package/build/src/database/drivers/pgsql/options.d.ts.map +1 -1
  240. package/build/src/database/drivers/pgsql/options.js +3 -1
  241. package/build/src/database/drivers/pgsql/structure-sql.d.ts +5 -2
  242. package/build/src/database/drivers/pgsql/structure-sql.d.ts.map +1 -1
  243. package/build/src/database/drivers/pgsql/structure-sql.js +5 -2
  244. package/build/src/database/drivers/pgsql/table.d.ts +1 -0
  245. package/build/src/database/drivers/pgsql/table.d.ts.map +1 -1
  246. package/build/src/database/drivers/pgsql/table.js +6 -2
  247. package/build/src/database/drivers/sqlite/base.d.ts +15 -5
  248. package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
  249. package/build/src/database/drivers/sqlite/base.js +79 -27
  250. package/build/src/database/drivers/sqlite/column.d.ts +3 -2
  251. package/build/src/database/drivers/sqlite/column.d.ts.map +1 -1
  252. package/build/src/database/drivers/sqlite/column.js +3 -2
  253. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts +4 -2
  254. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts.map +1 -1
  255. package/build/src/database/drivers/sqlite/connection-sql-js.js +4 -2
  256. package/build/src/database/drivers/sqlite/foreign-key.d.ts +3 -2
  257. package/build/src/database/drivers/sqlite/foreign-key.d.ts.map +1 -1
  258. package/build/src/database/drivers/sqlite/foreign-key.js +3 -2
  259. package/build/src/database/drivers/sqlite/index.d.ts +18 -5
  260. package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
  261. package/build/src/database/drivers/sqlite/index.js +40 -16
  262. package/build/src/database/drivers/sqlite/index.native.d.ts +1 -1
  263. package/build/src/database/drivers/sqlite/index.native.d.ts.map +1 -1
  264. package/build/src/database/drivers/sqlite/index.native.js +6 -3
  265. package/build/src/database/drivers/sqlite/index.web.d.ts +16 -4
  266. package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
  267. package/build/src/database/drivers/sqlite/index.web.js +17 -7
  268. package/build/src/database/drivers/sqlite/options.d.ts +2 -0
  269. package/build/src/database/drivers/sqlite/options.d.ts.map +1 -1
  270. package/build/src/database/drivers/sqlite/options.js +3 -1
  271. package/build/src/database/drivers/sqlite/query.d.ts +3 -2
  272. package/build/src/database/drivers/sqlite/query.d.ts.map +1 -1
  273. package/build/src/database/drivers/sqlite/query.js +6 -3
  274. package/build/src/database/drivers/sqlite/query.native.d.ts +2 -2
  275. package/build/src/database/drivers/sqlite/query.native.d.ts.map +1 -1
  276. package/build/src/database/drivers/sqlite/query.native.js +3 -3
  277. package/build/src/database/drivers/sqlite/query.web.d.ts +3 -2
  278. package/build/src/database/drivers/sqlite/query.web.d.ts.map +1 -1
  279. package/build/src/database/drivers/sqlite/query.web.js +6 -3
  280. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
  281. package/build/src/database/drivers/sqlite/sql/alter-table.js +9 -3
  282. package/build/src/database/drivers/sqlite/structure-sql.d.ts +2 -0
  283. package/build/src/database/drivers/sqlite/structure-sql.d.ts.map +1 -1
  284. package/build/src/database/drivers/sqlite/structure-sql.js +3 -1
  285. package/build/src/database/drivers/sqlite/table-rebuilder.d.ts +2 -0
  286. package/build/src/database/drivers/sqlite/table-rebuilder.d.ts.map +1 -1
  287. package/build/src/database/drivers/sqlite/table-rebuilder.js +3 -1
  288. package/build/src/database/drivers/sqlite/table.d.ts +2 -0
  289. package/build/src/database/drivers/sqlite/table.d.ts.map +1 -1
  290. package/build/src/database/drivers/sqlite/table.js +14 -4
  291. package/build/src/database/drivers/structure-sql/utils.d.ts +2 -0
  292. package/build/src/database/drivers/structure-sql/utils.d.ts.map +1 -1
  293. package/build/src/database/drivers/structure-sql/utils.js +3 -1
  294. package/build/src/database/handler.d.ts +1 -0
  295. package/build/src/database/handler.d.ts.map +1 -1
  296. package/build/src/database/handler.js +2 -1
  297. package/build/src/database/initializer-from-require-context.d.ts +8 -0
  298. package/build/src/database/initializer-from-require-context.d.ts.map +1 -1
  299. package/build/src/database/initializer-from-require-context.js +4 -1
  300. package/build/src/database/migration/index.d.ts +40 -5
  301. package/build/src/database/migration/index.d.ts.map +1 -1
  302. package/build/src/database/migration/index.js +34 -6
  303. package/build/src/database/migrator/files-finder.d.ts +2 -0
  304. package/build/src/database/migrator/files-finder.d.ts.map +1 -1
  305. package/build/src/database/migrator/files-finder.js +6 -2
  306. package/build/src/database/migrator.d.ts +29 -4
  307. package/build/src/database/migrator.d.ts.map +1 -1
  308. package/build/src/database/migrator.js +45 -10
  309. package/build/src/database/pool/async-tracked-multi-connection.d.ts +125 -31
  310. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  311. package/build/src/database/pool/async-tracked-multi-connection.js +189 -52
  312. package/build/src/database/pool/base-methods-forward.d.ts +1 -0
  313. package/build/src/database/pool/base-methods-forward.d.ts.map +1 -1
  314. package/build/src/database/pool/base-methods-forward.js +12 -3
  315. package/build/src/database/pool/base.d.ts +39 -7
  316. package/build/src/database/pool/base.d.ts.map +1 -1
  317. package/build/src/database/pool/base.js +59 -18
  318. package/build/src/database/pool/single-multi-use.d.ts +1 -0
  319. package/build/src/database/pool/single-multi-use.d.ts.map +1 -1
  320. package/build/src/database/pool/single-multi-use.js +16 -4
  321. package/build/src/database/query/alter-table-base.d.ts +1 -0
  322. package/build/src/database/query/alter-table-base.d.ts.map +1 -1
  323. package/build/src/database/query/alter-table-base.js +3 -1
  324. package/build/src/database/query/base.d.ts +3 -0
  325. package/build/src/database/query/base.d.ts.map +1 -1
  326. package/build/src/database/query/base.js +4 -1
  327. package/build/src/database/query/create-database-base.d.ts +5 -0
  328. package/build/src/database/query/create-database-base.d.ts.map +1 -1
  329. package/build/src/database/query/create-database-base.js +4 -1
  330. package/build/src/database/query/create-index-base.d.ts +5 -0
  331. package/build/src/database/query/create-index-base.d.ts.map +1 -1
  332. package/build/src/database/query/create-index-base.js +4 -1
  333. package/build/src/database/query/create-table-base.d.ts +2 -0
  334. package/build/src/database/query/create-table-base.d.ts.map +1 -1
  335. package/build/src/database/query/create-table-base.js +3 -1
  336. package/build/src/database/query/delete-base.d.ts +3 -2
  337. package/build/src/database/query/delete-base.d.ts.map +1 -1
  338. package/build/src/database/query/delete-base.js +3 -2
  339. package/build/src/database/query/drop-database-base.d.ts +5 -0
  340. package/build/src/database/query/drop-database-base.d.ts.map +1 -1
  341. package/build/src/database/query/drop-database-base.js +4 -1
  342. package/build/src/database/query/drop-table-base.d.ts +1 -0
  343. package/build/src/database/query/drop-table-base.d.ts.map +1 -1
  344. package/build/src/database/query/drop-table-base.js +3 -1
  345. package/build/src/database/query/from-base.d.ts +6 -1
  346. package/build/src/database/query/from-base.d.ts.map +1 -1
  347. package/build/src/database/query/from-base.js +7 -2
  348. package/build/src/database/query/from-plain.d.ts +1 -0
  349. package/build/src/database/query/from-plain.d.ts.map +1 -1
  350. package/build/src/database/query/from-plain.js +2 -1
  351. package/build/src/database/query/from-table.d.ts +1 -0
  352. package/build/src/database/query/from-table.d.ts.map +1 -1
  353. package/build/src/database/query/from-table.js +2 -1
  354. package/build/src/database/query/index.d.ts +72 -12
  355. package/build/src/database/query/index.d.ts.map +1 -1
  356. package/build/src/database/query/index.js +79 -19
  357. package/build/src/database/query/insert-base.d.ts +13 -8
  358. package/build/src/database/query/insert-base.d.ts.map +1 -1
  359. package/build/src/database/query/insert-base.js +10 -5
  360. package/build/src/database/query/join-base.d.ts +4 -0
  361. package/build/src/database/query/join-base.d.ts.map +1 -1
  362. package/build/src/database/query/join-base.js +5 -1
  363. package/build/src/database/query/join-object.d.ts +11 -0
  364. package/build/src/database/query/join-object.d.ts.map +1 -1
  365. package/build/src/database/query/join-object.js +15 -4
  366. package/build/src/database/query/join-plain.d.ts +1 -0
  367. package/build/src/database/query/join-plain.d.ts.map +1 -1
  368. package/build/src/database/query/join-plain.js +2 -1
  369. package/build/src/database/query/join-tracker.d.ts +7 -0
  370. package/build/src/database/query/join-tracker.d.ts.map +1 -1
  371. package/build/src/database/query/join-tracker.js +8 -1
  372. package/build/src/database/query/model-class-query.d.ts +92 -26
  373. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  374. package/build/src/database/query/model-class-query.js +230 -76
  375. package/build/src/database/query/order-base.d.ts +3 -0
  376. package/build/src/database/query/order-base.d.ts.map +1 -1
  377. package/build/src/database/query/order-base.js +4 -1
  378. package/build/src/database/query/order-column.d.ts +9 -1
  379. package/build/src/database/query/order-column.d.ts.map +1 -1
  380. package/build/src/database/query/order-column.js +10 -2
  381. package/build/src/database/query/order-plain.d.ts +1 -0
  382. package/build/src/database/query/order-plain.d.ts.map +1 -1
  383. package/build/src/database/query/order-plain.js +2 -1
  384. package/build/src/database/query/preloader/belongs-to.d.ts +1 -0
  385. package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
  386. package/build/src/database/query/preloader/belongs-to.js +68 -23
  387. package/build/src/database/query/preloader/ensure-model-class-initialized.d.ts +1 -0
  388. package/build/src/database/query/preloader/ensure-model-class-initialized.d.ts.map +1 -1
  389. package/build/src/database/query/preloader/ensure-model-class-initialized.js +2 -1
  390. package/build/src/database/query/preloader/has-many.d.ts +5 -3
  391. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  392. package/build/src/database/query/preloader/has-many.js +66 -24
  393. package/build/src/database/query/preloader/has-one.d.ts +1 -0
  394. package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
  395. package/build/src/database/query/preloader/has-one.js +26 -9
  396. package/build/src/database/query/preloader/selection.d.ts +7 -1
  397. package/build/src/database/query/preloader/selection.d.ts.map +1 -1
  398. package/build/src/database/query/preloader/selection.js +13 -5
  399. package/build/src/database/query/preloader.d.ts +1 -0
  400. package/build/src/database/query/preloader.d.ts.map +1 -1
  401. package/build/src/database/query/preloader.js +28 -9
  402. package/build/src/database/query/query-data.d.ts +21 -7
  403. package/build/src/database/query/query-data.d.ts.map +1 -1
  404. package/build/src/database/query/query-data.js +37 -18
  405. package/build/src/database/query/select-base.d.ts +3 -0
  406. package/build/src/database/query/select-base.d.ts.map +1 -1
  407. package/build/src/database/query/select-base.js +4 -1
  408. package/build/src/database/query/select-plain.d.ts +1 -0
  409. package/build/src/database/query/select-plain.d.ts.map +1 -1
  410. package/build/src/database/query/select-plain.js +2 -1
  411. package/build/src/database/query/select-table-and-column.d.ts +1 -0
  412. package/build/src/database/query/select-table-and-column.d.ts.map +1 -1
  413. package/build/src/database/query/select-table-and-column.js +2 -1
  414. package/build/src/database/query/update-base.d.ts +9 -6
  415. package/build/src/database/query/update-base.d.ts.map +1 -1
  416. package/build/src/database/query/update-base.js +7 -4
  417. package/build/src/database/query/upsert-base.d.ts +13 -4
  418. package/build/src/database/query/upsert-base.d.ts.map +1 -1
  419. package/build/src/database/query/upsert-base.js +12 -3
  420. package/build/src/database/query/where-base.d.ts +4 -0
  421. package/build/src/database/query/where-base.d.ts.map +1 -1
  422. package/build/src/database/query/where-base.js +5 -1
  423. package/build/src/database/query/where-combinator.d.ts +1 -0
  424. package/build/src/database/query/where-combinator.d.ts.map +1 -1
  425. package/build/src/database/query/where-combinator.js +6 -2
  426. package/build/src/database/query/where-hash.d.ts +6 -0
  427. package/build/src/database/query/where-hash.d.ts.map +1 -1
  428. package/build/src/database/query/where-hash.js +5 -1
  429. package/build/src/database/query/where-model-class-hash.d.ts +30 -16
  430. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  431. package/build/src/database/query/where-model-class-hash.js +55 -20
  432. package/build/src/database/query/where-not.d.ts +1 -0
  433. package/build/src/database/query/where-not.d.ts.map +1 -1
  434. package/build/src/database/query/where-not.js +3 -1
  435. package/build/src/database/query/where-plain.d.ts +1 -0
  436. package/build/src/database/query/where-plain.d.ts.map +1 -1
  437. package/build/src/database/query/where-plain.js +2 -1
  438. package/build/src/database/query/with-count.d.ts +11 -5
  439. package/build/src/database/query/with-count.d.ts.map +1 -1
  440. package/build/src/database/query/with-count.js +36 -15
  441. package/build/src/database/query-parser/base-query-parser.d.ts +1 -0
  442. package/build/src/database/query-parser/base-query-parser.d.ts.map +1 -1
  443. package/build/src/database/query-parser/base-query-parser.js +2 -1
  444. package/build/src/database/query-parser/from-parser.d.ts +5 -1
  445. package/build/src/database/query-parser/from-parser.d.ts.map +1 -1
  446. package/build/src/database/query-parser/from-parser.js +6 -2
  447. package/build/src/database/query-parser/group-parser.d.ts +2 -0
  448. package/build/src/database/query-parser/group-parser.d.ts.map +1 -1
  449. package/build/src/database/query-parser/group-parser.js +3 -1
  450. package/build/src/database/query-parser/joins-parser.d.ts +1 -0
  451. package/build/src/database/query-parser/joins-parser.d.ts.map +1 -1
  452. package/build/src/database/query-parser/joins-parser.js +2 -1
  453. package/build/src/database/query-parser/limit-parser.d.ts +1 -0
  454. package/build/src/database/query-parser/limit-parser.d.ts.map +1 -1
  455. package/build/src/database/query-parser/limit-parser.js +2 -1
  456. package/build/src/database/query-parser/options.d.ts +15 -4
  457. package/build/src/database/query-parser/options.d.ts.map +1 -1
  458. package/build/src/database/query-parser/options.js +11 -3
  459. package/build/src/database/query-parser/order-parser.d.ts +1 -0
  460. package/build/src/database/query-parser/order-parser.d.ts.map +1 -1
  461. package/build/src/database/query-parser/order-parser.js +2 -1
  462. package/build/src/database/query-parser/select-parser.d.ts +1 -0
  463. package/build/src/database/query-parser/select-parser.d.ts.map +1 -1
  464. package/build/src/database/query-parser/select-parser.js +2 -1
  465. package/build/src/database/query-parser/where-parser.d.ts +1 -0
  466. package/build/src/database/query-parser/where-parser.d.ts.map +1 -1
  467. package/build/src/database/query-parser/where-parser.js +2 -1
  468. package/build/src/database/record/acts-as-list.d.ts +0 -1
  469. package/build/src/database/record/acts-as-list.d.ts.map +1 -1
  470. package/build/src/database/record/acts-as-list.js +89 -45
  471. package/build/src/database/record/attachments/download.d.ts +34 -15
  472. package/build/src/database/record/attachments/download.d.ts.map +1 -1
  473. package/build/src/database/record/attachments/download.js +34 -22
  474. package/build/src/database/record/attachments/handle.d.ts +17 -5
  475. package/build/src/database/record/attachments/handle.d.ts.map +1 -1
  476. package/build/src/database/record/attachments/handle.js +25 -9
  477. package/build/src/database/record/attachments/normalize-input.d.ts +6 -1
  478. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  479. package/build/src/database/record/attachments/normalize-input.js +54 -17
  480. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts +7 -1
  481. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts.map +1 -1
  482. package/build/src/database/record/attachments/storage-drivers/filesystem.js +10 -2
  483. package/build/src/database/record/attachments/storage-drivers/native.d.ts +12 -7
  484. package/build/src/database/record/attachments/storage-drivers/native.d.ts.map +1 -1
  485. package/build/src/database/record/attachments/storage-drivers/native.js +13 -6
  486. package/build/src/database/record/attachments/storage-drivers/s3.d.ts +18 -9
  487. package/build/src/database/record/attachments/storage-drivers/s3.d.ts.map +1 -1
  488. package/build/src/database/record/attachments/storage-drivers/s3.js +38 -13
  489. package/build/src/database/record/attachments/store.d.ts +48 -25
  490. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  491. package/build/src/database/record/attachments/store.js +63 -25
  492. package/build/src/database/record/index.d.ts +394 -146
  493. package/build/src/database/record/index.d.ts.map +1 -1
  494. package/build/src/database/record/index.js +697 -248
  495. package/build/src/database/record/instance-relationships/base.d.ts +78 -19
  496. package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
  497. package/build/src/database/record/instance-relationships/base.js +98 -26
  498. package/build/src/database/record/instance-relationships/belongs-to.d.ts +1 -0
  499. package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  500. package/build/src/database/record/instance-relationships/belongs-to.js +13 -5
  501. package/build/src/database/record/instance-relationships/has-many.d.ts +27 -7
  502. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  503. package/build/src/database/record/instance-relationships/has-many.js +50 -16
  504. package/build/src/database/record/instance-relationships/has-one.d.ts +4 -1
  505. package/build/src/database/record/instance-relationships/has-one.d.ts.map +1 -1
  506. package/build/src/database/record/instance-relationships/has-one.js +28 -10
  507. package/build/src/database/record/relationships/base.d.ts +61 -14
  508. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  509. package/build/src/database/record/relationships/base.js +60 -15
  510. package/build/src/database/record/relationships/belongs-to.d.ts.map +1 -1
  511. package/build/src/database/record/relationships/belongs-to.js +9 -3
  512. package/build/src/database/record/relationships/has-many.d.ts.map +1 -1
  513. package/build/src/database/record/relationships/has-many.js +9 -3
  514. package/build/src/database/record/relationships/has-one.d.ts.map +1 -1
  515. package/build/src/database/record/relationships/has-one.js +9 -3
  516. package/build/src/database/record/state-machine.d.ts +9 -1
  517. package/build/src/database/record/state-machine.d.ts.map +1 -1
  518. package/build/src/database/record/state-machine.js +35 -14
  519. package/build/src/database/record/user-module.d.ts +2 -0
  520. package/build/src/database/record/user-module.d.ts.map +1 -1
  521. package/build/src/database/record/user-module.js +3 -1
  522. package/build/src/database/record/validators/base.d.ts +4 -2
  523. package/build/src/database/record/validators/base.d.ts.map +1 -1
  524. package/build/src/database/record/validators/base.js +4 -2
  525. package/build/src/database/record/validators/format.d.ts.map +1 -1
  526. package/build/src/database/record/validators/format.js +2 -1
  527. package/build/src/database/record/validators/presence.d.ts.map +1 -1
  528. package/build/src/database/record/validators/presence.js +5 -2
  529. package/build/src/database/record/validators/uniqueness.d.ts +0 -2
  530. package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
  531. package/build/src/database/record/validators/uniqueness.js +18 -8
  532. package/build/src/database/table-data/index.d.ts +40 -4
  533. package/build/src/database/table-data/index.d.ts.map +1 -1
  534. package/build/src/database/table-data/index.js +38 -5
  535. package/build/src/database/table-data/table-column.d.ts +43 -5
  536. package/build/src/database/table-data/table-column.d.ts.map +1 -1
  537. package/build/src/database/table-data/table-column.js +37 -4
  538. package/build/src/database/table-data/table-foreign-key.d.ts +8 -0
  539. package/build/src/database/table-data/table-foreign-key.d.ts.map +1 -1
  540. package/build/src/database/table-data/table-foreign-key.js +9 -1
  541. package/build/src/database/table-data/table-index.d.ts +8 -0
  542. package/build/src/database/table-data/table-index.d.ts.map +1 -1
  543. package/build/src/database/table-data/table-index.js +6 -1
  544. package/build/src/database/table-data/table-reference.d.ts +1 -0
  545. package/build/src/database/table-data/table-reference.d.ts.map +1 -1
  546. package/build/src/database/table-data/table-reference.js +2 -1
  547. package/build/src/database/use-database.d.ts +1 -0
  548. package/build/src/database/use-database.d.ts.map +1 -1
  549. package/build/src/database/use-database.js +2 -1
  550. package/build/src/environment-handlers/base.d.ts +94 -36
  551. package/build/src/environment-handlers/base.d.ts.map +1 -1
  552. package/build/src/environment-handlers/base.js +90 -36
  553. package/build/src/environment-handlers/browser.d.ts +33 -3
  554. package/build/src/environment-handlers/browser.d.ts.map +1 -1
  555. package/build/src/environment-handlers/browser.js +36 -9
  556. package/build/src/environment-handlers/node/cli/commands/cli-command-context.d.ts +5 -0
  557. package/build/src/environment-handlers/node/cli/commands/cli-command-context.d.ts.map +1 -1
  558. package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +6 -2
  559. package/build/src/environment-handlers/node/cli/commands/console.d.ts +3 -2
  560. package/build/src/environment-handlers/node/cli/commands/console.d.ts.map +1 -1
  561. package/build/src/environment-handlers/node/cli/commands/console.js +23 -9
  562. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.d.ts +4 -1
  563. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.d.ts.map +1 -1
  564. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +5 -2
  565. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts +6 -2
  566. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts.map +1 -1
  567. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +11 -5
  568. package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts +15 -5
  569. package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts.map +1 -1
  570. package/build/src/environment-handlers/node/cli/commands/db/seed.js +20 -6
  571. package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts +5 -0
  572. package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts.map +1 -1
  573. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +3 -1
  574. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +2 -0
  575. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  576. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +6 -4
  577. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +43 -29
  578. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  579. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +99 -40
  580. package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts +5 -0
  581. package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts.map +1 -1
  582. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +3 -1
  583. package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts +5 -0
  584. package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts.map +1 -1
  585. package/build/src/environment-handlers/node/cli/commands/generate/model.js +3 -1
  586. package/build/src/environment-handlers/node/cli/commands/init.d.ts +5 -0
  587. package/build/src/environment-handlers/node/cli/commands/init.d.ts.map +1 -1
  588. package/build/src/environment-handlers/node/cli/commands/init.js +3 -1
  589. package/build/src/environment-handlers/node/cli/commands/routes.d.ts +3 -0
  590. package/build/src/environment-handlers/node/cli/commands/routes.d.ts.map +1 -1
  591. package/build/src/environment-handlers/node/cli/commands/routes.js +4 -1
  592. package/build/src/environment-handlers/node/cli/commands/run-script.d.ts +15 -5
  593. package/build/src/environment-handlers/node/cli/commands/run-script.d.ts.map +1 -1
  594. package/build/src/environment-handlers/node/cli/commands/run-script.js +20 -6
  595. package/build/src/environment-handlers/node/cli/commands/runner.d.ts +18 -6
  596. package/build/src/environment-handlers/node/cli/commands/runner.d.ts.map +1 -1
  597. package/build/src/environment-handlers/node/cli/commands/runner.js +20 -6
  598. package/build/src/environment-handlers/node/cli/commands/server.d.ts +13 -1
  599. package/build/src/environment-handlers/node/cli/commands/server.d.ts.map +1 -1
  600. package/build/src/environment-handlers/node/cli/commands/server.js +23 -6
  601. package/build/src/environment-handlers/node.d.ts +14 -2
  602. package/build/src/environment-handlers/node.d.ts.map +1 -1
  603. package/build/src/environment-handlers/node.js +107 -39
  604. package/build/src/error-logger.d.ts +4 -3
  605. package/build/src/error-logger.d.ts.map +1 -1
  606. package/build/src/error-logger.js +4 -3
  607. package/build/src/frontend-model-controller.d.ts +239 -90
  608. package/build/src/frontend-model-controller.d.ts.map +1 -1
  609. package/build/src/frontend-model-controller.js +577 -787
  610. package/build/src/frontend-model-resource/base-resource.d.ts +118 -66
  611. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  612. package/build/src/frontend-model-resource/base-resource.js +205 -82
  613. package/build/src/frontend-models/base.d.ts +319 -163
  614. package/build/src/frontend-models/base.d.ts.map +1 -1
  615. package/build/src/frontend-models/base.js +717 -366
  616. package/build/src/frontend-models/clear-pending-debounced-callback.d.ts +2 -1
  617. package/build/src/frontend-models/clear-pending-debounced-callback.d.ts.map +1 -1
  618. package/build/src/frontend-models/clear-pending-debounced-callback.js +6 -3
  619. package/build/src/frontend-models/event-hook-models.d.ts +5 -0
  620. package/build/src/frontend-models/event-hook-models.d.ts.map +1 -1
  621. package/build/src/frontend-models/event-hook-models.js +10 -3
  622. package/build/src/frontend-models/model-registry.d.ts +5 -5
  623. package/build/src/frontend-models/model-registry.d.ts.map +1 -1
  624. package/build/src/frontend-models/model-registry.js +5 -5
  625. package/build/src/frontend-models/outgoing-event-buffer.d.ts +11 -3
  626. package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
  627. package/build/src/frontend-models/outgoing-event-buffer.js +13 -5
  628. package/build/src/frontend-models/preloader.d.ts +9 -6
  629. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  630. package/build/src/frontend-models/preloader.js +21 -9
  631. package/build/src/frontend-models/query.d.ts +283 -73
  632. package/build/src/frontend-models/query.d.ts.map +1 -1
  633. package/build/src/frontend-models/query.js +331 -203
  634. package/build/src/frontend-models/resource-config-validation.d.ts +2 -0
  635. package/build/src/frontend-models/resource-config-validation.d.ts.map +1 -1
  636. package/build/src/frontend-models/resource-config-validation.js +3 -1
  637. package/build/src/frontend-models/resource-definition.d.ts +12 -5
  638. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  639. package/build/src/frontend-models/resource-definition.js +39 -13
  640. package/build/src/frontend-models/transport-serialization.d.ts +14 -11
  641. package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
  642. package/build/src/frontend-models/transport-serialization.js +80 -53
  643. package/build/src/frontend-models/use-destroyed-event.d.ts +21 -0
  644. package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
  645. package/build/src/frontend-models/use-destroyed-event.js +34 -11
  646. package/build/src/frontend-models/use-model-class-event.d.ts +24 -0
  647. package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
  648. package/build/src/frontend-models/use-model-class-event.js +39 -12
  649. package/build/src/frontend-models/use-updated-event.d.ts +21 -0
  650. package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
  651. package/build/src/frontend-models/use-updated-event.js +37 -12
  652. package/build/src/frontend-models/websocket-channel.d.ts +51 -9
  653. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  654. package/build/src/frontend-models/websocket-channel.js +96 -26
  655. package/build/src/frontend-models/websocket-publishers.d.ts +2 -0
  656. package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
  657. package/build/src/frontend-models/websocket-publishers.js +33 -11
  658. package/build/src/http-client/header.d.ts +1 -0
  659. package/build/src/http-client/header.d.ts.map +1 -1
  660. package/build/src/http-client/header.js +2 -1
  661. package/build/src/http-client/index.d.ts +4 -0
  662. package/build/src/http-client/index.d.ts.map +1 -1
  663. package/build/src/http-client/index.js +5 -1
  664. package/build/src/http-client/request.d.ts +5 -0
  665. package/build/src/http-client/request.d.ts.map +1 -1
  666. package/build/src/http-client/request.js +6 -1
  667. package/build/src/http-client/response.d.ts +14 -4
  668. package/build/src/http-client/response.d.ts.map +1 -1
  669. package/build/src/http-client/response.js +14 -4
  670. package/build/src/http-client/websocket-client.d.ts +1 -0
  671. package/build/src/http-client/websocket-client.d.ts.map +1 -1
  672. package/build/src/http-client/websocket-client.js +2 -1
  673. package/build/src/http-server/client/index.d.ts +16 -2
  674. package/build/src/http-server/client/index.d.ts.map +1 -1
  675. package/build/src/http-server/client/index.js +44 -13
  676. package/build/src/http-server/client/params-to-object.d.ts +16 -10
  677. package/build/src/http-server/client/params-to-object.d.ts.map +1 -1
  678. package/build/src/http-server/client/params-to-object.js +46 -17
  679. package/build/src/http-server/client/request-buffer/form-data-part.d.ts +10 -6
  680. package/build/src/http-server/client/request-buffer/form-data-part.d.ts.map +1 -1
  681. package/build/src/http-server/client/request-buffer/form-data-part.js +11 -7
  682. package/build/src/http-server/client/request-buffer/header.d.ts +1 -0
  683. package/build/src/http-server/client/request-buffer/header.d.ts.map +1 -1
  684. package/build/src/http-server/client/request-buffer/header.js +2 -1
  685. package/build/src/http-server/client/request-buffer/index.d.ts +29 -4
  686. package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
  687. package/build/src/http-server/client/request-buffer/index.js +43 -9
  688. package/build/src/http-server/client/request-parser.d.ts +52 -13
  689. package/build/src/http-server/client/request-parser.d.ts.map +1 -1
  690. package/build/src/http-server/client/request-parser.js +58 -15
  691. package/build/src/http-server/client/request-runner.d.ts +5 -1
  692. package/build/src/http-server/client/request-runner.d.ts.map +1 -1
  693. package/build/src/http-server/client/request-runner.js +32 -8
  694. package/build/src/http-server/client/request-timing.d.ts +37 -7
  695. package/build/src/http-server/client/request-timing.d.ts.map +1 -1
  696. package/build/src/http-server/client/request-timing.js +32 -8
  697. package/build/src/http-server/client/request.d.ts +15 -5
  698. package/build/src/http-server/client/request.d.ts.map +1 -1
  699. package/build/src/http-server/client/request.js +17 -5
  700. package/build/src/http-server/client/response.d.ts +22 -4
  701. package/build/src/http-server/client/response.d.ts.map +1 -1
  702. package/build/src/http-server/client/response.js +29 -7
  703. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts +1 -0
  704. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts.map +1 -1
  705. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +3 -1
  706. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts +1 -0
  707. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts.map +1 -1
  708. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +3 -1
  709. package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts +2 -0
  710. package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts.map +1 -1
  711. package/build/src/http-server/client/uploaded-file/uploaded-file.js +3 -1
  712. package/build/src/http-server/client/websocket-request.d.ts +24 -12
  713. package/build/src/http-server/client/websocket-request.d.ts.map +1 -1
  714. package/build/src/http-server/client/websocket-request.js +24 -10
  715. package/build/src/http-server/client/websocket-session.d.ts +101 -62
  716. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  717. package/build/src/http-server/client/websocket-session.js +118 -61
  718. package/build/src/http-server/cookie.d.ts +36 -8
  719. package/build/src/http-server/cookie.d.ts.map +1 -1
  720. package/build/src/http-server/cookie.js +37 -9
  721. package/build/src/http-server/development-reloader.d.ts +32 -7
  722. package/build/src/http-server/development-reloader.d.ts.map +1 -1
  723. package/build/src/http-server/development-reloader.js +39 -10
  724. package/build/src/http-server/index.d.ts +102 -25
  725. package/build/src/http-server/index.d.ts.map +1 -1
  726. package/build/src/http-server/index.js +117 -32
  727. package/build/src/http-server/remote-address.d.ts +1 -0
  728. package/build/src/http-server/remote-address.d.ts.map +1 -1
  729. package/build/src/http-server/remote-address.js +15 -4
  730. package/build/src/http-server/server-client.d.ts +37 -8
  731. package/build/src/http-server/server-client.d.ts.map +1 -1
  732. package/build/src/http-server/server-client.js +48 -12
  733. package/build/src/http-server/server-lock.d.ts +76 -0
  734. package/build/src/http-server/server-lock.d.ts.map +1 -0
  735. package/build/src/http-server/server-lock.js +164 -0
  736. package/build/src/http-server/websocket-channel-subscribers.d.ts +13 -8
  737. package/build/src/http-server/websocket-channel-subscribers.d.ts.map +1 -1
  738. package/build/src/http-server/websocket-channel-subscribers.js +16 -7
  739. package/build/src/http-server/websocket-channel.d.ts +13 -11
  740. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  741. package/build/src/http-server/websocket-channel.js +8 -12
  742. package/build/src/http-server/websocket-connection.d.ts +10 -14
  743. package/build/src/http-server/websocket-connection.d.ts.map +1 -1
  744. package/build/src/http-server/websocket-connection.js +8 -12
  745. package/build/src/http-server/websocket-event-log-store.d.ts +48 -10
  746. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  747. package/build/src/http-server/websocket-event-log-store.js +76 -34
  748. package/build/src/http-server/websocket-events-host.d.ts +21 -15
  749. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  750. package/build/src/http-server/websocket-events-host.js +20 -11
  751. package/build/src/http-server/websocket-events.d.ts +8 -7
  752. package/build/src/http-server/websocket-events.d.ts.map +1 -1
  753. package/build/src/http-server/websocket-events.js +6 -5
  754. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts +3 -2
  755. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts.map +1 -1
  756. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +3 -2
  757. package/build/src/http-server/worker-handler/in-process.d.ts +18 -18
  758. package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
  759. package/build/src/http-server/worker-handler/in-process.js +28 -20
  760. package/build/src/http-server/worker-handler/index.d.ts +39 -20
  761. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  762. package/build/src/http-server/worker-handler/index.js +34 -14
  763. package/build/src/http-server/worker-handler/worker-thread.d.ts +31 -15
  764. package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
  765. package/build/src/http-server/worker-handler/worker-thread.js +31 -12
  766. package/build/src/initializer.d.ts +4 -0
  767. package/build/src/initializer.d.ts.map +1 -1
  768. package/build/src/initializer.js +5 -1
  769. package/build/src/jobs/mail-delivery.d.ts +1 -0
  770. package/build/src/jobs/mail-delivery.d.ts.map +1 -1
  771. package/build/src/jobs/mail-delivery.js +2 -1
  772. package/build/src/logger/base-logger.js +2 -2
  773. package/build/src/logger/console-logger.d.ts +2 -0
  774. package/build/src/logger/console-logger.d.ts.map +1 -1
  775. package/build/src/logger/console-logger.js +3 -1
  776. package/build/src/logger/file-logger.d.ts +2 -0
  777. package/build/src/logger/file-logger.d.ts.map +1 -1
  778. package/build/src/logger/file-logger.js +3 -1
  779. package/build/src/logger/outputs/array-output.d.ts +21 -5
  780. package/build/src/logger/outputs/array-output.d.ts.map +1 -1
  781. package/build/src/logger/outputs/array-output.js +19 -6
  782. package/build/src/logger/outputs/console-output.d.ts +10 -2
  783. package/build/src/logger/outputs/console-output.d.ts.map +1 -1
  784. package/build/src/logger/outputs/console-output.js +8 -3
  785. package/build/src/logger/outputs/file-output.d.ts +20 -5
  786. package/build/src/logger/outputs/file-output.d.ts.map +1 -1
  787. package/build/src/logger/outputs/file-output.js +18 -6
  788. package/build/src/logger/outputs/stdout-output.d.ts +7 -1
  789. package/build/src/logger/outputs/stdout-output.d.ts.map +1 -1
  790. package/build/src/logger/outputs/stdout-output.js +9 -3
  791. package/build/src/logger.d.ts +28 -13
  792. package/build/src/logger.d.ts.map +1 -1
  793. package/build/src/logger.js +60 -23
  794. package/build/src/mailer/backends/smtp.d.ts +5 -0
  795. package/build/src/mailer/backends/smtp.d.ts.map +1 -1
  796. package/build/src/mailer/backends/smtp.js +17 -4
  797. package/build/src/mailer/base.d.ts +33 -17
  798. package/build/src/mailer/base.d.ts.map +1 -1
  799. package/build/src/mailer/base.js +54 -18
  800. package/build/src/mailer/delivery.d.ts +16 -5
  801. package/build/src/mailer/delivery.d.ts.map +1 -1
  802. package/build/src/mailer/delivery.js +18 -7
  803. package/build/src/mailer/index.d.ts +5 -5
  804. package/build/src/mailer/index.d.ts.map +1 -1
  805. package/build/src/mailer/index.js +2 -2
  806. package/build/src/mailer.d.ts +5 -5
  807. package/build/src/mailer.d.ts.map +1 -1
  808. package/build/src/mailer.js +2 -2
  809. package/build/src/plugins/sqljs-wasm-route-controller.d.ts +4 -1
  810. package/build/src/plugins/sqljs-wasm-route-controller.d.ts.map +1 -1
  811. package/build/src/plugins/sqljs-wasm-route-controller.js +11 -4
  812. package/build/src/plugins/sqljs-wasm-route.d.ts +6 -0
  813. package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
  814. package/build/src/plugins/sqljs-wasm-route.js +4 -1
  815. package/build/src/record-payload-values.d.ts +54 -0
  816. package/build/src/record-payload-values.d.ts.map +1 -0
  817. package/build/src/record-payload-values.js +80 -0
  818. package/build/src/routes/app-routes.d.ts +1 -0
  819. package/build/src/routes/app-routes.d.ts.map +1 -1
  820. package/build/src/routes/app-routes.js +2 -1
  821. package/build/src/routes/base-route.d.ts +52 -16
  822. package/build/src/routes/base-route.d.ts.map +1 -1
  823. package/build/src/routes/base-route.js +50 -14
  824. package/build/src/routes/basic-route.d.ts +1 -0
  825. package/build/src/routes/basic-route.d.ts.map +1 -1
  826. package/build/src/routes/basic-route.js +13 -4
  827. package/build/src/routes/built-in/debug/controller.d.ts +4 -1
  828. package/build/src/routes/built-in/debug/controller.d.ts.map +1 -1
  829. package/build/src/routes/built-in/debug/controller.js +5 -2
  830. package/build/src/routes/get-route.d.ts +1 -0
  831. package/build/src/routes/get-route.d.ts.map +1 -1
  832. package/build/src/routes/get-route.js +7 -4
  833. package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts +1 -0
  834. package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts.map +1 -1
  835. package/build/src/routes/hooks/frontend-model-command-route-hook.js +6 -2
  836. package/build/src/routes/index.d.ts +3 -2
  837. package/build/src/routes/index.d.ts.map +1 -1
  838. package/build/src/routes/index.js +10 -4
  839. package/build/src/routes/namespace-route.d.ts +1 -0
  840. package/build/src/routes/namespace-route.d.ts.map +1 -1
  841. package/build/src/routes/namespace-route.js +5 -3
  842. package/build/src/routes/plugin-routes.d.ts +10 -1
  843. package/build/src/routes/plugin-routes.d.ts.map +1 -1
  844. package/build/src/routes/plugin-routes.js +11 -3
  845. package/build/src/routes/post-route.d.ts +1 -0
  846. package/build/src/routes/post-route.d.ts.map +1 -1
  847. package/build/src/routes/post-route.js +7 -4
  848. package/build/src/routes/resolver.d.ts +20 -5
  849. package/build/src/routes/resolver.d.ts.map +1 -1
  850. package/build/src/routes/resolver.js +47 -14
  851. package/build/src/routes/resource-route.d.ts +6 -1
  852. package/build/src/routes/resource-route.d.ts.map +1 -1
  853. package/build/src/routes/resource-route.js +10 -4
  854. package/build/src/testing/base-expect.d.ts +2 -0
  855. package/build/src/testing/base-expect.d.ts.map +1 -1
  856. package/build/src/testing/base-expect.js +3 -1
  857. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +33 -5
  858. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
  859. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +95 -23
  860. package/build/src/testing/expect-to-change.d.ts +3 -0
  861. package/build/src/testing/expect-to-change.d.ts.map +1 -1
  862. package/build/src/testing/expect-to-change.js +4 -1
  863. package/build/src/testing/expect-utils.d.ts +22 -16
  864. package/build/src/testing/expect-utils.d.ts.map +1 -1
  865. package/build/src/testing/expect-utils.js +62 -30
  866. package/build/src/testing/expect.d.ts +50 -21
  867. package/build/src/testing/expect.d.ts.map +1 -1
  868. package/build/src/testing/expect.js +58 -17
  869. package/build/src/testing/request-client.d.ts +16 -3
  870. package/build/src/testing/request-client.d.ts.map +1 -1
  871. package/build/src/testing/request-client.js +17 -4
  872. package/build/src/testing/test-files-finder.d.ts +41 -9
  873. package/build/src/testing/test-files-finder.d.ts.map +1 -1
  874. package/build/src/testing/test-files-finder.js +42 -10
  875. package/build/src/testing/test-filter-parser.d.ts +6 -0
  876. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  877. package/build/src/testing/test-filter-parser.js +12 -3
  878. package/build/src/testing/test-runner.d.ts +102 -6
  879. package/build/src/testing/test-runner.d.ts.map +1 -1
  880. package/build/src/testing/test-runner.js +115 -23
  881. package/build/src/testing/test-suite-splitter.d.ts +7 -0
  882. package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
  883. package/build/src/testing/test-suite-splitter.js +7 -2
  884. package/build/src/testing/test.d.ts +20 -4
  885. package/build/src/testing/test.d.ts.map +1 -1
  886. package/build/src/testing/test.js +67 -20
  887. package/build/src/utils/backtrace-cleaner-node.d.ts.map +1 -1
  888. package/build/src/utils/backtrace-cleaner-node.js +6 -1
  889. package/build/src/utils/backtrace-cleaner.d.ts +16 -1
  890. package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
  891. package/build/src/utils/backtrace-cleaner.js +20 -2
  892. package/build/src/utils/ensure-error.d.ts +3 -2
  893. package/build/src/utils/ensure-error.d.ts.map +1 -1
  894. package/build/src/utils/ensure-error.js +3 -2
  895. package/build/src/utils/event-emitter.d.ts.map +1 -1
  896. package/build/src/utils/event-emitter.js +2 -2
  897. package/build/src/utils/file-exists.d.ts +1 -0
  898. package/build/src/utils/file-exists.d.ts.map +1 -1
  899. package/build/src/utils/file-exists.js +2 -1
  900. package/build/src/utils/format-value.d.ts +5 -4
  901. package/build/src/utils/format-value.d.ts.map +1 -1
  902. package/build/src/utils/format-value.js +12 -7
  903. package/build/src/utils/model-scope.d.ts +18 -12
  904. package/build/src/utils/model-scope.d.ts.map +1 -1
  905. package/build/src/utils/model-scope.js +19 -11
  906. package/build/src/utils/nest-callbacks.d.ts +1 -0
  907. package/build/src/utils/nest-callbacks.d.ts.map +1 -1
  908. package/build/src/utils/nest-callbacks.js +2 -1
  909. package/build/src/utils/plain-object.d.ts +7 -0
  910. package/build/src/utils/plain-object.d.ts.map +1 -0
  911. package/build/src/utils/plain-object.js +13 -0
  912. package/build/src/utils/ransack.d.ts +29 -5
  913. package/build/src/utils/ransack.d.ts.map +1 -1
  914. package/build/src/utils/ransack.js +136 -49
  915. package/build/src/utils/rest-args-error.d.ts +1 -0
  916. package/build/src/utils/rest-args-error.d.ts.map +1 -1
  917. package/build/src/utils/rest-args-error.js +2 -1
  918. package/build/src/utils/singularize-model-name.d.ts +1 -0
  919. package/build/src/utils/singularize-model-name.d.ts.map +1 -1
  920. package/build/src/utils/singularize-model-name.js +2 -1
  921. package/build/src/utils/to-import-specifier.d.ts.map +1 -1
  922. package/build/src/utils/to-import-specifier.js +3 -1
  923. package/build/src/utils/with-tracked-stack-async-hooks.d.ts +8 -5
  924. package/build/src/utils/with-tracked-stack-async-hooks.d.ts.map +1 -1
  925. package/build/src/utils/with-tracked-stack-async-hooks.js +32 -13
  926. package/build/src/utils/with-tracked-stack.d.ts +9 -5
  927. package/build/src/utils/with-tracked-stack.d.ts.map +1 -1
  928. package/build/src/utils/with-tracked-stack.js +19 -8
  929. package/build/src/velocious-error.d.ts +4 -2
  930. package/build/src/velocious-error.d.ts.map +1 -1
  931. package/build/src/velocious-error.js +5 -3
  932. package/build/tsconfig.tsbuildinfo +1 -1
  933. package/package.json +1 -1
@@ -6,11 +6,11 @@
6
6
  * @typedef {function({request: import("./http-server/client/request.js").default | import("./http-server/client/websocket-request.js").default, response: import("./http-server/client/response.js").default}): Promise<void>} CorsType
7
7
  */
8
8
  /**
9
- * @typedef {function({request: import("./http-server/client/request.js").default | import("./http-server/client/websocket-request.js").default | undefined, subscription?: {channel: string, params?: Record<string, unknown>}, client: import("./http-server/client/index.js").default, websocketSession: import("./http-server/client/websocket-session.js").default, configuration: import("./configuration.js").default}): typeof import("./http-server/websocket-channel.js").default | import("./http-server/websocket-channel.js").default | void | Promise<typeof import("./http-server/websocket-channel.js").default | import("./http-server/websocket-channel.js").default | void>} WebsocketChannelResolverType
9
+ * @typedef {function({request: import("./http-server/client/request.js").default | import("./http-server/client/websocket-request.js").default | undefined, subscription?: {channel: string, params?: Record<string, ?>}, client: import("./http-server/client/index.js").default, websocketSession: import("./http-server/client/websocket-session.js").default, configuration: import("./configuration.js").default}): typeof import("./http-server/websocket-channel.js").default | import("./http-server/websocket-channel.js").default | void | Promise<typeof import("./http-server/websocket-channel.js").default | import("./http-server/websocket-channel.js").default | void>} WebsocketChannelResolverType
10
10
  */
11
11
  /**
12
12
  * @typedef {object} WebsocketMessageHandler
13
- * @property {function({message: any, session: import("./http-server/client/websocket-session.js").default}) : Promise<void> | void} [onMessage] - Handler for incoming websocket messages.
13
+ * @property {function({message: ?, session: import("./http-server/client/websocket-session.js").default}) : Promise<void> | void} [onMessage] - Handler for incoming websocket messages.
14
14
  * @property {function({session: import("./http-server/client/websocket-session.js").default}) : Promise<void> | void} [onOpen] - Handler when the websocket session opens.
15
15
  * @property {function({session: import("./http-server/client/websocket-session.js").default}) : Promise<void> | void} [onClose] - Handler when the websocket session closes.
16
16
  * @property {function({error: Error, session: import("./http-server/client/websocket-session.js").default}) : Promise<void> | void} [onError] - Handler when a websocket message errors.
@@ -55,7 +55,7 @@
55
55
  * @property {string} [database] - Database name for this connection.
56
56
  * @property {typeof import("./database/drivers/base.js").default} [driver] - Driver class to use for this database.
57
57
  * @property {typeof import("./database/pool/base.js").default} [poolType] - Pool class to use for this database.
58
- * @property {function() : unknown} [getConnection] - Custom connection factory override.
58
+ * @property {function() : ?} [getConnection] - Custom connection factory override.
59
59
  * @property {string} [host] - Database host.
60
60
  * @property {boolean} [migrations] - Whether migrations are enabled for this database.
61
61
  * @property {string} [password] - Password for the database user.
@@ -171,7 +171,7 @@
171
171
  */
172
172
  /**
173
173
  * @typedef {object} ScheduledBackgroundJobConfiguration
174
- * @property {any[]} [args] - Arguments passed to the job when enqueued.
174
+ * @property {Array<?>} [args] - Arguments passed to the job when enqueued.
175
175
  * @property {typeof import("./background-jobs/job.js").default} class - Job class to enqueue.
176
176
  * @property {string} [cron] - Crontab expression (5-field POSIX, plus `@hourly`/`@daily`/`@weekly`/`@monthly`/`@yearly`/`@midnight`). Mutually exclusive with `every`.
177
177
  * @property {boolean} [enabled] - Whether the schedule is enabled.
@@ -187,20 +187,20 @@
187
187
  */
188
188
  /**
189
189
  * @typedef {object} AttachmentDriverConfiguration
190
- * @property {function({configuration: import("./configuration.js").default, name: string, options: Record<string, any>}) : Record<string, any>} [create] - Optional factory for a custom attachment driver instance.
191
- * @property {new (...args: any[]) => Record<string, any>} [driverClass] - Optional custom attachment driver class.
192
- * @property {Record<string, any>} [instance] - Optional custom attachment driver instance.
190
+ * @property {function({configuration: import("./configuration.js").default, name: string, options: Record<string, ?>}) : Record<string, ?>} [create] - Optional factory for a custom attachment driver instance.
191
+ * @property {new (...args: Array<?>) => Record<string, ?>} [driverClass] - Optional custom attachment driver class.
192
+ * @property {Record<string, ?>} [instance] - Optional custom attachment driver instance.
193
193
  */
194
194
  /**
195
195
  * @typedef {object} AttachmentsConfiguration
196
196
  * @property {string} [defaultDriver] - Default attachment storage driver name.
197
- * @property {Record<string, AttachmentDriverConfiguration & Record<string, any>>} [drivers] - Named attachment driver configurations.
197
+ * @property {Record<string, AttachmentDriverConfiguration & Record<string, ?>>} [drivers] - Named attachment driver configurations.
198
198
  * @property {boolean} [allowPathInput] - Whether `{path: ...}` attachment input is allowed.
199
199
  * @property {string[]} [allowedPathPrefixes] - Optional allowlist of directories for `{path: ...}` input.
200
200
  */
201
201
  /**
202
202
  * @typedef {object} MailerBackend
203
- * @property {function({payload: import("./mailer.js").MailerDeliveryPayload, configuration: import("./configuration.js").default}) : Promise<unknown> | unknown} deliver - Deliver a mailer payload.
203
+ * @property {function({payload: import("./mailer.js").MailerDeliveryPayload, configuration: import("./configuration.js").default}) : Promise<?> | ?} deliver - Deliver a mailer payload.
204
204
  */
205
205
  /**
206
206
  * @typedef {Record<string, string[]>} LocaleFallbacksType
@@ -264,13 +264,13 @@
264
264
  */
265
265
  /**
266
266
  * @typedef {object} FrontendModelResourceServerConfiguration
267
- * @property {function({action: "index" | "find" | "create" | "update" | "destroy" | "attach" | "download" | "url", controller: import("./controller.js").default, params: Record<string, any>, modelClass: typeof import("./database/record/index.js").default}) : (boolean | void | Promise<boolean | void>)} [beforeAction] - Optional callback run before built-in frontend actions.
268
- * @property {function({action: "index", controller: import("./controller.js").default, params: Record<string, any>, modelClass: typeof import("./database/record/index.js").default}) : Promise<import("./database/record/index.js").default[]>} [records] - Records loader for frontendIndex.
269
- * @property {function({action: "index" | "find" | "create" | "update", controller: import("./controller.js").default, params: Record<string, any>, modelClass: typeof import("./database/record/index.js").default, model: import("./database/record/index.js").default}) : Record<string, any> | Promise<Record<string, any>>} [serialize] - Record serializer for response payloads.
270
- * @property {function({action: "find" | "update" | "destroy" | "attach" | "download" | "url", controller: import("./controller.js").default, params: Record<string, any>, modelClass: typeof import("./database/record/index.js").default, id: string | number}) : Promise<import("./database/record/index.js").default | null>} [find] - Record loader for find/update/destroy/attach/download/url actions.
271
- * @property {function({action: "create", controller: import("./controller.js").default, params: Record<string, any>, modelClass: typeof import("./database/record/index.js").default, attributes: Record<string, any>}) : Promise<import("./database/record/index.js").default>} [create] - Custom create callback.
272
- * @property {function({action: "update", controller: import("./controller.js").default, params: Record<string, any>, modelClass: typeof import("./database/record/index.js").default, model: import("./database/record/index.js").default, attributes: Record<string, any>}) : Promise<import("./database/record/index.js").default | void>} [update] - Custom update callback.
273
- * @property {function({action: "destroy", controller: import("./controller.js").default, params: Record<string, any>, modelClass: typeof import("./database/record/index.js").default, model: import("./database/record/index.js").default}) : Promise<void>} [destroy] - Custom destroy callback.
267
+ * @property {function({action: "index" | "find" | "create" | "update" | "destroy" | "attach" | "download" | "url", controller: import("./controller.js").default, params: Record<string, ?>, modelClass: typeof import("./database/record/index.js").default}) : (boolean | void | Promise<boolean | void>)} [beforeAction] - Optional callback run before built-in frontend actions.
268
+ * @property {function({action: "index", controller: import("./controller.js").default, params: Record<string, ?>, modelClass: typeof import("./database/record/index.js").default}) : Promise<import("./database/record/index.js").default[]>} [records] - Records loader for frontendIndex.
269
+ * @property {function({action: "index" | "find" | "create" | "update", controller: import("./controller.js").default, params: Record<string, ?>, modelClass: typeof import("./database/record/index.js").default, model: import("./database/record/index.js").default}) : Record<string, ?> | Promise<Record<string, ?>>} [serialize] - Record serializer for response payloads.
270
+ * @property {function({action: "find" | "update" | "destroy" | "attach" | "download" | "url", controller: import("./controller.js").default, params: Record<string, ?>, modelClass: typeof import("./database/record/index.js").default, id: string | number}) : Promise<import("./database/record/index.js").default | null>} [find] - Record loader for find/update/destroy/attach/download/url actions.
271
+ * @property {function({action: "create", controller: import("./controller.js").default, params: Record<string, ?>, modelClass: typeof import("./database/record/index.js").default, attributes: Record<string, ?>}) : Promise<import("./database/record/index.js").default>} [create] - Custom create callback.
272
+ * @property {function({action: "update", controller: import("./controller.js").default, params: Record<string, ?>, modelClass: typeof import("./database/record/index.js").default, model: import("./database/record/index.js").default, attributes: Record<string, ?>}) : Promise<import("./database/record/index.js").default | void>} [update] - Custom update callback.
273
+ * @property {function({action: "destroy", controller: import("./controller.js").default, params: Record<string, ?>, modelClass: typeof import("./database/record/index.js").default, model: import("./database/record/index.js").default}) : Promise<void>} [destroy] - Custom destroy callback.
274
274
  */
275
275
  /**
276
276
  * @typedef {object} BackendProjectConfiguration
@@ -281,7 +281,7 @@
281
281
  /**
282
282
  * @typedef {object} RouteResolverHookArgs
283
283
  * @property {import("./configuration.js").default} configuration - Configuration instance.
284
- * @property {Record<string, any>} params - Mutable request params object.
284
+ * @property {Record<string, ?>} params - Mutable request params object.
285
285
  * @property {string} currentPath - Request path without query.
286
286
  * @property {boolean} [hasMatchingCustomRoute] - True when matching a configured custom route.
287
287
  * @property {import("./http-server/client/request.js").default | import("./http-server/client/websocket-request.js").default} request - Request object.
@@ -294,7 +294,7 @@
294
294
  * @property {string} controller - Controller path (for example `accounts`).
295
295
  * @property {typeof import("./controller.js").default} [controllerClass] - Optional controller class override.
296
296
  * @property {string} [controllerPath] - Optional absolute/relative controller file path override.
297
- * @property {Record<string, any>} [params] - Extra params to merge for controller/action.
297
+ * @property {Record<string, ?>} [params] - Extra params to merge for controller/action.
298
298
  * @property {boolean} [skipAbilityResolution] - Whether to run the controller action without resolving request ability.
299
299
  * @property {boolean} [skipControllerConnections] - Whether to run the controller action without the automatic database checkout wrapper.
300
300
  * @property {boolean} [skipTenantResolution] - Whether to run the controller action without resolving request tenant.
@@ -307,13 +307,13 @@
307
307
  * @typedef {typeof import("./authorization/base-resource.js").default} AbilityResourceClassType
308
308
  */
309
309
  /**
310
- * @typedef {function({configuration: import("./configuration.js").default, params: Record<string, any>, request: import("./http-server/client/request.js").default | import("./http-server/client/websocket-request.js").default, response: import("./http-server/client/response.js").default}) : import("./authorization/ability.js").default | void | Promise<import("./authorization/ability.js").default | void>} AbilityResolverType
310
+ * @typedef {function({configuration: import("./configuration.js").default, params: Record<string, ?>, request: import("./http-server/client/request.js").default | import("./http-server/client/websocket-request.js").default, response: import("./http-server/client/response.js").default}) : import("./authorization/ability.js").default | void | Promise<import("./authorization/ability.js").default | void>} AbilityResolverType
311
311
  */
312
312
  /**
313
- * @typedef {function({configuration: import("./configuration.js").default, params: Record<string, any>, request: import("./http-server/client/request.js").default | import("./http-server/client/websocket-request.js").default | undefined, response: import("./http-server/client/response.js").default | undefined, subscription?: {channel: string, params?: Record<string, unknown>}}) : unknown | void | Promise<unknown | void>} TenantResolverType
313
+ * @typedef {function({configuration: import("./configuration.js").default, params: Record<string, ?>, request: import("./http-server/client/request.js").default | import("./http-server/client/websocket-request.js").default | undefined, response: import("./http-server/client/response.js").default | undefined, subscription?: {channel: string, params?: Record<string, ?>}}) : ? | void | Promise<? | void>} TenantResolverType
314
314
  */
315
315
  /**
316
- * @typedef {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, tenant: unknown}) : DatabaseConfigurationType | Partial<DatabaseConfigurationType> | void} TenantDatabaseResolverType
316
+ * @typedef {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, tenant: ?}) : DatabaseConfigurationType | Partial<DatabaseConfigurationType> | void} TenantDatabaseResolverType
317
317
  */
318
318
  /**
319
319
  * @typedef {object} DebugEndpointConfiguration
@@ -322,11 +322,11 @@
322
322
  */
323
323
  /**
324
324
  * @typedef {object} TenantDatabaseProviderType
325
- * @property {function({configuration: import("./configuration.js").default, identifier: string}) : unknown[] | Promise<unknown[]>} listTenants - Lists tenants that should be created, checked, or migrated for this database identifier.
326
- * @property {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, tenant: unknown}) : void | Promise<void>} [createDatabase] - Creates the tenant database/schema for one tenant.
327
- * @property {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, tenant: unknown}) : void | Promise<void>} [dropDatabase] - Drops the tenant database/schema for one tenant.
328
- * @property {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, tenant: unknown}) : void | Promise<void>} [checkTenant] - Checks one tenant database before generic connection validation.
329
- * @property {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, migrationsApplied: number, tenant: unknown}) : void | Promise<void>} [afterMigrateTenant] - Runs app-owned tenant work after generic migrations for one tenant. `migrationsApplied` is how many migrations actually ran (0 when the tenant was already up to date), so the app can skip expensive per-tenant work on no-op deploys.
325
+ * @property {function({configuration: import("./configuration.js").default, identifier: string}) : Array<?> | Promise<Array<?>>} listTenants - Lists tenants that should be created, checked, or migrated for this database identifier.
326
+ * @property {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, tenant: ?}) : void | Promise<void>} [createDatabase] - Creates the tenant database/schema for one tenant.
327
+ * @property {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, tenant: ?}) : void | Promise<void>} [dropDatabase] - Drops the tenant database/schema for one tenant.
328
+ * @property {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, tenant: ?}) : void | Promise<void>} [checkTenant] - Checks one tenant database before generic connection validation.
329
+ * @property {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, migrationsApplied: number, tenant: ?}) : void | Promise<void>} [afterMigrateTenant] - Runs app-owned tenant work after generic migrations for one tenant. `migrationsApplied` is how many migrations actually ran (0 when the tenant was already up to date), so the app can skip expensive per-tenant work on no-op deploys.
330
330
  */
331
331
  /**
332
332
  * @typedef {object} ConfigurationArgsType
@@ -369,4 +369,4 @@
369
369
  * @property {WebsocketMessageHandlerResolverType} [websocketMessageHandlerResolver] - Resolve a raw websocket message handler for each connection.
370
370
  */
371
371
  export const nothing = {};
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWd1cmF0aW9uLXR5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUVIOztHQUVHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7R0FJRztBQUVIOzs7O0dBSUc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7OztHQUlHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7O0dBR0c7QUFFSDs7R0FFRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7OztHQUdHO0FBR0g7O0dBRUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7OztHQUlHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q0c7QUFFSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQG1vZHVsZSB0eXBlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtyZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0LCByZXNwb25zZTogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIikuZGVmYXVsdH0pOiBQcm9taXNlPHZvaWQ+fSBDb3JzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtyZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCBzdWJzY3JpcHRpb24/OiB7Y2hhbm5lbDogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0sIGNsaWVudDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvaW5kZXguanNcIikuZGVmYXVsdCwgd2Vic29ja2V0U2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdCwgY29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9KTogdHlwZW9mIGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdCB8IHZvaWQgfCBQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQgfCB2b2lkPn0gV2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2Vic29ja2V0TWVzc2FnZUhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe21lc3NhZ2U6IGFueSwgc2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTx2b2lkPiB8IHZvaWR9IFtvbk1lc3NhZ2VdIC0gSGFuZGxlciBmb3IgaW5jb21pbmcgd2Vic29ja2V0IG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7c2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTx2b2lkPiB8IHZvaWR9IFtvbk9wZW5dIC0gSGFuZGxlciB3aGVuIHRoZSB3ZWJzb2NrZXQgc2Vzc2lvbiBvcGVucy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe3Nlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25DbG9zZV0gLSBIYW5kbGVyIHdoZW4gdGhlIHdlYnNvY2tldCBzZXNzaW9uIGNsb3Nlcy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2Vycm9yOiBFcnJvciwgc2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTx2b2lkPiB8IHZvaWR9IFtvbkVycm9yXSAtIEhhbmRsZXIgd2hlbiBhIHdlYnNvY2tldCBtZXNzYWdlIGVycm9ycy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbih7cmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgY2xpZW50OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9pbmRleC5qc1wiKS5kZWZhdWx0LCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pOiBXZWJzb2NrZXRNZXNzYWdlSGFuZGxlciB8IHZvaWQgfCBQcm9taXNlPFdlYnNvY2tldE1lc3NhZ2VIYW5kbGVyIHwgdm9pZD59IFdlYnNvY2tldE1lc3NhZ2VIYW5kbGVyUmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGlkOiBzdHJpbmcpID0+IHtkZWZhdWx0OiB0eXBlb2YgaW1wb3J0KFwiLi9pbml0aWFsaXplci5qc1wiKS5kZWZhdWx0fX0gSW5pdGlhbGl6ZXJzUmVxdWlyZUNvbnRleHRUeXBlXG4gKiBAdHlwZWRlZiB7SW5pdGlhbGl6ZXJzUmVxdWlyZUNvbnRleHRUeXBlICYge1xuICogICBrZXlzOiAoKSA9PiBzdHJpbmdbXSxcbiAqICAgaWQ6IHN0cmluZ1xuICogfX0gV2VicGFja1JlcXVpcmVDb250ZXh0XG4gKiBAdHlwZWRlZiB7e3JlcXVpcmVDb250ZXh0OiBXZWJwYWNrUmVxdWlyZUNvbnRleHR9fSBJbml0aWFsaXplcnNFeHBvcnRUeXBlXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSkgOiBQcm9taXNlPEluaXRpYWxpemVyc0V4cG9ydFR5cGU+fSBJbml0aWFsaXplcnNUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTcWxDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YWJhc2VdIC0gRGF0YWJhc2UgbmFtZSBmb3IgdGhlIFNRTCBkcml2ZXIuXG4gKiBAcHJvcGVydHkge29iamVjdH0gW29wdGlvbnNdIC0gRHJpdmVyLXNwZWNpZmljIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29wdGlvbnMuZW5jcnlwdF0gLSBXaGV0aGVyIHRvIGVuY3J5cHQgdGhlIGNvbm5lY3Rpb24gKE1TU1FMKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbb3B0aW9ucy5zY2hlbWFdIC0gRGVmYXVsdCBzY2hlbWEgZm9yIHVucXVhbGlmaWVkIHRhYmxlIGxvb2t1cHMgKE1TU1FMKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbb3B0aW9ucy5zZXJ2ZXJOYW1lXSAtIFRMUyBTTkkgc2VydmVyIG5hbWUgb3ZlcnJpZGUgZm9yIE1TU1FMIChlbXB0eSBzdHJpbmcgZGlzYWJsZXMgU05JKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZV0gLSBXaGV0aGVyIHRvIHRydXN0IHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgKE1TU1FMKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFzc3dvcmRdIC0gUGFzc3dvcmQgZm9yIHRoZSBTUUwgdXNlci5cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbcG9vbF0gLSBDb25uZWN0aW9uIHBvb2wgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9vbC5tYXhdIC0gTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Bvb2wubWluXSAtIE1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb29sLmlkbGVUaW1lb3V0TWlsbGlzXSAtIElkbGUgdGltZW91dCBiZWZvcmUgcmVsZWFzaW5nIGEgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VydmVyXSAtIFNRTCBzZXJ2ZXIgaG9zdG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VzZXJdIC0gU1FMIHVzZXJuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGF0YWJhc2VQb29sQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBbaWRsZVRpbWVvdXRNaWxsaXNdIC0gSWRsZSB0aW1lb3V0IGJlZm9yZSBjbG9zaW5nIGEgY2hlY2tlZC1pbiBhc3luYy10cmFja2VkIGNvbm5lY3Rpb24uIFNldCBudWxsIHRvIGRpc2FibGUgaWRsZSByZWFwaW5nLiBEZWZhdWx0OiA1MDAwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhdIC0gTWF4aW11bSBsaXZlIGFzeW5jLXRyYWNrZWQgY29ubmVjdGlvbnMgZm9yIHRoaXMgcG9vbC4gRXh0cmEgY2hlY2tvdXRzIHdhaXQgdW50aWwgYSBtYXRjaGluZyBjb25uZWN0aW9uIGlzIGNoZWNrZWQgaW4gb3IgY2FwYWNpdHkgaXMgZnJlZWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlQ2hhcnNldF0gLSBEZWZhdWx0IGNoYXJhY3RlciBzZXQgYXBwbGllZCBieSBgZGI6Y3JlYXRlYCB2aWEgbXlzcWwvbWFyaWFkYiBgQ1JFQVRFIERBVEFCQVNFIC4uLiBDSEFSQUNURVIgU0VUYC4gRGlzdGluY3QgZnJvbSBgY2hhcnNldGAsIHdoaWNoIGlzIHRoZSBjbGllbnQgY29ubmVjdGlvbiBjaGFyc2V0IGZvcndhcmRlZCB0byB0aGUgbXlzcWwyIGRyaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YWJhc2VDb2xsYXRpb25dIC0gRGVmYXVsdCBjb2xsYXRpb24gYXBwbGllZCBieSBgZGI6Y3JlYXRlYCB2aWEgbXlzcWwvbWFyaWFkYiBgQ1JFQVRFIERBVEFCQVNFIC4uLiBDT0xMQVRFYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YWJhc2VdIC0gRGF0YWJhc2UgbmFtZSBmb3IgdGhpcyBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gW2RyaXZlcl0gLSBEcml2ZXIgY2xhc3MgdG8gdXNlIGZvciB0aGlzIGRhdGFiYXNlLlxuICogQHByb3BlcnR5IHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9wb29sL2Jhc2UuanNcIikuZGVmYXVsdH0gW3Bvb2xUeXBlXSAtIFBvb2wgY2xhc3MgdG8gdXNlIGZvciB0aGlzIGRhdGFiYXNlLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbigpIDogdW5rbm93bn0gW2dldENvbm5lY3Rpb25dIC0gQ3VzdG9tIGNvbm5lY3Rpb24gZmFjdG9yeSBvdmVycmlkZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gLSBEYXRhYmFzZSBob3N0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbWlncmF0aW9uc10gLSBXaGV0aGVyIG1pZ3JhdGlvbnMgYXJlIGVuYWJsZWQgZm9yIHRoaXMgZGF0YWJhc2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Bhc3N3b3JkXSAtIFBhc3N3b3JkIGZvciB0aGUgZGF0YWJhc2UgdXNlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9ydF0gLSBEYXRhYmFzZSBwb3J0LlxuICogQHByb3BlcnR5IHtEYXRhYmFzZVBvb2xDb25maWd1cmF0aW9ufSBbcG9vbF0gLSBWZWxvY2lvdXMgZGF0YWJhc2UgcG9vbCBsaWZlY3ljbGUgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBGcmllbmRseSBuYW1lIGZvciB0aGUgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KGZpbGU6IHN0cmluZykgPT4gc3RyaW5nfSBbbG9jYXRlRmlsZV0gLSBPcHRpb25hbCBzcWxpdGUtd2ViIHNxbC5qcyB3YXNtIHJlc29sdmVyIChgaW5pdFNxbEpzKHtsb2NhdGVGaWxlfSlgKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JlYWRPbmx5XSAtIFdoZXRoZXIgd3JpdGVzIHNob3VsZCBiZSBibG9ja2VkIGZvciB0aGlzIGRhdGFiYXNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY2hlbWFdIC0gRGVmYXVsdCBzY2hlbWEgZm9yIHVucXVhbGlmaWVkIHRhYmxlIGxvb2t1cHMgKE1TU1FMKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NjaGVtYUNhY2hlXSAtIFdoZXRoZXIgc2NoZW1hIG1ldGFkYXRhIHNob3VsZCBiZSBjYWNoZWQgb24gdGhlIGRyaXZlci4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbcmVjb3JkXSAtIFJlY29yZC1sZXZlbCBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVjb3JkLnRyYW5zYWN0aW9uc10gLSBXaGV0aGVyIHJlY29yZCBvcGVyYXRpb25zIHNob3VsZCB1c2UgdHJhbnNhY3Rpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVzZXRdIC0gV2hldGhlciB0byByZXNldCB0aGUgZGF0YWJhc2Ugb24gc3RhcnR1cC5cbiAqIEBwcm9wZXJ0eSB7U3FsQ29uZmlnfSBbc3FsQ29uZmlnXSAtIERyaXZlci1zcGVjaWZpYyBTUUwgY29uZmlnLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdGVuYW50T25seV0gLSBXaGV0aGVyIHRoaXMgZGF0YWJhc2UgaWRlbnRpZmllciBpcyBvbmx5IGFjdGl2ZSBpbnNpZGUgYSByZXNvbHZlZCB0ZW5hbnQgY29udGV4dC5cbiAqIEBwcm9wZXJ0eSB7XCJtc3NxbFwiIHwgXCJteXNxbFwiIHwgXCJwZ3NxbFwiIHwgXCJzcWxpdGVcIn0gW3R5cGVdIC0gRGF0YWJhc2UgdHlwZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1c2VEYXRhYmFzZV0gLSBEYXRhYmFzZSB0byBzd2l0Y2ggdG8gYWZ0ZXIgY29ubmVjdGluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdXNlcm5hbWVdIC0gVXNlcm5hbWUgZm9yIGRhdGFiYXNlIGF1dGhlbnRpY2F0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1wiZGVidWctbG93LWxldmVsXCIgfCBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwifSBMb2dMZXZlbFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9nZ2luZ091dHB1dFBheWxvYWRcbiAqIEBwcm9wZXJ0eSB7TG9nTGV2ZWx9IGxldmVsIC0gTG9nIGxldmVsLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2UgLSBGb3JtYXR0ZWQgbWVzc2FnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdWJqZWN0IC0gTG9nIHN1YmplY3QuXG4gKiBAcHJvcGVydHkge0RhdGV9IHRpbWVzdGFtcCAtIFRpbWVzdGFtcC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvZ2dpbmdPdXRwdXRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oTG9nZ2luZ091dHB1dFBheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gd3JpdGUgLSBXcml0ZSBhIGxvZyBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7TG9nTGV2ZWxbXX0gW2xldmVsc10gLSBEZWZhdWx0IGxldmVscyBmb3IgdGhpcyBvdXRwdXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2dnaW5nT3V0cHV0Q29uZmlnXG4gKiBAcHJvcGVydHkge0xvZ2dpbmdPdXRwdXR9IG91dHB1dCAtIE91dHB1dCBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8TG9nTGV2ZWw+fSBbbGV2ZWxzXSAtIExldmVscyBlbmFibGVkIGZvciB0aGlzIG91dHB1dC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtMb2dnaW5nT3V0cHV0Q29uZmlnIHwgTG9nZ2luZ091dHB1dCB8IGltcG9ydChcIi4vbG9nZ2VyL2Jhc2UtbG9nZ2VyLmpzXCIpLmRlZmF1bHR9IExvZ2dlckNvbmZpZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9nZ2luZ0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnNvbGVdIC0gRW5hYmxlL2Rpc2FibGUgY29uc29sZSBsb2dnaW5nIGZvciByZXF1ZXN0IGxvZ2dpbmcuIERlZmF1bHRzIHRvIHRydWUgb3V0c2lkZSBvZiBcInRlc3RcIiBhbmQgZm9yIEhUVFAgc2VydmVyIGxvZ3MuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmaWxlXSAtIEVuYWJsZS9kaXNhYmxlIHdyaXRpbmcgbG9ncyB0byBhIGZpbGUuIERlZmF1bHRzIHRvIHRydWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RpcmVjdG9yeV0gLSBEaXJlY3Rvcnkgd2hlcmUgbG9nIGZpbGVzIGFyZSBzdG9yZWQuIERlZmF1bHRzIHRvIFwiPHByb2plY3Q+L2xvZ1wiLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmaWxlUGF0aF0gLSBFeHBsaWNpdCBwYXRoIGZvciB0aGUgbG9nIGZpbGUuIERlZmF1bHRzIHRvIFwiPGRpcmVjdG9yeT4vPGVudmlyb25tZW50Pi5sb2dcIi5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8XCJkZWJ1Zy1sb3ctbGV2ZWxcIiB8IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCI+fSBbbGV2ZWxzXSAtIE92ZXJyaWRlIHdoaWNoIGxvZyBsZXZlbHMgYXJlIGVtaXR0ZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z0xvd0xldmVsXSAtIENvbnZlbmllbmNlIGZsYWcgdG8gaW5jbHVkZSB2ZXJ5IGxvdy1sZXZlbCBkZWJ1ZyBsb2dzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcXVlcnlMb2dnaW5nXSAtIEVuYWJsZS9kaXNhYmxlIGRhdGFiYXNlIHF1ZXJ5IGxvZ2dpbmcuIERlZmF1bHRzIHRvIHRydWUgb3V0c2lkZSB0ZXN0IGFuZCBmYWxzZSBpbiB0ZXN0LlxuICogQHByb3BlcnR5IHtMb2dnZXJDb25maWdbXX0gW2xvZ2dlcnNdIC0gTG9nZ2VyIGluc3RhbmNlcyAoY29udmVydGVkIHRvIG91dHB1dHMgd2hlbiBjb25maWd1cmVkKS5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2luZ091dHB1dENvbmZpZ1tdfSBbb3V0cHV0c10gLSBFeHBsaWNpdCBsb2dnZXIgb3V0cHV0cyAob3ZlcnJpZGVzIGNvbnNvbGUvZmlsZSBkZWZhdWx0cyB3aGVuIHByb3ZpZGVkKS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0cnVjdHVyZVNxbENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtlbmFibGVkRW52aXJvbm1lbnRzXSAtIEVudmlyb25tZW50cyBhbGxvd2VkIHRvIHdyaXRlIHN0cnVjdHVyZSBzcWwgZmlsZXMgZHVyaW5nIGF1dG9tYXRpYyBtaWdyYXRpb24gZHVtcHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZGlzYWJsZWRFbnZpcm9ubWVudHNdIC0gRW52aXJvbm1lbnRzIHRoYXQgc2hvdWxkIHNraXAgd3JpdGluZyBzdHJ1Y3R1cmUgc3FsIGZpbGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1wiYmVhY29uXCIgfCBcInBvbGxpbmdcIn0gQmFja2dyb3VuZEpvYnNEaXNwYXRjaFN0cmF0ZWd5XG4gKlxuICogLSBgXCJiZWFjb25cImAgKGRlZmF1bHQpOiBldmVudC1kcml2ZW4gZGlzcGF0Y2guIFRoZVxuICogICBgYmFja2dyb3VuZC1qb2JzLW1haW5gIHByb2Nlc3MgZHJhaW5zIHRoZSBxdWV1ZSBvbiBlbnF1ZXVlLCBvblxuICogICB3b3JrZXIgcmVhZGluZXNzLCBvbiBCZWFjb24gYnJvYWRjYXN0cyAoc28gY3Jvc3MtcHJvY2VzcyBlbnF1ZXVlc1xuICogICB3YWtlIGl0KSwgYW5kIGFybXMgYSBgc2V0VGltZW91dGAgZm9yIHRoZSBzb29uZXN0IGZ1dHVyZS1zY2hlZHVsZWRcbiAqICAgam9iLiBGYWxscyBiYWNrIGdyYWNlZnVsbHkgdG8gZGlyZWN0IGluLXByb2Nlc3MgdHJpZ2dlcmluZyB3aGVuXG4gKiAgIEJlYWNvbiBpcyBub3QgY29uZmlndXJlZC5cbiAqIC0gYFwicG9sbGluZ1wiYDogbGVnYWN5IG1vZGUsIHJ1bnMgYSBmaXhlZC1pbnRlcnZhbCBwb2xsIG92ZXIgdGhlXG4gKiAgIGBiYWNrZ3JvdW5kX2pvYnNgIHRhYmxlIChzZWUgYHBvbGxJbnRlcnZhbE1zYCkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gLSBIb3N0bmFtZSBmb3IgdGhlIGJhY2tncm91bmQgam9icyBtYWluIHByb2Nlc3MuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gUG9ydCBmb3IgdGhlIGJhY2tncm91bmQgam9icyBtYWluIHByb2Nlc3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlSWRlbnRpZmllcl0gLSBEYXRhYmFzZSBpZGVudGlmaWVyIHVzZWQgdG8gc3RvcmUgYmFja2dyb3VuZCBqb2JzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDb25jdXJyZW50SW5saW5lSm9ic10gLSBIb3cgbWFueSBgZm9ya2VkOiBmYWxzZWAgam9icyBhIHNpbmdsZVxuICogICBgYmFja2dyb3VuZC1qb2JzLXdvcmtlcmAgcHJvY2VzcyBpcyBhbGxvd2VkIHRvIHJ1biBpbiBwYXJhbGxlbC4gQ29uY3VycmVuY3lcbiAqICAgaXMgYXQgdGhlIEpTIGV2ZW50LWxvb3AgbGV2ZWw6IGV2ZXJ5IGNvbmN1cnJlbnQgam9iIHNoYXJlcyB0aGUgd29ya2VyJ3NcbiAqICAgcHJvY2VzcyBhbmQgREIgY29ubmVjdGlvbiBwb29sLCBzbyB0aGlzIHNob3VsZCBmaXQgdGhlIHBvb2wgc2l6ZSwgbm90IHRoZVxuICogICBDUFUgY291bnQuIEZvcmtpbmcgcmVtYWlucyB0aGUgcmlnaHQgdG9vbCBmb3IgbWVtb3J5IGlzb2xhdGlvbiBhY3Jvc3NcbiAqICAgbG9uZy1ydW5uaW5nIGpvYnMgYW5kIGZvciB1c2luZyBtb3JlIGNvcmVzLiBEZWZhdWx0OiBgNGAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heENvbmN1cnJlbnRGb3JrZWRKb2JzXSAtIEhvdyBtYW55IG91dC1vZi1wcm9jZXNzXG4gKiAgIGBcImZvcmtlZFwiYCBvciBgXCJzcGF3bmVkXCJgIGpvYnMgYSBzaW5nbGUgYGJhY2tncm91bmQtam9icy13b3JrZXJgIGlzXG4gKiAgIGFsbG93ZWQgdG8ga2VlcCBpbiBmbGlnaHQuIERlZmF1bHQ6IGA0YC5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYnNEaXNwYXRjaFN0cmF0ZWd5fSBbZGlzcGF0Y2hTdHJhdGVneV0gLSBIb3cgdGhlIG1haW4gcHJvY2Vzc1xuICogICBkZXRlY3RzIG5ldyB3b3JrLiBEZWZhdWx0cyB0byBgXCJiZWFjb25cImAgKGV2ZW50LWRyaXZlbikuIFNldCB0byBgXCJwb2xsaW5nXCJgXG4gKiAgIHRvIHJlc3RvcmUgdGhlIGxlZ2FjeSBmaXhlZC1pbnRlcnZhbCBwb2xsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxNc10gLSBQb2xsIGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4gT25seSB1c2VkXG4gKiAgIHdoZW4gYGRpc3BhdGNoU3RyYXRlZ3kgPT09IFwicG9sbGluZ1wiYC4gRGVmYXVsdDogYDEwMDBgLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmVhY29uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlZF0gLSBXaGV0aGVyIHRvIGNvbm5lY3QgdG8gYSBCZWFjb24gYnJva2VyLiBEZWZhdWx0cyB0byBmYWxzZSB1bmxlc3MgYGhvc3RgL2Bwb3J0YCBvciBgaW5Qcm9jZXNzOiB0cnVlYCBhcmUgc2V0LCBvciBlbnYgdmFycyBhcmUgcHJlc2VudC4gRXhwbGljaXQgYGZhbHNlYCBkaXNhYmxlcyBCZWFjb24gZXZlbiB3aGVuIGVudiB2YXJzIGFyZSBzZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpblByb2Nlc3NdIC0gV2hlbiB0cnVlLCB1c2UgYSBtb2R1bGUtbGV2ZWwgaW4tcHJvY2VzcyBicm9rZXIgc2luZ2xldG9uIGluc3RlYWQgb2YgY29ubmVjdGluZyBvdmVyIFRDUC4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGhvc3RgL2Bwb3J0YC4gVXNlZnVsIGZvciB0ZXN0cyBhbmQgc2luZ2xlLXByb2Nlc3MgZGVwbG95bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gSG9zdG5hbWUgb2YgdGhlIEJlYWNvbiBicm9rZXIgZGFlbW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSAtIFBvcnQgb2YgdGhlIEJlYWNvbiBicm9rZXIgZGFlbW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwZWVyVHlwZV0gLSBPcHRpb25hbCBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBwZWVyIChlLmcuIFwic2VydmVyXCIsIFwiYmFja2dyb3VuZC1qb2JzLXdvcmtlclwiKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdW5yZWFjaGFibGVSZXBvcnRNc10gLSBHcmFjZSB3aW5kb3cgKG1zKSBhIGJlYWNvbiBjb25uZWN0L2Rpc2Nvbm5lY3QgYmxpcCBtdXN0IHBlcnNpc3QgYmVmb3JlIGl0IGlzIHJlcG9ydGVkIGFzIGEgZnJhbWV3b3JrLWVycm9yLiBUcmFuc2llbnQgb3V0YWdlcyB0aGF0IHJlY292ZXIgd2l0aGluIHRoaXMgd2luZG93IChlLmcuIGEgZGVwbG95IHJlc3RhcnRpbmcgdGhlIGJyb2tlcikgYXJlIG5vdCByZXBvcnRlZC4gRGVmYXVsdHMgdG8gMzAwMDAuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIdHRwU2VydmVyQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSAtIEhvc3RuYW1lIHRvIGJpbmQgdGhlIEhUVFAgc2VydmVyIHRvLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5Qcm9jZXNzXSAtIFJ1biBIVFRQIGhhbmRsZXJzIGluIHRoZSBtYWluIHRocmVhZCBpbnN0ZWFkIG9mIHdvcmtlciB0aHJlYWRzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhXb3JrZXJzXSAtIEJhY2t3YXJkLWNvbXBhdGlibGUgYWxpYXMgZm9yIHdvcmtlcnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gUG9ydCB0byBiaW5kIHRoZSBIVFRQIHNlcnZlciB0by5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd29ya2Vyc10gLSBXb3JrZXIgaGFuZGxlcnMgdG8gc3RhcnQgZm9yIHRoZSBIVFRQIHNlcnZlci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNjaGVkdWxlZEJhY2tncm91bmRKb2JFdmVyeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgc3RyaW5nfSBbZmlyc3RJbl0gLSBEZWxheSBiZWZvcmUgdGhlIGZpcnN0IGVucXVldWUuXG4gKiBAcHJvcGVydHkge251bWJlciB8IHN0cmluZ30gW2ZpcnN0X2luXSAtIFNpZGVraXEtc3R5bGUgYWxpYXMgZm9yIGBmaXJzdEluYC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge2FueVtdfSBbYXJnc10gLSBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBqb2Igd2hlbiBlbnF1ZXVlZC5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vYmFja2dyb3VuZC1qb2JzL2pvYi5qc1wiKS5kZWZhdWx0fSBjbGFzcyAtIEpvYiBjbGFzcyB0byBlbnF1ZXVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjcm9uXSAtIENyb250YWIgZXhwcmVzc2lvbiAoNS1maWVsZCBQT1NJWCwgcGx1cyBgQGhvdXJseWAvYEBkYWlseWAvYEB3ZWVrbHlgL2BAbW9udGhseWAvYEB5ZWFybHlgL2BAbWlkbmlnaHRgKS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGV2ZXJ5YC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuYWJsZWRdIC0gV2hldGhlciB0aGUgc2NoZWR1bGUgaXMgZW5hYmxlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgc3RyaW5nIHwgW251bWJlciB8IHN0cmluZywgU2NoZWR1bGVkQmFja2dyb3VuZEpvYkV2ZXJ5T3B0aW9uc119IFtldmVyeV0gLSBSZXBlYXQgaW50ZXJ2YWwuIEVpdGhlciBgZXZlcnlgIG9yIGBjcm9uYCBtdXN0IGJlIHNldC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9iYWNrZ3JvdW5kLWpvYnMvdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IFtvcHRpb25zXSAtIEpvYiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9uPn0gam9icyAtIFNjaGVkdWxlZCBqb2JzIGtleWVkIGJ5IG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSkgOiBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb24gfCBQcm9taXNlPFNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvbj59IFNjaGVkdWxlZEJhY2tncm91bmRKb2JzTG9hZGVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXR0YWNobWVudERyaXZlckNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT59KSA6IFJlY29yZDxzdHJpbmcsIGFueT59IFtjcmVhdGVdIC0gT3B0aW9uYWwgZmFjdG9yeSBmb3IgYSBjdXN0b20gYXR0YWNobWVudCBkcml2ZXIgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge25ldyAoLi4uYXJnczogYW55W10pID0+IFJlY29yZDxzdHJpbmcsIGFueT59IFtkcml2ZXJDbGFzc10gLSBPcHRpb25hbCBjdXN0b20gYXR0YWNobWVudCBkcml2ZXIgY2xhc3MuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtpbnN0YW5jZV0gLSBPcHRpb25hbCBjdXN0b20gYXR0YWNobWVudCBkcml2ZXIgaW5zdGFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdHRhY2htZW50c0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVmYXVsdERyaXZlcl0gLSBEZWZhdWx0IGF0dGFjaG1lbnQgc3RvcmFnZSBkcml2ZXIgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgQXR0YWNobWVudERyaXZlckNvbmZpZ3VyYXRpb24gJiBSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gW2RyaXZlcnNdIC0gTmFtZWQgYXR0YWNobWVudCBkcml2ZXIgY29uZmlndXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbGxvd1BhdGhJbnB1dF0gLSBXaGV0aGVyIGB7cGF0aDogLi4ufWAgYXR0YWNobWVudCBpbnB1dCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2FsbG93ZWRQYXRoUHJlZml4ZXNdIC0gT3B0aW9uYWwgYWxsb3dsaXN0IG9mIGRpcmVjdG9yaWVzIGZvciBge3BhdGg6IC4uLn1gIGlucHV0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWFpbGVyQmFja2VuZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7cGF5bG9hZDogaW1wb3J0KFwiLi9tYWlsZXIuanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkLCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTx1bmtub3duPiB8IHVua25vd259IGRlbGl2ZXIgLSBEZWxpdmVyIGEgbWFpbGVyIHBheWxvYWQuXG4gKi9cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IExvY2FsZUZhbGxiYWNrc1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZWxhdGlvbnNoaXBDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge1wiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9IHR5cGUgLSBSZWxhdGlvbnNoaXAgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbW9kZWxdIC0gVGFyZ2V0IG1vZGVsIGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NsYXNzTmFtZV0gLSBBbGlhcyBvZiB0YXJnZXQgbW9kZWwgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbW9kZWxDbGFzc05hbWVdIC0gRXhwbGljaXQgdGFyZ2V0IG1vZGVsIGNsYXNzIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsQXR0cmlidXRlQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0eXBlXSAtIENvbHVtbiB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbHVtblR5cGVdIC0gQWxpYXMgZm9yIGNvbHVtbiB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NxbFR5cGVdIC0gQWxpYXMgZm9yIGNvbHVtbiB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFUeXBlXSAtIEFsaWFzIGZvciBjb2x1bW4gdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbnVsbF0gLSBXaGV0aGVyIHZhbHVlIGNhbiBiZSBudWxsLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2VsZWN0ZWRCeURlZmF1bHRdIC0gV2hldGhlciBpbmNsdWRlZCBpbiBkZWZhdWx0IHNlcmlhbGl6YXRpb24uIERlZmF1bHRzIHRvIHRydWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsQXR0YWNobWVudENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifSB0eXBlIC0gQXR0YWNobWVudCBjYXJkaW5hbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0cmlidXRlQ29uZmlndXJhdGlvbiB8IGltcG9ydChcIi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0IHwgYm9vbGVhbj59IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIGV4cG9zZSBvbiB0aGUgZnJvbnRlbmQgbW9kZWwuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYWJpbGl0aWVzXSAtIEFiaWxpdHkgYWN0aW9uIGxpc3QgKGNhbWVsQ2FzZSBhY3Rpb24gbmFtZXMpLiBEZWZhdWx0cyB0byBgW1wicmVhZFwiXWAgZm9yIGBmaW5kYCBhbmQgYGluZGV4YCB3aGVuIG9taXR0ZWQuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxBdHRhY2htZW50Q29uZmlndXJhdGlvbj59IFthdHRhY2htZW50c10gLSBBdHRhY2htZW50IGhlbHBlcnMga2V5ZWQgYnkgYXR0YWNobWVudCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2NvbW1hbmRzXSAtIExlZ2FjeSBidWlsdC1pbiBjb21tYW5kIG5hbWVzIChgaW5kZXhgLCBgZmluZGAsIGBjcmVhdGVgLCBgdXBkYXRlYCwgYGRlc3Ryb3lgLCBgYXR0YWNoYCwgYGRvd25sb2FkYCwgYHVybGApLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2NvbGxlY3Rpb25Db21tYW5kc10gLSBDdXN0b20gY29sbGVjdGlvbiBjb21tYW5kcyBhcyBjYW1lbENhc2UgbWV0aG9kIG5hbWVzLiBUaGUgcnVudGltZSBkZXJpdmVzIHRoZSBrZWJhYi1jYXNlIGNvbW1hbmQgc2x1ZyBmcm9tIGVhY2ggbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFttZW1iZXJDb21tYW5kc10gLSBDdXN0b20gbWVtYmVyIGNvbW1hbmRzIGFzIGNhbWVsQ2FzZSBtZXRob2QgbmFtZXMuIFRoZSBydW50aW1lIGRlcml2ZXMgdGhlIGtlYmFiLWNhc2UgY29tbWFuZCBzbHVnIGZyb20gZWFjaCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2J1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNdIC0gQnVpbHQtaW4gY29sbGVjdGlvbiBjb21tYW5kIG5hbWVzIChgaW5kZXhgLCBgY3JlYXRlYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYnVpbHRJbk1lbWJlckNvbW1hbmRzXSAtIEJ1aWx0LWluIG1lbWJlciBjb21tYW5kIG5hbWVzIChgZmluZGAsIGB1cGRhdGVgLCBgZGVzdHJveWAsIGBhdHRhY2hgLCBgZG93bmxvYWRgLCBgdXJsYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbcmVsYXRpb25zaGlwc10gLSBSZWxhdGlvbnNoaXAgbmFtZXMgdG8gZXhwb3NlIGluIGZyb250ZW5kIG1vZGVscy4gVHlwZSBhbmQgdGFyZ2V0IG1vZGVsIGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBiYWNrZW5kIG1vZGVsJ3MgcmVnaXN0ZXJlZCByZWxhdGlvbnNoaXBzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcmltYXJ5S2V5XSAtIFByaW1hcnkga2V5IGF0dHJpYnV0ZSBuYW1lLlxuICogQHByb3BlcnR5IHtGcm9udGVuZE1vZGVsUmVzb3VyY2VTZXJ2ZXJDb25maWd1cmF0aW9ufSBbc2VydmVyXSAtIE9wdGlvbmFsIGxlZ2FjeSBiYWNrZW5kIGJlaGF2aW9yIG92ZXJyaWRlcyBmb3IgYnVpbHQtaW4gZnJvbnRlbmQgYWN0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPbWl0PEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24sIFwiYWJpbGl0aWVzXCIgfCBcImJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcIiB8IFwiYnVpbHRJbk1lbWJlckNvbW1hbmRzXCIgfCBcImNvbGxlY3Rpb25Db21tYW5kc1wiIHwgXCJjb21tYW5kc1wiIHwgXCJtZW1iZXJDb21tYW5kc1wiPiAmIHtcbiAqICAgYWJpbGl0aWVzOiBGcm9udGVuZE1vZGVsUmVzb3VyY2VBYmlsaXRpZXNDb25maWd1cmF0aW9uXG4gKiAgIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAqICAgYnVpbHRJbk1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gKiAgIGNvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICogICBtZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICogfX0gTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0Zyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gRnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlQWJpbGl0aWVzQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbmRleF0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgaW5kZXguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ZpbmRdIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIGZpbmQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NyZWF0ZV0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgY3JlYXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1cGRhdGVdIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIHVwZGF0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVzdHJveV0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgZGVzdHJveS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZVNlcnZlckNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJpbmRleFwiIHwgXCJmaW5kXCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSkgOiAoYm9vbGVhbiB8IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4gfCB2b2lkPil9IFtiZWZvcmVBY3Rpb25dIC0gT3B0aW9uYWwgY2FsbGJhY2sgcnVuIGJlZm9yZSBidWlsdC1pbiBmcm9udGVuZCBhY3Rpb25zLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7YWN0aW9uOiBcImluZGV4XCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSkgOiBQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXT59IFtyZWNvcmRzXSAtIFJlY29yZHMgbG9hZGVyIGZvciBmcm9udGVuZEluZGV4LlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7YWN0aW9uOiBcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbW9kZWw6IGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBbc2VyaWFsaXplXSAtIFJlY29yZCBzZXJpYWxpemVyIGZvciByZXNwb25zZSBwYXlsb2Fkcy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJmaW5kXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIGlkOiBzdHJpbmcgfCBudW1iZXJ9KSA6IFByb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGw+fSBbZmluZF0gLSBSZWNvcmQgbG9hZGVyIGZvciBmaW5kL3VwZGF0ZS9kZXN0cm95L2F0dGFjaC9kb3dubG9hZC91cmwgYWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJjcmVhdGVcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT59KSA6IFByb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IFtjcmVhdGVdIC0gQ3VzdG9tIGNyZWF0ZSBjYWxsYmFjay5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJ1cGRhdGVcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIG1vZGVsOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSkgOiBQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB2b2lkPn0gW3VwZGF0ZV0gLSBDdXN0b20gdXBkYXRlIGNhbGxiYWNrLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7YWN0aW9uOiBcImRlc3Ryb3lcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIG1vZGVsOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSkgOiBQcm9taXNlPHZvaWQ+fSBbZGVzdHJveV0gLSBDdXN0b20gZGVzdHJveSBjYWxsYmFjay5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBQYXRoIHRvIHRoZSBiYWNrZW5kIHByb2plY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb250ZW5kTW9kZWxzT3V0cHV0UGF0aF0gLSBPcHRpb25hbCBvdXRwdXQgcHJvamVjdCBwYXRoIHdoZXJlIGBzcmMvZnJvbnRlbmQtbW9kZWxzYCBzaG91bGQgYmUgZ2VuZXJhdGVkLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uPn0gW2Zyb250ZW5kTW9kZWxzXSAtIEF1dG8tZGlzY292ZXJlZCBmcm9udGVuZCBtb2RlbCBkZWZpbml0aW9ucyBrZXllZCBieSBtb2RlbCBjbGFzcyBuYW1lLiBTZXQgaW50ZXJuYWxseSBieSB0aGUgZW52aXJvbm1lbnQgaGFuZGxlciDigJQgZG8gbm90IHNldCBtYW51YWxseS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJvdXRlUmVzb2x2ZXJIb29rQXJnc1xuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIE11dGFibGUgcmVxdWVzdCBwYXJhbXMgb2JqZWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFRydWUgd2hlbiBtYXRjaGluZyBhIGNvbmZpZ3VyZWQgY3VzdG9tIHJvdXRlLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSByZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHR9IHJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3JvdXRlcy9yZXNvbHZlci5qc1wiKS5kZWZhdWx0fSByZXNvbHZlciAtIFJlc29sdmVyIGluc3RhbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUm91dGVSZXNvbHZlckhvb2tSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gLSBEYXNoZXJpemVkIGFjdGlvbiBuYW1lIChmb3IgZXhhbXBsZSBgZnJvbnRlbmQtaW5kZXhgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250cm9sbGVyIC0gQ29udHJvbGxlciBwYXRoIChmb3IgZXhhbXBsZSBgYWNjb3VudHNgKS5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBbY29udHJvbGxlckNsYXNzXSAtIE9wdGlvbmFsIGNvbnRyb2xsZXIgY2xhc3Mgb3ZlcnJpZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRyb2xsZXJQYXRoXSAtIE9wdGlvbmFsIGFic29sdXRlL3JlbGF0aXZlIGNvbnRyb2xsZXIgZmlsZSBwYXRoIG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcGFyYW1zXSAtIEV4dHJhIHBhcmFtcyB0byBtZXJnZSBmb3IgY29udHJvbGxlci9hY3Rpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtza2lwQWJpbGl0eVJlc29sdXRpb25dIC0gV2hldGhlciB0byBydW4gdGhlIGNvbnRyb2xsZXIgYWN0aW9uIHdpdGhvdXQgcmVzb2x2aW5nIHJlcXVlc3QgYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NraXBDb250cm9sbGVyQ29ubmVjdGlvbnNdIC0gV2hldGhlciB0byBydW4gdGhlIGNvbnRyb2xsZXIgYWN0aW9uIHdpdGhvdXQgdGhlIGF1dG9tYXRpYyBkYXRhYmFzZSBjaGVja291dCB3cmFwcGVyLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2tpcFRlbmFudFJlc29sdXRpb25dIC0gV2hldGhlciB0byBydW4gdGhlIGNvbnRyb2xsZXIgYWN0aW9uIHdpdGhvdXQgcmVzb2x2aW5nIHJlcXVlc3QgdGVuYW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt2aWV3UGF0aF0gLSBPcHRpb25hbCB2aWV3IHBhdGggb3ZlcnJpZGUgdXNlZCBieSBjb250cm9sbGVyIHJlbmRlciBsb29rdXBzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKFJvdXRlUmVzb2x2ZXJIb29rQXJncykgOiBSb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGwgfCBQcm9taXNlPFJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0IHwgbnVsbD59IFJvdXRlUmVzb2x2ZXJIb29rVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3R5cGVvZiBpbXBvcnQoXCIuL2F1dGhvcml6YXRpb24vYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBBYmlsaXR5UmVzb3VyY2VDbGFzc1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgcmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCwgcmVzcG9uc2U6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHR9KSA6IGltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB2b2lkIHwgUHJvbWlzZTxpbXBvcnQoXCIuL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0IHwgdm9pZD59IEFiaWxpdHlSZXNvbHZlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgcmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgcmVzcG9uc2U6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIHN1YnNjcmlwdGlvbj86IHtjaGFubmVsOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+fX0pIDogdW5rbm93biB8IHZvaWQgfCBQcm9taXNlPHVua25vd24gfCB2b2lkPn0gVGVuYW50UmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiB1bmtub3dufSkgOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlIHwgUGFydGlhbDxEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlPiB8IHZvaWR9IFRlbmFudERhdGFiYXNlUmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWJ1Z0VuZHBvaW50Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXSAtIEhUVFAgcGF0aCBmb3IgdGhlIGJ1aWx0LWluIGRlYnVnIGVuZHBvaW50LiBEZWZhdWx0cyB0byBgL3ZlbG9jaW91cy9kZWJ1Z2AuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rva2VuXSAtIEJlYXJlciB0b2tlbiByZXF1aXJlZCBpbiB0aGUgYEF1dGhvcml6YXRpb246IEJlYXJlciA8dG9rZW4+YCBoZWFkZXIuIFdoZW4gc2V0LCByZXF1ZXN0cyB3aXRob3V0IGEgbWF0Y2hpbmcgdG9rZW4gYXJlIG5vdCByb3V0ZWQgKDQwNCksIHNvIHRoZSBlbmRwb2ludCBzdGF5cyBoaWRkZW4uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUZW5hbnREYXRhYmFzZVByb3ZpZGVyVHlwZVxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGlkZW50aWZpZXI6IHN0cmluZ30pIDogdW5rbm93bltdIHwgUHJvbWlzZTx1bmtub3duW10+fSBsaXN0VGVuYW50cyAtIExpc3RzIHRlbmFudHMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCwgY2hlY2tlZCwgb3IgbWlncmF0ZWQgZm9yIHRoaXMgZGF0YWJhc2UgaWRlbnRpZmllci5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiB1bmtub3dufSkgOiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gW2NyZWF0ZURhdGFiYXNlXSAtIENyZWF0ZXMgdGhlIHRlbmFudCBkYXRhYmFzZS9zY2hlbWEgZm9yIG9uZSB0ZW5hbnQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCBpZGVudGlmaWVyOiBzdHJpbmcsIHRlbmFudDogdW5rbm93bn0pIDogdm9pZCB8IFByb21pc2U8dm9pZD59IFtkcm9wRGF0YWJhc2VdIC0gRHJvcHMgdGhlIHRlbmFudCBkYXRhYmFzZS9zY2hlbWEgZm9yIG9uZSB0ZW5hbnQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCBpZGVudGlmaWVyOiBzdHJpbmcsIHRlbmFudDogdW5rbm93bn0pIDogdm9pZCB8IFByb21pc2U8dm9pZD59IFtjaGVja1RlbmFudF0gLSBDaGVja3Mgb25lIHRlbmFudCBkYXRhYmFzZSBiZWZvcmUgZ2VuZXJpYyBjb25uZWN0aW9uIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCBpZGVudGlmaWVyOiBzdHJpbmcsIG1pZ3JhdGlvbnNBcHBsaWVkOiBudW1iZXIsIHRlbmFudDogdW5rbm93bn0pIDogdm9pZCB8IFByb21pc2U8dm9pZD59IFthZnRlck1pZ3JhdGVUZW5hbnRdIC0gUnVucyBhcHAtb3duZWQgdGVuYW50IHdvcmsgYWZ0ZXIgZ2VuZXJpYyBtaWdyYXRpb25zIGZvciBvbmUgdGVuYW50LiBgbWlncmF0aW9uc0FwcGxpZWRgIGlzIGhvdyBtYW55IG1pZ3JhdGlvbnMgYWN0dWFsbHkgcmFuICgwIHdoZW4gdGhlIHRlbmFudCB3YXMgYWxyZWFkeSB1cCB0byBkYXRlKSwgc28gdGhlIGFwcCBjYW4gc2tpcCBleHBlbnNpdmUgcGVyLXRlbmFudCB3b3JrIG9uIG5vLW9wIGRlcGxveXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb25maWd1cmF0aW9uQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2F1dG9sb2FkXSAtIEdsb2JhbGx5IGVuYWJsZSBhdXRvLWJhdGNoLXByZWxvYWQgb2YgcmVsYXRpb25zaGlwcyBvbiBsYXp5IGFjY2Vzcy4gRGVmYXVsdCB0cnVlLlxuICogQHByb3BlcnR5IHtDb3JzVHlwZX0gW2NvcnNdIC0gQ09SUyBjb25maWd1cmF0aW9uIGZvciB0aGUgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Nvb2tpZVNlY3JldF0gLSBTZWNyZXQgZm9yIGVuY3J5cHRpbmcgY29va2llcy5cbiAqIEBwcm9wZXJ0eSB7QWJpbGl0eVJlc291cmNlQ2xhc3NUeXBlW119IFthYmlsaXR5UmVzb3VyY2VzXSAtIFJlc291cmNlIGNsYXNzZXMgdXNlZCB0byBkZWZpbmUgYWJpbGl0aWVzIHBlciBtb2RlbC5cbiAqIEBwcm9wZXJ0eSB7QWJpbGl0eVJlc29sdmVyVHlwZX0gW2FiaWxpdHlSZXNvbHZlcl0gLSBSZXNvbHZlciBmb3IgY3JlYXRpbmcgcmVxdWVzdC1zY29wZWQgYWJpbGl0eSBpbnN0YW5jZXMuXG4gKiBAcHJvcGVydHkge0F0dGFjaG1lbnRzQ29uZmlndXJhdGlvbn0gW2F0dGFjaG1lbnRzXSAtIEF0dGFjaG1lbnQgc3RvcmFnZSBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtCYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb25bXX0gW2JhY2tlbmRQcm9qZWN0c10gLSBCYWNrZW5kIHByb2plY3QgZGVmaW5pdGlvbnMgdXNlZCBmb3IgZnJvbnRlbmQgbW9kZWwgZ2VuZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7e1trZXk6IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfX19IGRhdGFiYXNlIC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbnMga2V5ZWQgYnkgZW52aXJvbm1lbnQgYW5kIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z10gLSBFbmFibGUgZGVidWcgbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IERlYnVnRW5kcG9pbnRDb25maWd1cmF0aW9ufSBbZGVidWdFbmRwb2ludF0gLSBFbmFibGUgdGhlIGJ1aWx0LWluIGRlYnVnIGVuZHBvaW50LiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlyZWN0b3J5XSAtIEJhc2UgZGlyZWN0b3J5IGZvciB0aGUgcHJvamVjdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuZm9yY2VUZW5hbnREYXRhYmFzZVNjb3Blc10gLSBSZXF1aXJlIHRlbmFudC1zd2l0Y2hlZCBtb2RlbCBxdWVyaWVzIHRvIHJlc29sdmUgYSB0ZW5hbnQgZGF0YWJhc2UgaWRlbnRpZmllci4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZW52aXJvbm1lbnRdIC0gQ3VycmVudCBlbnZpcm9ubWVudCBuYW1lLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2Vudmlyb25tZW50LWhhbmRsZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZW52aXJvbm1lbnRIYW5kbGVyIC0gRW52aXJvbm1lbnQgaGFuZGxlciBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2V4cG9zZUludGVybmFsRXJyb3JzVG9DbGllbnRzXSAtIFJldHVybiB1bmV4cGVjdGVkIGludGVybmFsIGVycm9yIGRldGFpbHMgaW4gY2xpZW50IEFQSSBwYXlsb2FkcyBvdXRzaWRlIHByb2R1Y3Rpb24uIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtIdHRwU2VydmVyQ29uZmlndXJhdGlvbn0gW2h0dHBTZXJ2ZXJdIC0gRGVmYXVsdCBIVFRQIHNlcnZlciBjb25maWd1cmF0aW9uIGZvciBhcHBsaWNhdGlvbnMgc3RhcnRlZCBmcm9tIHRoaXMgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2luZ0NvbmZpZ3VyYXRpb259IFtsb2dnaW5nXSAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9ufSBbYmFja2dyb3VuZEpvYnNdIC0gQmFja2dyb3VuZCBqb2JzIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge0JlYWNvbkNvbmZpZ3VyYXRpb259IFtiZWFjb25dIC0gQmVhY29uIGJyb2FkY2FzdCBidXMgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9uIHwgU2NoZWR1bGVkQmFja2dyb3VuZEpvYnNMb2FkZXJUeXBlfSBbc2NoZWR1bGVkQmFja2dyb3VuZEpvYnNdIC0gU2NoZWR1bGVkIGJhY2tncm91bmQgam9icyBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtNYWlsZXJCYWNrZW5kfSBbbWFpbGVyQmFja2VuZF0gLSBNYWlsIGRlbGl2ZXJ5IGJhY2tlbmQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgdHlwZTogc3RyaW5nfSkgOiB2b2lkfSBpbml0aWFsaXplTW9kZWxzIC0gSG9vayB0byByZWdpc3RlciBtb2RlbHMgZm9yIGEgZ2l2ZW4gaW5pdGlhbGl6YXRpb24gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7SW5pdGlhbGl6ZXJzVHlwZX0gW2luaXRpYWxpemVyc10gLSBJbml0aWFsaXplciBsb2FkZXIgZm9yIGVudmlyb25tZW50IGJvb3RzdHJhcHBpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IGZ1bmN0aW9uKCkgOiBzdHJpbmd9IGxvY2FsZSAtIERlZmF1bHQgbG9jYWxlIG9yIGxvY2FsZSByZXNvbHZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGxvY2FsZXMgLSBTdXBwb3J0ZWQgbG9jYWxlcy5cbiAqIEBwcm9wZXJ0eSB7TG9jYWxlRmFsbGJhY2tzVHlwZX0gbG9jYWxlRmFsbGJhY2tzIC0gTG9jYWxlIGZhbGxiYWNrIG1hcC5cbiAqIEBwcm9wZXJ0eSB7U3RydWN0dXJlU3FsQ29uZmlndXJhdGlvbn0gW3N0cnVjdHVyZVNxbF0gLSBTdHJ1Y3R1cmUgU1FMIGdlbmVyYXRpb24gY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7VGVuYW50UmVzb2x2ZXJUeXBlfSBbdGVuYW50UmVzb2x2ZXJdIC0gUmVzb2x2ZXIgZm9yIGNyZWF0aW5nIHJlcXVlc3Qtc2NvcGVkIHRlbmFudCBjb250ZXh0IG9iamVjdHMuXG4gKiBAcHJvcGVydHkge1RlbmFudERhdGFiYXNlUmVzb2x2ZXJUeXBlfSBbdGVuYW50RGF0YWJhc2VSZXNvbHZlcl0gLSBSZXNvbHZlciBmb3IgZGVyaXZpbmcgdGVuYW50LXNwZWNpZmljIGRhdGFiYXNlIGNvbmZpZyBvdmVycmlkZXMuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFRlbmFudERhdGFiYXNlUHJvdmlkZXJUeXBlPn0gW3RlbmFudERhdGFiYXNlUHJvdmlkZXJzXSAtIFRlbmFudCBkYXRhYmFzZSBsaWZlY3ljbGUgcHJvdmlkZXJzIGtleWVkIGJ5IGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rlc3RpbmddIC0gUGF0aCB0byB0aGUgdGVzdGluZyBjb25maWd1cmF0aW9uIGZpbGUuXG4gKiBAcHJvcGVydHkge251bWJlciB8ICgoKSA9PiBudW1iZXIpfSBbdGltZXpvbmVPZmZzZXRNaW51dGVzXSAtIERlZmF1bHQgdGltZXpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHN0cmluZ1tdfSBbdHJ1c3RlZFByb3hpZXNdIC0gVHJ1c3RlZCByZXZlcnNlIHByb3h5IGFkZHJlc3MgcmFuZ2VzIHVzZWQgdG8gcmVzb2x2ZSByZXF1ZXN0IHJlbW90ZSBhZGRyZXNzZXMgZnJvbSBmb3J3YXJkaW5nIGhlYWRlcnMuXG4gKiBAcHJvcGVydHkge251bWJlciB8ICgoKSA9PiBudW1iZXIpfSBbcmVxdWVzdFRpbWVvdXRNc10gLSBUaW1lb3V0IGluIHNlY29uZHMgZm9yIGNvbXBsZXRpbmcgYSBIVFRQIHJlcXVlc3QuXG4gKiBAcHJvcGVydHkge1JvdXRlUmVzb2x2ZXJIb29rVHlwZVtdfSBbcm91dGVSZXNvbHZlckhvb2tzXSAtIEhvb2sgY2FsbGJhY2tzIHRoYXQgY2FuIGhpamFjayB1bnJlc29sdmVkIHJvdXRlcy5cbiAqIEBwcm9wZXJ0eSB7V2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyVHlwZX0gW3dlYnNvY2tldENoYW5uZWxSZXNvbHZlcl0gLSBSZXNvbHZlIGEgd2Vic29ja2V0IGNoYW5uZWwgY2xhc3MvaW5zdGFuY2UgZm9yIGVhY2ggY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7V2Vic29ja2V0TWVzc2FnZUhhbmRsZXJSZXNvbHZlclR5cGV9IFt3ZWJzb2NrZXRNZXNzYWdlSGFuZGxlclJlc29sdmVyXSAtIFJlc29sdmUgYSByYXcgd2Vic29ja2V0IG1lc3NhZ2UgaGFuZGxlciBmb3IgZWFjaCBjb25uZWN0aW9uLlxuICovXG5cbmV4cG9ydCBjb25zdCBub3RoaW5nID0ge31cbiJdfQ==
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWd1cmF0aW9uLXR5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUVIOztHQUVHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7R0FJRztBQUVIOzs7O0dBSUc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7OztHQUlHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7O0dBR0c7QUFFSDs7R0FFRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7OztHQU1HO0FBRUg7OztHQUdHO0FBR0g7O0dBRUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7OztHQUlHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q0c7QUFFSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQG1vZHVsZSB0eXBlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtyZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0LCByZXNwb25zZTogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIikuZGVmYXVsdH0pOiBQcm9taXNlPHZvaWQ+fSBDb3JzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtyZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCBzdWJzY3JpcHRpb24/OiB7Y2hhbm5lbDogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0sIGNsaWVudDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvaW5kZXguanNcIikuZGVmYXVsdCwgd2Vic29ja2V0U2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdCwgY29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9KTogdHlwZW9mIGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdCB8IHZvaWQgfCBQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQgfCB2b2lkPn0gV2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2Vic29ja2V0TWVzc2FnZUhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe21lc3NhZ2U6ID8sIHNlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25NZXNzYWdlXSAtIEhhbmRsZXIgZm9yIGluY29taW5nIHdlYnNvY2tldCBtZXNzYWdlcy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe3Nlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25PcGVuXSAtIEhhbmRsZXIgd2hlbiB0aGUgd2Vic29ja2V0IHNlc3Npb24gb3BlbnMuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtzZXNzaW9uOiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtc2Vzc2lvbi5qc1wiKS5kZWZhdWx0fSkgOiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gW29uQ2xvc2VdIC0gSGFuZGxlciB3aGVuIHRoZSB3ZWJzb2NrZXQgc2Vzc2lvbiBjbG9zZXMuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtlcnJvcjogRXJyb3IsIHNlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25FcnJvcl0gLSBIYW5kbGVyIHdoZW4gYSB3ZWJzb2NrZXQgbWVzc2FnZSBlcnJvcnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe3JlcXVlc3Q6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIGNsaWVudDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvaW5kZXguanNcIikuZGVmYXVsdCwgY29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9KTogV2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkIHwgUHJvbWlzZTxXZWJzb2NrZXRNZXNzYWdlSGFuZGxlciB8IHZvaWQ+fSBXZWJzb2NrZXRNZXNzYWdlSGFuZGxlclJlc29sdmVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhpZDogc3RyaW5nKSA9PiB7ZGVmYXVsdDogdHlwZW9mIGltcG9ydChcIi4vaW5pdGlhbGl6ZXIuanNcIikuZGVmYXVsdH19IEluaXRpYWxpemVyc1JlcXVpcmVDb250ZXh0VHlwZVxuICogQHR5cGVkZWYge0luaXRpYWxpemVyc1JlcXVpcmVDb250ZXh0VHlwZSAmIHtcbiAqICAga2V5czogKCkgPT4gc3RyaW5nW10sXG4gKiAgIGlkOiBzdHJpbmdcbiAqIH19IFdlYnBhY2tSZXF1aXJlQ29udGV4dFxuICogQHR5cGVkZWYge3tyZXF1aXJlQ29udGV4dDogV2VicGFja1JlcXVpcmVDb250ZXh0fX0gSW5pdGlhbGl6ZXJzRXhwb3J0VHlwZVxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTxJbml0aWFsaXplcnNFeHBvcnRUeXBlPn0gSW5pdGlhbGl6ZXJzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3FsQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlXSAtIERhdGFiYXNlIG5hbWUgZm9yIHRoZSBTUUwgZHJpdmVyLlxuICogQHByb3BlcnR5IHtvYmplY3R9IFtvcHRpb25zXSAtIERyaXZlci1zcGVjaWZpYyBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvcHRpb25zLmVuY3J5cHRdIC0gV2hldGhlciB0byBlbmNyeXB0IHRoZSBjb25uZWN0aW9uIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29wdGlvbnMuc2NoZW1hXSAtIERlZmF1bHQgc2NoZW1hIGZvciB1bnF1YWxpZmllZCB0YWJsZSBsb29rdXBzIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29wdGlvbnMuc2VydmVyTmFtZV0gLSBUTFMgU05JIHNlcnZlciBuYW1lIG92ZXJyaWRlIGZvciBNU1NRTCAoZW1wdHkgc3RyaW5nIGRpc2FibGVzIFNOSSkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGVdIC0gV2hldGhlciB0byB0cnVzdCB0aGUgc2VydmVyIGNlcnRpZmljYXRlIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Bhc3N3b3JkXSAtIFBhc3N3b3JkIGZvciB0aGUgU1FMIHVzZXIuXG4gKiBAcHJvcGVydHkge29iamVjdH0gW3Bvb2xdIC0gQ29ubmVjdGlvbiBwb29sIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Bvb2wubWF4XSAtIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb29sLm1pbl0gLSBNaW5pbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9vbC5pZGxlVGltZW91dE1pbGxpc10gLSBJZGxlIHRpbWVvdXQgYmVmb3JlIHJlbGVhc2luZyBhIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlcnZlcl0gLSBTUUwgc2VydmVyIGhvc3RuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1c2VyXSAtIFNRTCB1c2VybmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERhdGFiYXNlUG9vbENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW2lkbGVUaW1lb3V0TWlsbGlzXSAtIElkbGUgdGltZW91dCBiZWZvcmUgY2xvc2luZyBhIGNoZWNrZWQtaW4gYXN5bmMtdHJhY2tlZCBjb25uZWN0aW9uLiBTZXQgbnVsbCB0byBkaXNhYmxlIGlkbGUgcmVhcGluZy4gRGVmYXVsdDogNTAwMC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4XSAtIE1heGltdW0gbGl2ZSBhc3luYy10cmFja2VkIGNvbm5lY3Rpb25zIGZvciB0aGlzIHBvb2wuIEV4dHJhIGNoZWNrb3V0cyB3YWl0IHVudGlsIGEgbWF0Y2hpbmcgY29ubmVjdGlvbiBpcyBjaGVja2VkIGluIG9yIGNhcGFjaXR5IGlzIGZyZWVkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkYXRhYmFzZUNoYXJzZXRdIC0gRGVmYXVsdCBjaGFyYWN0ZXIgc2V0IGFwcGxpZWQgYnkgYGRiOmNyZWF0ZWAgdmlhIG15c3FsL21hcmlhZGIgYENSRUFURSBEQVRBQkFTRSAuLi4gQ0hBUkFDVEVSIFNFVGAuIERpc3RpbmN0IGZyb20gYGNoYXJzZXRgLCB3aGljaCBpcyB0aGUgY2xpZW50IGNvbm5lY3Rpb24gY2hhcnNldCBmb3J3YXJkZWQgdG8gdGhlIG15c3FsMiBkcml2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlQ29sbGF0aW9uXSAtIERlZmF1bHQgY29sbGF0aW9uIGFwcGxpZWQgYnkgYGRiOmNyZWF0ZWAgdmlhIG15c3FsL21hcmlhZGIgYENSRUFURSBEQVRBQkFTRSAuLi4gQ09MTEFURWAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlXSAtIERhdGFiYXNlIG5hbWUgZm9yIHRoaXMgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IFtkcml2ZXJdIC0gRHJpdmVyIGNsYXNzIHRvIHVzZSBmb3IgdGhpcyBkYXRhYmFzZS5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcG9vbC9iYXNlLmpzXCIpLmRlZmF1bHR9IFtwb29sVHlwZV0gLSBQb29sIGNsYXNzIHRvIHVzZSBmb3IgdGhpcyBkYXRhYmFzZS5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oKSA6ID99IFtnZXRDb25uZWN0aW9uXSAtIEN1c3RvbSBjb25uZWN0aW9uIGZhY3Rvcnkgb3ZlcnJpZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gRGF0YWJhc2UgaG9zdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW21pZ3JhdGlvbnNdIC0gV2hldGhlciBtaWdyYXRpb25zIGFyZSBlbmFibGVkIGZvciB0aGlzIGRhdGFiYXNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXNzd29yZF0gLSBQYXNzd29yZCBmb3IgdGhlIGRhdGFiYXNlIHVzZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gRGF0YWJhc2UgcG9ydC5cbiAqIEBwcm9wZXJ0eSB7RGF0YWJhc2VQb29sQ29uZmlndXJhdGlvbn0gW3Bvb2xdIC0gVmVsb2Npb3VzIGRhdGFiYXNlIHBvb2wgbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gRnJpZW5kbHkgbmFtZSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkgeyhmaWxlOiBzdHJpbmcpID0+IHN0cmluZ30gW2xvY2F0ZUZpbGVdIC0gT3B0aW9uYWwgc3FsaXRlLXdlYiBzcWwuanMgd2FzbSByZXNvbHZlciAoYGluaXRTcWxKcyh7bG9jYXRlRmlsZX0pYCkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZWFkT25seV0gLSBXaGV0aGVyIHdyaXRlcyBzaG91bGQgYmUgYmxvY2tlZCBmb3IgdGhpcyBkYXRhYmFzZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2NoZW1hXSAtIERlZmF1bHQgc2NoZW1hIGZvciB1bnF1YWxpZmllZCB0YWJsZSBsb29rdXBzIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzY2hlbWFDYWNoZV0gLSBXaGV0aGVyIHNjaGVtYSBtZXRhZGF0YSBzaG91bGQgYmUgY2FjaGVkIG9uIHRoZSBkcml2ZXIuIERlZmF1bHRzIHRvIHRydWUuXG4gKiBAcHJvcGVydHkge29iamVjdH0gW3JlY29yZF0gLSBSZWNvcmQtbGV2ZWwgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JlY29yZC50cmFuc2FjdGlvbnNdIC0gV2hldGhlciByZWNvcmQgb3BlcmF0aW9ucyBzaG91bGQgdXNlIHRyYW5zYWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Jlc2V0XSAtIFdoZXRoZXIgdG8gcmVzZXQgdGhlIGRhdGFiYXNlIG9uIHN0YXJ0dXAuXG4gKiBAcHJvcGVydHkge1NxbENvbmZpZ30gW3NxbENvbmZpZ10gLSBEcml2ZXItc3BlY2lmaWMgU1FMIGNvbmZpZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RlbmFudE9ubHldIC0gV2hldGhlciB0aGlzIGRhdGFiYXNlIGlkZW50aWZpZXIgaXMgb25seSBhY3RpdmUgaW5zaWRlIGEgcmVzb2x2ZWQgdGVuYW50IGNvbnRleHQuXG4gKiBAcHJvcGVydHkge1wibXNzcWxcIiB8IFwibXlzcWxcIiB8IFwicGdzcWxcIiB8IFwic3FsaXRlXCJ9IFt0eXBlXSAtIERhdGFiYXNlIHR5cGUgaWRlbnRpZmllci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdXNlRGF0YWJhc2VdIC0gRGF0YWJhc2UgdG8gc3dpdGNoIHRvIGFmdGVyIGNvbm5lY3RpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VzZXJuYW1lXSAtIFVzZXJuYW1lIGZvciBkYXRhYmFzZSBhdXRoZW50aWNhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtcImRlYnVnLWxvdy1sZXZlbFwiIHwgXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIn0gTG9nTGV2ZWxcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvZ2dpbmdPdXRwdXRQYXlsb2FkXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsfSBsZXZlbCAtIExvZyBsZXZlbC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXNzYWdlIC0gRm9ybWF0dGVkIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3ViamVjdCAtIExvZyBzdWJqZWN0LlxuICogQHByb3BlcnR5IHtEYXRlfSB0aW1lc3RhbXAgLSBUaW1lc3RhbXAuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2dnaW5nT3V0cHV0XG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKExvZ2dpbmdPdXRwdXRQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB8IHZvaWR9IHdyaXRlIC0gV3JpdGUgYSBsb2cgZW50cnkuXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsW119IFtsZXZlbHNdIC0gRGVmYXVsdCBsZXZlbHMgZm9yIHRoaXMgb3V0cHV0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9nZ2luZ091dHB1dENvbmZpZ1xuICogQHByb3BlcnR5IHtMb2dnaW5nT3V0cHV0fSBvdXRwdXQgLSBPdXRwdXQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge0FycmF5PExvZ0xldmVsPn0gW2xldmVsc10gLSBMZXZlbHMgZW5hYmxlZCBmb3IgdGhpcyBvdXRwdXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TG9nZ2luZ091dHB1dENvbmZpZyB8IExvZ2dpbmdPdXRwdXQgfCBpbXBvcnQoXCIuL2xvZ2dlci9iYXNlLWxvZ2dlci5qc1wiKS5kZWZhdWx0fSBMb2dnZXJDb25maWdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvZ2dpbmdDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zb2xlXSAtIEVuYWJsZS9kaXNhYmxlIGNvbnNvbGUgbG9nZ2luZyBmb3IgcmVxdWVzdCBsb2dnaW5nLiBEZWZhdWx0cyB0byB0cnVlIG91dHNpZGUgb2YgXCJ0ZXN0XCIgYW5kIGZvciBIVFRQIHNlcnZlciBsb2dzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmlsZV0gLSBFbmFibGUvZGlzYWJsZSB3cml0aW5nIGxvZ3MgdG8gYSBmaWxlLiBEZWZhdWx0cyB0byB0cnVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkaXJlY3RvcnldIC0gRGlyZWN0b3J5IHdoZXJlIGxvZyBmaWxlcyBhcmUgc3RvcmVkLiBEZWZhdWx0cyB0byBcIjxwcm9qZWN0Pi9sb2dcIi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZmlsZVBhdGhdIC0gRXhwbGljaXQgcGF0aCBmb3IgdGhlIGxvZyBmaWxlLiBEZWZhdWx0cyB0byBcIjxkaXJlY3Rvcnk+LzxlbnZpcm9ubWVudD4ubG9nXCIuXG4gKiBAcHJvcGVydHkge0FycmF5PFwiZGVidWctbG93LWxldmVsXCIgfCBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiPn0gW2xldmVsc10gLSBPdmVycmlkZSB3aGljaCBsb2cgbGV2ZWxzIGFyZSBlbWl0dGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWdMb3dMZXZlbF0gLSBDb252ZW5pZW5jZSBmbGFnIHRvIGluY2x1ZGUgdmVyeSBsb3ctbGV2ZWwgZGVidWcgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3F1ZXJ5TG9nZ2luZ10gLSBFbmFibGUvZGlzYWJsZSBkYXRhYmFzZSBxdWVyeSBsb2dnaW5nLiBEZWZhdWx0cyB0byB0cnVlIG91dHNpZGUgdGVzdCBhbmQgZmFsc2UgaW4gdGVzdC5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2VyQ29uZmlnW119IFtsb2dnZXJzXSAtIExvZ2dlciBpbnN0YW5jZXMgKGNvbnZlcnRlZCB0byBvdXRwdXRzIHdoZW4gY29uZmlndXJlZCkuXG4gKiBAcHJvcGVydHkge0xvZ2dpbmdPdXRwdXRDb25maWdbXX0gW291dHB1dHNdIC0gRXhwbGljaXQgbG9nZ2VyIG91dHB1dHMgKG92ZXJyaWRlcyBjb25zb2xlL2ZpbGUgZGVmYXVsdHMgd2hlbiBwcm92aWRlZCkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdHJ1Y3R1cmVTcWxDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZW5hYmxlZEVudmlyb25tZW50c10gLSBFbnZpcm9ubWVudHMgYWxsb3dlZCB0byB3cml0ZSBzdHJ1Y3R1cmUgc3FsIGZpbGVzIGR1cmluZyBhdXRvbWF0aWMgbWlncmF0aW9uIGR1bXBzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Rpc2FibGVkRW52aXJvbm1lbnRzXSAtIEVudmlyb25tZW50cyB0aGF0IHNob3VsZCBza2lwIHdyaXRpbmcgc3RydWN0dXJlIHNxbCBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtcImJlYWNvblwiIHwgXCJwb2xsaW5nXCJ9IEJhY2tncm91bmRKb2JzRGlzcGF0Y2hTdHJhdGVneVxuICpcbiAqIC0gYFwiYmVhY29uXCJgIChkZWZhdWx0KTogZXZlbnQtZHJpdmVuIGRpc3BhdGNoLiBUaGVcbiAqICAgYGJhY2tncm91bmQtam9icy1tYWluYCBwcm9jZXNzIGRyYWlucyB0aGUgcXVldWUgb24gZW5xdWV1ZSwgb25cbiAqICAgd29ya2VyIHJlYWRpbmVzcywgb24gQmVhY29uIGJyb2FkY2FzdHMgKHNvIGNyb3NzLXByb2Nlc3MgZW5xdWV1ZXNcbiAqICAgd2FrZSBpdCksIGFuZCBhcm1zIGEgYHNldFRpbWVvdXRgIGZvciB0aGUgc29vbmVzdCBmdXR1cmUtc2NoZWR1bGVkXG4gKiAgIGpvYi4gRmFsbHMgYmFjayBncmFjZWZ1bGx5IHRvIGRpcmVjdCBpbi1wcm9jZXNzIHRyaWdnZXJpbmcgd2hlblxuICogICBCZWFjb24gaXMgbm90IGNvbmZpZ3VyZWQuXG4gKiAtIGBcInBvbGxpbmdcImA6IGxlZ2FjeSBtb2RlLCBydW5zIGEgZml4ZWQtaW50ZXJ2YWwgcG9sbCBvdmVyIHRoZVxuICogICBgYmFja2dyb3VuZF9qb2JzYCB0YWJsZSAoc2VlIGBwb2xsSW50ZXJ2YWxNc2ApLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gSG9zdG5hbWUgZm9yIHRoZSBiYWNrZ3JvdW5kIGpvYnMgbWFpbiBwcm9jZXNzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSAtIFBvcnQgZm9yIHRoZSBiYWNrZ3JvdW5kIGpvYnMgbWFpbiBwcm9jZXNzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkYXRhYmFzZUlkZW50aWZpZXJdIC0gRGF0YWJhc2UgaWRlbnRpZmllciB1c2VkIHRvIHN0b3JlIGJhY2tncm91bmQgam9icy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4Q29uY3VycmVudElubGluZUpvYnNdIC0gSG93IG1hbnkgYGZvcmtlZDogZmFsc2VgIGpvYnMgYSBzaW5nbGVcbiAqICAgYGJhY2tncm91bmQtam9icy13b3JrZXJgIHByb2Nlc3MgaXMgYWxsb3dlZCB0byBydW4gaW4gcGFyYWxsZWwuIENvbmN1cnJlbmN5XG4gKiAgIGlzIGF0IHRoZSBKUyBldmVudC1sb29wIGxldmVsOiBldmVyeSBjb25jdXJyZW50IGpvYiBzaGFyZXMgdGhlIHdvcmtlcidzXG4gKiAgIHByb2Nlc3MgYW5kIERCIGNvbm5lY3Rpb24gcG9vbCwgc28gdGhpcyBzaG91bGQgZml0IHRoZSBwb29sIHNpemUsIG5vdCB0aGVcbiAqICAgQ1BVIGNvdW50LiBGb3JraW5nIHJlbWFpbnMgdGhlIHJpZ2h0IHRvb2wgZm9yIG1lbW9yeSBpc29sYXRpb24gYWNyb3NzXG4gKiAgIGxvbmctcnVubmluZyBqb2JzIGFuZCBmb3IgdXNpbmcgbW9yZSBjb3Jlcy4gRGVmYXVsdDogYDRgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDb25jdXJyZW50Rm9ya2VkSm9ic10gLSBIb3cgbWFueSBvdXQtb2YtcHJvY2Vzc1xuICogICBgXCJmb3JrZWRcImAgb3IgYFwic3Bhd25lZFwiYCBqb2JzIGEgc2luZ2xlIGBiYWNrZ3JvdW5kLWpvYnMtd29ya2VyYCBpc1xuICogICBhbGxvd2VkIHRvIGtlZXAgaW4gZmxpZ2h0LiBEZWZhdWx0OiBgNGAuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JzRGlzcGF0Y2hTdHJhdGVneX0gW2Rpc3BhdGNoU3RyYXRlZ3ldIC0gSG93IHRoZSBtYWluIHByb2Nlc3NcbiAqICAgZGV0ZWN0cyBuZXcgd29yay4gRGVmYXVsdHMgdG8gYFwiYmVhY29uXCJgIChldmVudC1kcml2ZW4pLiBTZXQgdG8gYFwicG9sbGluZ1wiYFxuICogICB0byByZXN0b3JlIHRoZSBsZWdhY3kgZml4ZWQtaW50ZXJ2YWwgcG9sbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsTXNdIC0gUG9sbCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMuIE9ubHkgdXNlZFxuICogICB3aGVuIGBkaXNwYXRjaFN0cmF0ZWd5ID09PSBcInBvbGxpbmdcImAuIERlZmF1bHQ6IGAxMDAwYC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJlYWNvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuYWJsZWRdIC0gV2hldGhlciB0byBjb25uZWN0IHRvIGEgQmVhY29uIGJyb2tlci4gRGVmYXVsdHMgdG8gZmFsc2UgdW5sZXNzIGBob3N0YC9gcG9ydGAgb3IgYGluUHJvY2VzczogdHJ1ZWAgYXJlIHNldCwgb3IgZW52IHZhcnMgYXJlIHByZXNlbnQuIEV4cGxpY2l0IGBmYWxzZWAgZGlzYWJsZXMgQmVhY29uIGV2ZW4gd2hlbiBlbnYgdmFycyBhcmUgc2V0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5Qcm9jZXNzXSAtIFdoZW4gdHJ1ZSwgdXNlIGEgbW9kdWxlLWxldmVsIGluLXByb2Nlc3MgYnJva2VyIHNpbmdsZXRvbiBpbnN0ZWFkIG9mIGNvbm5lY3Rpbmcgb3ZlciBUQ1AuIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBob3N0YC9gcG9ydGAuIFVzZWZ1bCBmb3IgdGVzdHMgYW5kIHNpbmdsZS1wcm9jZXNzIGRlcGxveW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSAtIEhvc3RuYW1lIG9mIHRoZSBCZWFjb24gYnJva2VyIGRhZW1vbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9ydF0gLSBQb3J0IG9mIHRoZSBCZWFjb24gYnJva2VyIGRhZW1vbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGVlclR5cGVdIC0gT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoaXMgcGVlciAoZS5nLiBcInNlcnZlclwiLCBcImJhY2tncm91bmQtam9icy13b3JrZXJcIikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3VucmVhY2hhYmxlUmVwb3J0TXNdIC0gR3JhY2Ugd2luZG93IChtcykgYSBiZWFjb24gY29ubmVjdC9kaXNjb25uZWN0IGJsaXAgbXVzdCBwZXJzaXN0IGJlZm9yZSBpdCBpcyByZXBvcnRlZCBhcyBhIGZyYW1ld29yay1lcnJvci4gVHJhbnNpZW50IG91dGFnZXMgdGhhdCByZWNvdmVyIHdpdGhpbiB0aGlzIHdpbmRvdyAoZS5nLiBhIGRlcGxveSByZXN0YXJ0aW5nIHRoZSBicm9rZXIpIGFyZSBub3QgcmVwb3J0ZWQuIERlZmF1bHRzIHRvIDMwMDAwLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSHR0cFNlcnZlckNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gLSBIb3N0bmFtZSB0byBiaW5kIHRoZSBIVFRQIHNlcnZlciB0by5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2luUHJvY2Vzc10gLSBSdW4gSFRUUCBoYW5kbGVycyBpbiB0aGUgbWFpbiB0aHJlYWQgaW5zdGVhZCBvZiB3b3JrZXIgdGhyZWFkcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4V29ya2Vyc10gLSBCYWNrd2FyZC1jb21wYXRpYmxlIGFsaWFzIGZvciB3b3JrZXJzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSAtIFBvcnQgdG8gYmluZCB0aGUgSFRUUCBzZXJ2ZXIgdG8uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3dvcmtlcnNdIC0gV29ya2VyIGhhbmRsZXJzIHRvIHN0YXJ0IGZvciB0aGUgSFRUUCBzZXJ2ZXIuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iRXZlcnlPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlciB8IHN0cmluZ30gW2ZpcnN0SW5dIC0gRGVsYXkgYmVmb3JlIHRoZSBmaXJzdCBlbnF1ZXVlLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBzdHJpbmd9IFtmaXJzdF9pbl0gLSBTaWRla2lxLXN0eWxlIGFsaWFzIGZvciBgZmlyc3RJbmAuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtBcnJheTw/Pn0gW2FyZ3NdIC0gQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgam9iIHdoZW4gZW5xdWV1ZWQuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2JhY2tncm91bmQtam9icy9qb2IuanNcIikuZGVmYXVsdH0gY2xhc3MgLSBKb2IgY2xhc3MgdG8gZW5xdWV1ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY3Jvbl0gLSBDcm9udGFiIGV4cHJlc3Npb24gKDUtZmllbGQgUE9TSVgsIHBsdXMgYEBob3VybHlgL2BAZGFpbHlgL2BAd2Vla2x5YC9gQG1vbnRobHlgL2BAeWVhcmx5YC9gQG1pZG5pZ2h0YCkuIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBldmVyeWAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVkXSAtIFdoZXRoZXIgdGhlIHNjaGVkdWxlIGlzIGVuYWJsZWQuXG4gKiBAcHJvcGVydHkge251bWJlciB8IHN0cmluZyB8IFtudW1iZXIgfCBzdHJpbmcsIFNjaGVkdWxlZEJhY2tncm91bmRKb2JFdmVyeU9wdGlvbnNdfSBbZXZlcnldIC0gUmVwZWF0IGludGVydmFsLiBFaXRoZXIgYGV2ZXJ5YCBvciBgY3JvbmAgbXVzdCBiZSBzZXQuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vYmFja2dyb3VuZC1qb2JzL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfSBbb3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbj59IGpvYnMgLSBTY2hlZHVsZWQgam9icyBrZXllZCBieSBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pIDogU2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9uIHwgUHJvbWlzZTxTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb24+fSBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0xvYWRlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF0dGFjaG1lbnREcml2ZXJDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgbmFtZTogc3RyaW5nLCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCA/Pn0pIDogUmVjb3JkPHN0cmluZywgPz59IFtjcmVhdGVdIC0gT3B0aW9uYWwgZmFjdG9yeSBmb3IgYSBjdXN0b20gYXR0YWNobWVudCBkcml2ZXIgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge25ldyAoLi4uYXJnczogQXJyYXk8Pz4pID0+IFJlY29yZDxzdHJpbmcsID8+fSBbZHJpdmVyQ2xhc3NdIC0gT3B0aW9uYWwgY3VzdG9tIGF0dGFjaG1lbnQgZHJpdmVyIGNsYXNzLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2luc3RhbmNlXSAtIE9wdGlvbmFsIGN1c3RvbSBhdHRhY2htZW50IGRyaXZlciBpbnN0YW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF0dGFjaG1lbnRzQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkZWZhdWx0RHJpdmVyXSAtIERlZmF1bHQgYXR0YWNobWVudCBzdG9yYWdlIGRyaXZlciBuYW1lLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBBdHRhY2htZW50RHJpdmVyQ29uZmlndXJhdGlvbiAmIFJlY29yZDxzdHJpbmcsID8+Pn0gW2RyaXZlcnNdIC0gTmFtZWQgYXR0YWNobWVudCBkcml2ZXIgY29uZmlndXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbGxvd1BhdGhJbnB1dF0gLSBXaGV0aGVyIGB7cGF0aDogLi4ufWAgYXR0YWNobWVudCBpbnB1dCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2FsbG93ZWRQYXRoUHJlZml4ZXNdIC0gT3B0aW9uYWwgYWxsb3dsaXN0IG9mIGRpcmVjdG9yaWVzIGZvciBge3BhdGg6IC4uLn1gIGlucHV0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWFpbGVyQmFja2VuZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7cGF5bG9hZDogaW1wb3J0KFwiLi9tYWlsZXIuanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkLCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTw/PiB8ID99IGRlbGl2ZXIgLSBEZWxpdmVyIGEgbWFpbGVyIHBheWxvYWQuXG4gKi9cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IExvY2FsZUZhbGxiYWNrc1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZWxhdGlvbnNoaXBDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge1wiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9IHR5cGUgLSBSZWxhdGlvbnNoaXAgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbW9kZWxdIC0gVGFyZ2V0IG1vZGVsIGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NsYXNzTmFtZV0gLSBBbGlhcyBvZiB0YXJnZXQgbW9kZWwgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbW9kZWxDbGFzc05hbWVdIC0gRXhwbGljaXQgdGFyZ2V0IG1vZGVsIGNsYXNzIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsQXR0cmlidXRlQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0eXBlXSAtIENvbHVtbiB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbHVtblR5cGVdIC0gQWxpYXMgZm9yIGNvbHVtbiB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NxbFR5cGVdIC0gQWxpYXMgZm9yIGNvbHVtbiB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFUeXBlXSAtIEFsaWFzIGZvciBjb2x1bW4gdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbnVsbF0gLSBXaGV0aGVyIHZhbHVlIGNhbiBiZSBudWxsLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2VsZWN0ZWRCeURlZmF1bHRdIC0gV2hldGhlciBpbmNsdWRlZCBpbiBkZWZhdWx0IHNlcmlhbGl6YXRpb24uIERlZmF1bHRzIHRvIHRydWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsQXR0YWNobWVudENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifSB0eXBlIC0gQXR0YWNobWVudCBjYXJkaW5hbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0cmlidXRlQ29uZmlndXJhdGlvbiB8IGltcG9ydChcIi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0IHwgYm9vbGVhbj59IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIGV4cG9zZSBvbiB0aGUgZnJvbnRlbmQgbW9kZWwuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYWJpbGl0aWVzXSAtIEFiaWxpdHkgYWN0aW9uIGxpc3QgKGNhbWVsQ2FzZSBhY3Rpb24gbmFtZXMpLiBEZWZhdWx0cyB0byBgW1wicmVhZFwiXWAgZm9yIGBmaW5kYCBhbmQgYGluZGV4YCB3aGVuIG9taXR0ZWQuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxBdHRhY2htZW50Q29uZmlndXJhdGlvbj59IFthdHRhY2htZW50c10gLSBBdHRhY2htZW50IGhlbHBlcnMga2V5ZWQgYnkgYXR0YWNobWVudCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2NvbW1hbmRzXSAtIExlZ2FjeSBidWlsdC1pbiBjb21tYW5kIG5hbWVzIChgaW5kZXhgLCBgZmluZGAsIGBjcmVhdGVgLCBgdXBkYXRlYCwgYGRlc3Ryb3lgLCBgYXR0YWNoYCwgYGRvd25sb2FkYCwgYHVybGApLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2NvbGxlY3Rpb25Db21tYW5kc10gLSBDdXN0b20gY29sbGVjdGlvbiBjb21tYW5kcyBhcyBjYW1lbENhc2UgbWV0aG9kIG5hbWVzLiBUaGUgcnVudGltZSBkZXJpdmVzIHRoZSBrZWJhYi1jYXNlIGNvbW1hbmQgc2x1ZyBmcm9tIGVhY2ggbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFttZW1iZXJDb21tYW5kc10gLSBDdXN0b20gbWVtYmVyIGNvbW1hbmRzIGFzIGNhbWVsQ2FzZSBtZXRob2QgbmFtZXMuIFRoZSBydW50aW1lIGRlcml2ZXMgdGhlIGtlYmFiLWNhc2UgY29tbWFuZCBzbHVnIGZyb20gZWFjaCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2J1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNdIC0gQnVpbHQtaW4gY29sbGVjdGlvbiBjb21tYW5kIG5hbWVzIChgaW5kZXhgLCBgY3JlYXRlYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYnVpbHRJbk1lbWJlckNvbW1hbmRzXSAtIEJ1aWx0LWluIG1lbWJlciBjb21tYW5kIG5hbWVzIChgZmluZGAsIGB1cGRhdGVgLCBgZGVzdHJveWAsIGBhdHRhY2hgLCBgZG93bmxvYWRgLCBgdXJsYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbcmVsYXRpb25zaGlwc10gLSBSZWxhdGlvbnNoaXAgbmFtZXMgdG8gZXhwb3NlIGluIGZyb250ZW5kIG1vZGVscy4gVHlwZSBhbmQgdGFyZ2V0IG1vZGVsIGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBiYWNrZW5kIG1vZGVsJ3MgcmVnaXN0ZXJlZCByZWxhdGlvbnNoaXBzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcmltYXJ5S2V5XSAtIFByaW1hcnkga2V5IGF0dHJpYnV0ZSBuYW1lLlxuICogQHByb3BlcnR5IHtGcm9udGVuZE1vZGVsUmVzb3VyY2VTZXJ2ZXJDb25maWd1cmF0aW9ufSBbc2VydmVyXSAtIE9wdGlvbmFsIGxlZ2FjeSBiYWNrZW5kIGJlaGF2aW9yIG92ZXJyaWRlcyBmb3IgYnVpbHQtaW4gZnJvbnRlbmQgYWN0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPbWl0PEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24sIFwiYWJpbGl0aWVzXCIgfCBcImJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcIiB8IFwiYnVpbHRJbk1lbWJlckNvbW1hbmRzXCIgfCBcImNvbGxlY3Rpb25Db21tYW5kc1wiIHwgXCJjb21tYW5kc1wiIHwgXCJtZW1iZXJDb21tYW5kc1wiPiAmIHtcbiAqICAgYWJpbGl0aWVzOiBGcm9udGVuZE1vZGVsUmVzb3VyY2VBYmlsaXRpZXNDb25maWd1cmF0aW9uXG4gKiAgIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAqICAgYnVpbHRJbk1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gKiAgIGNvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICogICBtZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICogfX0gTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0Zyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gRnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlQWJpbGl0aWVzQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbmRleF0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgaW5kZXguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ZpbmRdIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIGZpbmQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NyZWF0ZV0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgY3JlYXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1cGRhdGVdIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIHVwZGF0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVzdHJveV0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgZGVzdHJveS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZVNlcnZlckNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJpbmRleFwiIHwgXCJmaW5kXCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0pIDogKGJvb2xlYW4gfCB2b2lkIHwgUHJvbWlzZTxib29sZWFuIHwgdm9pZD4pfSBbYmVmb3JlQWN0aW9uXSAtIE9wdGlvbmFsIGNhbGxiYWNrIHJ1biBiZWZvcmUgYnVpbHQtaW4gZnJvbnRlbmQgYWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJpbmRleFwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdPn0gW3JlY29yZHNdIC0gUmVjb3JkcyBsb2FkZXIgZm9yIGZyb250ZW5kSW5kZXguXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHthY3Rpb246IFwiaW5kZXhcIiB8IFwiZmluZFwiIHwgXCJjcmVhdGVcIiB8IFwidXBkYXRlXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbW9kZWw6IGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA6IFJlY29yZDxzdHJpbmcsID8+IHwgUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IFtzZXJpYWxpemVdIC0gUmVjb3JkIHNlcmlhbGl6ZXIgZm9yIHJlc3BvbnNlIHBheWxvYWRzLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7YWN0aW9uOiBcImZpbmRcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIiB8IFwiYXR0YWNoXCIgfCBcImRvd25sb2FkXCIgfCBcInVybFwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIGlkOiBzdHJpbmcgfCBudW1iZXJ9KSA6IFByb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGw+fSBbZmluZF0gLSBSZWNvcmQgbG9hZGVyIGZvciBmaW5kL3VwZGF0ZS9kZXN0cm95L2F0dGFjaC9kb3dubG9hZC91cmwgYWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJjcmVhdGVcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCA/Pn0pIDogUHJvbWlzZTxpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gW2NyZWF0ZV0gLSBDdXN0b20gY3JlYXRlIGNhbGxiYWNrLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7YWN0aW9uOiBcInVwZGF0ZVwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIG1vZGVsOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCA/Pn0pIDogUHJvbWlzZTxpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdm9pZD59IFt1cGRhdGVdIC0gQ3VzdG9tIHVwZGF0ZSBjYWxsYmFjay5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJkZXN0cm95XCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbW9kZWw6IGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8dm9pZD59IFtkZXN0cm95XSAtIEN1c3RvbSBkZXN0cm95IGNhbGxiYWNrLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFBhdGggdG8gdGhlIGJhY2tlbmQgcHJvamVjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoXSAtIE9wdGlvbmFsIG91dHB1dCBwcm9qZWN0IHBhdGggd2hlcmUgYHNyYy9mcm9udGVuZC1tb2RlbHNgIHNob3VsZCBiZSBnZW5lcmF0ZWQuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb24+fSBbZnJvbnRlbmRNb2RlbHNdIC0gQXV0by1kaXNjb3ZlcmVkIGZyb250ZW5kIG1vZGVsIGRlZmluaXRpb25zIGtleWVkIGJ5IG1vZGVsIGNsYXNzIG5hbWUuIFNldCBpbnRlcm5hbGx5IGJ5IHRoZSBlbnZpcm9ubWVudCBoYW5kbGVyIOKAlCBkbyBub3Qgc2V0IG1hbnVhbGx5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUm91dGVSZXNvbHZlckhvb2tBcmdzXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIE11dGFibGUgcmVxdWVzdCBwYXJhbXMgb2JqZWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFRydWUgd2hlbiBtYXRjaGluZyBhIGNvbmZpZ3VyZWQgY3VzdG9tIHJvdXRlLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSByZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHR9IHJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3JvdXRlcy9yZXNvbHZlci5qc1wiKS5kZWZhdWx0fSByZXNvbHZlciAtIFJlc29sdmVyIGluc3RhbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUm91dGVSZXNvbHZlckhvb2tSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gLSBEYXNoZXJpemVkIGFjdGlvbiBuYW1lIChmb3IgZXhhbXBsZSBgZnJvbnRlbmQtaW5kZXhgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250cm9sbGVyIC0gQ29udHJvbGxlciBwYXRoIChmb3IgZXhhbXBsZSBgYWNjb3VudHNgKS5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBbY29udHJvbGxlckNsYXNzXSAtIE9wdGlvbmFsIGNvbnRyb2xsZXIgY2xhc3Mgb3ZlcnJpZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRyb2xsZXJQYXRoXSAtIE9wdGlvbmFsIGFic29sdXRlL3JlbGF0aXZlIGNvbnRyb2xsZXIgZmlsZSBwYXRoIG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW3BhcmFtc10gLSBFeHRyYSBwYXJhbXMgdG8gbWVyZ2UgZm9yIGNvbnRyb2xsZXIvYWN0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2tpcEFiaWxpdHlSZXNvbHV0aW9uXSAtIFdoZXRoZXIgdG8gcnVuIHRoZSBjb250cm9sbGVyIGFjdGlvbiB3aXRob3V0IHJlc29sdmluZyByZXF1ZXN0IGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtza2lwQ29udHJvbGxlckNvbm5lY3Rpb25zXSAtIFdoZXRoZXIgdG8gcnVuIHRoZSBjb250cm9sbGVyIGFjdGlvbiB3aXRob3V0IHRoZSBhdXRvbWF0aWMgZGF0YWJhc2UgY2hlY2tvdXQgd3JhcHBlci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NraXBUZW5hbnRSZXNvbHV0aW9uXSAtIFdoZXRoZXIgdG8gcnVuIHRoZSBjb250cm9sbGVyIGFjdGlvbiB3aXRob3V0IHJlc29sdmluZyByZXF1ZXN0IHRlbmFudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmlld1BhdGhdIC0gT3B0aW9uYWwgdmlldyBwYXRoIG92ZXJyaWRlIHVzZWQgYnkgY29udHJvbGxlciByZW5kZXIgbG9va3Vwcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihSb3V0ZVJlc29sdmVySG9va0FyZ3MpIDogUm91dGVSZXNvbHZlckhvb2tSZXN1bHQgfCBudWxsIHwgUHJvbWlzZTxSb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGw+fSBSb3V0ZVJlc29sdmVySG9va1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gQWJpbGl0eVJlc291cmNlQ2xhc3NUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCByZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0LCByZXNwb25zZTogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIikuZGVmYXVsdH0pIDogaW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHZvaWQgfCBQcm9taXNlPGltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB2b2lkPn0gQWJpbGl0eVJlc29sdmVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgcmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgcmVzcG9uc2U6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIHN1YnNjcmlwdGlvbj86IHtjaGFubmVsOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fX0pIDogPyB8IHZvaWQgfCBQcm9taXNlPD8gfCB2b2lkPn0gVGVuYW50UmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiA/fSkgOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlIHwgUGFydGlhbDxEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlPiB8IHZvaWR9IFRlbmFudERhdGFiYXNlUmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWJ1Z0VuZHBvaW50Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXSAtIEhUVFAgcGF0aCBmb3IgdGhlIGJ1aWx0LWluIGRlYnVnIGVuZHBvaW50LiBEZWZhdWx0cyB0byBgL3ZlbG9jaW91cy9kZWJ1Z2AuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rva2VuXSAtIEJlYXJlciB0b2tlbiByZXF1aXJlZCBpbiB0aGUgYEF1dGhvcml6YXRpb246IEJlYXJlciA8dG9rZW4+YCBoZWFkZXIuIFdoZW4gc2V0LCByZXF1ZXN0cyB3aXRob3V0IGEgbWF0Y2hpbmcgdG9rZW4gYXJlIG5vdCByb3V0ZWQgKDQwNCksIHNvIHRoZSBlbmRwb2ludCBzdGF5cyBoaWRkZW4uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUZW5hbnREYXRhYmFzZVByb3ZpZGVyVHlwZVxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGlkZW50aWZpZXI6IHN0cmluZ30pIDogQXJyYXk8Pz4gfCBQcm9taXNlPEFycmF5PD8+Pn0gbGlzdFRlbmFudHMgLSBMaXN0cyB0ZW5hbnRzIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQsIGNoZWNrZWQsIG9yIG1pZ3JhdGVkIGZvciB0aGlzIGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCBpZGVudGlmaWVyOiBzdHJpbmcsIHRlbmFudDogP30pIDogdm9pZCB8IFByb21pc2U8dm9pZD59IFtjcmVhdGVEYXRhYmFzZV0gLSBDcmVhdGVzIHRoZSB0ZW5hbnQgZGF0YWJhc2Uvc2NoZW1hIGZvciBvbmUgdGVuYW50LlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGRhdGFiYXNlQ29uZmlndXJhdGlvbjogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZSwgaWRlbnRpZmllcjogc3RyaW5nLCB0ZW5hbnQ6ID99KSA6IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBbZHJvcERhdGFiYXNlXSAtIERyb3BzIHRoZSB0ZW5hbnQgZGF0YWJhc2Uvc2NoZW1hIGZvciBvbmUgdGVuYW50LlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGRhdGFiYXNlQ29uZmlndXJhdGlvbjogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZSwgaWRlbnRpZmllcjogc3RyaW5nLCB0ZW5hbnQ6ID99KSA6IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBbY2hlY2tUZW5hbnRdIC0gQ2hlY2tzIG9uZSB0ZW5hbnQgZGF0YWJhc2UgYmVmb3JlIGdlbmVyaWMgY29ubmVjdGlvbiB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGRhdGFiYXNlQ29uZmlndXJhdGlvbjogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZSwgaWRlbnRpZmllcjogc3RyaW5nLCBtaWdyYXRpb25zQXBwbGllZDogbnVtYmVyLCB0ZW5hbnQ6ID99KSA6IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBbYWZ0ZXJNaWdyYXRlVGVuYW50XSAtIFJ1bnMgYXBwLW93bmVkIHRlbmFudCB3b3JrIGFmdGVyIGdlbmVyaWMgbWlncmF0aW9ucyBmb3Igb25lIHRlbmFudC4gYG1pZ3JhdGlvbnNBcHBsaWVkYCBpcyBob3cgbWFueSBtaWdyYXRpb25zIGFjdHVhbGx5IHJhbiAoMCB3aGVuIHRoZSB0ZW5hbnQgd2FzIGFscmVhZHkgdXAgdG8gZGF0ZSksIHNvIHRoZSBhcHAgY2FuIHNraXAgZXhwZW5zaXZlIHBlci10ZW5hbnQgd29yayBvbiBuby1vcCBkZXBsb3lzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29uZmlndXJhdGlvbkFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthdXRvbG9hZF0gLSBHbG9iYWxseSBlbmFibGUgYXV0by1iYXRjaC1wcmVsb2FkIG9mIHJlbGF0aW9uc2hpcHMgb24gbGF6eSBhY2Nlc3MuIERlZmF1bHQgdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7Q29yc1R5cGV9IFtjb3JzXSAtIENPUlMgY29uZmlndXJhdGlvbiBmb3IgdGhlIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb29raWVTZWNyZXRdIC0gU2VjcmV0IGZvciBlbmNyeXB0aW5nIGNvb2tpZXMuXG4gKiBAcHJvcGVydHkge0FiaWxpdHlSZXNvdXJjZUNsYXNzVHlwZVtdfSBbYWJpbGl0eVJlc291cmNlc10gLSBSZXNvdXJjZSBjbGFzc2VzIHVzZWQgdG8gZGVmaW5lIGFiaWxpdGllcyBwZXIgbW9kZWwuXG4gKiBAcHJvcGVydHkge0FiaWxpdHlSZXNvbHZlclR5cGV9IFthYmlsaXR5UmVzb2x2ZXJdIC0gUmVzb2x2ZXIgZm9yIGNyZWF0aW5nIHJlcXVlc3Qtc2NvcGVkIGFiaWxpdHkgaW5zdGFuY2VzLlxuICogQHByb3BlcnR5IHtBdHRhY2htZW50c0NvbmZpZ3VyYXRpb259IFthdHRhY2htZW50c10gLSBBdHRhY2htZW50IHN0b3JhZ2UgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uW119IFtiYWNrZW5kUHJvamVjdHNdIC0gQmFja2VuZCBwcm9qZWN0IGRlZmluaXRpb25zIHVzZWQgZm9yIGZyb250ZW5kIG1vZGVsIGdlbmVyYXRpb24uXG4gKiBAcHJvcGVydHkge3tba2V5OiBzdHJpbmddOiB7W2tleTogc3RyaW5nXTogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX19fSBkYXRhYmFzZSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb25zIGtleWVkIGJ5IGVudmlyb25tZW50IGFuZCBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWddIC0gRW5hYmxlIGRlYnVnIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBEZWJ1Z0VuZHBvaW50Q29uZmlndXJhdGlvbn0gW2RlYnVnRW5kcG9pbnRdIC0gRW5hYmxlIHRoZSBidWlsdC1pbiBkZWJ1ZyBlbmRwb2ludC4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RpcmVjdG9yeV0gLSBCYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHByb2plY3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmZvcmNlVGVuYW50RGF0YWJhc2VTY29wZXNdIC0gUmVxdWlyZSB0ZW5hbnQtc3dpdGNoZWQgbW9kZWwgcXVlcmllcyB0byByZXNvbHZlIGEgdGVuYW50IGRhdGFiYXNlIGlkZW50aWZpZXIuIERlZmF1bHRzIHRvIHRydWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vudmlyb25tZW50XSAtIEN1cnJlbnQgZW52aXJvbm1lbnQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9lbnZpcm9ubWVudC1oYW5kbGVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGVudmlyb25tZW50SGFuZGxlciAtIEVudmlyb25tZW50IGhhbmRsZXIgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtleHBvc2VJbnRlcm5hbEVycm9yc1RvQ2xpZW50c10gLSBSZXR1cm4gdW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvciBkZXRhaWxzIGluIGNsaWVudCBBUEkgcGF5bG9hZHMgb3V0c2lkZSBwcm9kdWN0aW9uLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7SHR0cFNlcnZlckNvbmZpZ3VyYXRpb259IFtodHRwU2VydmVyXSAtIERlZmF1bHQgSFRUUCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmb3IgYXBwbGljYXRpb25zIHN0YXJ0ZWQgZnJvbSB0aGlzIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge0xvZ2dpbmdDb25maWd1cmF0aW9ufSBbbG9nZ2luZ10gLSBMb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvbn0gW2JhY2tncm91bmRKb2JzXSAtIEJhY2tncm91bmQgam9icyBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtCZWFjb25Db25maWd1cmF0aW9ufSBbYmVhY29uXSAtIEJlYWNvbiBicm9hZGNhc3QgYnVzIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge1NjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvbiB8IFNjaGVkdWxlZEJhY2tncm91bmRKb2JzTG9hZGVyVHlwZX0gW3NjaGVkdWxlZEJhY2tncm91bmRKb2JzXSAtIFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYnMgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TWFpbGVyQmFja2VuZH0gW21haWxlckJhY2tlbmRdIC0gTWFpbCBkZWxpdmVyeSBiYWNrZW5kLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIHR5cGU6IHN0cmluZ30pIDogdm9pZH0gaW5pdGlhbGl6ZU1vZGVscyAtIEhvb2sgdG8gcmVnaXN0ZXIgbW9kZWxzIGZvciBhIGdpdmVuIGluaXRpYWxpemF0aW9uIHR5cGUuXG4gKiBAcHJvcGVydHkge0luaXRpYWxpemVyc1R5cGV9IFtpbml0aWFsaXplcnNdIC0gSW5pdGlhbGl6ZXIgbG9hZGVyIGZvciBlbnZpcm9ubWVudCBib290c3RyYXBwaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBmdW5jdGlvbigpIDogc3RyaW5nfSBsb2NhbGUgLSBEZWZhdWx0IGxvY2FsZSBvciBsb2NhbGUgcmVzb2x2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBsb2NhbGVzIC0gU3VwcG9ydGVkIGxvY2FsZXMuXG4gKiBAcHJvcGVydHkge0xvY2FsZUZhbGxiYWNrc1R5cGV9IGxvY2FsZUZhbGxiYWNrcyAtIExvY2FsZSBmYWxsYmFjayBtYXAuXG4gKiBAcHJvcGVydHkge1N0cnVjdHVyZVNxbENvbmZpZ3VyYXRpb259IFtzdHJ1Y3R1cmVTcWxdIC0gU3RydWN0dXJlIFNRTCBnZW5lcmF0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge1RlbmFudFJlc29sdmVyVHlwZX0gW3RlbmFudFJlc29sdmVyXSAtIFJlc29sdmVyIGZvciBjcmVhdGluZyByZXF1ZXN0LXNjb3BlZCB0ZW5hbnQgY29udGV4dCBvYmplY3RzLlxuICogQHByb3BlcnR5IHtUZW5hbnREYXRhYmFzZVJlc29sdmVyVHlwZX0gW3RlbmFudERhdGFiYXNlUmVzb2x2ZXJdIC0gUmVzb2x2ZXIgZm9yIGRlcml2aW5nIHRlbmFudC1zcGVjaWZpYyBkYXRhYmFzZSBjb25maWcgb3ZlcnJpZGVzLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBUZW5hbnREYXRhYmFzZVByb3ZpZGVyVHlwZT59IFt0ZW5hbnREYXRhYmFzZVByb3ZpZGVyc10gLSBUZW5hbnQgZGF0YWJhc2UgbGlmZWN5Y2xlIHByb3ZpZGVycyBrZXllZCBieSBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0ZXN0aW5nXSAtIFBhdGggdG8gdGhlIHRlc3RpbmcgY29uZmlndXJhdGlvbiBmaWxlLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCAoKCkgPT4gbnVtYmVyKX0gW3RpbWV6b25lT2Zmc2V0TWludXRlc10gLSBEZWZhdWx0IHRpbWV6b25lIG9mZnNldCBpbiBtaW51dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBzdHJpbmdbXX0gW3RydXN0ZWRQcm94aWVzXSAtIFRydXN0ZWQgcmV2ZXJzZSBwcm94eSBhZGRyZXNzIHJhbmdlcyB1c2VkIHRvIHJlc29sdmUgcmVxdWVzdCByZW1vdGUgYWRkcmVzc2VzIGZyb20gZm9yd2FyZGluZyBoZWFkZXJzLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCAoKCkgPT4gbnVtYmVyKX0gW3JlcXVlc3RUaW1lb3V0TXNdIC0gVGltZW91dCBpbiBzZWNvbmRzIGZvciBjb21wbGV0aW5nIGEgSFRUUCByZXF1ZXN0LlxuICogQHByb3BlcnR5IHtSb3V0ZVJlc29sdmVySG9va1R5cGVbXX0gW3JvdXRlUmVzb2x2ZXJIb29rc10gLSBIb29rIGNhbGxiYWNrcyB0aGF0IGNhbiBoaWphY2sgdW5yZXNvbHZlZCByb3V0ZXMuXG4gKiBAcHJvcGVydHkge1dlYnNvY2tldENoYW5uZWxSZXNvbHZlclR5cGV9IFt3ZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXJdIC0gUmVzb2x2ZSBhIHdlYnNvY2tldCBjaGFubmVsIGNsYXNzL2luc3RhbmNlIGZvciBlYWNoIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge1dlYnNvY2tldE1lc3NhZ2VIYW5kbGVyUmVzb2x2ZXJUeXBlfSBbd2Vic29ja2V0TWVzc2FnZUhhbmRsZXJSZXNvbHZlcl0gLSBSZXNvbHZlIGEgcmF3IHdlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZm9yIGVhY2ggY29ubmVjdGlvbi5cbiAqL1xuXG5leHBvcnQgY29uc3Qgbm90aGluZyA9IHt9XG4iXX0=