occam-verify-cli 1.0.984 → 1.0.986

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 (423) hide show
  1. package/lib/action/verify.js +22 -27
  2. package/lib/constants.js +1 -41
  3. package/lib/index.js +1 -2
  4. package/lib/utilities/fileContext.js +3 -8
  5. package/lib/utilities/releaseContext.js +2 -2
  6. package/package.json +2 -5
  7. package/src/action/verify.js +8 -18
  8. package/src/constants.js +0 -10
  9. package/src/index.js +0 -2
  10. package/src/utilities/fileContext.js +1 -2
  11. package/src/utilities/releaseContext.js +1 -1
  12. package/lib/context/aphasic.js +0 -27
  13. package/lib/context/bounded.js +0 -244
  14. package/lib/context/branching.js +0 -61
  15. package/lib/context/file/nominal.js +0 -586
  16. package/lib/context/illative.js +0 -28
  17. package/lib/context/liminal.js +0 -200
  18. package/lib/context/literal.js +0 -44
  19. package/lib/context/mnemic.js +0 -454
  20. package/lib/context/nested.js +0 -31
  21. package/lib/context/nominal.js +0 -57
  22. package/lib/context/phaneric.js +0 -44
  23. package/lib/context/thetic.js +0 -28
  24. package/lib/context.js +0 -445
  25. package/lib/element/assertion/contained.js +0 -218
  26. package/lib/element/assertion/defined.js +0 -213
  27. package/lib/element/assertion/property.js +0 -176
  28. package/lib/element/assertion/signature.js +0 -170
  29. package/lib/element/assertion/subproof.js +0 -220
  30. package/lib/element/assertion/type.js +0 -227
  31. package/lib/element/assertion.js +0 -49
  32. package/lib/element/assumption/metaLevel.js +0 -244
  33. package/lib/element/assumption.js +0 -252
  34. package/lib/element/combinator/bracketed.js +0 -36
  35. package/lib/element/combinator.js +0 -104
  36. package/lib/element/conclusion.js +0 -131
  37. package/lib/element/constructor/bracketed.js +0 -57
  38. package/lib/element/constructor.js +0 -129
  39. package/lib/element/declaration/combinator.js +0 -58
  40. package/lib/element/declaration/complexType.js +0 -180
  41. package/lib/element/declaration/constructor.js +0 -93
  42. package/lib/element/declaration/metavariable.js +0 -77
  43. package/lib/element/declaration/property.js +0 -88
  44. package/lib/element/declaration/simpleType.js +0 -148
  45. package/lib/element/declaration/typePrefix.js +0 -53
  46. package/lib/element/declaration/variable.js +0 -99
  47. package/lib/element/declaration.js +0 -15
  48. package/lib/element/deduction.js +0 -131
  49. package/lib/element/derivation.js +0 -46
  50. package/lib/element/equality.js +0 -211
  51. package/lib/element/equivalence.js +0 -200
  52. package/lib/element/error.js +0 -27
  53. package/lib/element/frame.js +0 -238
  54. package/lib/element/hypothesis.js +0 -135
  55. package/lib/element/judgement.js +0 -212
  56. package/lib/element/label.js +0 -135
  57. package/lib/element/metaType.js +0 -57
  58. package/lib/element/metavariable.js +0 -452
  59. package/lib/element/parameter.js +0 -69
  60. package/lib/element/procedureCall.js +0 -116
  61. package/lib/element/procedureReference.js +0 -56
  62. package/lib/element/proof.js +0 -52
  63. package/lib/element/proofAssertion/premise.js +0 -238
  64. package/lib/element/proofAssertion/step.js +0 -235
  65. package/lib/element/proofAssertion/supposition.js +0 -249
  66. package/lib/element/proofAssertion.js +0 -56
  67. package/lib/element/property.js +0 -176
  68. package/lib/element/propertyRelation.js +0 -132
  69. package/lib/element/reference.js +0 -227
  70. package/lib/element/rule.js +0 -242
  71. package/lib/element/section.js +0 -64
  72. package/lib/element/signature.js +0 -195
  73. package/lib/element/statement.js +0 -228
  74. package/lib/element/subDerivation.js +0 -46
  75. package/lib/element/subproof.js +0 -91
  76. package/lib/element/substitution/frame.js +0 -256
  77. package/lib/element/substitution/reference.js +0 -192
  78. package/lib/element/substitution/statement.js +0 -294
  79. package/lib/element/substitution/term.js +0 -266
  80. package/lib/element/substitution.js +0 -183
  81. package/lib/element/term.js +0 -217
  82. package/lib/element/topLevelAssertion/axiom.js +0 -158
  83. package/lib/element/topLevelAssertion/conjecture.js +0 -42
  84. package/lib/element/topLevelAssertion/lemma.js +0 -39
  85. package/lib/element/topLevelAssertion/theorem.js +0 -42
  86. package/lib/element/topLevelAssertion.js +0 -286
  87. package/lib/element/topLevelMetaAssertion/metaLemma.js +0 -42
  88. package/lib/element/topLevelMetaAssertion/metatheorem.js +0 -42
  89. package/lib/element/topLevelMetaAssertion.js +0 -179
  90. package/lib/element/type.js +0 -240
  91. package/lib/element/typePrefix.js +0 -85
  92. package/lib/element/variable.js +0 -206
  93. package/lib/elements.js +0 -27
  94. package/lib/metaTypeNames.js +0 -26
  95. package/lib/metaTypes.js +0 -66
  96. package/lib/node/argument.js +0 -31
  97. package/lib/node/assertion/contained.js +0 -51
  98. package/lib/node/assertion/defined.js +0 -47
  99. package/lib/node/assertion/property.js +0 -36
  100. package/lib/node/assertion/signature.js +0 -32
  101. package/lib/node/assertion/subproof.js +0 -28
  102. package/lib/node/assertion/type.js +0 -32
  103. package/lib/node/assertion.js +0 -18
  104. package/lib/node/assumption/metaLevel.js +0 -27
  105. package/lib/node/assumption.js +0 -27
  106. package/lib/node/body/axiom.js +0 -23
  107. package/lib/node/body/conjecture.js +0 -23
  108. package/lib/node/body/lemma.js +0 -23
  109. package/lib/node/body/metaLemma.js +0 -23
  110. package/lib/node/body/metatheorem.js +0 -23
  111. package/lib/node/body/rule.js +0 -44
  112. package/lib/node/body/theorem.js +0 -23
  113. package/lib/node/body.js +0 -31
  114. package/lib/node/combinator.js +0 -23
  115. package/lib/node/conclusion.js +0 -27
  116. package/lib/node/constructor.js +0 -23
  117. package/lib/node/declaration/combinator.js +0 -28
  118. package/lib/node/declaration/complexType.js +0 -72
  119. package/lib/node/declaration/constructor.js +0 -47
  120. package/lib/node/declaration/metavariable.js +0 -36
  121. package/lib/node/declaration/property.js +0 -44
  122. package/lib/node/declaration/simpleType.js +0 -72
  123. package/lib/node/declaration/typePrefix.js +0 -32
  124. package/lib/node/declaration/variable.js +0 -51
  125. package/lib/node/declaration.js +0 -18
  126. package/lib/node/deduction.js +0 -27
  127. package/lib/node/derivation.js +0 -26
  128. package/lib/node/document.js +0 -18
  129. package/lib/node/equality.js +0 -33
  130. package/lib/node/equivalence.js +0 -23
  131. package/lib/node/equivalences.js +0 -18
  132. package/lib/node/error.js +0 -18
  133. package/lib/node/frame.js +0 -38
  134. package/lib/node/header/axiom.js +0 -28
  135. package/lib/node/header/conjecture.js +0 -23
  136. package/lib/node/header/lemma.js +0 -23
  137. package/lib/node/header/metaLemma.js +0 -23
  138. package/lib/node/header/metatheorem.js +0 -23
  139. package/lib/node/header/rule.js +0 -23
  140. package/lib/node/header/theorem.js +0 -23
  141. package/lib/node/header.js +0 -47
  142. package/lib/node/hypothesis.js +0 -27
  143. package/lib/node/judgement.js +0 -31
  144. package/lib/node/label.js +0 -23
  145. package/lib/node/labels.js +0 -23
  146. package/lib/node/metaArgument.js +0 -23
  147. package/lib/node/metaType.js +0 -30
  148. package/lib/node/metavariable.js +0 -39
  149. package/lib/node/parameter.js +0 -47
  150. package/lib/node/parenthesisedLabel.js +0 -23
  151. package/lib/node/parenthesisedLabels.js +0 -27
  152. package/lib/node/placeholder.js +0 -18
  153. package/lib/node/procedureCall.js +0 -31
  154. package/lib/node/procedureReference.js +0 -30
  155. package/lib/node/proof.js +0 -23
  156. package/lib/node/proofAssertion/premise.js +0 -28
  157. package/lib/node/proofAssertion/step.js +0 -52
  158. package/lib/node/proofAssertion/supposition.js +0 -28
  159. package/lib/node/proofAssertion.js +0 -27
  160. package/lib/node/property.js +0 -30
  161. package/lib/node/propertyRelation.js +0 -31
  162. package/lib/node/qualification.js +0 -27
  163. package/lib/node/reference.js +0 -23
  164. package/lib/node/rule.js +0 -43
  165. package/lib/node/section.js +0 -39
  166. package/lib/node/signature.js +0 -23
  167. package/lib/node/statement.js +0 -103
  168. package/lib/node/subDerivation.js +0 -26
  169. package/lib/node/subproof.js +0 -35
  170. package/lib/node/substitution/frame.js +0 -40
  171. package/lib/node/substitution/reference.js +0 -40
  172. package/lib/node/substitution/statement.js +0 -60
  173. package/lib/node/substitution/term.js +0 -40
  174. package/lib/node/substitution.js +0 -18
  175. package/lib/node/term.js +0 -60
  176. package/lib/node/topLevelAssertion/axiom.js +0 -26
  177. package/lib/node/topLevelAssertion/conjecture.js +0 -26
  178. package/lib/node/topLevelAssertion/lemma.js +0 -26
  179. package/lib/node/topLevelAssertion/theorem.js +0 -26
  180. package/lib/node/topLevelAssertion.js +0 -46
  181. package/lib/node/topLevelMetaAssertion/metaLemma.js +0 -26
  182. package/lib/node/topLevelMetaAssertion/metatheorem.js +0 -26
  183. package/lib/node/topLevelMetaAssertion.js +0 -42
  184. package/lib/node/type.js +0 -60
  185. package/lib/node/typePrefix.js +0 -30
  186. package/lib/node/types.js +0 -23
  187. package/lib/node/variable.js +0 -30
  188. package/lib/nominal/lexer.js +0 -15
  189. package/lib/nominal/parser.js +0 -24
  190. package/lib/nonTerminalNodeMap.js +0 -189
  191. package/lib/pass/zip.js +0 -23
  192. package/lib/preamble.js +0 -73
  193. package/lib/process/assign.js +0 -62
  194. package/lib/process/discharge.js +0 -38
  195. package/lib/process/equate.js +0 -73
  196. package/lib/process/instantiate.js +0 -261
  197. package/lib/process/unification.js +0 -228
  198. package/lib/process/unify.js +0 -336
  199. package/lib/process/validate.js +0 -135
  200. package/lib/process/validation.js +0 -291
  201. package/lib/process/verify.js +0 -205
  202. package/lib/ruleNames.js +0 -350
  203. package/lib/tokenTypes.js +0 -22
  204. package/lib/utilities/assignment.js +0 -47
  205. package/lib/utilities/bnf.js +0 -21
  206. package/lib/utilities/brackets.js +0 -77
  207. package/lib/utilities/breakPoint.js +0 -38
  208. package/lib/utilities/context.js +0 -220
  209. package/lib/utilities/element.js +0 -1851
  210. package/lib/utilities/equivalence.js +0 -27
  211. package/lib/utilities/equivalences.js +0 -134
  212. package/lib/utilities/instance.js +0 -44
  213. package/lib/utilities/json.js +0 -1109
  214. package/lib/utilities/string.js +0 -231
  215. package/lib/utilities/substitutions.js +0 -86
  216. package/lib/utilities/synoptic.js +0 -159
  217. package/lib/utilities/type.js +0 -27
  218. package/src/context/aphasic.js +0 -15
  219. package/src/context/bounded.js +0 -362
  220. package/src/context/branching.js +0 -69
  221. package/src/context/file/nominal.js +0 -955
  222. package/src/context/illative.js +0 -17
  223. package/src/context/liminal.js +0 -280
  224. package/src/context/literal.js +0 -42
  225. package/src/context/mnemic.js +0 -778
  226. package/src/context/nested.js +0 -21
  227. package/src/context/nominal.js +0 -62
  228. package/src/context/phaneric.js +0 -43
  229. package/src/context/thetic.js +0 -17
  230. package/src/context.js +0 -722
  231. package/src/element/assertion/contained.js +0 -313
  232. package/src/element/assertion/defined.js +0 -310
  233. package/src/element/assertion/property.js +0 -252
  234. package/src/element/assertion/signature.js +0 -239
  235. package/src/element/assertion/subproof.js +0 -335
  236. package/src/element/assertion/type.js +0 -328
  237. package/src/element/assertion.js +0 -65
  238. package/src/element/assumption/metaLevel.js +0 -373
  239. package/src/element/assumption.js +0 -374
  240. package/src/element/combinator/bracketed.js +0 -32
  241. package/src/element/combinator.js +0 -145
  242. package/src/element/conclusion.js +0 -185
  243. package/src/element/constructor/bracketed.js +0 -68
  244. package/src/element/constructor.js +0 -188
  245. package/src/element/declaration/combinator.js +0 -66
  246. package/src/element/declaration/complexType.js +0 -257
  247. package/src/element/declaration/constructor.js +0 -122
  248. package/src/element/declaration/metavariable.js +0 -93
  249. package/src/element/declaration/property.js +0 -108
  250. package/src/element/declaration/simpleType.js +0 -208
  251. package/src/element/declaration/typePrefix.js +0 -58
  252. package/src/element/declaration/variable.js +0 -130
  253. package/src/element/declaration.js +0 -7
  254. package/src/element/deduction.js +0 -185
  255. package/src/element/derivation.js +0 -57
  256. package/src/element/equality.js +0 -325
  257. package/src/element/equivalence.js +0 -276
  258. package/src/element/error.js +0 -26
  259. package/src/element/frame.js +0 -356
  260. package/src/element/hypothesis.js +0 -186
  261. package/src/element/judgement.js +0 -303
  262. package/src/element/label.js +0 -186
  263. package/src/element/metaType.js +0 -75
  264. package/src/element/metavariable.js +0 -662
  265. package/src/element/parameter.js +0 -90
  266. package/src/element/procedureCall.js +0 -159
  267. package/src/element/procedureReference.js +0 -71
  268. package/src/element/proof.js +0 -61
  269. package/src/element/proofAssertion/premise.js +0 -354
  270. package/src/element/proofAssertion/step.js +0 -271
  271. package/src/element/proofAssertion/supposition.js +0 -377
  272. package/src/element/proofAssertion.js +0 -74
  273. package/src/element/property.js +0 -258
  274. package/src/element/propertyRelation.js +0 -193
  275. package/src/element/reference.js +0 -345
  276. package/src/element/rule.js +0 -358
  277. package/src/element/section.js +0 -78
  278. package/src/element/signature.js +0 -292
  279. package/src/element/statement.js +0 -358
  280. package/src/element/subDerivation.js +0 -56
  281. package/src/element/subproof.js +0 -116
  282. package/src/element/substitution/frame.js +0 -392
  283. package/src/element/substitution/reference.js +0 -274
  284. package/src/element/substitution/statement.js +0 -452
  285. package/src/element/substitution/term.js +0 -407
  286. package/src/element/substitution.js +0 -261
  287. package/src/element/term.js +0 -339
  288. package/src/element/topLevelAssertion/axiom.js +0 -244
  289. package/src/element/topLevelAssertion/conjecture.js +0 -40
  290. package/src/element/topLevelAssertion/lemma.js +0 -42
  291. package/src/element/topLevelAssertion/theorem.js +0 -40
  292. package/src/element/topLevelAssertion.js +0 -436
  293. package/src/element/topLevelMetaAssertion/metaLemma.js +0 -40
  294. package/src/element/topLevelMetaAssertion/metatheorem.js +0 -40
  295. package/src/element/topLevelMetaAssertion.js +0 -276
  296. package/src/element/type.js +0 -374
  297. package/src/element/typePrefix.js +0 -113
  298. package/src/element/variable.js +0 -259
  299. package/src/elements.js +0 -13
  300. package/src/metaTypeNames.js +0 -5
  301. package/src/metaTypes.js +0 -71
  302. package/src/node/argument.js +0 -30
  303. package/src/node/assertion/contained.js +0 -53
  304. package/src/node/assertion/defined.js +0 -46
  305. package/src/node/assertion/property.js +0 -30
  306. package/src/node/assertion/signature.js +0 -23
  307. package/src/node/assertion/subproof.js +0 -16
  308. package/src/node/assertion/type.js +0 -23
  309. package/src/node/assertion.js +0 -7
  310. package/src/node/assumption/metaLevel.js +0 -23
  311. package/src/node/assumption.js +0 -23
  312. package/src/node/body/axiom.js +0 -7
  313. package/src/node/body/conjecture.js +0 -7
  314. package/src/node/body/lemma.js +0 -7
  315. package/src/node/body/metaLemma.js +0 -7
  316. package/src/node/body/metatheorem.js +0 -7
  317. package/src/node/body/rule.js +0 -42
  318. package/src/node/body/theorem.js +0 -7
  319. package/src/node/body.js +0 -30
  320. package/src/node/combinator.js +0 -16
  321. package/src/node/conclusion.js +0 -23
  322. package/src/node/constructor.js +0 -16
  323. package/src/node/declaration/combinator.js +0 -16
  324. package/src/node/declaration/complexType.js +0 -88
  325. package/src/node/declaration/constructor.js +0 -46
  326. package/src/node/declaration/metavariable.js +0 -30
  327. package/src/node/declaration/property.js +0 -42
  328. package/src/node/declaration/simpleType.js +0 -87
  329. package/src/node/declaration/typePrefix.js +0 -24
  330. package/src/node/declaration/variable.js +0 -53
  331. package/src/node/declaration.js +0 -7
  332. package/src/node/deduction.js +0 -23
  333. package/src/node/derivation.js +0 -19
  334. package/src/node/document.js +0 -7
  335. package/src/node/equality.js +0 -35
  336. package/src/node/equivalence.js +0 -16
  337. package/src/node/equivalences.js +0 -7
  338. package/src/node/error.js +0 -7
  339. package/src/node/frame.js +0 -40
  340. package/src/node/header/axiom.js +0 -16
  341. package/src/node/header/conjecture.js +0 -7
  342. package/src/node/header/lemma.js +0 -7
  343. package/src/node/header/metaLemma.js +0 -7
  344. package/src/node/header/metatheorem.js +0 -7
  345. package/src/node/header/rule.js +0 -7
  346. package/src/node/header/theorem.js +0 -7
  347. package/src/node/header.js +0 -54
  348. package/src/node/hypothesis.js +0 -23
  349. package/src/node/judgement.js +0 -30
  350. package/src/node/label.js +0 -16
  351. package/src/node/labels.js +0 -16
  352. package/src/node/metaArgument.js +0 -16
  353. package/src/node/metaType.js +0 -26
  354. package/src/node/metavariable.js +0 -42
  355. package/src/node/parameter.js +0 -51
  356. package/src/node/parenthesisedLabel.js +0 -16
  357. package/src/node/parenthesisedLabels.js +0 -23
  358. package/src/node/placeholder.js +0 -7
  359. package/src/node/procedureCall.js +0 -30
  360. package/src/node/procedureReference.js +0 -26
  361. package/src/node/proof.js +0 -16
  362. package/src/node/proofAssertion/premise.js +0 -16
  363. package/src/node/proofAssertion/step.js +0 -52
  364. package/src/node/proofAssertion/supposition.js +0 -16
  365. package/src/node/proofAssertion.js +0 -23
  366. package/src/node/property.js +0 -28
  367. package/src/node/propertyRelation.js +0 -30
  368. package/src/node/qualification.js +0 -23
  369. package/src/node/reference.js +0 -16
  370. package/src/node/rule.js +0 -51
  371. package/src/node/section.js +0 -44
  372. package/src/node/signature.js +0 -16
  373. package/src/node/statement.js +0 -167
  374. package/src/node/subDerivation.js +0 -19
  375. package/src/node/subproof.js +0 -35
  376. package/src/node/substitution/frame.js +0 -37
  377. package/src/node/substitution/reference.js +0 -38
  378. package/src/node/substitution/statement.js +0 -70
  379. package/src/node/substitution/term.js +0 -38
  380. package/src/node/substitution.js +0 -7
  381. package/src/node/term.js +0 -75
  382. package/src/node/topLevelAssertion/axiom.js +0 -13
  383. package/src/node/topLevelAssertion/conjecture.js +0 -13
  384. package/src/node/topLevelAssertion/lemma.js +0 -13
  385. package/src/node/topLevelAssertion/theorem.js +0 -13
  386. package/src/node/topLevelAssertion.js +0 -58
  387. package/src/node/topLevelMetaAssertion/metaLemma.js +0 -13
  388. package/src/node/topLevelMetaAssertion/metatheorem.js +0 -13
  389. package/src/node/topLevelMetaAssertion.js +0 -51
  390. package/src/node/type.js +0 -74
  391. package/src/node/typePrefix.js +0 -26
  392. package/src/node/types.js +0 -16
  393. package/src/node/variable.js +0 -26
  394. package/src/nominal/lexer.js +0 -5
  395. package/src/nominal/parser.js +0 -12
  396. package/src/nonTerminalNodeMap.js +0 -261
  397. package/src/pass/zip.js +0 -19
  398. package/src/preamble.js +0 -64
  399. package/src/process/assign.js +0 -53
  400. package/src/process/discharge.js +0 -33
  401. package/src/process/equate.js +0 -94
  402. package/src/process/instantiate.js +0 -198
  403. package/src/process/unification.js +0 -332
  404. package/src/process/unify.js +0 -504
  405. package/src/process/validate.js +0 -174
  406. package/src/process/validation.js +0 -410
  407. package/src/process/verify.js +0 -299
  408. package/src/ruleNames.js +0 -86
  409. package/src/tokenTypes.js +0 -4
  410. package/src/utilities/assignment.js +0 -57
  411. package/src/utilities/bnf.js +0 -20
  412. package/src/utilities/brackets.js +0 -87
  413. package/src/utilities/breakPoint.js +0 -29
  414. package/src/utilities/context.js +0 -223
  415. package/src/utilities/element.js +0 -2293
  416. package/src/utilities/equivalence.js +0 -25
  417. package/src/utilities/equivalences.js +0 -158
  418. package/src/utilities/instance.js +0 -40
  419. package/src/utilities/json.js +0 -1273
  420. package/src/utilities/string.js +0 -282
  421. package/src/utilities/substitutions.js +0 -93
  422. package/src/utilities/synoptic.js +0 -135
  423. package/src/utilities/type.js +0 -19
@@ -1,256 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "default", {
6
- enumerable: true,
7
- get: function() {
8
- return _default;
9
- }
10
- });
11
- const _substitution = /*#__PURE__*/ _interop_require_default(require("../substitution"));
12
- const _elements = require("../../elements");
13
- const _breakPoint = require("../../utilities/breakPoint");
14
- const _instantiate = require("../../process/instantiate");
15
- const _element = require("../../utilities/element");
16
- const _string = require("../../utilities/string");
17
- const _context = require("../../utilities/context");
18
- function _interop_require_default(obj) {
19
- return obj && obj.__esModule ? obj : {
20
- default: obj
21
- };
22
- }
23
- const _default = (0, _elements.define)(class FrameSubstitution extends _substitution.default {
24
- constructor(contexts, string, node, breakPoint, targetFrame, replacementFrame){
25
- super(contexts, string, node, breakPoint);
26
- this.targetFrame = targetFrame;
27
- this.replacementFrame = replacementFrame;
28
- }
29
- getTargetFrame() {
30
- return this.targetFrame;
31
- }
32
- getReplacementFrame() {
33
- return this.replacementFrame;
34
- }
35
- getFrameSubstitutionNode() {
36
- const node = this.getNode(), frameSubstitutionNode = node; ///
37
- return frameSubstitutionNode;
38
- }
39
- getMetavariableNode() {
40
- return this.targetFrame.getMetavariableNode();
41
- }
42
- getTargetNode() {
43
- const targetFrameNode = this.targetFrame.getNode(), tergetNode = targetFrameNode; ///
44
- return tergetNode;
45
- }
46
- getReplacementNode() {
47
- const replacementFrameNode = this.replacementFrame.getNode(), replacementNode = replacementFrameNode; ///
48
- return replacementNode;
49
- }
50
- isTrivial() {
51
- const targetFrameEqualToReplacementFrame = this.targetFrame.isEqualTo(this.replacementFrame), trivial = targetFrameEqualToReplacementFrame; ///
52
- return trivial;
53
- }
54
- matchMetavariableNode(metavariableNode) {
55
- return this.targetFrame.matchMetavariableNode(metavariableNode);
56
- }
57
- compareFrame(frame, context) {
58
- const frameEqualToReplacementFrame = this.replacementFrame.isEqualTo(frame), comparedToFrame = frameEqualToReplacementFrame; ///
59
- return comparedToFrame;
60
- }
61
- compareParameter(parameter) {
62
- const targetFrameComparesToParameter = this.targetFrame.compareParameter(parameter), comparesToParameter = targetFrameComparesToParameter; ///
63
- return comparesToParameter;
64
- }
65
- validate(context) {
66
- let frameSubstitution = null;
67
- const frameSubstitutionString = this.getString(); ///
68
- context.trace(`Validating the '${frameSubstitutionString}' frame substitution...`);
69
- let validates = false;
70
- const validSubstitution = this.findValidSubstitution(context);
71
- if (validSubstitution) {
72
- validates = true;
73
- frameSubstitution = validSubstitution; ///
74
- context.debug(`...the '${frameSubstitutionString}' frame substitution is already valid.`);
75
- } else {
76
- const generalContext = this.getGeneralContext(), specificContext = this.getSpecificContext();
77
- (0, _context.attempts)((generalContext, specificContext)=>{
78
- const targetFrameValidates = this.validateTargetFrame(generalContext, specificContext);
79
- if (targetFrameValidates) {
80
- const replacementFrameValidates = this.validateReplacementFrame(generalContext, specificContext);
81
- if (replacementFrameValidates) {
82
- validates = true;
83
- }
84
- }
85
- if (validates) {
86
- this.commit(generalContext, specificContext);
87
- }
88
- }, generalContext, specificContext);
89
- if (validates) {
90
- const substitution = this; ///
91
- frameSubstitution = substitution; ///
92
- context.addSubstitution(substitution);
93
- }
94
- }
95
- if (validates) {
96
- context.debug(`...validated the '${frameSubstitutionString}' frame substitution.`);
97
- }
98
- return frameSubstitution;
99
- }
100
- validateTargetFrame(generalContext, specificContext) {
101
- let targetFrameValidates = false;
102
- const context = generalContext, frameSubstitutionString = this.getString(); ///
103
- context.trace(`Validating the '${frameSubstitutionString}' frame substitution's target frame...`);
104
- const targetFrameSingular = this.targetFrame.isSingular();
105
- if (targetFrameSingular) {
106
- (0, _context.manifest)((context)=>{
107
- (0, _context.elide)((context)=>{
108
- const tragetFrame = this.targetFrame.validate(context);
109
- if (tragetFrame !== null) {
110
- this.targetFrame = tragetFrame;
111
- targetFrameValidates = true;
112
- }
113
- }, context);
114
- }, specificContext, context);
115
- } else {
116
- const targetFrameString = this.targetFrame.getString();
117
- context.debug(`The '${targetFrameString}' target frame is not singular.`);
118
- }
119
- if (targetFrameValidates) {
120
- context.debug(`...validated the frame substitution's target frame...`);
121
- }
122
- return targetFrameValidates;
123
- }
124
- validateReplacementFrame(generalContext, specificContext) {
125
- let replacementFrameValidates = false;
126
- const context = specificContext, frameSubstitutionString = this.getString(); ///
127
- context.trace(`Validating the '${frameSubstitutionString}' frame substitution's replacement frame...`);
128
- (0, _context.elide)((context)=>{
129
- const replacementFrame = this.replacementFrame.validate(context);
130
- if (replacementFrame !== null) {
131
- this.replacementFrame = replacementFrame;
132
- replacementFrameValidates = true;
133
- }
134
- }, context);
135
- if (replacementFrameValidates) {
136
- context.debug(`...validated the '${frameSubstitutionString}' frame substitution's replacement frame.`);
137
- }
138
- return replacementFrameValidates;
139
- }
140
- unifySubstitution(substitution, context) {
141
- let substitutionUnifies = false;
142
- const generalSubstitution = this, specificSubstitution = substitution, generalSubstitutionString = generalSubstitution.getString(), specificSubstitutionString = specificSubstitution.getString();
143
- context.trace(`Unifying the '${specificSubstitutionString}' substitution with the '${generalSubstitutionString}' substitution...`);
144
- (0, _context.reconcile)((context)=>{
145
- const replacementFrameUnifies = this.unifyReplacementFrame(substitution, context);
146
- if (replacementFrameUnifies) {
147
- const targetFrameUnifies = this.unifyTargetFrame(substitution, context);
148
- if (targetFrameUnifies) {
149
- context.commit();
150
- substitutionUnifies = true;
151
- }
152
- }
153
- }, context);
154
- if (substitutionUnifies) {
155
- context.debug(`...unified the '${specificSubstitutionString}' substitution with the '${generalSubstitutionString}' substitution.`);
156
- }
157
- return substitutionUnifies;
158
- }
159
- unifyTargetFrame(substitution, context) {
160
- let targetFrameUnifies = false;
161
- const generalSubstitution = this, specificSubstitution = substitution, generalSubstitutionString = generalSubstitution.getString(), specificSubstitutionString = specificSubstitution.getString();
162
- context.trace(`Unifying the '${specificSubstitutionString}' substitution's target frame with the '${generalSubstitutionString}' substitution's target frame...`);
163
- const generalSubstitutionGeneralContext = generalSubstitution.getGeneralContext(), specificSubstitutionGeneralContext = specificSubstitution.getGeneralContext(), generalSubstitutionTargetFrame = generalSubstitution.getTargetFrame(), specificSubstitutionTargetFrame = specificSubstitution.getTargetFrame(), generalContext = generalSubstitutionGeneralContext, specificContext = specificSubstitutionGeneralContext, generalFrame = generalSubstitutionTargetFrame, specificFrame = specificSubstitutionTargetFrame; ///
164
- (0, _context.reconcile)((specificContext)=>{
165
- const frameNode = generalFrame.getFrameNode(), metavariable = metavariableFromFrameNode(frameNode, generalContext);
166
- if (metavariable !== null) {
167
- const frame = specificFrame, frameUnifies = metavariable.unifyFrame(frame, generalContext, specificContext);
168
- if (frameUnifies) {
169
- specificContext.commit(context);
170
- targetFrameUnifies = true;
171
- }
172
- }
173
- }, specificContext);
174
- if (targetFrameUnifies) {
175
- context.trace(`...unified the '${specificSubstitutionString}' substitution's target frame with the '${generalSubstitutionString}' substitution's target frame.`);
176
- }
177
- return targetFrameUnifies;
178
- }
179
- unifyReplacementFrame(substitution, context) {
180
- let replacementFrameUnifies = false;
181
- const generalSubstitution = this, specificSubstitution = substitution, generalSubstitutionString = generalSubstitution.getString(), specificSubstitutionString = specificSubstitution.getString();
182
- context.trace(`Unifying the '${specificSubstitutionString}' substitution's replacement frame with the '${generalSubstitutionString}' substitution's replacement frame...`);
183
- const generalSubstitutionSpecificContext = generalSubstitution.getSpecificContext(), specificSubstitutionSpecificContext = specificSubstitution.getSpecificContext(), generalSubstitutionReplacementFrame = generalSubstitution.getReplacementFrame(), specificSubstitutionReplacementFrame = specificSubstitution.getReplacementFrame(), generalContext = generalSubstitutionSpecificContext, specificContext = specificSubstitutionSpecificContext, generalFrame = generalSubstitutionReplacementFrame, specificFrame = specificSubstitutionReplacementFrame; ///
184
- (0, _context.reconcile)((specificContext)=>{
185
- const frameNode = generalFrame.getNode(), metavariable = metavariableFromFrameNode(frameNode, generalContext);
186
- if (metavariable !== null) {
187
- const frame = specificFrame, frameUnifies = metavariable.unifyFrame(frame, generalContext, specificContext);
188
- if (frameUnifies) {
189
- specificContext.commit(context);
190
- replacementFrameUnifies = true;
191
- }
192
- }
193
- }, specificContext);
194
- if (replacementFrameUnifies) {
195
- context.trace(`...unified the '${specificSubstitutionString}' substitution's replacement frame with the '${generalSubstitutionString}' substitution's replacement frame.`);
196
- }
197
- return replacementFrameUnifies;
198
- }
199
- static name = "FrameSubstitution";
200
- static fromJSON(json, context) {
201
- let frameSubstitutionn = null;
202
- const { name } = json;
203
- if (this.name === name) {
204
- (0, _context.instantiate)((context)=>{
205
- (0, _context.unserialises)((json, generalContext, specificContext)=>{
206
- const { string } = json, frameSubstitutionNode = (0, _instantiate.instantiateFrameSubstitution)(string, context), node = frameSubstitutionNode, breakPoint = (0, _breakPoint.breakPointFromJSON)(json), targetFrame = targetFrameFromFrameSubstitutionNode(frameSubstitutionNode, generalContext), replacementFrame = replacementFrameFromFrameSubstitutionNode(frameSubstitutionNode, specificContext), contexts = [
207
- generalContext,
208
- specificContext
209
- ];
210
- frameSubstitutionn = new FrameSubstitution(contexts, string, node, breakPoint, targetFrame, replacementFrame);
211
- }, json, context);
212
- }, context);
213
- }
214
- return frameSubstitutionn;
215
- }
216
- static fromStatement(statement, context) {
217
- let frameSubstitution = null;
218
- const frameSubstitutionNode = statement.getFrameSubstitutionNode();
219
- if (frameSubstitutionNode !== null) {
220
- (0, _context.ablate)((context)=>{
221
- const generalContext = context, specificContext = context; ///
222
- frameSubstitution = (0, _element.frameSubstitutionFromFrameSubstitutionNode)(frameSubstitutionNode, generalContext, specificContext);
223
- }, context);
224
- }
225
- return frameSubstitution;
226
- }
227
- static fromFrameAndMetavariable(frame, metavariable, generalContext, specificContext) {
228
- let frameSubstitution;
229
- (0, _context.ablates)((generalContext, specificContext)=>{
230
- const context = specificContext; ///
231
- (0, _context.instantiate)((context)=>{
232
- const specificContext = context, frameSubstitutionString = (0, _string.frameSubstitutionStringFromFrameAndMetavariable)(frame, metavariable), string = frameSubstitutionString, frameSubstitutionNode = (0, _instantiate.instantiateFrameSubstitution)(string, context);
233
- frameSubstitution = (0, _element.frameSubstitutionFromFrameSubstitutionNode)(frameSubstitutionNode, generalContext, specificContext);
234
- }, context);
235
- }, generalContext, specificContext);
236
- return frameSubstitution;
237
- }
238
- });
239
- function metavariableFromFrameNode(frameNode, generalContext) {
240
- let metavariable = null;
241
- const metavariableNode = frameNode.getMetavariableNode();
242
- if (metavariableNode !== null) {
243
- metavariable = generalContext.findMetavariableByMetavariableNode(metavariableNode);
244
- }
245
- return metavariable;
246
- }
247
- function targetFrameFromFrameSubstitutionNode(frameSubstitutionNode, generalContext) {
248
- const targetFrameNode = frameSubstitutionNode.getTargetFrameNode(), targetFrame = generalContext.findFrameByFrameNode(targetFrameNode);
249
- return targetFrame;
250
- }
251
- function replacementFrameFromFrameSubstitutionNode(frameSubstitutionNode, specificContext) {
252
- const replacementFrameNode = frameSubstitutionNode.getReplacementFrameNode(), replacementFrame = specificContext.findFrameByFrameNode(replacementFrameNode);
253
- return replacementFrame;
254
- }
255
-
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L3N1YnN0aXR1dGlvbi9mcmFtZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFN1YnN0aXR1dGlvbiBmcm9tIFwiLi4vc3Vic3RpdHV0aW9uXCI7XG5cbmltcG9ydCB7IGRlZmluZSB9IGZyb20gXCIuLi8uLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgYnJlYWtQb2ludEZyb21KU09OIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9icmVha1BvaW50XCI7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZUZyYW1lU3Vic3RpdHV0aW9uIH0gZnJvbSBcIi4uLy4uL3Byb2Nlc3MvaW5zdGFudGlhdGVcIjtcbmltcG9ydCB7IGZyYW1lU3Vic3RpdHV0aW9uRnJvbUZyYW1lU3Vic3RpdHV0aW9uTm9kZSB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvZWxlbWVudFwiO1xuaW1wb3J0IHsgZnJhbWVTdWJzdGl0dXRpb25TdHJpbmdGcm9tRnJhbWVBbmRNZXRhdmFyaWFibGUgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL3N0cmluZ1wiO1xuaW1wb3J0IHsgZWxpZGUsIGFibGF0ZSwgYWJsYXRlcywgbWFuaWZlc3QsIGF0dGVtcHRzLCByZWNvbmNpbGUsIGluc3RhbnRpYXRlLCB1bnNlcmlhbGlzZXMgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIEZyYW1lU3Vic3RpdHV0aW9uIGV4dGVuZHMgU3Vic3RpdHV0aW9uIHtcbiAgY29uc3RydWN0b3IoY29udGV4dHMsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgdGFyZ2V0RnJhbWUsIHJlcGxhY2VtZW50RnJhbWUpIHtcbiAgICBzdXBlcihjb250ZXh0cywgc3RyaW5nLCBub2RlLCBicmVha1BvaW50KTtcblxuICAgIHRoaXMudGFyZ2V0RnJhbWUgPSB0YXJnZXRGcmFtZTtcbiAgICB0aGlzLnJlcGxhY2VtZW50RnJhbWUgPSByZXBsYWNlbWVudEZyYW1lO1xuICB9XG5cbiAgZ2V0VGFyZ2V0RnJhbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGFyZ2V0RnJhbWU7XG4gIH1cblxuICBnZXRSZXBsYWNlbWVudEZyYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VtZW50RnJhbWU7XG4gIH1cblxuICBnZXRGcmFtZVN1YnN0aXR1dGlvbk5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGZyYW1lU3Vic3RpdHV0aW9uTm9kZSA9IG5vZGU7IC8vL1xuXG4gICAgcmV0dXJuIGZyYW1lU3Vic3RpdHV0aW9uTm9kZTtcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZU5vZGUoKSB7IHJldHVybiB0aGlzLnRhcmdldEZyYW1lLmdldE1ldGF2YXJpYWJsZU5vZGUoKTsgfVxuXG4gIGdldFRhcmdldE5vZGUoKSB7XG4gICAgY29uc3QgdGFyZ2V0RnJhbWVOb2RlID0gdGhpcy50YXJnZXRGcmFtZS5nZXROb2RlKCksXG4gICAgICAgICAgdGVyZ2V0Tm9kZSA9IHRhcmdldEZyYW1lTm9kZTsgLy8vXG5cbiAgICByZXR1cm4gdGVyZ2V0Tm9kZTtcbiAgfVxuXG4gIGdldFJlcGxhY2VtZW50Tm9kZSgpIHtcbiAgICBjb25zdCByZXBsYWNlbWVudEZyYW1lTm9kZSA9IHRoaXMucmVwbGFjZW1lbnRGcmFtZS5nZXROb2RlKCksXG4gICAgICAgICAgcmVwbGFjZW1lbnROb2RlID0gcmVwbGFjZW1lbnRGcmFtZU5vZGU7IC8vL1xuXG4gICAgcmV0dXJuIHJlcGxhY2VtZW50Tm9kZTtcbiAgfVxuXG4gIGlzVHJpdmlhbCgpIHtcbiAgICBjb25zdCB0YXJnZXRGcmFtZUVxdWFsVG9SZXBsYWNlbWVudEZyYW1lID0gdGhpcy50YXJnZXRGcmFtZS5pc0VxdWFsVG8odGhpcy5yZXBsYWNlbWVudEZyYW1lKSxcbiAgICAgICAgICB0cml2aWFsID0gdGFyZ2V0RnJhbWVFcXVhbFRvUmVwbGFjZW1lbnRGcmFtZTsgLy8vXG5cbiAgICByZXR1cm4gdHJpdmlhbDtcbiAgfVxuXG4gIG1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7IHJldHVybiB0aGlzLnRhcmdldEZyYW1lLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTsgfVxuXG4gIGNvbXBhcmVGcmFtZShmcmFtZSwgY29udGV4dCkge1xuICAgIGNvbnN0IGZyYW1lRXF1YWxUb1JlcGxhY2VtZW50RnJhbWUgPSB0aGlzLnJlcGxhY2VtZW50RnJhbWUuaXNFcXVhbFRvKGZyYW1lKSxcbiAgICAgICAgICBjb21wYXJlZFRvRnJhbWUgPSBmcmFtZUVxdWFsVG9SZXBsYWNlbWVudEZyYW1lOyAvLy9cblxuICAgIHJldHVybiBjb21wYXJlZFRvRnJhbWU7XG4gIH1cblxuICBjb21wYXJlUGFyYW1ldGVyKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IHRhcmdldEZyYW1lQ29tcGFyZXNUb1BhcmFtZXRlciA9IHRoaXMudGFyZ2V0RnJhbWUuY29tcGFyZVBhcmFtZXRlcihwYXJhbWV0ZXIpLFxuICAgICAgICAgIGNvbXBhcmVzVG9QYXJhbWV0ZXIgPSB0YXJnZXRGcmFtZUNvbXBhcmVzVG9QYXJhbWV0ZXI7ICAvLy9cblxuICAgIHJldHVybiBjb21wYXJlc1RvUGFyYW1ldGVyO1xuICB9XG5cbiAgdmFsaWRhdGUoY29udGV4dCkge1xuICAgIGxldCBmcmFtZVN1YnN0aXR1dGlvbiA9IG51bGw7XG5cbiAgICBjb25zdCBmcmFtZVN1YnN0aXR1dGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2ZyYW1lU3Vic3RpdHV0aW9uU3RyaW5nfScgZnJhbWUgc3Vic3RpdHV0aW9uLi4uYCk7XG5cbiAgICBsZXQgdmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICBjb25zdCB2YWxpZFN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZFZhbGlkU3Vic3RpdHV0aW9uKGNvbnRleHQpO1xuXG4gICAgaWYgKHZhbGlkU3Vic3RpdHV0aW9uKSB7XG4gICAgICB2YWxpZGF0ZXMgPSB0cnVlO1xuXG4gICAgICBmcmFtZVN1YnN0aXR1dGlvbiA9IHZhbGlkU3Vic3RpdHV0aW9uOyAgLy8vXG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnRoZSAnJHtmcmFtZVN1YnN0aXR1dGlvblN0cmluZ30nIGZyYW1lIHN1YnN0aXR1dGlvbiBpcyBhbHJlYWR5IHZhbGlkLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBnZW5lcmFsQ29udGV4dCA9IHRoaXMuZ2V0R2VuZXJhbENvbnRleHQoKSxcbiAgICAgICAgICAgIHNwZWNpZmljQ29udGV4dCA9IHRoaXMuZ2V0U3BlY2lmaWNDb250ZXh0KCk7XG5cbiAgICAgIGF0dGVtcHRzKChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldEZyYW1lVmFsaWRhdGVzID0gdGhpcy52YWxpZGF0ZVRhcmdldEZyYW1lKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgICAgIGlmICh0YXJnZXRGcmFtZVZhbGlkYXRlcykge1xuICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50RnJhbWVWYWxpZGF0ZXMgPSB0aGlzLnZhbGlkYXRlUmVwbGFjZW1lbnRGcmFtZShnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgICAgIGlmIChyZXBsYWNlbWVudEZyYW1lVmFsaWRhdGVzKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgICAgICB0aGlzLmNvbW1pdChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic3RpdHV0aW9uID0gdGhpczsgIC8vL1xuXG4gICAgICAgIGZyYW1lU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uOyAvLy9cblxuICAgICAgICBjb250ZXh0LmFkZFN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7ZnJhbWVTdWJzdGl0dXRpb25TdHJpbmd9JyBmcmFtZSBzdWJzdGl0dXRpb24uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyYW1lU3Vic3RpdHV0aW9uO1xuICB9XG5cbiAgdmFsaWRhdGVUYXJnZXRGcmFtZShnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSB7XG4gICAgbGV0IHRhcmdldEZyYW1lVmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhbENvbnRleHQsICAvLy9cbiAgICAgICAgICBmcmFtZVN1YnN0aXR1dGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2ZyYW1lU3Vic3RpdHV0aW9uU3RyaW5nfScgZnJhbWUgc3Vic3RpdHV0aW9uJ3MgdGFyZ2V0IGZyYW1lLi4uYCk7XG5cbiAgICBjb25zdCB0YXJnZXRGcmFtZVNpbmd1bGFyID0gdGhpcy50YXJnZXRGcmFtZS5pc1Npbmd1bGFyKCk7XG5cbiAgICBpZiAodGFyZ2V0RnJhbWVTaW5ndWxhcikge1xuICAgICAgbWFuaWZlc3QoKGNvbnRleHQpID0+IHtcbiAgICAgICAgZWxpZGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgICBjb25zdCB0cmFnZXRGcmFtZSA9IHRoaXMudGFyZ2V0RnJhbWUudmFsaWRhdGUoY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAodHJhZ2V0RnJhbWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RnJhbWUgPSB0cmFnZXRGcmFtZTtcblxuICAgICAgICAgICAgdGFyZ2V0RnJhbWVWYWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgY29udGV4dCk7XG4gICAgICB9LCBzcGVjaWZpY0NvbnRleHQsIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXRGcmFtZVN0cmluZyA9IHRoaXMudGFyZ2V0RnJhbWUuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQuZGVidWcoYFRoZSAnJHt0YXJnZXRGcmFtZVN0cmluZ30nIHRhcmdldCBmcmFtZSBpcyBub3Qgc2luZ3VsYXIuYCk7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldEZyYW1lVmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlIGZyYW1lIHN1YnN0aXR1dGlvbidzIHRhcmdldCBmcmFtZS4uLmApO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRGcmFtZVZhbGlkYXRlcztcbiAgfVxuXG4gIHZhbGlkYXRlUmVwbGFjZW1lbnRGcmFtZShnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSB7XG4gICAgbGV0IHJlcGxhY2VtZW50RnJhbWVWYWxpZGF0ZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICBmcmFtZVN1YnN0aXR1dGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2ZyYW1lU3Vic3RpdHV0aW9uU3RyaW5nfScgZnJhbWUgc3Vic3RpdHV0aW9uJ3MgcmVwbGFjZW1lbnQgZnJhbWUuLi5gKTtcblxuICAgIGVsaWRlKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudEZyYW1lID0gdGhpcy5yZXBsYWNlbWVudEZyYW1lLnZhbGlkYXRlKGNvbnRleHQpO1xuXG4gICAgICBpZiAocmVwbGFjZW1lbnRGcmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlcGxhY2VtZW50RnJhbWUgPSByZXBsYWNlbWVudEZyYW1lO1xuXG4gICAgICAgIHJlcGxhY2VtZW50RnJhbWVWYWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuXG4gICAgaWYgKHJlcGxhY2VtZW50RnJhbWVWYWxpZGF0ZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7ZnJhbWVTdWJzdGl0dXRpb25TdHJpbmd9JyBmcmFtZSBzdWJzdGl0dXRpb24ncyByZXBsYWNlbWVudCBmcmFtZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVwbGFjZW1lbnRGcmFtZVZhbGlkYXRlcztcbiAgfVxuXG4gIHVuaWZ5U3Vic3RpdHV0aW9uKHN1YnN0aXR1dGlvbiwgY29udGV4dCkge1xuICAgIGxldCBzdWJzdGl0dXRpb25VbmlmaWVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBnZW5lcmFsU3Vic3RpdHV0aW9uID0gdGhpcywgLy8vXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24sXG4gICAgICAgICAgZ2VuZXJhbFN1YnN0aXR1dGlvblN0cmluZyA9IGdlbmVyYWxTdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCksXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25TdHJpbmcgPSBzcGVjaWZpY1N1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzcGVjaWZpY1N1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbiB3aXRoIHRoZSAnJHtnZW5lcmFsU3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uLi4uYCk7XG5cbiAgICByZWNvbmNpbGUoKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50RnJhbWVVbmlmaWVzID0gdGhpcy51bmlmeVJlcGxhY2VtZW50RnJhbWUoc3Vic3RpdHV0aW9uLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHJlcGxhY2VtZW50RnJhbWVVbmlmaWVzKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEZyYW1lVW5pZmllcyA9IHRoaXMudW5pZnlUYXJnZXRGcmFtZShzdWJzdGl0dXRpb24sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICh0YXJnZXRGcmFtZVVuaWZpZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgICAgICAgc3Vic3RpdHV0aW9uVW5pZmllcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBjb250ZXh0KTtcblxuICAgIGlmIChzdWJzdGl0dXRpb25VbmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzcGVjaWZpY1N1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbiB3aXRoIHRoZSAnJHtnZW5lcmFsU3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJzdGl0dXRpb25VbmlmaWVzO1xuICB9XG5cbiAgdW5pZnlUYXJnZXRGcmFtZShzdWJzdGl0dXRpb24sIGNvbnRleHQpIHtcbiAgICBsZXQgdGFyZ2V0RnJhbWVVbmlmaWVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBnZW5lcmFsU3Vic3RpdHV0aW9uID0gdGhpcywgLy8vXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24sXG4gICAgICAgICAgZ2VuZXJhbFN1YnN0aXR1dGlvblN0cmluZyA9IGdlbmVyYWxTdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCksXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25TdHJpbmcgPSBzcGVjaWZpY1N1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzcGVjaWZpY1N1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbidzIHRhcmdldCBmcmFtZSB3aXRoIHRoZSAnJHtnZW5lcmFsU3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uJ3MgdGFyZ2V0IGZyYW1lLi4uYCk7XG5cbiAgICBjb25zdCBnZW5lcmFsU3Vic3RpdHV0aW9uR2VuZXJhbENvbnRleHQgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldEdlbmVyYWxDb250ZXh0KCksXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25HZW5lcmFsQ29udGV4dCA9IHNwZWNpZmljU3Vic3RpdHV0aW9uLmdldEdlbmVyYWxDb250ZXh0KCksXG4gICAgICAgICAgZ2VuZXJhbFN1YnN0aXR1dGlvblRhcmdldEZyYW1lID0gZ2VuZXJhbFN1YnN0aXR1dGlvbi5nZXRUYXJnZXRGcmFtZSgpLFxuICAgICAgICAgIHNwZWNpZmljU3Vic3RpdHV0aW9uVGFyZ2V0RnJhbWUgPSBzcGVjaWZpY1N1YnN0aXR1dGlvbi5nZXRUYXJnZXRGcmFtZSgpLFxuICAgICAgICAgIGdlbmVyYWxDb250ZXh0ID0gZ2VuZXJhbFN1YnN0aXR1dGlvbkdlbmVyYWxDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0ID0gc3BlY2lmaWNTdWJzdGl0dXRpb25HZW5lcmFsQ29udGV4dCwgIC8vL1xuICAgICAgICAgIGdlbmVyYWxGcmFtZSA9IGdlbmVyYWxTdWJzdGl0dXRpb25UYXJnZXRGcmFtZSwgLy8vXG4gICAgICAgICAgc3BlY2lmaWNGcmFtZSA9IHNwZWNpZmljU3Vic3RpdHV0aW9uVGFyZ2V0RnJhbWU7IC8vL1xuXG4gICAgcmVjb25jaWxlKChzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGZyYW1lTm9kZSA9IGdlbmVyYWxGcmFtZS5nZXRGcmFtZU5vZGUoKSxcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZUZyb21GcmFtZU5vZGUoZnJhbWVOb2RlLCBnZW5lcmFsQ29udGV4dCk7XG5cbiAgICAgIGlmIChtZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSBzcGVjaWZpY0ZyYW1lLCAgLy8vXG4gICAgICAgICAgICAgIGZyYW1lVW5pZmllcyA9IG1ldGF2YXJpYWJsZS51bmlmeUZyYW1lKGZyYW1lLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgICBpZiAoZnJhbWVVbmlmaWVzKSB7XG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0LmNvbW1pdChjb250ZXh0KTtcblxuICAgICAgICAgIHRhcmdldEZyYW1lVW5pZmllcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKHRhcmdldEZyYW1lVW5pZmllcykge1xuICAgICAgY29udGV4dC50cmFjZShgLi4udW5pZmllZCB0aGUgJyR7c3BlY2lmaWNTdWJzdGl0dXRpb25TdHJpbmd9JyBzdWJzdGl0dXRpb24ncyB0YXJnZXQgZnJhbWUgd2l0aCB0aGUgJyR7Z2VuZXJhbFN1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbidzIHRhcmdldCBmcmFtZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0RnJhbWVVbmlmaWVzO1xuICB9XG5cbiAgdW5pZnlSZXBsYWNlbWVudEZyYW1lKHN1YnN0aXR1dGlvbiwgY29udGV4dCkge1xuICAgIGxldCByZXBsYWNlbWVudEZyYW1lVW5pZmllcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgZ2VuZXJhbFN1YnN0aXR1dGlvbiA9IHRoaXMsIC8vL1xuICAgICAgICAgIHNwZWNpZmljU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uLFxuICAgICAgICAgIGdlbmVyYWxTdWJzdGl0dXRpb25TdHJpbmcgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldFN0cmluZygpLFxuICAgICAgICAgIHNwZWNpZmljU3Vic3RpdHV0aW9uU3RyaW5nID0gc3BlY2lmaWNTdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3BlY2lmaWNTdWJzdGl0dXRpb25TdHJpbmd9JyBzdWJzdGl0dXRpb24ncyByZXBsYWNlbWVudCBmcmFtZSB3aXRoIHRoZSAnJHtnZW5lcmFsU3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uJ3MgcmVwbGFjZW1lbnQgZnJhbWUuLi5gKTtcblxuICAgIGNvbnN0IGdlbmVyYWxTdWJzdGl0dXRpb25TcGVjaWZpY0NvbnRleHQgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldFNwZWNpZmljQ29udGV4dCgpLFxuICAgICAgICAgIHNwZWNpZmljU3Vic3RpdHV0aW9uU3BlY2lmaWNDb250ZXh0ID0gc3BlY2lmaWNTdWJzdGl0dXRpb24uZ2V0U3BlY2lmaWNDb250ZXh0KCksXG4gICAgICAgICAgZ2VuZXJhbFN1YnN0aXR1dGlvblJlcGxhY2VtZW50RnJhbWUgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldFJlcGxhY2VtZW50RnJhbWUoKSxcbiAgICAgICAgICBzcGVjaWZpY1N1YnN0aXR1dGlvblJlcGxhY2VtZW50RnJhbWUgPSBzcGVjaWZpY1N1YnN0aXR1dGlvbi5nZXRSZXBsYWNlbWVudEZyYW1lKCksXG4gICAgICAgICAgZ2VuZXJhbENvbnRleHQgPSBnZW5lcmFsU3Vic3RpdHV0aW9uU3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0ID0gc3BlY2lmaWNTdWJzdGl0dXRpb25TcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICBnZW5lcmFsRnJhbWUgPSBnZW5lcmFsU3Vic3RpdHV0aW9uUmVwbGFjZW1lbnRGcmFtZSwgLy8vXG4gICAgICAgICAgc3BlY2lmaWNGcmFtZSA9IHNwZWNpZmljU3Vic3RpdHV0aW9uUmVwbGFjZW1lbnRGcmFtZTsgLy8vXG5cbiAgICByZWNvbmNpbGUoKHNwZWNpZmljQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgZnJhbWVOb2RlID0gZ2VuZXJhbEZyYW1lLmdldE5vZGUoKSxcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZUZyb21GcmFtZU5vZGUoZnJhbWVOb2RlLCBnZW5lcmFsQ29udGV4dCk7XG5cbiAgICAgIGlmIChtZXRhdmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSBzcGVjaWZpY0ZyYW1lLCAgLy8vXG4gICAgICAgICAgICAgIGZyYW1lVW5pZmllcyA9IG1ldGF2YXJpYWJsZS51bmlmeUZyYW1lKGZyYW1lLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgICBpZiAoZnJhbWVVbmlmaWVzKSB7XG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0LmNvbW1pdChjb250ZXh0KTtcblxuICAgICAgICAgIHJlcGxhY2VtZW50RnJhbWVVbmlmaWVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICBpZiAocmVwbGFjZW1lbnRGcmFtZVVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYC4uLnVuaWZpZWQgdGhlICcke3NwZWNpZmljU3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uJ3MgcmVwbGFjZW1lbnQgZnJhbWUgd2l0aCB0aGUgJyR7Z2VuZXJhbFN1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbidzIHJlcGxhY2VtZW50IGZyYW1lLmApO1xuICAgIH1cblxuICAgIHJldHVybiByZXBsYWNlbWVudEZyYW1lVW5pZmllcztcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJGcmFtZVN1YnN0aXR1dGlvblwiO1xuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBjb250ZXh0KSB7XG4gICAgbGV0IGZyYW1lU3Vic3RpdHV0aW9ubiA9IG51bGw7XG5cbiAgICBjb25zdCB7IG5hbWUgfSA9IGpzb247XG5cbiAgICBpZiAodGhpcy5uYW1lID09PSBuYW1lKSB7XG4gICAgICBpbnN0YW50aWF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgICB1bnNlcmlhbGlzZXMoKGpzb24sIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHN0cmluZyB9ID0ganNvbixcbiAgICAgICAgICAgICAgICBmcmFtZVN1YnN0aXR1dGlvbk5vZGUgPSBpbnN0YW50aWF0ZUZyYW1lU3Vic3RpdHV0aW9uKHN0cmluZywgY29udGV4dCksXG4gICAgICAgICAgICAgICAgbm9kZSA9IGZyYW1lU3Vic3RpdHV0aW9uTm9kZSwgLy8vXG4gICAgICAgICAgICAgICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRGcm9tSlNPTihqc29uKSxcbiAgICAgICAgICAgICAgICB0YXJnZXRGcmFtZSA9IHRhcmdldEZyYW1lRnJvbUZyYW1lU3Vic3RpdHV0aW9uTm9kZShmcmFtZVN1YnN0aXR1dGlvbk5vZGUsIGdlbmVyYWxDb250ZXh0KSxcbiAgICAgICAgICAgICAgICByZXBsYWNlbWVudEZyYW1lID0gcmVwbGFjZW1lbnRGcmFtZUZyb21GcmFtZVN1YnN0aXR1dGlvbk5vZGUoZnJhbWVTdWJzdGl0dXRpb25Ob2RlLCBzcGVjaWZpY0NvbnRleHQpLFxuICAgICAgICAgICAgICAgIGNvbnRleHRzID0gW1xuICAgICAgICAgICAgICAgICAgZ2VuZXJhbENvbnRleHQsXG4gICAgICAgICAgICAgICAgICBzcGVjaWZpY0NvbnRleHRcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgZnJhbWVTdWJzdGl0dXRpb25uID0gbmV3IEZyYW1lU3Vic3RpdHV0aW9uKGNvbnRleHRzLCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIHRhcmdldEZyYW1lLCByZXBsYWNlbWVudEZyYW1lKTtcbiAgICAgICAgfSwganNvbiwgY29udGV4dCk7XG4gICAgICB9LCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJhbWVTdWJzdGl0dXRpb25uO1xuICB9XG5cbiAgc3RhdGljIGZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gICAgbGV0IGZyYW1lU3Vic3RpdHV0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IGZyYW1lU3Vic3RpdHV0aW9uTm9kZSA9IHN0YXRlbWVudC5nZXRGcmFtZVN1YnN0aXR1dGlvbk5vZGUoKTtcblxuICAgIGlmIChmcmFtZVN1YnN0aXR1dGlvbk5vZGUgIT09IG51bGwpIHtcbiAgICAgIGFibGF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBnZW5lcmFsQ29udGV4dCA9IGNvbnRleHQsIC8vL1xuICAgICAgICAgICAgICBzcGVjaWZpY0NvbnRleHQgPSBjb250ZXh0OyAgLy8vXG5cbiAgICAgICAgZnJhbWVTdWJzdGl0dXRpb24gPSBmcmFtZVN1YnN0aXR1dGlvbkZyb21GcmFtZVN1YnN0aXR1dGlvbk5vZGUoZnJhbWVTdWJzdGl0dXRpb25Ob2RlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBmcmFtZVN1YnN0aXR1dGlvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRnJhbWVBbmRNZXRhdmFyaWFibGUoZnJhbWUsIG1ldGF2YXJpYWJsZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICAgIGxldCBmcmFtZVN1YnN0aXR1dGlvblxuXG4gICAgYWJsYXRlcygoZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dDsgIC8vL1xuXG4gICAgICBpbnN0YW50aWF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBzcGVjaWZpY0NvbnRleHQgPSBjb250ZXh0LCAgLy8vXG4gICAgICAgICAgICAgIGZyYW1lU3Vic3RpdHV0aW9uU3RyaW5nID0gZnJhbWVTdWJzdGl0dXRpb25TdHJpbmdGcm9tRnJhbWVBbmRNZXRhdmFyaWFibGUoZnJhbWUsIG1ldGF2YXJpYWJsZSksXG4gICAgICAgICAgICAgIHN0cmluZyA9IGZyYW1lU3Vic3RpdHV0aW9uU3RyaW5nLCAgLy8vXG4gICAgICAgICAgICAgIGZyYW1lU3Vic3RpdHV0aW9uTm9kZSA9IGluc3RhbnRpYXRlRnJhbWVTdWJzdGl0dXRpb24oc3RyaW5nLCBjb250ZXh0KTtcblxuICAgICAgICBmcmFtZVN1YnN0aXR1dGlvbiA9IGZyYW1lU3Vic3RpdHV0aW9uRnJvbUZyYW1lU3Vic3RpdHV0aW9uTm9kZShmcmFtZVN1YnN0aXR1dGlvbk5vZGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICByZXR1cm4gZnJhbWVTdWJzdGl0dXRpb247XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBtZXRhdmFyaWFibGVGcm9tRnJhbWVOb2RlKGZyYW1lTm9kZSwgZ2VuZXJhbENvbnRleHQpIHtcbiAgbGV0IG1ldGF2YXJpYWJsZSA9IG51bGw7XG5cbiAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IGZyYW1lTm9kZS5nZXRNZXRhdmFyaWFibGVOb2RlKCk7XG5cbiAgaWYgKG1ldGF2YXJpYWJsZU5vZGUgIT09IG51bGwpIHtcbiAgICBtZXRhdmFyaWFibGUgPSBnZW5lcmFsQ29udGV4dC5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbn1cblxuZnVuY3Rpb24gdGFyZ2V0RnJhbWVGcm9tRnJhbWVTdWJzdGl0dXRpb25Ob2RlKGZyYW1lU3Vic3RpdHV0aW9uTm9kZSwgZ2VuZXJhbENvbnRleHQpIHtcbiAgY29uc3QgdGFyZ2V0RnJhbWVOb2RlID0gZnJhbWVTdWJzdGl0dXRpb25Ob2RlLmdldFRhcmdldEZyYW1lTm9kZSgpLFxuICAgICAgICB0YXJnZXRGcmFtZSA9IGdlbmVyYWxDb250ZXh0LmZpbmRGcmFtZUJ5RnJhbWVOb2RlKHRhcmdldEZyYW1lTm9kZSk7XG5cbiAgcmV0dXJuIHRhcmdldEZyYW1lO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlbWVudEZyYW1lRnJvbUZyYW1lU3Vic3RpdHV0aW9uTm9kZShmcmFtZVN1YnN0aXR1dGlvbk5vZGUsIHNwZWNpZmljQ29udGV4dCkge1xuICBjb25zdCByZXBsYWNlbWVudEZyYW1lTm9kZSA9IGZyYW1lU3Vic3RpdHV0aW9uTm9kZS5nZXRSZXBsYWNlbWVudEZyYW1lTm9kZSgpLFxuICAgICAgICByZXBsYWNlbWVudEZyYW1lID0gc3BlY2lmaWNDb250ZXh0LmZpbmRGcmFtZUJ5RnJhbWVOb2RlKHJlcGxhY2VtZW50RnJhbWVOb2RlKTtcblxuICByZXR1cm4gcmVwbGFjZW1lbnRGcmFtZTtcbn1cbiJdLCJuYW1lcyI6WyJkZWZpbmUiLCJGcmFtZVN1YnN0aXR1dGlvbiIsIlN1YnN0aXR1dGlvbiIsImNvbnRleHRzIiwic3RyaW5nIiwibm9kZSIsImJyZWFrUG9pbnQiLCJ0YXJnZXRGcmFtZSIsInJlcGxhY2VtZW50RnJhbWUiLCJnZXRUYXJnZXRGcmFtZSIsImdldFJlcGxhY2VtZW50RnJhbWUiLCJnZXRGcmFtZVN1YnN0aXR1dGlvbk5vZGUiLCJnZXROb2RlIiwiZnJhbWVTdWJzdGl0dXRpb25Ob2RlIiwiZ2V0TWV0YXZhcmlhYmxlTm9kZSIsImdldFRhcmdldE5vZGUiLCJ0YXJnZXRGcmFtZU5vZGUiLCJ0ZXJnZXROb2RlIiwiZ2V0UmVwbGFjZW1lbnROb2RlIiwicmVwbGFjZW1lbnRGcmFtZU5vZGUiLCJyZXBsYWNlbWVudE5vZGUiLCJpc1RyaXZpYWwiLCJ0YXJnZXRGcmFtZUVxdWFsVG9SZXBsYWNlbWVudEZyYW1lIiwiaXNFcXVhbFRvIiwidHJpdmlhbCIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJjb21wYXJlRnJhbWUiLCJmcmFtZSIsImNvbnRleHQiLCJmcmFtZUVxdWFsVG9SZXBsYWNlbWVudEZyYW1lIiwiY29tcGFyZWRUb0ZyYW1lIiwiY29tcGFyZVBhcmFtZXRlciIsInBhcmFtZXRlciIsInRhcmdldEZyYW1lQ29tcGFyZXNUb1BhcmFtZXRlciIsImNvbXBhcmVzVG9QYXJhbWV0ZXIiLCJ2YWxpZGF0ZSIsImZyYW1lU3Vic3RpdHV0aW9uIiwiZnJhbWVTdWJzdGl0dXRpb25TdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsInZhbGlkYXRlcyIsInZhbGlkU3Vic3RpdHV0aW9uIiwiZmluZFZhbGlkU3Vic3RpdHV0aW9uIiwiZGVidWciLCJnZW5lcmFsQ29udGV4dCIsImdldEdlbmVyYWxDb250ZXh0Iiwic3BlY2lmaWNDb250ZXh0IiwiZ2V0U3BlY2lmaWNDb250ZXh0IiwiYXR0ZW1wdHMiLCJ0YXJnZXRGcmFtZVZhbGlkYXRlcyIsInZhbGlkYXRlVGFyZ2V0RnJhbWUiLCJyZXBsYWNlbWVudEZyYW1lVmFsaWRhdGVzIiwidmFsaWRhdGVSZXBsYWNlbWVudEZyYW1lIiwiY29tbWl0Iiwic3Vic3RpdHV0aW9uIiwiYWRkU3Vic3RpdHV0aW9uIiwidGFyZ2V0RnJhbWVTaW5ndWxhciIsImlzU2luZ3VsYXIiLCJtYW5pZmVzdCIsImVsaWRlIiwidHJhZ2V0RnJhbWUiLCJ0YXJnZXRGcmFtZVN0cmluZyIsInVuaWZ5U3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uVW5pZmllcyIsImdlbmVyYWxTdWJzdGl0dXRpb24iLCJzcGVjaWZpY1N1YnN0aXR1dGlvbiIsImdlbmVyYWxTdWJzdGl0dXRpb25TdHJpbmciLCJzcGVjaWZpY1N1YnN0aXR1dGlvblN0cmluZyIsInJlY29uY2lsZSIsInJlcGxhY2VtZW50RnJhbWVVbmlmaWVzIiwidW5pZnlSZXBsYWNlbWVudEZyYW1lIiwidGFyZ2V0RnJhbWVVbmlmaWVzIiwidW5pZnlUYXJnZXRGcmFtZSIsImdlbmVyYWxTdWJzdGl0dXRpb25HZW5lcmFsQ29udGV4dCIsInNwZWNpZmljU3Vic3RpdHV0aW9uR2VuZXJhbENvbnRleHQiLCJnZW5lcmFsU3Vic3RpdHV0aW9uVGFyZ2V0RnJhbWUiLCJzcGVjaWZpY1N1YnN0aXR1dGlvblRhcmdldEZyYW1lIiwiZ2VuZXJhbEZyYW1lIiwic3BlY2lmaWNGcmFtZSIsImZyYW1lTm9kZSIsImdldEZyYW1lTm9kZSIsIm1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZUZyb21GcmFtZU5vZGUiLCJmcmFtZVVuaWZpZXMiLCJ1bmlmeUZyYW1lIiwiZ2VuZXJhbFN1YnN0aXR1dGlvblNwZWNpZmljQ29udGV4dCIsInNwZWNpZmljU3Vic3RpdHV0aW9uU3BlY2lmaWNDb250ZXh0IiwiZ2VuZXJhbFN1YnN0aXR1dGlvblJlcGxhY2VtZW50RnJhbWUiLCJzcGVjaWZpY1N1YnN0aXR1dGlvblJlcGxhY2VtZW50RnJhbWUiLCJuYW1lIiwiZnJvbUpTT04iLCJqc29uIiwiZnJhbWVTdWJzdGl0dXRpb25uIiwiaW5zdGFudGlhdGUiLCJ1bnNlcmlhbGlzZXMiLCJpbnN0YW50aWF0ZUZyYW1lU3Vic3RpdHV0aW9uIiwiYnJlYWtQb2ludEZyb21KU09OIiwidGFyZ2V0RnJhbWVGcm9tRnJhbWVTdWJzdGl0dXRpb25Ob2RlIiwicmVwbGFjZW1lbnRGcmFtZUZyb21GcmFtZVN1YnN0aXR1dGlvbk5vZGUiLCJmcm9tU3RhdGVtZW50Iiwic3RhdGVtZW50IiwiYWJsYXRlIiwiZnJhbWVTdWJzdGl0dXRpb25Gcm9tRnJhbWVTdWJzdGl0dXRpb25Ob2RlIiwiZnJvbUZyYW1lQW5kTWV0YXZhcmlhYmxlIiwiYWJsYXRlcyIsImZyYW1lU3Vic3RpdHV0aW9uU3RyaW5nRnJvbUZyYW1lQW5kTWV0YXZhcmlhYmxlIiwiZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZSIsImdldFRhcmdldEZyYW1lTm9kZSIsImZpbmRGcmFtZUJ5RnJhbWVOb2RlIiwiZ2V0UmVwbGFjZW1lbnRGcmFtZU5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVdBOzs7ZUFBQTs7O3FFQVR5QjswQkFFRjs0QkFDWTs2QkFDVTt5QkFDYzt3QkFDSzt5QkFDaUM7Ozs7OztNQUVqRyxXQUFlQSxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLDBCQUEwQkMscUJBQVk7SUFDaEUsWUFBWUMsUUFBUSxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxXQUFXLEVBQUVDLGdCQUFnQixDQUFFO1FBQzdFLEtBQUssQ0FBQ0wsVUFBVUMsUUFBUUMsTUFBTUM7UUFFOUIsSUFBSSxDQUFDQyxXQUFXLEdBQUdBO1FBQ25CLElBQUksQ0FBQ0MsZ0JBQWdCLEdBQUdBO0lBQzFCO0lBRUFDLGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDRixXQUFXO0lBQ3pCO0lBRUFHLHNCQUFzQjtRQUNwQixPQUFPLElBQUksQ0FBQ0YsZ0JBQWdCO0lBQzlCO0lBRUFHLDJCQUEyQjtRQUN6QixNQUFNTixPQUFPLElBQUksQ0FBQ08sT0FBTyxJQUNuQkMsd0JBQXdCUixNQUFNLEdBQUc7UUFFdkMsT0FBT1E7SUFDVDtJQUVBQyxzQkFBc0I7UUFBRSxPQUFPLElBQUksQ0FBQ1AsV0FBVyxDQUFDTyxtQkFBbUI7SUFBSTtJQUV2RUMsZ0JBQWdCO1FBQ2QsTUFBTUMsa0JBQWtCLElBQUksQ0FBQ1QsV0FBVyxDQUFDSyxPQUFPLElBQzFDSyxhQUFhRCxpQkFBaUIsR0FBRztRQUV2QyxPQUFPQztJQUNUO0lBRUFDLHFCQUFxQjtRQUNuQixNQUFNQyx1QkFBdUIsSUFBSSxDQUFDWCxnQkFBZ0IsQ0FBQ0ksT0FBTyxJQUNwRFEsa0JBQWtCRCxzQkFBc0IsR0FBRztRQUVqRCxPQUFPQztJQUNUO0lBRUFDLFlBQVk7UUFDVixNQUFNQyxxQ0FBcUMsSUFBSSxDQUFDZixXQUFXLENBQUNnQixTQUFTLENBQUMsSUFBSSxDQUFDZixnQkFBZ0IsR0FDckZnQixVQUFVRixvQ0FBb0MsR0FBRztRQUV2RCxPQUFPRTtJQUNUO0lBRUFDLHNCQUFzQkMsZ0JBQWdCLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQ25CLFdBQVcsQ0FBQ2tCLHFCQUFxQixDQUFDQztJQUFtQjtJQUUzR0MsYUFBYUMsS0FBSyxFQUFFQyxPQUFPLEVBQUU7UUFDM0IsTUFBTUMsK0JBQStCLElBQUksQ0FBQ3RCLGdCQUFnQixDQUFDZSxTQUFTLENBQUNLLFFBQy9ERyxrQkFBa0JELDhCQUE4QixHQUFHO1FBRXpELE9BQU9DO0lBQ1Q7SUFFQUMsaUJBQWlCQyxTQUFTLEVBQUU7UUFDMUIsTUFBTUMsaUNBQWlDLElBQUksQ0FBQzNCLFdBQVcsQ0FBQ3lCLGdCQUFnQixDQUFDQyxZQUNuRUUsc0JBQXNCRCxnQ0FBaUMsR0FBRztRQUVoRSxPQUFPQztJQUNUO0lBRUFDLFNBQVNQLE9BQU8sRUFBRTtRQUNoQixJQUFJUSxvQkFBb0I7UUFFeEIsTUFBTUMsMEJBQTBCLElBQUksQ0FBQ0MsU0FBUyxJQUFLLEdBQUc7UUFFdERWLFFBQVFXLEtBQUssQ0FBQyxDQUFDLGdCQUFnQixFQUFFRix3QkFBd0IsdUJBQXVCLENBQUM7UUFFakYsSUFBSUcsWUFBWTtRQUVoQixNQUFNQyxvQkFBb0IsSUFBSSxDQUFDQyxxQkFBcUIsQ0FBQ2Q7UUFFckQsSUFBSWEsbUJBQW1CO1lBQ3JCRCxZQUFZO1lBRVpKLG9CQUFvQkssbUJBQW9CLEdBQUc7WUFFM0NiLFFBQVFlLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRU4sd0JBQXdCLHNDQUFzQyxDQUFDO1FBQzFGLE9BQU87WUFDTCxNQUFNTyxpQkFBaUIsSUFBSSxDQUFDQyxpQkFBaUIsSUFDdkNDLGtCQUFrQixJQUFJLENBQUNDLGtCQUFrQjtZQUUvQ0MsSUFBQUEsaUJBQVEsRUFBQyxDQUFDSixnQkFBZ0JFO2dCQUN4QixNQUFNRyx1QkFBdUIsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQ04sZ0JBQWdCRTtnQkFFdEUsSUFBSUcsc0JBQXNCO29CQUN4QixNQUFNRSw0QkFBNEIsSUFBSSxDQUFDQyx3QkFBd0IsQ0FBQ1IsZ0JBQWdCRTtvQkFFaEYsSUFBSUssMkJBQTJCO3dCQUM3QlgsWUFBWTtvQkFDZDtnQkFDRjtnQkFFQSxJQUFJQSxXQUFXO29CQUNiLElBQUksQ0FBQ2EsTUFBTSxDQUFDVCxnQkFBZ0JFO2dCQUM5QjtZQUNGLEdBQUdGLGdCQUFnQkU7WUFFbkIsSUFBSU4sV0FBVztnQkFDYixNQUFNYyxlQUFlLElBQUksRUFBRyxHQUFHO2dCQUUvQmxCLG9CQUFvQmtCLGNBQWMsR0FBRztnQkFFckMxQixRQUFRMkIsZUFBZSxDQUFDRDtZQUMxQjtRQUNGO1FBRUEsSUFBSWQsV0FBVztZQUNiWixRQUFRZSxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsRUFBRU4sd0JBQXdCLHFCQUFxQixDQUFDO1FBQ25GO1FBRUEsT0FBT0Q7SUFDVDtJQUVBYyxvQkFBb0JOLGNBQWMsRUFBRUUsZUFBZSxFQUFFO1FBQ25ELElBQUlHLHVCQUF1QjtRQUUzQixNQUFNckIsVUFBVWdCLGdCQUNWUCwwQkFBMEIsSUFBSSxDQUFDQyxTQUFTLElBQUssR0FBRztRQUV0RFYsUUFBUVcsS0FBSyxDQUFDLENBQUMsZ0JBQWdCLEVBQUVGLHdCQUF3QixzQ0FBc0MsQ0FBQztRQUVoRyxNQUFNbUIsc0JBQXNCLElBQUksQ0FBQ2xELFdBQVcsQ0FBQ21ELFVBQVU7UUFFdkQsSUFBSUQscUJBQXFCO1lBQ3ZCRSxJQUFBQSxpQkFBUSxFQUFDLENBQUM5QjtnQkFDUitCLElBQUFBLGNBQUssRUFBQyxDQUFDL0I7b0JBQ0wsTUFBTWdDLGNBQWMsSUFBSSxDQUFDdEQsV0FBVyxDQUFDNkIsUUFBUSxDQUFDUDtvQkFFOUMsSUFBSWdDLGdCQUFnQixNQUFNO3dCQUN4QixJQUFJLENBQUN0RCxXQUFXLEdBQUdzRDt3QkFFbkJYLHVCQUF1QjtvQkFDekI7Z0JBQ0YsR0FBR3JCO1lBQ0wsR0FBR2tCLGlCQUFpQmxCO1FBQ3RCLE9BQU87WUFDTCxNQUFNaUMsb0JBQW9CLElBQUksQ0FBQ3ZELFdBQVcsQ0FBQ2dDLFNBQVM7WUFFcERWLFFBQVFlLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRWtCLGtCQUFrQiwrQkFBK0IsQ0FBQztRQUMxRTtRQUVBLElBQUlaLHNCQUFzQjtZQUN4QnJCLFFBQVFlLEtBQUssQ0FBQyxDQUFDLHFEQUFxRCxDQUFDO1FBQ3ZFO1FBRUEsT0FBT007SUFDVDtJQUVBRyx5QkFBeUJSLGNBQWMsRUFBRUUsZUFBZSxFQUFFO1FBQ3hELElBQUlLLDRCQUE0QjtRQUVoQyxNQUFNdkIsVUFBVWtCLGlCQUNWVCwwQkFBMEIsSUFBSSxDQUFDQyxTQUFTLElBQUssR0FBRztRQUV0RFYsUUFBUVcsS0FBSyxDQUFDLENBQUMsZ0JBQWdCLEVBQUVGLHdCQUF3QiwyQ0FBMkMsQ0FBQztRQUVyR3NCLElBQUFBLGNBQUssRUFBQyxDQUFDL0I7WUFDTCxNQUFNckIsbUJBQW1CLElBQUksQ0FBQ0EsZ0JBQWdCLENBQUM0QixRQUFRLENBQUNQO1lBRXhELElBQUlyQixxQkFBcUIsTUFBTTtnQkFDN0IsSUFBSSxDQUFDQSxnQkFBZ0IsR0FBR0E7Z0JBRXhCNEMsNEJBQTRCO1lBQzlCO1FBQ0YsR0FBR3ZCO1FBRUgsSUFBSXVCLDJCQUEyQjtZQUM3QnZCLFFBQVFlLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixFQUFFTix3QkFBd0IseUNBQXlDLENBQUM7UUFDdkc7UUFFQSxPQUFPYztJQUNUO0lBRUFXLGtCQUFrQlIsWUFBWSxFQUFFMUIsT0FBTyxFQUFFO1FBQ3ZDLElBQUltQyxzQkFBc0I7UUFFMUIsTUFBTUMsc0JBQXNCLElBQUksRUFDMUJDLHVCQUF1QlgsY0FDdkJZLDRCQUE0QkYsb0JBQW9CMUIsU0FBUyxJQUN6RDZCLDZCQUE2QkYscUJBQXFCM0IsU0FBUztRQUVqRVYsUUFBUVcsS0FBSyxDQUFDLENBQUMsY0FBYyxFQUFFNEIsMkJBQTJCLHlCQUF5QixFQUFFRCwwQkFBMEIsaUJBQWlCLENBQUM7UUFFaklFLElBQUFBLGtCQUFTLEVBQUMsQ0FBQ3hDO1lBQ1QsTUFBTXlDLDBCQUEwQixJQUFJLENBQUNDLHFCQUFxQixDQUFDaEIsY0FBYzFCO1lBRXpFLElBQUl5Qyx5QkFBeUI7Z0JBQzNCLE1BQU1FLHFCQUFxQixJQUFJLENBQUNDLGdCQUFnQixDQUFDbEIsY0FBYzFCO2dCQUUvRCxJQUFJMkMsb0JBQW9CO29CQUN0QjNDLFFBQVF5QixNQUFNO29CQUVkVSxzQkFBc0I7Z0JBQ3hCO1lBQ0Y7UUFDRixHQUFHbkM7UUFFSCxJQUFJbUMscUJBQXFCO1lBQ3ZCbkMsUUFBUWUsS0FBSyxDQUFDLENBQUMsZ0JBQWdCLEVBQUV3QiwyQkFBMkIseUJBQXlCLEVBQUVELDBCQUEwQixlQUFlLENBQUM7UUFDbkk7UUFFQSxPQUFPSDtJQUNUO0lBRUFTLGlCQUFpQmxCLFlBQVksRUFBRTFCLE9BQU8sRUFBRTtRQUN0QyxJQUFJMkMscUJBQXFCO1FBRXpCLE1BQU1QLHNCQUFzQixJQUFJLEVBQzFCQyx1QkFBdUJYLGNBQ3ZCWSw0QkFBNEJGLG9CQUFvQjFCLFNBQVMsSUFDekQ2Qiw2QkFBNkJGLHFCQUFxQjNCLFNBQVM7UUFFakVWLFFBQVFXLEtBQUssQ0FBQyxDQUFDLGNBQWMsRUFBRTRCLDJCQUEyQix3Q0FBd0MsRUFBRUQsMEJBQTBCLGdDQUFnQyxDQUFDO1FBRS9KLE1BQU1PLG9DQUFvQ1Qsb0JBQW9CbkIsaUJBQWlCLElBQ3pFNkIscUNBQXFDVCxxQkFBcUJwQixpQkFBaUIsSUFDM0U4QixpQ0FBaUNYLG9CQUFvQnhELGNBQWMsSUFDbkVvRSxrQ0FBa0NYLHFCQUFxQnpELGNBQWMsSUFDckVvQyxpQkFBaUI2QixtQ0FDakIzQixrQkFBa0I0QixvQ0FDbEJHLGVBQWVGLGdDQUNmRyxnQkFBZ0JGLGlDQUFpQyxHQUFHO1FBRTFEUixJQUFBQSxrQkFBUyxFQUFDLENBQUN0QjtZQUNULE1BQU1pQyxZQUFZRixhQUFhRyxZQUFZLElBQ3JDQyxlQUFlQywwQkFBMEJILFdBQVduQztZQUUxRCxJQUFJcUMsaUJBQWlCLE1BQU07Z0JBQ3pCLE1BQU10RCxRQUFRbUQsZUFDUkssZUFBZUYsYUFBYUcsVUFBVSxDQUFDekQsT0FBT2lCLGdCQUFnQkU7Z0JBRXBFLElBQUlxQyxjQUFjO29CQUNoQnJDLGdCQUFnQk8sTUFBTSxDQUFDekI7b0JBRXZCMkMscUJBQXFCO2dCQUN2QjtZQUNGO1FBQ0YsR0FBR3pCO1FBRUgsSUFBSXlCLG9CQUFvQjtZQUN0QjNDLFFBQVFXLEtBQUssQ0FBQyxDQUFDLGdCQUFnQixFQUFFNEIsMkJBQTJCLHdDQUF3QyxFQUFFRCwwQkFBMEIsOEJBQThCLENBQUM7UUFDaks7UUFFQSxPQUFPSztJQUNUO0lBRUFELHNCQUFzQmhCLFlBQVksRUFBRTFCLE9BQU8sRUFBRTtRQUMzQyxJQUFJeUMsMEJBQTBCO1FBRTlCLE1BQU1MLHNCQUFzQixJQUFJLEVBQzFCQyx1QkFBdUJYLGNBQ3ZCWSw0QkFBNEJGLG9CQUFvQjFCLFNBQVMsSUFDekQ2Qiw2QkFBNkJGLHFCQUFxQjNCLFNBQVM7UUFFakVWLFFBQVFXLEtBQUssQ0FBQyxDQUFDLGNBQWMsRUFBRTRCLDJCQUEyQiw2Q0FBNkMsRUFBRUQsMEJBQTBCLHFDQUFxQyxDQUFDO1FBRXpLLE1BQU1tQixxQ0FBcUNyQixvQkFBb0JqQixrQkFBa0IsSUFDM0V1QyxzQ0FBc0NyQixxQkFBcUJsQixrQkFBa0IsSUFDN0V3QyxzQ0FBc0N2QixvQkFBb0J2RCxtQkFBbUIsSUFDN0UrRSx1Q0FBdUN2QixxQkFBcUJ4RCxtQkFBbUIsSUFDL0VtQyxpQkFBaUJ5QyxvQ0FDakJ2QyxrQkFBa0J3QyxxQ0FDbEJULGVBQWVVLHFDQUNmVCxnQkFBZ0JVLHNDQUFzQyxHQUFHO1FBRS9EcEIsSUFBQUEsa0JBQVMsRUFBQyxDQUFDdEI7WUFDVCxNQUFNaUMsWUFBWUYsYUFBYWxFLE9BQU8sSUFDaENzRSxlQUFlQywwQkFBMEJILFdBQVduQztZQUUxRCxJQUFJcUMsaUJBQWlCLE1BQU07Z0JBQ3pCLE1BQU10RCxRQUFRbUQsZUFDUkssZUFBZUYsYUFBYUcsVUFBVSxDQUFDekQsT0FBT2lCLGdCQUFnQkU7Z0JBRXBFLElBQUlxQyxjQUFjO29CQUNoQnJDLGdCQUFnQk8sTUFBTSxDQUFDekI7b0JBRXZCeUMsMEJBQTBCO2dCQUM1QjtZQUNGO1FBQ0YsR0FBR3ZCO1FBRUgsSUFBSXVCLHlCQUF5QjtZQUMzQnpDLFFBQVFXLEtBQUssQ0FBQyxDQUFDLGdCQUFnQixFQUFFNEIsMkJBQTJCLDZDQUE2QyxFQUFFRCwwQkFBMEIsbUNBQW1DLENBQUM7UUFDM0s7UUFFQSxPQUFPRztJQUNUO0lBRUEsT0FBT29CLE9BQU8sb0JBQW9CO0lBRWxDLE9BQU9DLFNBQVNDLElBQUksRUFBRS9ELE9BQU8sRUFBRTtRQUM3QixJQUFJZ0UscUJBQXFCO1FBRXpCLE1BQU0sRUFBRUgsSUFBSSxFQUFFLEdBQUdFO1FBRWpCLElBQUksSUFBSSxDQUFDRixJQUFJLEtBQUtBLE1BQU07WUFDdEJJLElBQUFBLG9CQUFXLEVBQUMsQ0FBQ2pFO2dCQUNYa0UsSUFBQUEscUJBQVksRUFBQyxDQUFDSCxNQUFNL0MsZ0JBQWdCRTtvQkFDbEMsTUFBTSxFQUFFM0MsTUFBTSxFQUFFLEdBQUd3RixNQUNiL0Usd0JBQXdCbUYsSUFBQUEseUNBQTRCLEVBQUM1RixRQUFReUIsVUFDN0R4QixPQUFPUSx1QkFDUFAsYUFBYTJGLElBQUFBLDhCQUFrQixFQUFDTCxPQUNoQ3JGLGNBQWMyRixxQ0FBcUNyRix1QkFBdUJnQyxpQkFDMUVyQyxtQkFBbUIyRiwwQ0FBMEN0Rix1QkFBdUJrQyxrQkFDcEY1QyxXQUFXO3dCQUNUMEM7d0JBQ0FFO3FCQUNEO29CQUVQOEMscUJBQXFCLElBQUk1RixrQkFBa0JFLFVBQVVDLFFBQVFDLE1BQU1DLFlBQVlDLGFBQWFDO2dCQUM5RixHQUFHb0YsTUFBTS9EO1lBQ1gsR0FBR0E7UUFDTDtRQUVBLE9BQU9nRTtJQUNUO0lBRUEsT0FBT08sY0FBY0MsU0FBUyxFQUFFeEUsT0FBTyxFQUFFO1FBQ3ZDLElBQUlRLG9CQUFvQjtRQUV4QixNQUFNeEIsd0JBQXdCd0YsVUFBVTFGLHdCQUF3QjtRQUVoRSxJQUFJRSwwQkFBMEIsTUFBTTtZQUNsQ3lGLElBQUFBLGVBQU0sRUFBQyxDQUFDekU7Z0JBQ04sTUFBTWdCLGlCQUFpQmhCLFNBQ2pCa0Isa0JBQWtCbEIsU0FBVSxHQUFHO2dCQUVyQ1Esb0JBQW9Ca0UsSUFBQUEsbURBQTBDLEVBQUMxRix1QkFBdUJnQyxnQkFBZ0JFO1lBQ3hHLEdBQUdsQjtRQUNMO1FBRUEsT0FBT1E7SUFDVDtJQUVBLE9BQU9tRSx5QkFBeUI1RSxLQUFLLEVBQUVzRCxZQUFZLEVBQUVyQyxjQUFjLEVBQUVFLGVBQWUsRUFBRTtRQUNwRixJQUFJVjtRQUVKb0UsSUFBQUEsZ0JBQU8sRUFBQyxDQUFDNUQsZ0JBQWdCRTtZQUN2QixNQUFNbEIsVUFBVWtCLGlCQUFrQixHQUFHO1lBRXJDK0MsSUFBQUEsb0JBQVcsRUFBQyxDQUFDakU7Z0JBQ1gsTUFBTWtCLGtCQUFrQmxCLFNBQ2xCUywwQkFBMEJvRSxJQUFBQSx1REFBK0MsRUFBQzlFLE9BQU9zRCxlQUNqRjlFLFNBQVNrQyx5QkFDVHpCLHdCQUF3Qm1GLElBQUFBLHlDQUE0QixFQUFDNUYsUUFBUXlCO2dCQUVuRVEsb0JBQW9Ca0UsSUFBQUEsbURBQTBDLEVBQUMxRix1QkFBdUJnQyxnQkFBZ0JFO1lBQ3hHLEdBQUdsQjtRQUNMLEdBQUdnQixnQkFBZ0JFO1FBRW5CLE9BQU9WO0lBQ1Q7QUFDRjtBQUVBLFNBQVM4QywwQkFBMEJILFNBQVMsRUFBRW5DLGNBQWM7SUFDMUQsSUFBSXFDLGVBQWU7SUFFbkIsTUFBTXhELG1CQUFtQnNELFVBQVVsRSxtQkFBbUI7SUFFdEQsSUFBSVkscUJBQXFCLE1BQU07UUFDN0J3RCxlQUFlckMsZUFBZThELGtDQUFrQyxDQUFDakY7SUFDbkU7SUFFQSxPQUFPd0Q7QUFDVDtBQUVBLFNBQVNnQixxQ0FBcUNyRixxQkFBcUIsRUFBRWdDLGNBQWM7SUFDakYsTUFBTTdCLGtCQUFrQkgsc0JBQXNCK0Ysa0JBQWtCLElBQzFEckcsY0FBY3NDLGVBQWVnRSxvQkFBb0IsQ0FBQzdGO0lBRXhELE9BQU9UO0FBQ1Q7QUFFQSxTQUFTNEYsMENBQTBDdEYscUJBQXFCLEVBQUVrQyxlQUFlO0lBQ3ZGLE1BQU01Qix1QkFBdUJOLHNCQUFzQmlHLHVCQUF1QixJQUNwRXRHLG1CQUFtQnVDLGdCQUFnQjhELG9CQUFvQixDQUFDMUY7SUFFOUQsT0FBT1g7QUFDVCJ9
@@ -1,192 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "default", {
6
- enumerable: true,
7
- get: function() {
8
- return _default;
9
- }
10
- });
11
- const _substitution = /*#__PURE__*/ _interop_require_default(require("../substitution"));
12
- const _elements = require("../../elements");
13
- const _breakPoint = require("../../utilities/breakPoint");
14
- const _instantiate = require("../../process/instantiate");
15
- const _element = require("../../utilities/element");
16
- const _string = require("../../utilities/string");
17
- const _context = require("../../utilities/context");
18
- function _interop_require_default(obj) {
19
- return obj && obj.__esModule ? obj : {
20
- default: obj
21
- };
22
- }
23
- const _default = (0, _elements.define)(class ReferenceSubstitution extends _substitution.default {
24
- constructor(context, string, node, breakPoint, targetReference, replacementReference){
25
- super(context, string, node, breakPoint);
26
- this.targetReference = targetReference;
27
- this.replacementReference = replacementReference;
28
- }
29
- getTargetReference() {
30
- return this.targetReference;
31
- }
32
- getReplacementReference() {
33
- return this.replacementReference;
34
- }
35
- getReferenceSubstitutionNode() {
36
- const node = this.getNode(), referenceSubstitution = node; ///
37
- return referenceSubstitution;
38
- }
39
- getTargetNode() {
40
- const targetReferenceNode = this.targetReference.getNode(), tergetNode = targetReferenceNode; ///
41
- return tergetNode;
42
- }
43
- getReplacementNode() {
44
- const replacementReferenceNode = this.replacementReference.getNode(), replacementNode = replacementReferenceNode; ///
45
- return replacementNode;
46
- }
47
- getMetavariableNode() {
48
- return this.targetReference.getMetavariableNode();
49
- }
50
- isTrivial() {
51
- const targetReferenceEqualToReplacementReference = this.targetReference.isEqualTo(this.replacementReference), trivial = targetReferenceEqualToReplacementReference; ///
52
- return trivial;
53
- }
54
- matchMetavariableNode(metavariableNode) {
55
- return this.targetReference.matchMetavariableNode(metavariableNode);
56
- }
57
- compareReference(reference, context) {
58
- const referenceEqualToReplacementReference = this.replacementReference.isEqualTo(reference), comparedToReference = referenceEqualToReplacementReference; ///
59
- return comparedToReference;
60
- }
61
- compareParameter(parameter) {
62
- const targetReferenceComparesToParameter = this.targetReference.compareParameter(parameter), comparesToParameter = targetReferenceComparesToParameter; ///
63
- return comparesToParameter;
64
- }
65
- compareSubstitution(substitution) {
66
- let substitutionCompares = false;
67
- const substitutionReferenceSubstitution = substitution instanceof ReferenceSubstitution;
68
- if (substitutionReferenceSubstitution) {
69
- const substitutionNode = substitution.getNode(), substitutionNodeMatches = this.matchNode(substitutionNode);
70
- if (substitutionNodeMatches) {
71
- substitutionCompares = true;
72
- }
73
- }
74
- return substitutionCompares;
75
- }
76
- validate(context) {
77
- let referenceSubstitution = null;
78
- const referenceSubstitutionString = this.getString(); ///
79
- context.trace(`Validating the '${referenceSubstitutionString}' reference substitution...`);
80
- let validates = false;
81
- const validSubstitution = this.findValidSubstitution(context);
82
- if (validSubstitution) {
83
- validates = true;
84
- referenceSubstitution = validSubstitution; ///
85
- context.debug(`...the '${referenceSubstitutionString}' reference substitution is already valid.`);
86
- } else {
87
- const generalContext = this.getGeneralContext(), specificContext = this.getSpecificContext();
88
- (0, _context.attempts)((generalContext, specificContext)=>{
89
- const targetReferenceValidates = this.validateTargetReference(generalContext, specificContext);
90
- if (targetReferenceValidates) {
91
- const replacementReferenceValidates = this.validateReplacementReference(generalContext, specificContext);
92
- if (replacementReferenceValidates) {
93
- validates = true;
94
- }
95
- }
96
- if (validates) {
97
- this.commit(generalContext, specificContext);
98
- }
99
- }, generalContext, specificContext);
100
- if (validates) {
101
- const substitution = this; ///
102
- referenceSubstitution = substitution; ///
103
- context.addSubstitution(substitution);
104
- }
105
- }
106
- if (validates) {
107
- context.debug(`...validated the '${referenceSubstitutionString}' reference substitution.`);
108
- }
109
- return referenceSubstitution;
110
- }
111
- validateTargetReference(generalContext, specificContext) {
112
- let targetReferenceValidates = false;
113
- const context = generalContext, referenceSubstitutionString = this.getString(); ///
114
- context.trace(`Validating the '${referenceSubstitutionString}' reference substitution's target reference...`);
115
- (0, _context.manifest)((context)=>{
116
- (0, _context.elide)((context)=>{
117
- const targetReference = this.targetReference.validate(context);
118
- if (targetReference !== null) {
119
- targetReferenceValidates = true;
120
- }
121
- }, context);
122
- }, specificContext, context);
123
- if (targetReferenceValidates) {
124
- context.debug(`...validated the '${referenceSubstitutionString}' reference substitution's target reference...`);
125
- }
126
- return targetReferenceValidates;
127
- }
128
- validateReplacementReference(generalContext, specificContext) {
129
- let replacementReferenceValidates = false;
130
- const context = specificContext, referenceSubstitutionString = this.getString(); ///
131
- context.trace(`Validating the '${referenceSubstitutionString}' reference substitution's replacement reference...`);
132
- (0, _context.elide)((context)=>{
133
- const replacementReference = this.replacementReference.validate(context);
134
- if (replacementReference !== null) {
135
- replacementReferenceValidates = true;
136
- }
137
- }, context);
138
- if (replacementReferenceValidates) {
139
- context.debug(`...validated the '${referenceSubstitutionString}' reference substitution's replacement reference.`);
140
- }
141
- return replacementReferenceValidates;
142
- }
143
- static name = "ReferenceSubstitution";
144
- static fromJSON(json, context) {
145
- let referenceSubstitutionn = null;
146
- const { name } = json;
147
- if (this.name === name) {
148
- (0, _context.instantiate)((context)=>{
149
- (0, _context.unserialises)((json, generalContext, specificContext)=>{
150
- const { string } = json, referenceSubstitutionNode = (0, _instantiate.instantiateReferenceSubstitution)(string, context), node = referenceSubstitutionNode, breakPoint = (0, _breakPoint.breakPointFromJSON)(json), targetReference = targetReferenceFromReferenceSubstitutionNode(referenceSubstitutionNode, generalContext), replacementReference = replacementReferenceFromReferenceSubstitutionNode(referenceSubstitutionNode, specificContext), contexts = [
151
- generalContext,
152
- specificContext
153
- ];
154
- referenceSubstitutionn = new ReferenceSubstitution(contexts, string, node, breakPoint, targetReference, replacementReference);
155
- }, json, context);
156
- }, context);
157
- }
158
- return referenceSubstitutionn;
159
- }
160
- static fromReferenceAndMetavariable(reference, metavariable, generalContext, specificContext) {
161
- let referenceSubstitution;
162
- (0, _context.ablates)((generalContext, specificContext)=>{
163
- const context = specificContext; ///
164
- (0, _context.instantiate)((context)=>{
165
- const specificContext = context, referenceSubstitutionString = (0, _string.referenceSubstitutionStringFromReferenceAndMetavariable)(reference, metavariable), string = referenceSubstitutionString, referenceSubstitutionNode = (0, _instantiate.instantiateReferenceSubstitution)(string, context);
166
- referenceSubstitution = (0, _element.referenceSubstitutionFromReferenceSubstitutionNode)(referenceSubstitutionNode, generalContext, specificContext);
167
- }, context);
168
- }, generalContext, specificContext);
169
- return referenceSubstitution;
170
- }
171
- static fromAssumptionAndMetaLevelAssumption(assumption, metaLevelAssumption, generalContext, specificContext) {
172
- let referenceSubstitution;
173
- (0, _context.ablates)((generalContext, specificContext)=>{
174
- const context = specificContext; ///
175
- (0, _context.instantiate)((context)=>{
176
- const specificContext = context, metavariable = assumption.getMetavariable(), reference = metaLevelAssumption.getReference(), referenceSubstitutionString = (0, _string.referenceSubstitutionStringFromReferenceAndMetavariable)(reference, metavariable), string = referenceSubstitutionString, referenceSubstitutionNode = (0, _instantiate.instantiateReferenceSubstitution)(string, context);
177
- referenceSubstitution = (0, _element.referenceSubstitutionFromReferenceSubstitutionNode)(referenceSubstitutionNode, generalContext, specificContext);
178
- }, context);
179
- }, generalContext, specificContext);
180
- return referenceSubstitution;
181
- }
182
- });
183
- function targetReferenceFromReferenceSubstitutionNode(referenceSubstitutionNode, generalContext) {
184
- const targetReferenceNode = referenceSubstitutionNode.getTargetReferenceNode(), targetReference = generalContext.findReferenceByReferenceNode(targetReferenceNode);
185
- return targetReference;
186
- }
187
- function replacementReferenceFromReferenceSubstitutionNode(referenceSubstitutionNode, specificContext) {
188
- const replacementReferenceNode = referenceSubstitutionNode.getReplacementReferenceNode(), replacementReference = specificContext.findReferenceByReferenceNode(replacementReferenceNode);
189
- return replacementReference;
190
- }
191
-
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L3N1YnN0aXR1dGlvbi9yZWZlcmVuY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBTdWJzdGl0dXRpb24gZnJvbSBcIi4uL3N1YnN0aXR1dGlvblwiO1xuXG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IGJyZWFrUG9pbnRGcm9tSlNPTiB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvYnJlYWtQb2ludFwiO1xuaW1wb3J0IHsgaW5zdGFudGlhdGVSZWZlcmVuY2VTdWJzdGl0dXRpb24gfSBmcm9tIFwiLi4vLi4vcHJvY2Vzcy9pbnN0YW50aWF0ZVwiO1xuaW1wb3J0IHsgcmVmZXJlbmNlU3Vic3RpdHV0aW9uRnJvbVJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2VsZW1lbnRcIjtcbmltcG9ydCB7IHJlZmVyZW5jZVN1YnN0aXR1dGlvblN0cmluZ0Zyb21SZWZlcmVuY2VBbmRNZXRhdmFyaWFibGUgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL3N0cmluZ1wiO1xuaW1wb3J0IHsgZWxpZGUsIGFibGF0ZXMsIG1hbmlmZXN0LCBhdHRlbXB0cywgaW5zdGFudGlhdGUsIHVuc2VyaWFsaXNlcyB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvY29udGV4dFwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmUoY2xhc3MgUmVmZXJlbmNlU3Vic3RpdHV0aW9uIGV4dGVuZHMgU3Vic3RpdHV0aW9uIHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCB0YXJnZXRSZWZlcmVuY2UsIHJlcGxhY2VtZW50UmVmZXJlbmNlKSB7XG4gICAgc3VwZXIoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50KTtcblxuICAgIHRoaXMudGFyZ2V0UmVmZXJlbmNlID0gdGFyZ2V0UmVmZXJlbmNlO1xuICAgIHRoaXMucmVwbGFjZW1lbnRSZWZlcmVuY2UgPSByZXBsYWNlbWVudFJlZmVyZW5jZTtcbiAgfVxuXG4gIGdldFRhcmdldFJlZmVyZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXRSZWZlcmVuY2U7XG4gIH1cblxuICBnZXRSZXBsYWNlbWVudFJlZmVyZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlbWVudFJlZmVyZW5jZTtcbiAgfVxuXG4gIGdldFJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIHJlZmVyZW5jZVN1YnN0aXR1dGlvbiA9IG5vZGU7IC8vL1xuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVN1YnN0aXR1dGlvbjtcbiAgfVxuXG4gIGdldFRhcmdldE5vZGUoKSB7XG4gICAgY29uc3QgdGFyZ2V0UmVmZXJlbmNlTm9kZSA9IHRoaXMudGFyZ2V0UmVmZXJlbmNlLmdldE5vZGUoKSxcbiAgICAgICAgICB0ZXJnZXROb2RlID0gdGFyZ2V0UmVmZXJlbmNlTm9kZTsgLy8vXG5cbiAgICByZXR1cm4gdGVyZ2V0Tm9kZTtcbiAgfVxuXG4gIGdldFJlcGxhY2VtZW50Tm9kZSgpIHtcbiAgICBjb25zdCByZXBsYWNlbWVudFJlZmVyZW5jZU5vZGUgPSB0aGlzLnJlcGxhY2VtZW50UmVmZXJlbmNlLmdldE5vZGUoKSxcbiAgICAgICAgICByZXBsYWNlbWVudE5vZGUgPSByZXBsYWNlbWVudFJlZmVyZW5jZU5vZGU7IC8vL1xuXG4gICAgcmV0dXJuIHJlcGxhY2VtZW50Tm9kZTtcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZU5vZGUoKSB7IHJldHVybiB0aGlzLnRhcmdldFJlZmVyZW5jZS5nZXRNZXRhdmFyaWFibGVOb2RlKCk7IH1cblxuICBpc1RyaXZpYWwoKSB7XG4gICAgY29uc3QgdGFyZ2V0UmVmZXJlbmNlRXF1YWxUb1JlcGxhY2VtZW50UmVmZXJlbmNlID0gdGhpcy50YXJnZXRSZWZlcmVuY2UuaXNFcXVhbFRvKHRoaXMucmVwbGFjZW1lbnRSZWZlcmVuY2UpLFxuICAgICAgICAgIHRyaXZpYWwgPSB0YXJnZXRSZWZlcmVuY2VFcXVhbFRvUmVwbGFjZW1lbnRSZWZlcmVuY2U7IC8vL1xuXG4gICAgcmV0dXJuIHRyaXZpYWw7XG4gIH1cblxuICBtYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkgeyByZXR1cm4gdGhpcy50YXJnZXRSZWZlcmVuY2UubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpOyB9XG5cbiAgY29tcGFyZVJlZmVyZW5jZShyZWZlcmVuY2UsIGNvbnRleHQpIHtcbiAgICBjb25zdCByZWZlcmVuY2VFcXVhbFRvUmVwbGFjZW1lbnRSZWZlcmVuY2UgPSB0aGlzLnJlcGxhY2VtZW50UmVmZXJlbmNlLmlzRXF1YWxUbyhyZWZlcmVuY2UpLFxuICAgICAgICAgIGNvbXBhcmVkVG9SZWZlcmVuY2UgPSByZWZlcmVuY2VFcXVhbFRvUmVwbGFjZW1lbnRSZWZlcmVuY2U7IC8vL1xuXG4gICAgcmV0dXJuIGNvbXBhcmVkVG9SZWZlcmVuY2U7XG4gIH1cblxuICBjb21wYXJlUGFyYW1ldGVyKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IHRhcmdldFJlZmVyZW5jZUNvbXBhcmVzVG9QYXJhbWV0ZXIgPSB0aGlzLnRhcmdldFJlZmVyZW5jZS5jb21wYXJlUGFyYW1ldGVyKHBhcmFtZXRlciksXG4gICAgICAgICAgY29tcGFyZXNUb1BhcmFtZXRlciA9IHRhcmdldFJlZmVyZW5jZUNvbXBhcmVzVG9QYXJhbWV0ZXI7ICAvLy9cblxuICAgIHJldHVybiBjb21wYXJlc1RvUGFyYW1ldGVyO1xuICB9XG5cbiAgY29tcGFyZVN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICBsZXQgc3Vic3RpdHV0aW9uQ29tcGFyZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN1YnN0aXR1dGlvblJlZmVyZW5jZVN1YnN0aXR1dGlvbiA9IChzdWJzdGl0dXRpb24gaW5zdGFuY2VvZiBSZWZlcmVuY2VTdWJzdGl0dXRpb24pO1xuXG4gICAgaWYgKHN1YnN0aXR1dGlvblJlZmVyZW5jZVN1YnN0aXR1dGlvbikge1xuICAgICAgY29uc3Qgc3Vic3RpdHV0aW9uTm9kZSA9IHN1YnN0aXR1dGlvbi5nZXROb2RlKCksXG4gICAgICAgICAgICBzdWJzdGl0dXRpb25Ob2RlTWF0Y2hlcyA9IHRoaXMubWF0Y2hOb2RlKHN1YnN0aXR1dGlvbk5vZGUpO1xuXG4gICAgICBpZiAoc3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgc3Vic3RpdHV0aW9uQ29tcGFyZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdWJzdGl0dXRpb25Db21wYXJlcztcbiAgfVxuXG4gIHZhbGlkYXRlKGNvbnRleHQpIHtcbiAgICBsZXQgcmVmZXJlbmNlU3Vic3RpdHV0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IHJlZmVyZW5jZVN1YnN0aXR1dGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3JlZmVyZW5jZVN1YnN0aXR1dGlvblN0cmluZ30nIHJlZmVyZW5jZSBzdWJzdGl0dXRpb24uLi5gKTtcblxuICAgIGxldCB2YWxpZGF0ZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHZhbGlkU3Vic3RpdHV0aW9uID0gdGhpcy5maW5kVmFsaWRTdWJzdGl0dXRpb24oY29udGV4dCk7XG5cbiAgICBpZiAodmFsaWRTdWJzdGl0dXRpb24pIHtcbiAgICAgIHZhbGlkYXRlcyA9IHRydWU7XG5cbiAgICAgIHJlZmVyZW5jZVN1YnN0aXR1dGlvbiA9IHZhbGlkU3Vic3RpdHV0aW9uOyAgLy8vXG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnRoZSAnJHtyZWZlcmVuY2VTdWJzdGl0dXRpb25TdHJpbmd9JyByZWZlcmVuY2Ugc3Vic3RpdHV0aW9uIGlzIGFscmVhZHkgdmFsaWQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdlbmVyYWxDb250ZXh0ID0gdGhpcy5nZXRHZW5lcmFsQ29udGV4dCgpLFxuICAgICAgICAgICAgc3BlY2lmaWNDb250ZXh0ID0gdGhpcy5nZXRTcGVjaWZpY0NvbnRleHQoKTtcblxuICAgICAgYXR0ZW1wdHMoKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UmVmZXJlbmNlVmFsaWRhdGVzID0gdGhpcy52YWxpZGF0ZVRhcmdldFJlZmVyZW5jZShnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgICBpZiAodGFyZ2V0UmVmZXJlbmNlVmFsaWRhdGVzKSB7XG4gICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnRSZWZlcmVuY2VWYWxpZGF0ZXMgPSB0aGlzLnZhbGlkYXRlUmVwbGFjZW1lbnRSZWZlcmVuY2UoZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgICAgICBpZiAocmVwbGFjZW1lbnRSZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlcyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbGlkYXRlcykge1xuICAgICAgICAgIHRoaXMuY29tbWl0KGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgaWYgKHZhbGlkYXRlcykge1xuICAgICAgICBjb25zdCBzdWJzdGl0dXRpb24gPSB0aGlzOyAgLy8vXG5cbiAgICAgICAgcmVmZXJlbmNlU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uOyAgLy8vXG5cbiAgICAgICAgY29udGV4dC5hZGRTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3JlZmVyZW5jZVN1YnN0aXR1dGlvblN0cmluZ30nIHJlZmVyZW5jZSBzdWJzdGl0dXRpb24uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVN1YnN0aXR1dGlvbjtcbiAgfVxuXG4gIHZhbGlkYXRlVGFyZ2V0UmVmZXJlbmNlKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBsZXQgdGFyZ2V0UmVmZXJlbmNlVmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhbENvbnRleHQsIC8vL1xuICAgICAgICAgIHJlZmVyZW5jZVN1YnN0aXR1dGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3JlZmVyZW5jZVN1YnN0aXR1dGlvblN0cmluZ30nIHJlZmVyZW5jZSBzdWJzdGl0dXRpb24ncyB0YXJnZXQgcmVmZXJlbmNlLi4uYCk7XG5cbiAgICBtYW5pZmVzdCgoY29udGV4dCkgPT4ge1xuICAgICAgZWxpZGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UmVmZXJlbmNlID0gdGhpcy50YXJnZXRSZWZlcmVuY2UudmFsaWRhdGUoY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFJlZmVyZW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRhcmdldFJlZmVyZW5jZVZhbGlkYXRlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH0sIHNwZWNpZmljQ29udGV4dCwgY29udGV4dCk7XG5cbiAgICBpZiAodGFyZ2V0UmVmZXJlbmNlVmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3JlZmVyZW5jZVN1YnN0aXR1dGlvblN0cmluZ30nIHJlZmVyZW5jZSBzdWJzdGl0dXRpb24ncyB0YXJnZXQgcmVmZXJlbmNlLi4uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFJlZmVyZW5jZVZhbGlkYXRlcztcbiAgfVxuXG4gIHZhbGlkYXRlUmVwbGFjZW1lbnRSZWZlcmVuY2UoZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICAgIGxldCByZXBsYWNlbWVudFJlZmVyZW5jZVZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIHJlZmVyZW5jZVN1YnN0aXR1dGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3JlZmVyZW5jZVN1YnN0aXR1dGlvblN0cmluZ30nIHJlZmVyZW5jZSBzdWJzdGl0dXRpb24ncyByZXBsYWNlbWVudCByZWZlcmVuY2UuLi5gKTtcblxuICAgIGVsaWRlKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudFJlZmVyZW5jZSA9IHRoaXMucmVwbGFjZW1lbnRSZWZlcmVuY2UudmFsaWRhdGUoY29udGV4dCk7XG5cbiAgICAgIGlmIChyZXBsYWNlbWVudFJlZmVyZW5jZSAhPT0gbnVsbCkge1xuICAgICAgICByZXBsYWNlbWVudFJlZmVyZW5jZVZhbGlkYXRlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICBpZiAocmVwbGFjZW1lbnRSZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7cmVmZXJlbmNlU3Vic3RpdHV0aW9uU3RyaW5nfScgcmVmZXJlbmNlIHN1YnN0aXR1dGlvbidzIHJlcGxhY2VtZW50IHJlZmVyZW5jZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVwbGFjZW1lbnRSZWZlcmVuY2VWYWxpZGF0ZXM7XG4gIH1cblxuICBzdGF0aWMgbmFtZSA9IFwiUmVmZXJlbmNlU3Vic3RpdHV0aW9uXCI7XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICBsZXQgcmVmZXJlbmNlU3Vic3RpdHV0aW9ubiA9IG51bGw7XG5cbiAgICBjb25zdCB7IG5hbWUgfSA9IGpzb247XG5cbiAgICBpZiAodGhpcy5uYW1lID09PSBuYW1lKSB7XG4gICAgICBpbnN0YW50aWF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgICB1bnNlcmlhbGlzZXMoKGpzb24sIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHN0cmluZyB9ID0ganNvbixcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VTdWJzdGl0dXRpb25Ob2RlID0gaW5zdGFudGlhdGVSZWZlcmVuY2VTdWJzdGl0dXRpb24oc3RyaW5nLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgICBub2RlID0gcmVmZXJlbmNlU3Vic3RpdHV0aW9uTm9kZSwgLy8vXG4gICAgICAgICAgICAgICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRGcm9tSlNPTihqc29uKSxcbiAgICAgICAgICAgICAgICB0YXJnZXRSZWZlcmVuY2UgPSB0YXJnZXRSZWZlcmVuY2VGcm9tUmVmZXJlbmNlU3Vic3RpdHV0aW9uTm9kZShyZWZlcmVuY2VTdWJzdGl0dXRpb25Ob2RlLCBnZW5lcmFsQ29udGV4dCksXG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRSZWZlcmVuY2UgPSByZXBsYWNlbWVudFJlZmVyZW5jZUZyb21SZWZlcmVuY2VTdWJzdGl0dXRpb25Ob2RlKHJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUsIHNwZWNpZmljQ29udGV4dCksXG4gICAgICAgICAgICAgICAgY29udGV4dHMgPSBbXG4gICAgICAgICAgICAgICAgICBnZW5lcmFsQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgIHNwZWNpZmljQ29udGV4dFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICByZWZlcmVuY2VTdWJzdGl0dXRpb25uID0gbmV3IFJlZmVyZW5jZVN1YnN0aXR1dGlvbihjb250ZXh0cywgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCB0YXJnZXRSZWZlcmVuY2UsIHJlcGxhY2VtZW50UmVmZXJlbmNlKTtcbiAgICAgICAgfSwganNvbiwgY29udGV4dCk7XG4gICAgICB9LCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlU3Vic3RpdHV0aW9ubjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUmVmZXJlbmNlQW5kTWV0YXZhcmlhYmxlKHJlZmVyZW5jZSwgbWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSB7XG4gICAgbGV0IHJlZmVyZW5jZVN1YnN0aXR1dGlvbjtcblxuICAgIGFibGF0ZXMoKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQ7ICAvLy9cblxuICAgICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3Qgc3BlY2lmaWNDb250ZXh0ID0gY29udGV4dCwgIC8vL1xuICAgICAgICAgICAgICByZWZlcmVuY2VTdWJzdGl0dXRpb25TdHJpbmcgPSByZWZlcmVuY2VTdWJzdGl0dXRpb25TdHJpbmdGcm9tUmVmZXJlbmNlQW5kTWV0YXZhcmlhYmxlKHJlZmVyZW5jZSwgbWV0YXZhcmlhYmxlKSxcbiAgICAgICAgICAgICAgc3RyaW5nID0gcmVmZXJlbmNlU3Vic3RpdHV0aW9uU3RyaW5nLCAgLy8vXG4gICAgICAgICAgICAgIHJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUgPSBpbnN0YW50aWF0ZVJlZmVyZW5jZVN1YnN0aXR1dGlvbihzdHJpbmcsIGNvbnRleHQpO1xuXG4gICAgICAgIHJlZmVyZW5jZVN1YnN0aXR1dGlvbiA9IHJlZmVyZW5jZVN1YnN0aXR1dGlvbkZyb21SZWZlcmVuY2VTdWJzdGl0dXRpb25Ob2RlKHJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlU3Vic3RpdHV0aW9uO1xuICB9XG5cbiAgc3RhdGljIGZyb21Bc3N1bXB0aW9uQW5kTWV0YUxldmVsQXNzdW1wdGlvbihhc3N1bXB0aW9uLCBtZXRhTGV2ZWxBc3N1bXB0aW9uLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSB7XG4gICAgbGV0IHJlZmVyZW5jZVN1YnN0aXR1dGlvbjtcblxuICAgIGFibGF0ZXMoKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQ7ICAvLy9cblxuICAgICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3Qgc3BlY2lmaWNDb250ZXh0ID0gY29udGV4dCwgIC8vL1xuICAgICAgICAgICAgICBtZXRhdmFyaWFibGUgPSBhc3N1bXB0aW9uLmdldE1ldGF2YXJpYWJsZSgpLFxuICAgICAgICAgICAgICByZWZlcmVuY2UgPSBtZXRhTGV2ZWxBc3N1bXB0aW9uLmdldFJlZmVyZW5jZSgpLFxuICAgICAgICAgICAgICByZWZlcmVuY2VTdWJzdGl0dXRpb25TdHJpbmcgPSByZWZlcmVuY2VTdWJzdGl0dXRpb25TdHJpbmdGcm9tUmVmZXJlbmNlQW5kTWV0YXZhcmlhYmxlKHJlZmVyZW5jZSwgbWV0YXZhcmlhYmxlKSxcbiAgICAgICAgICAgICAgc3RyaW5nID0gcmVmZXJlbmNlU3Vic3RpdHV0aW9uU3RyaW5nLCAgLy8vXG4gICAgICAgICAgICAgIHJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUgPSBpbnN0YW50aWF0ZVJlZmVyZW5jZVN1YnN0aXR1dGlvbihzdHJpbmcsIGNvbnRleHQpO1xuXG4gICAgICAgIHJlZmVyZW5jZVN1YnN0aXR1dGlvbiA9IHJlZmVyZW5jZVN1YnN0aXR1dGlvbkZyb21SZWZlcmVuY2VTdWJzdGl0dXRpb25Ob2RlKHJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlU3Vic3RpdHV0aW9uO1xuICB9XG59KTtcblxuZnVuY3Rpb24gdGFyZ2V0UmVmZXJlbmNlRnJvbVJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUocmVmZXJlbmNlU3Vic3RpdHV0aW9uTm9kZSwgZ2VuZXJhbENvbnRleHQpIHtcbiAgY29uc3QgdGFyZ2V0UmVmZXJlbmNlTm9kZSA9IHJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUuZ2V0VGFyZ2V0UmVmZXJlbmNlTm9kZSgpLFxuICAgICAgICB0YXJnZXRSZWZlcmVuY2UgPSBnZW5lcmFsQ29udGV4dC5maW5kUmVmZXJlbmNlQnlSZWZlcmVuY2VOb2RlKHRhcmdldFJlZmVyZW5jZU5vZGUpO1xuXG4gIHJldHVybiB0YXJnZXRSZWZlcmVuY2U7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VtZW50UmVmZXJlbmNlRnJvbVJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUocmVmZXJlbmNlU3Vic3RpdHV0aW9uTm9kZSwgc3BlY2lmaWNDb250ZXh0KSB7XG4gIGNvbnN0IHJlcGxhY2VtZW50UmVmZXJlbmNlTm9kZSA9IHJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUuZ2V0UmVwbGFjZW1lbnRSZWZlcmVuY2VOb2RlKCksXG4gICAgICAgIHJlcGxhY2VtZW50UmVmZXJlbmNlID0gc3BlY2lmaWNDb250ZXh0LmZpbmRSZWZlcmVuY2VCeVJlZmVyZW5jZU5vZGUocmVwbGFjZW1lbnRSZWZlcmVuY2VOb2RlKTtcblxuICByZXR1cm4gcmVwbGFjZW1lbnRSZWZlcmVuY2U7XG59XG4iXSwibmFtZXMiOlsiZGVmaW5lIiwiUmVmZXJlbmNlU3Vic3RpdHV0aW9uIiwiU3Vic3RpdHV0aW9uIiwiY29udGV4dCIsInN0cmluZyIsIm5vZGUiLCJicmVha1BvaW50IiwidGFyZ2V0UmVmZXJlbmNlIiwicmVwbGFjZW1lbnRSZWZlcmVuY2UiLCJnZXRUYXJnZXRSZWZlcmVuY2UiLCJnZXRSZXBsYWNlbWVudFJlZmVyZW5jZSIsImdldFJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUiLCJnZXROb2RlIiwicmVmZXJlbmNlU3Vic3RpdHV0aW9uIiwiZ2V0VGFyZ2V0Tm9kZSIsInRhcmdldFJlZmVyZW5jZU5vZGUiLCJ0ZXJnZXROb2RlIiwiZ2V0UmVwbGFjZW1lbnROb2RlIiwicmVwbGFjZW1lbnRSZWZlcmVuY2VOb2RlIiwicmVwbGFjZW1lbnROb2RlIiwiZ2V0TWV0YXZhcmlhYmxlTm9kZSIsImlzVHJpdmlhbCIsInRhcmdldFJlZmVyZW5jZUVxdWFsVG9SZXBsYWNlbWVudFJlZmVyZW5jZSIsImlzRXF1YWxUbyIsInRyaXZpYWwiLCJtYXRjaE1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwiY29tcGFyZVJlZmVyZW5jZSIsInJlZmVyZW5jZSIsInJlZmVyZW5jZUVxdWFsVG9SZXBsYWNlbWVudFJlZmVyZW5jZSIsImNvbXBhcmVkVG9SZWZlcmVuY2UiLCJjb21wYXJlUGFyYW1ldGVyIiwicGFyYW1ldGVyIiwidGFyZ2V0UmVmZXJlbmNlQ29tcGFyZXNUb1BhcmFtZXRlciIsImNvbXBhcmVzVG9QYXJhbWV0ZXIiLCJjb21wYXJlU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uQ29tcGFyZXMiLCJzdWJzdGl0dXRpb25SZWZlcmVuY2VTdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaE5vZGUiLCJ2YWxpZGF0ZSIsInJlZmVyZW5jZVN1YnN0aXR1dGlvblN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwidmFsaWRhdGVzIiwidmFsaWRTdWJzdGl0dXRpb24iLCJmaW5kVmFsaWRTdWJzdGl0dXRpb24iLCJkZWJ1ZyIsImdlbmVyYWxDb250ZXh0IiwiZ2V0R2VuZXJhbENvbnRleHQiLCJzcGVjaWZpY0NvbnRleHQiLCJnZXRTcGVjaWZpY0NvbnRleHQiLCJhdHRlbXB0cyIsInRhcmdldFJlZmVyZW5jZVZhbGlkYXRlcyIsInZhbGlkYXRlVGFyZ2V0UmVmZXJlbmNlIiwicmVwbGFjZW1lbnRSZWZlcmVuY2VWYWxpZGF0ZXMiLCJ2YWxpZGF0ZVJlcGxhY2VtZW50UmVmZXJlbmNlIiwiY29tbWl0IiwiYWRkU3Vic3RpdHV0aW9uIiwibWFuaWZlc3QiLCJlbGlkZSIsIm5hbWUiLCJmcm9tSlNPTiIsImpzb24iLCJyZWZlcmVuY2VTdWJzdGl0dXRpb25uIiwiaW5zdGFudGlhdGUiLCJ1bnNlcmlhbGlzZXMiLCJyZWZlcmVuY2VTdWJzdGl0dXRpb25Ob2RlIiwiaW5zdGFudGlhdGVSZWZlcmVuY2VTdWJzdGl0dXRpb24iLCJicmVha1BvaW50RnJvbUpTT04iLCJ0YXJnZXRSZWZlcmVuY2VGcm9tUmVmZXJlbmNlU3Vic3RpdHV0aW9uTm9kZSIsInJlcGxhY2VtZW50UmVmZXJlbmNlRnJvbVJlZmVyZW5jZVN1YnN0aXR1dGlvbk5vZGUiLCJjb250ZXh0cyIsImZyb21SZWZlcmVuY2VBbmRNZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGUiLCJhYmxhdGVzIiwicmVmZXJlbmNlU3Vic3RpdHV0aW9uU3RyaW5nRnJvbVJlZmVyZW5jZUFuZE1ldGF2YXJpYWJsZSIsInJlZmVyZW5jZVN1YnN0aXR1dGlvbkZyb21SZWZlcmVuY2VTdWJzdGl0dXRpb25Ob2RlIiwiZnJvbUFzc3VtcHRpb25BbmRNZXRhTGV2ZWxBc3N1bXB0aW9uIiwiYXNzdW1wdGlvbiIsIm1ldGFMZXZlbEFzc3VtcHRpb24iLCJnZXRNZXRhdmFyaWFibGUiLCJnZXRSZWZlcmVuY2UiLCJnZXRUYXJnZXRSZWZlcmVuY2VOb2RlIiwiZmluZFJlZmVyZW5jZUJ5UmVmZXJlbmNlTm9kZSIsImdldFJlcGxhY2VtZW50UmVmZXJlbmNlTm9kZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBV0E7OztlQUFBOzs7cUVBVHlCOzBCQUVGOzRCQUNZOzZCQUNjO3lCQUNrQjt3QkFDSzt5QkFDTTs7Ozs7O01BRTlFLFdBQWVBLElBQUFBLGdCQUFNLEVBQUMsTUFBTUMsOEJBQThCQyxxQkFBWTtJQUNwRSxZQUFZQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxVQUFVLEVBQUVDLGVBQWUsRUFBRUMsb0JBQW9CLENBQUU7UUFDcEYsS0FBSyxDQUFDTCxTQUFTQyxRQUFRQyxNQUFNQztRQUU3QixJQUFJLENBQUNDLGVBQWUsR0FBR0E7UUFDdkIsSUFBSSxDQUFDQyxvQkFBb0IsR0FBR0E7SUFDOUI7SUFFQUMscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDRixlQUFlO0lBQzdCO0lBRUFHLDBCQUEwQjtRQUN4QixPQUFPLElBQUksQ0FBQ0Ysb0JBQW9CO0lBQ2xDO0lBRUFHLCtCQUErQjtRQUM3QixNQUFNTixPQUFPLElBQUksQ0FBQ08sT0FBTyxJQUNuQkMsd0JBQXdCUixNQUFNLEdBQUc7UUFFdkMsT0FBT1E7SUFDVDtJQUVBQyxnQkFBZ0I7UUFDZCxNQUFNQyxzQkFBc0IsSUFBSSxDQUFDUixlQUFlLENBQUNLLE9BQU8sSUFDbERJLGFBQWFELHFCQUFxQixHQUFHO1FBRTNDLE9BQU9DO0lBQ1Q7SUFFQUMscUJBQXFCO1FBQ25CLE1BQU1DLDJCQUEyQixJQUFJLENBQUNWLG9CQUFvQixDQUFDSSxPQUFPLElBQzVETyxrQkFBa0JELDBCQUEwQixHQUFHO1FBRXJELE9BQU9DO0lBQ1Q7SUFFQUMsc0JBQXNCO1FBQUUsT0FBTyxJQUFJLENBQUNiLGVBQWUsQ0FBQ2EsbUJBQW1CO0lBQUk7SUFFM0VDLFlBQVk7UUFDVixNQUFNQyw2Q0FBNkMsSUFBSSxDQUFDZixlQUFl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