query.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.transformQueryInputToParse = exports.transformQueryConstraintInputToParse = void 0;
  6. var _graphqlRelay = require("graphql-relay");
  7. function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
  8. function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
  9. function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
  10. function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
  11. function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
  12. const parseQueryMap = {
  13. OR: '$or',
  14. AND: '$and',
  15. NOR: '$nor'
  16. };
  17. const parseConstraintMap = {
  18. equalTo: '$eq',
  19. notEqualTo: '$ne',
  20. lessThan: '$lt',
  21. lessThanOrEqualTo: '$lte',
  22. greaterThan: '$gt',
  23. greaterThanOrEqualTo: '$gte',
  24. in: '$in',
  25. notIn: '$nin',
  26. exists: '$exists',
  27. inQueryKey: '$select',
  28. notInQueryKey: '$dontSelect',
  29. inQuery: '$inQuery',
  30. notInQuery: '$notInQuery',
  31. containedBy: '$containedBy',
  32. contains: '$all',
  33. matchesRegex: '$regex',
  34. options: '$options',
  35. text: '$text',
  36. search: '$search',
  37. term: '$term',
  38. language: '$language',
  39. caseSensitive: '$caseSensitive',
  40. diacriticSensitive: '$diacriticSensitive',
  41. nearSphere: '$nearSphere',
  42. maxDistance: '$maxDistance',
  43. maxDistanceInRadians: '$maxDistanceInRadians',
  44. maxDistanceInMiles: '$maxDistanceInMiles',
  45. maxDistanceInKilometers: '$maxDistanceInKilometers',
  46. within: '$within',
  47. box: '$box',
  48. geoWithin: '$geoWithin',
  49. polygon: '$polygon',
  50. centerSphere: '$centerSphere',
  51. geoIntersects: '$geoIntersects',
  52. point: '$point'
  53. };
  54. const transformQueryConstraintInputToParse = (constraints, parentFieldName, className, parentConstraints, parseClasses) => {
  55. const fields = parseClasses[className].fields;
  56. if (parentFieldName === 'id' && className) {
  57. Object.keys(constraints).forEach(constraintName => {
  58. const constraintValue = constraints[constraintName];
  59. if (typeof constraintValue === 'string') {
  60. const globalIdObject = (0, _graphqlRelay.fromGlobalId)(constraintValue);
  61. if (globalIdObject.type === className) {
  62. constraints[constraintName] = globalIdObject.id;
  63. }
  64. } else if (Array.isArray(constraintValue)) {
  65. constraints[constraintName] = constraintValue.map(value => {
  66. const globalIdObject = (0, _graphqlRelay.fromGlobalId)(value);
  67. if (globalIdObject.type === className) {
  68. return globalIdObject.id;
  69. }
  70. return value;
  71. });
  72. }
  73. });
  74. parentConstraints.objectId = constraints;
  75. delete parentConstraints.id;
  76. }
  77. Object.keys(constraints).forEach(fieldName => {
  78. let fieldValue = constraints[fieldName];
  79. if (parseConstraintMap[fieldName]) {
  80. constraints[parseConstraintMap[fieldName]] = constraints[fieldName];
  81. delete constraints[fieldName];
  82. }
  83. /**
  84. * If we have a key-value pair, we need to change the way the constraint is structured.
  85. *
  86. * Example:
  87. * From:
  88. * {
  89. * "someField": {
  90. * "lessThan": {
  91. * "key":"foo.bar",
  92. * "value": 100
  93. * },
  94. * "greaterThan": {
  95. * "key":"foo.bar",
  96. * "value": 10
  97. * }
  98. * }
  99. * }
  100. *
  101. * To:
  102. * {
  103. * "someField.foo.bar": {
  104. * "$lt": 100,
  105. * "$gt": 10
  106. * }
  107. * }
  108. */
  109. if (fieldValue.key && fieldValue.value !== undefined && parentConstraints && parentFieldName) {
  110. delete parentConstraints[parentFieldName];
  111. parentConstraints[`${parentFieldName}.${fieldValue.key}`] = _objectSpread(_objectSpread({}, parentConstraints[`${parentFieldName}.${fieldValue.key}`]), {}, {
  112. [parseConstraintMap[fieldName]]: fieldValue.value
  113. });
  114. } else if (fields[parentFieldName] && (fields[parentFieldName].type === 'Pointer' || fields[parentFieldName].type === 'Relation')) {
  115. const {
  116. targetClass
  117. } = fields[parentFieldName];
  118. if (fieldName === 'exists') {
  119. if (fields[parentFieldName].type === 'Relation') {
  120. const whereTarget = fieldValue ? 'where' : 'notWhere';
  121. if (constraints[whereTarget]) {
  122. if (constraints[whereTarget].objectId) {
  123. constraints[whereTarget].objectId = _objectSpread(_objectSpread({}, constraints[whereTarget].objectId), {}, {
  124. $exists: fieldValue
  125. });
  126. } else {
  127. constraints[whereTarget].objectId = {
  128. $exists: fieldValue
  129. };
  130. }
  131. } else {
  132. const parseWhereTarget = fieldValue ? '$inQuery' : '$notInQuery';
  133. parentConstraints[parentFieldName][parseWhereTarget] = {
  134. where: {
  135. objectId: {
  136. $exists: true
  137. }
  138. },
  139. className: targetClass
  140. };
  141. }
  142. delete constraints.$exists;
  143. } else {
  144. parentConstraints[parentFieldName].$exists = fieldValue;
  145. }
  146. return;
  147. }
  148. switch (fieldName) {
  149. case 'have':
  150. parentConstraints[parentFieldName].$inQuery = {
  151. where: fieldValue,
  152. className: targetClass
  153. };
  154. transformQueryInputToParse(parentConstraints[parentFieldName].$inQuery.where, targetClass, parseClasses);
  155. break;
  156. case 'haveNot':
  157. parentConstraints[parentFieldName].$notInQuery = {
  158. where: fieldValue,
  159. className: targetClass
  160. };
  161. transformQueryInputToParse(parentConstraints[parentFieldName].$notInQuery.where, targetClass, parseClasses);
  162. break;
  163. }
  164. delete constraints[fieldName];
  165. return;
  166. }
  167. switch (fieldName) {
  168. case 'point':
  169. if (typeof fieldValue === 'object' && !fieldValue.__type) {
  170. fieldValue.__type = 'GeoPoint';
  171. }
  172. break;
  173. case 'nearSphere':
  174. if (typeof fieldValue === 'object' && !fieldValue.__type) {
  175. fieldValue.__type = 'GeoPoint';
  176. }
  177. break;
  178. case 'box':
  179. if (typeof fieldValue === 'object' && fieldValue.bottomLeft && fieldValue.upperRight) {
  180. fieldValue = [_objectSpread({
  181. __type: 'GeoPoint'
  182. }, fieldValue.bottomLeft), _objectSpread({
  183. __type: 'GeoPoint'
  184. }, fieldValue.upperRight)];
  185. constraints[parseConstraintMap[fieldName]] = fieldValue;
  186. }
  187. break;
  188. case 'polygon':
  189. if (fieldValue instanceof Array) {
  190. fieldValue.forEach(geoPoint => {
  191. if (typeof geoPoint === 'object' && !geoPoint.__type) {
  192. geoPoint.__type = 'GeoPoint';
  193. }
  194. });
  195. }
  196. break;
  197. case 'centerSphere':
  198. if (typeof fieldValue === 'object' && fieldValue.center && fieldValue.distance) {
  199. fieldValue = [_objectSpread({
  200. __type: 'GeoPoint'
  201. }, fieldValue.center), fieldValue.distance];
  202. constraints[parseConstraintMap[fieldName]] = fieldValue;
  203. }
  204. break;
  205. }
  206. if (typeof fieldValue === 'object') {
  207. if (fieldName === 'where') {
  208. transformQueryInputToParse(fieldValue, className, parseClasses);
  209. } else {
  210. transformQueryConstraintInputToParse(fieldValue, fieldName, className, constraints, parseClasses);
  211. }
  212. }
  213. });
  214. };
  215. exports.transformQueryConstraintInputToParse = transformQueryConstraintInputToParse;
  216. const transformQueryInputToParse = (constraints, className, parseClasses) => {
  217. if (!constraints || typeof constraints !== 'object') {
  218. return;
  219. }
  220. Object.keys(constraints).forEach(fieldName => {
  221. const fieldValue = constraints[fieldName];
  222. if (parseQueryMap[fieldName]) {
  223. delete constraints[fieldName];
  224. fieldName = parseQueryMap[fieldName];
  225. constraints[fieldName] = fieldValue;
  226. fieldValue.forEach(fieldValueItem => {
  227. transformQueryInputToParse(fieldValueItem, className, parseClasses);
  228. });
  229. return;
  230. } else {
  231. transformQueryConstraintInputToParse(fieldValue, fieldName, className, constraints, parseClasses);
  232. }
  233. });
  234. };
  235. exports.transformQueryInputToParse = transformQueryInputToParse;
  236. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ3JhcGhxbFJlbGF5IiwicmVxdWlyZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwicGFyc2VRdWVyeU1hcCIsIk9SIiwiQU5EIiwiTk9SIiwicGFyc2VDb25zdHJhaW50TWFwIiwiZXF1YWxUbyIsIm5vdEVxdWFsVG8iLCJsZXNzVGhhbiIsImxlc3NUaGFuT3JFcXVhbFRvIiwiZ3JlYXRlclRoYW4iLCJncmVhdGVyVGhhbk9yRXF1YWxUbyIsImluIiwibm90SW4iLCJleGlzdHMiLCJpblF1ZXJ5S2V5Iiwibm90SW5RdWVyeUtleSIsImluUXVlcnkiLCJub3RJblF1ZXJ5IiwiY29udGFpbmVkQnkiLCJjb250YWlucyIsIm1hdGNoZXNSZWdleCIsIm9wdGlvbnMiLCJ0ZXh0Iiwic2VhcmNoIiwidGVybSIsImxhbmd1YWdlIiwiY2FzZVNlbnNpdGl2ZSIsImRpYWNyaXRpY1NlbnNpdGl2ZSIsIm5lYXJTcGhlcmUiLCJtYXhEaXN0YW5jZSIsIm1heERpc3RhbmNlSW5SYWRpYW5zIiwibWF4RGlzdGFuY2VJbk1pbGVzIiwibWF4RGlzdGFuY2VJbktpbG9tZXRlcnMiLCJ3aXRoaW4iLCJib3giLCJnZW9XaXRoaW4iLCJwb2x5Z29uIiwiY2VudGVyU3BoZXJlIiwiZ2VvSW50ZXJzZWN0cyIsInBvaW50IiwidHJhbnNmb3JtUXVlcnlDb25zdHJhaW50SW5wdXRUb1BhcnNlIiwiY29uc3RyYWludHMiLCJwYXJlbnRGaWVsZE5hbWUiLCJjbGFzc05hbWUiLCJwYXJlbnRDb25zdHJhaW50cyIsInBhcnNlQ2xhc3NlcyIsImZpZWxkcyIsImNvbnN0cmFpbnROYW1lIiwiY29uc3RyYWludFZhbHVlIiwiZ2xvYmFsSWRPYmplY3QiLCJmcm9tR2xvYmFsSWQiLCJ0eXBlIiwiaWQiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJvYmplY3RJZCIsImZpZWxkTmFtZSIsImZpZWxkVmFsdWUiLCJrZXkiLCJ1bmRlZmluZWQiLCJ0YXJnZXRDbGFzcyIsIndoZXJlVGFyZ2V0IiwiJGV4aXN0cyIsInBhcnNlV2hlcmVUYXJnZXQiLCJ3aGVyZSIsIiRpblF1ZXJ5IiwidHJhbnNmb3JtUXVlcnlJbnB1dFRvUGFyc2UiLCIkbm90SW5RdWVyeSIsIl9fdHlwZSIsImJvdHRvbUxlZnQiLCJ1cHBlclJpZ2h0IiwiZ2VvUG9pbnQiLCJjZW50ZXIiLCJkaXN0YW5jZSIsImV4cG9ydHMiLCJmaWVsZFZhbHVlSXRlbSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML3RyYW5zZm9ybWVycy9xdWVyeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tR2xvYmFsSWQgfSBmcm9tICdncmFwaHFsLXJlbGF5JztcblxuY29uc3QgcGFyc2VRdWVyeU1hcCA9IHtcbiAgT1I6ICckb3InLFxuICBBTkQ6ICckYW5kJyxcbiAgTk9SOiAnJG5vcicsXG59O1xuXG5jb25zdCBwYXJzZUNvbnN0cmFpbnRNYXAgPSB7XG4gIGVxdWFsVG86ICckZXEnLFxuICBub3RFcXVhbFRvOiAnJG5lJyxcbiAgbGVzc1RoYW46ICckbHQnLFxuICBsZXNzVGhhbk9yRXF1YWxUbzogJyRsdGUnLFxuICBncmVhdGVyVGhhbjogJyRndCcsXG4gIGdyZWF0ZXJUaGFuT3JFcXVhbFRvOiAnJGd0ZScsXG4gIGluOiAnJGluJyxcbiAgbm90SW46ICckbmluJyxcbiAgZXhpc3RzOiAnJGV4aXN0cycsXG4gIGluUXVlcnlLZXk6ICckc2VsZWN0JyxcbiAgbm90SW5RdWVyeUtleTogJyRkb250U2VsZWN0JyxcbiAgaW5RdWVyeTogJyRpblF1ZXJ5JyxcbiAgbm90SW5RdWVyeTogJyRub3RJblF1ZXJ5JyxcbiAgY29udGFpbmVkQnk6ICckY29udGFpbmVkQnknLFxuICBjb250YWluczogJyRhbGwnLFxuICBtYXRjaGVzUmVnZXg6ICckcmVnZXgnLFxuICBvcHRpb25zOiAnJG9wdGlvbnMnLFxuICB0ZXh0OiAnJHRleHQnLFxuICBzZWFyY2g6ICckc2VhcmNoJyxcbiAgdGVybTogJyR0ZXJtJyxcbiAgbGFuZ3VhZ2U6ICckbGFuZ3VhZ2UnLFxuICBjYXNlU2Vuc2l0aXZlOiAnJGNhc2VTZW5zaXRpdmUnLFxuICBkaWFjcml0aWNTZW5zaXRpdmU6ICckZGlhY3JpdGljU2Vuc2l0aXZlJyxcbiAgbmVhclNwaGVyZTogJyRuZWFyU3BoZXJlJyxcbiAgbWF4RGlzdGFuY2U6ICckbWF4RGlzdGFuY2UnLFxuICBtYXhEaXN0YW5jZUluUmFkaWFuczogJyRtYXhEaXN0YW5jZUluUmFkaWFucycsXG4gIG1heERpc3RhbmNlSW5NaWxlczogJyRtYXhEaXN0YW5jZUluTWlsZXMnLFxuICBtYXhEaXN0YW5jZUluS2lsb21ldGVyczogJyRtYXhEaXN0YW5jZUluS2lsb21ldGVycycsXG4gIHdpdGhpbjogJyR3aXRoaW4nLFxuICBib3g6ICckYm94JyxcbiAgZ2VvV2l0aGluOiAnJGdlb1dpdGhpbicsXG4gIHBvbHlnb246ICckcG9seWdvbicsXG4gIGNlbnRlclNwaGVyZTogJyRjZW50ZXJTcGhlcmUnLFxuICBnZW9JbnRlcnNlY3RzOiAnJGdlb0ludGVyc2VjdHMnLFxuICBwb2ludDogJyRwb2ludCcsXG59O1xuXG5jb25zdCB0cmFuc2Zvcm1RdWVyeUNvbnN0cmFpbnRJbnB1dFRvUGFyc2UgPSAoXG4gIGNvbnN0cmFpbnRzLFxuICBwYXJlbnRGaWVsZE5hbWUsXG4gIGNsYXNzTmFtZSxcbiAgcGFyZW50Q29uc3RyYWludHMsXG4gIHBhcnNlQ2xhc3Nlc1xuKSA9PiB7XG4gIGNvbnN0IGZpZWxkcyA9IHBhcnNlQ2xhc3Nlc1tjbGFzc05hbWVdLmZpZWxkcztcbiAgaWYgKHBhcmVudEZpZWxkTmFtZSA9PT0gJ2lkJyAmJiBjbGFzc05hbWUpIHtcbiAgICBPYmplY3Qua2V5cyhjb25zdHJhaW50cykuZm9yRWFjaChjb25zdHJhaW50TmFtZSA9PiB7XG4gICAgICBjb25zdCBjb25zdHJhaW50VmFsdWUgPSBjb25zdHJhaW50c1tjb25zdHJhaW50TmFtZV07XG4gICAgICBpZiAodHlwZW9mIGNvbnN0cmFpbnRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgZ2xvYmFsSWRPYmplY3QgPSBmcm9tR2xvYmFsSWQoY29uc3RyYWludFZhbHVlKTtcblxuICAgICAgICBpZiAoZ2xvYmFsSWRPYmplY3QudHlwZSA9PT0gY2xhc3NOYW1lKSB7XG4gICAgICAgICAgY29uc3RyYWludHNbY29uc3RyYWludE5hbWVdID0gZ2xvYmFsSWRPYmplY3QuaWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb25zdHJhaW50VmFsdWUpKSB7XG4gICAgICAgIGNvbnN0cmFpbnRzW2NvbnN0cmFpbnROYW1lXSA9IGNvbnN0cmFpbnRWYWx1ZS5tYXAodmFsdWUgPT4ge1xuICAgICAgICAgIGNvbnN0IGdsb2JhbElkT2JqZWN0ID0gZnJvbUdsb2JhbElkKHZhbHVlKTtcblxuICAgICAgICAgIGlmIChnbG9iYWxJZE9iamVjdC50eXBlID09PSBjbGFzc05hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxJZE9iamVjdC5pZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHBhcmVudENvbnN0cmFpbnRzLm9iamVjdElkID0gY29uc3RyYWludHM7XG4gICAgZGVsZXRlIHBhcmVudENvbnN0cmFpbnRzLmlkO1xuICB9XG4gIE9iamVjdC5rZXlzKGNvbnN0cmFpbnRzKS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgbGV0IGZpZWxkVmFsdWUgPSBjb25zdHJhaW50c1tmaWVsZE5hbWVdO1xuICAgIGlmIChwYXJzZUNvbnN0cmFpbnRNYXBbZmllbGROYW1lXSkge1xuICAgICAgY29uc3RyYWludHNbcGFyc2VDb25zdHJhaW50TWFwW2ZpZWxkTmFtZV1dID0gY29uc3RyYWludHNbZmllbGROYW1lXTtcbiAgICAgIGRlbGV0ZSBjb25zdHJhaW50c1tmaWVsZE5hbWVdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB3ZSBoYXZlIGEga2V5LXZhbHVlIHBhaXIsIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSB3YXkgdGhlIGNvbnN0cmFpbnQgaXMgc3RydWN0dXJlZC5cbiAgICAgKlxuICAgICAqIEV4YW1wbGU6XG4gICAgICogICBGcm9tOlxuICAgICAqICAge1xuICAgICAqICAgICBcInNvbWVGaWVsZFwiOiB7XG4gICAgICogICAgICAgXCJsZXNzVGhhblwiOiB7XG4gICAgICogICAgICAgICBcImtleVwiOlwiZm9vLmJhclwiLFxuICAgICAqICAgICAgICAgXCJ2YWx1ZVwiOiAxMDBcbiAgICAgKiAgICAgICB9LFxuICAgICAqICAgICAgIFwiZ3JlYXRlclRoYW5cIjoge1xuICAgICAqICAgICAgICAgXCJrZXlcIjpcImZvby5iYXJcIixcbiAgICAgKiAgICAgICAgIFwidmFsdWVcIjogMTBcbiAgICAgKiAgICAgICB9XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqICAgVG86XG4gICAgICogICB7XG4gICAgICogICAgIFwic29tZUZpZWxkLmZvby5iYXJcIjoge1xuICAgICAqICAgICAgIFwiJGx0XCI6IDEwMCxcbiAgICAgKiAgICAgICBcIiRndFwiOiAxMFxuICAgICAqICAgICAgfVxuICAgICAqICAgfVxuICAgICAqL1xuICAgIGlmIChmaWVsZFZhbHVlLmtleSAmJiBmaWVsZFZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcGFyZW50Q29uc3RyYWludHMgJiYgcGFyZW50RmllbGROYW1lKSB7XG4gICAgICBkZWxldGUgcGFyZW50Q29uc3RyYWludHNbcGFyZW50RmllbGROYW1lXTtcbiAgICAgIHBhcmVudENvbnN0cmFpbnRzW2Ake3BhcmVudEZpZWxkTmFtZX0uJHtmaWVsZFZhbHVlLmtleX1gXSA9IHtcbiAgICAgICAgLi4ucGFyZW50Q29uc3RyYWludHNbYCR7cGFyZW50RmllbGROYW1lfS4ke2ZpZWxkVmFsdWUua2V5fWBdLFxuICAgICAgICBbcGFyc2VDb25zdHJhaW50TWFwW2ZpZWxkTmFtZV1dOiBmaWVsZFZhbHVlLnZhbHVlLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZmllbGRzW3BhcmVudEZpZWxkTmFtZV0gJiZcbiAgICAgIChmaWVsZHNbcGFyZW50RmllbGROYW1lXS50eXBlID09PSAnUG9pbnRlcicgfHwgZmllbGRzW3BhcmVudEZpZWxkTmFtZV0udHlwZSA9PT0gJ1JlbGF0aW9uJylcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgdGFyZ2V0Q2xhc3MgfSA9IGZpZWxkc1twYXJlbnRGaWVsZE5hbWVdO1xuICAgICAgaWYgKGZpZWxkTmFtZSA9PT0gJ2V4aXN0cycpIHtcbiAgICAgICAgaWYgKGZpZWxkc1twYXJlbnRGaWVsZE5hbWVdLnR5cGUgPT09ICdSZWxhdGlvbicpIHtcbiAgICAgICAgICBjb25zdCB3aGVyZVRhcmdldCA9IGZpZWxkVmFsdWUgPyAnd2hlcmUnIDogJ25vdFdoZXJlJztcbiAgICAgICAgICBpZiAoY29uc3RyYWludHNbd2hlcmVUYXJnZXRdKSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludHNbd2hlcmVUYXJnZXRdLm9iamVjdElkKSB7XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzW3doZXJlVGFyZ2V0XS5vYmplY3RJZCA9IHtcbiAgICAgICAgICAgICAgICAuLi5jb25zdHJhaW50c1t3aGVyZVRhcmdldF0ub2JqZWN0SWQsXG4gICAgICAgICAgICAgICAgJGV4aXN0czogZmllbGRWYWx1ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzW3doZXJlVGFyZ2V0XS5vYmplY3RJZCA9IHtcbiAgICAgICAgICAgICAgICAkZXhpc3RzOiBmaWVsZFZhbHVlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZVdoZXJlVGFyZ2V0ID0gZmllbGRWYWx1ZSA/ICckaW5RdWVyeScgOiAnJG5vdEluUXVlcnknO1xuICAgICAgICAgICAgcGFyZW50Q29uc3RyYWludHNbcGFyZW50RmllbGROYW1lXVtwYXJzZVdoZXJlVGFyZ2V0XSA9IHtcbiAgICAgICAgICAgICAgd2hlcmU6IHsgb2JqZWN0SWQ6IHsgJGV4aXN0czogdHJ1ZSB9IH0sXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogdGFyZ2V0Q2xhc3MsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgY29uc3RyYWludHMuJGV4aXN0cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJlbnRDb25zdHJhaW50c1twYXJlbnRGaWVsZE5hbWVdLiRleGlzdHMgPSBmaWVsZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZmllbGROYW1lKSB7XG4gICAgICAgIGNhc2UgJ2hhdmUnOlxuICAgICAgICAgIHBhcmVudENvbnN0cmFpbnRzW3BhcmVudEZpZWxkTmFtZV0uJGluUXVlcnkgPSB7XG4gICAgICAgICAgICB3aGVyZTogZmllbGRWYWx1ZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogdGFyZ2V0Q2xhc3MsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0cmFuc2Zvcm1RdWVyeUlucHV0VG9QYXJzZShcbiAgICAgICAgICAgIHBhcmVudENvbnN0cmFpbnRzW3BhcmVudEZpZWxkTmFtZV0uJGluUXVlcnkud2hlcmUsXG4gICAgICAgICAgICB0YXJnZXRDbGFzcyxcbiAgICAgICAgICAgIHBhcnNlQ2xhc3Nlc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2hhdmVOb3QnOlxuICAgICAgICAgIHBhcmVudENvbnN0cmFpbnRzW3BhcmVudEZpZWxkTmFtZV0uJG5vdEluUXVlcnkgPSB7XG4gICAgICAgICAgICB3aGVyZTogZmllbGRWYWx1ZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogdGFyZ2V0Q2xhc3MsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0cmFuc2Zvcm1RdWVyeUlucHV0VG9QYXJzZShcbiAgICAgICAgICAgIHBhcmVudENvbnN0cmFpbnRzW3BhcmVudEZpZWxkTmFtZV0uJG5vdEluUXVlcnkud2hlcmUsXG4gICAgICAgICAgICB0YXJnZXRDbGFzcyxcbiAgICAgICAgICAgIHBhcnNlQ2xhc3Nlc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWxldGUgY29uc3RyYWludHNbZmllbGROYW1lXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChmaWVsZE5hbWUpIHtcbiAgICAgIGNhc2UgJ3BvaW50JzpcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0JyAmJiAhZmllbGRWYWx1ZS5fX3R5cGUpIHtcbiAgICAgICAgICBmaWVsZFZhbHVlLl9fdHlwZSA9ICdHZW9Qb2ludCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICduZWFyU3BoZXJlJzpcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0JyAmJiAhZmllbGRWYWx1ZS5fX3R5cGUpIHtcbiAgICAgICAgICBmaWVsZFZhbHVlLl9fdHlwZSA9ICdHZW9Qb2ludCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3gnOlxuICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnICYmIGZpZWxkVmFsdWUuYm90dG9tTGVmdCAmJiBmaWVsZFZhbHVlLnVwcGVyUmlnaHQpIHtcbiAgICAgICAgICBmaWVsZFZhbHVlID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfX3R5cGU6ICdHZW9Qb2ludCcsXG4gICAgICAgICAgICAgIC4uLmZpZWxkVmFsdWUuYm90dG9tTGVmdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIF9fdHlwZTogJ0dlb1BvaW50JyxcbiAgICAgICAgICAgICAgLi4uZmllbGRWYWx1ZS51cHBlclJpZ2h0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGNvbnN0cmFpbnRzW3BhcnNlQ29uc3RyYWludE1hcFtmaWVsZE5hbWVdXSA9IGZpZWxkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGZpZWxkVmFsdWUuZm9yRWFjaChnZW9Qb2ludCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGdlb1BvaW50ID09PSAnb2JqZWN0JyAmJiAhZ2VvUG9pbnQuX190eXBlKSB7XG4gICAgICAgICAgICAgIGdlb1BvaW50Ll9fdHlwZSA9ICdHZW9Qb2ludCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXJTcGhlcmUnOlxuICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnICYmIGZpZWxkVmFsdWUuY2VudGVyICYmIGZpZWxkVmFsdWUuZGlzdGFuY2UpIHtcbiAgICAgICAgICBmaWVsZFZhbHVlID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfX3R5cGU6ICdHZW9Qb2ludCcsXG4gICAgICAgICAgICAgIC4uLmZpZWxkVmFsdWUuY2VudGVyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpZWxkVmFsdWUuZGlzdGFuY2UsXG4gICAgICAgICAgXTtcbiAgICAgICAgICBjb25zdHJhaW50c1twYXJzZUNvbnN0cmFpbnRNYXBbZmllbGROYW1lXV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoZmllbGROYW1lID09PSAnd2hlcmUnKSB7XG4gICAgICAgIHRyYW5zZm9ybVF1ZXJ5SW5wdXRUb1BhcnNlKGZpZWxkVmFsdWUsIGNsYXNzTmFtZSwgcGFyc2VDbGFzc2VzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zZm9ybVF1ZXJ5Q29uc3RyYWludElucHV0VG9QYXJzZShcbiAgICAgICAgICBmaWVsZFZhbHVlLFxuICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgY29uc3RyYWludHMsXG4gICAgICAgICAgcGFyc2VDbGFzc2VzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybVF1ZXJ5SW5wdXRUb1BhcnNlID0gKGNvbnN0cmFpbnRzLCBjbGFzc05hbWUsIHBhcnNlQ2xhc3NlcykgPT4ge1xuICBpZiAoIWNvbnN0cmFpbnRzIHx8IHR5cGVvZiBjb25zdHJhaW50cyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBPYmplY3Qua2V5cyhjb25zdHJhaW50cykuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBjb25zdHJhaW50c1tmaWVsZE5hbWVdO1xuXG4gICAgaWYgKHBhcnNlUXVlcnlNYXBbZmllbGROYW1lXSkge1xuICAgICAgZGVsZXRlIGNvbnN0cmFpbnRzW2ZpZWxkTmFtZV07XG4gICAgICBmaWVsZE5hbWUgPSBwYXJzZVF1ZXJ5TWFwW2ZpZWxkTmFtZV07XG4gICAgICBjb25zdHJhaW50c1tmaWVsZE5hbWVdID0gZmllbGRWYWx1ZTtcbiAgICAgIGZpZWxkVmFsdWUuZm9yRWFjaChmaWVsZFZhbHVlSXRlbSA9PiB7XG4gICAgICAgIHRyYW5zZm9ybVF1ZXJ5SW5wdXRUb1BhcnNlKGZpZWxkVmFsdWVJdGVtLCBjbGFzc05hbWUsIHBhcnNlQ2xhc3Nlcyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhbnNmb3JtUXVlcnlDb25zdHJhaW50SW5wdXRUb1BhcnNlKFxuICAgICAgICBmaWVsZFZhbHVlLFxuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgY29uc3RyYWludHMsXG4gICAgICAgIHBhcnNlQ2xhc3Nlc1xuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuZXhwb3J0IHsgdHJhbnNmb3JtUXVlcnlDb25zdHJhaW50SW5wdXRUb1BhcnNlLCB0cmFuc2Zvcm1RdWVyeUlucHV0VG9QYXJzZSB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxhQUFBLEdBQUFDLE9BQUE7QUFBNkMsU0FBQUMsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFB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