@colijnit/configurator 1.0.17 → 1.0.18

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 (88) hide show
  1. package/app/builder.d.ts +53 -53
  2. package/app/components/answers/answer/answer.component.d.ts +11 -11
  3. package/app/components/answers/answers.component.d.ts +8 -8
  4. package/app/components/answers/answers.module.d.ts +2 -2
  5. package/app/components/selections/selections.component.d.ts +22 -22
  6. package/app/components/selections/selections.module.d.ts +2 -2
  7. package/app/components/shared/loader/loader.component.d.ts +2 -2
  8. package/app/components/shared/shared.module.d.ts +2 -2
  9. package/app/directives/visibility-observer-master.directive.d.ts +9 -9
  10. package/app/directives/visibility-observer.directive.d.ts +13 -13
  11. package/app/services/configurator.service.d.ts +22 -22
  12. package/app/services/image-cache.service.d.ts +10 -10
  13. package/app/services/locator.service.d.ts +4 -4
  14. package/bundles/colijnit-configurator.umd.js +2455 -2455
  15. package/bundles/colijnit-configurator.umd.js.map +1 -1
  16. package/bundles/colijnit-configurator.umd.min.js +1 -1
  17. package/bundles/colijnit-configurator.umd.min.js.map +1 -1
  18. package/colijnit-configurator.d.ts +10 -10
  19. package/colijnit-configurator.metadata.json +1 -1
  20. package/esm2015/app/builder.js +477 -477
  21. package/esm2015/app/components/answers/answer/answer.component.js +51 -51
  22. package/esm2015/app/components/answers/answers.component.js +25 -25
  23. package/esm2015/app/components/answers/answers.module.js +28 -28
  24. package/esm2015/app/components/selections/selections.component.js +85 -85
  25. package/esm2015/app/components/selections/selections.module.js +22 -22
  26. package/esm2015/app/components/shared/loader/loader.component.js +12 -12
  27. package/esm2015/app/components/shared/shared.module.js +20 -20
  28. package/esm2015/app/directives/visibility-observer-master.directive.js +50 -50
  29. package/esm2015/app/directives/visibility-observer.directive.js +56 -56
  30. package/esm2015/app/services/configurator.service.js +94 -94
  31. package/esm2015/app/services/image-cache.service.js +66 -66
  32. package/esm2015/app/services/locator.service.js +9 -9
  33. package/esm2015/colijnit-configurator.js +10 -10
  34. package/esm2015/helper/variation-helper.js +215 -215
  35. package/esm2015/model/material.js +10 -10
  36. package/esm2015/model/variation-settings.js +5 -5
  37. package/esm2015/model/variation.js +2 -2
  38. package/esm2015/public_api.js +6 -6
  39. package/esm2015/utils/asset.utils.js +73 -73
  40. package/esm2015/utils/file.utils.js +138 -138
  41. package/esm2015/utils/image.utils.js +51 -51
  42. package/esm2015/utils/object.utils.js +48 -48
  43. package/esm2015/utils/scene-utils.js +93 -93
  44. package/esm2015/utils/threed.utils.js +221 -221
  45. package/esm2015/utils/variation-utils.js +223 -223
  46. package/esm5/app/builder.js +591 -591
  47. package/esm5/app/components/answers/answer/answer.component.js +63 -63
  48. package/esm5/app/components/answers/answers.component.js +26 -26
  49. package/esm5/app/components/answers/answers.module.js +31 -31
  50. package/esm5/app/components/selections/selections.component.js +103 -103
  51. package/esm5/app/components/selections/selections.module.js +25 -25
  52. package/esm5/app/components/shared/loader/loader.component.js +15 -15
  53. package/esm5/app/components/shared/shared.module.js +23 -23
  54. package/esm5/app/directives/visibility-observer-master.directive.js +63 -63
  55. package/esm5/app/directives/visibility-observer.directive.js +58 -58
  56. package/esm5/app/services/configurator.service.js +160 -160
  57. package/esm5/app/services/image-cache.service.js +69 -69
  58. package/esm5/app/services/locator.service.js +12 -12
  59. package/esm5/colijnit-configurator.js +10 -10
  60. package/esm5/helper/variation-helper.js +267 -267
  61. package/esm5/model/material.js +12 -12
  62. package/esm5/model/variation-settings.js +7 -7
  63. package/esm5/model/variation.js +6 -6
  64. package/esm5/public_api.js +6 -6
  65. package/esm5/utils/asset.utils.js +105 -105
  66. package/esm5/utils/file.utils.js +150 -150
  67. package/esm5/utils/image.utils.js +55 -55
  68. package/esm5/utils/object.utils.js +55 -55
  69. package/esm5/utils/scene-utils.js +97 -97
  70. package/esm5/utils/threed.utils.js +278 -278
  71. package/esm5/utils/variation-utils.js +326 -326
  72. package/fesm2015/colijnit-configurator.js +1946 -1946
  73. package/fesm2015/colijnit-configurator.js.map +1 -1
  74. package/fesm5/colijnit-configurator.js +2457 -2457
  75. package/fesm5/colijnit-configurator.js.map +1 -1
  76. package/helper/variation-helper.d.ts +14 -14
  77. package/model/material.d.ts +17 -17
  78. package/model/variation-settings.d.ts +14 -14
  79. package/model/variation.d.ts +10 -10
  80. package/package.json +3 -2
  81. package/public_api.d.ts +6 -6
  82. package/utils/asset.utils.d.ts +13 -13
  83. package/utils/file.utils.d.ts +27 -27
  84. package/utils/image.utils.d.ts +8 -8
  85. package/utils/object.utils.d.ts +7 -7
  86. package/utils/scene-utils.d.ts +7 -7
  87. package/utils/threed.utils.d.ts +16 -16
  88. package/utils/variation-utils.d.ts +12 -12
@@ -1,56 +1,56 @@
1
- import * as THREE from 'three';
2
- // @dynamic
3
- var ImageUtils = /** @class */ (function () {
4
- function ImageUtils() {
5
- }
6
- ImageUtils.CreateTextureFromBase64 = function (id, base64, material) {
7
- return new Promise(function (resolve) {
8
- if (ImageUtils.textures.has(id)) {
9
- resolve(ImageUtils.textures.get(id));
10
- }
11
- else {
12
- if (!base64) {
13
- resolve(new THREE.Texture());
14
- }
15
- else {
16
- var loader = new THREE.TextureLoader();
17
- loader.load(base64, function (texture) {
18
- texture.anisotropy = 16;
19
- texture.wrapS = THREE.RepeatWrapping;
20
- texture.wrapT = THREE.RepeatWrapping;
21
- texture.repeat = new THREE.Vector2(material ? material.repeatX : 1, material ? material.repeatY : 1);
22
- texture.needsUpdate = true;
23
- ImageUtils.textures.set(id, texture);
24
- resolve(texture);
25
- });
26
- }
27
- }
28
- });
29
- };
30
- ImageUtils.getDocBodyWithMimeTypeDefinition = function (fileName, documentBody) {
31
- if (documentBody === null) {
32
- return documentBody;
33
- }
34
- var fileExtension = fileName.substr(fileName.lastIndexOf('.') + 1);
35
- switch (fileExtension.toLowerCase()) {
36
- case "jpg":
37
- case "jpeg":
38
- return "data:image/jpg;base64," + documentBody;
39
- case "png":
40
- return "data:image/png;base64," + documentBody;
41
- case "gif":
42
- return "data:image/gif;base64," + documentBody;
43
- case "bmp":
44
- return "data:image/bmp;base64," + documentBody;
45
- default:
46
- return "data:image/png;base64," + documentBody;
47
- }
48
- };
49
- ImageUtils.getFixedImageFilepathUrl = function (imageFilepathUrl) {
50
- return imageFilepathUrl.replace("/content/", "/content43/");
51
- };
52
- ImageUtils.textures = new Map();
53
- return ImageUtils;
54
- }());
55
- export { ImageUtils };
1
+ import * as THREE from 'three';
2
+ // @dynamic
3
+ var ImageUtils = /** @class */ (function () {
4
+ function ImageUtils() {
5
+ }
6
+ ImageUtils.CreateTextureFromBase64 = function (id, base64, material) {
7
+ return new Promise(function (resolve) {
8
+ if (ImageUtils.textures.has(id)) {
9
+ resolve(ImageUtils.textures.get(id));
10
+ }
11
+ else {
12
+ if (!base64) {
13
+ resolve(new THREE.Texture());
14
+ }
15
+ else {
16
+ var loader = new THREE.TextureLoader();
17
+ loader.load(base64, function (texture) {
18
+ texture.anisotropy = 16;
19
+ texture.wrapS = THREE.RepeatWrapping;
20
+ texture.wrapT = THREE.RepeatWrapping;
21
+ texture.repeat = new THREE.Vector2(material ? material.repeatX : 1, material ? material.repeatY : 1);
22
+ texture.needsUpdate = true;
23
+ ImageUtils.textures.set(id, texture);
24
+ resolve(texture);
25
+ });
26
+ }
27
+ }
28
+ });
29
+ };
30
+ ImageUtils.getDocBodyWithMimeTypeDefinition = function (fileName, documentBody) {
31
+ if (documentBody === null) {
32
+ return documentBody;
33
+ }
34
+ var fileExtension = fileName.substr(fileName.lastIndexOf('.') + 1);
35
+ switch (fileExtension.toLowerCase()) {
36
+ case "jpg":
37
+ case "jpeg":
38
+ return "data:image/jpg;base64," + documentBody;
39
+ case "png":
40
+ return "data:image/png;base64," + documentBody;
41
+ case "gif":
42
+ return "data:image/gif;base64," + documentBody;
43
+ case "bmp":
44
+ return "data:image/bmp;base64," + documentBody;
45
+ default:
46
+ return "data:image/png;base64," + documentBody;
47
+ }
48
+ };
49
+ ImageUtils.getFixedImageFilepathUrl = function (imageFilepathUrl) {
50
+ return imageFilepathUrl.replace("/content/", "/content43/");
51
+ };
52
+ ImageUtils.textures = new Map();
53
+ return ImageUtils;
54
+ }());
55
+ export { ImageUtils };
56
56
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UudXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29saWpuaXQvY29uZmlndXJhdG9yLyIsInNvdXJjZXMiOlsidXRpbHMvaW1hZ2UudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsV0FBVztBQUNYO0lBQUE7SUFrREEsQ0FBQztJQTlDZSxrQ0FBdUIsR0FBckMsVUFBc0MsRUFBVSxFQUFFLE1BQWMsRUFBRSxRQUFrQjtRQUNsRixPQUFPLElBQUksT0FBTyxDQUFnQixVQUFDLE9BQU87WUFDeEMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDL0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDdEM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDWCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztpQkFDOUI7cUJBQU07b0JBQ0wsSUFBTSxNQUFNLEdBQXdCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFDLE9BQXNCO3dCQUN6QyxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQzt3QkFDeEIsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO3dCQUNyQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7d0JBQ3JDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3JHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO3dCQUMzQixVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7d0JBQ3JDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkIsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVhLDJDQUFnQyxHQUE5QyxVQUErQyxRQUFnQixFQUFFLFlBQW9CO1FBQ25GLElBQUksWUFBWSxLQUFLLElBQUksRUFBRTtZQUN6QixPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUNELElBQU0sYUFBYSxHQUFXLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RSxRQUFRLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNuQyxLQUFLLEtBQUssQ0FBQztZQUNYLEtBQUssTUFBTTtnQkFDVCxPQUFPLHdCQUF3QixHQUFHLFlBQVksQ0FBQztZQUNqRCxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyx3QkFBd0IsR0FBRyxZQUFZLENBQUM7WUFDakQsS0FBSyxLQUFLO2dCQUNSLE9BQU8sd0JBQXdCLEdBQUcsWUFBWSxDQUFDO1lBQ2pELEtBQUssS0FBSztnQkFDUixPQUFPLHdCQUF3QixHQUFHLFlBQVksQ0FBQztZQUNqRDtnQkFDRSxPQUFPLHdCQUF3QixHQUFHLFlBQVksQ0FBQztTQUNsRDtJQUNILENBQUM7SUFFYSxtQ0FBd0IsR0FBdEMsVUFBdUMsZ0JBQXdCO1FBQzdELE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBL0NhLG1CQUFRLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7SUFnRGpFLGlCQUFDO0NBQUEsQUFsREQsSUFrREM7U0FsRFksVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7TWF0ZXJpYWx9IGZyb20gJy4uL21vZGVsL21hdGVyaWFsJztcbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgSW1hZ2VVdGlscyB7XG5cbiAgcHVibGljIHN0YXRpYyB0ZXh0dXJlczogTWFwPHN0cmluZywgVEhSRUUuVGV4dHVyZT4gPSBuZXcgTWFwKCk7XG5cbiAgcHVibGljIHN0YXRpYyBDcmVhdGVUZXh0dXJlRnJvbUJhc2U2NChpZDogc3RyaW5nLCBiYXNlNjQ6IHN0cmluZywgbWF0ZXJpYWw6IE1hdGVyaWFsKTogUHJvbWlzZTxUSFJFRS5UZXh0dXJlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFRIUkVFLlRleHR1cmU+KChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoSW1hZ2VVdGlscy50ZXh0dXJlcy5oYXMoaWQpKSB7XG4gICAgICAgIHJlc29sdmUoSW1hZ2VVdGlscy50ZXh0dXJlcy5nZXQoaWQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghYmFzZTY0KSB7XG4gICAgICAgICAgcmVzb2x2ZShuZXcgVEhSRUUuVGV4dHVyZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsb2FkZXI6IFRIUkVFLlRleHR1cmVMb2FkZXIgPSBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpO1xuICAgICAgICAgIGxvYWRlci5sb2FkKGJhc2U2NCwgKHRleHR1cmU6IFRIUkVFLlRleHR1cmUpID0+IHtcbiAgICAgICAgICAgIHRleHR1cmUuYW5pc290cm9weSA9IDE2O1xuICAgICAgICAgICAgdGV4dHVyZS53cmFwUyA9IFRIUkVFLlJlcGVhdFdyYXBwaW5nO1xuICAgICAgICAgICAgdGV4dHVyZS53cmFwVCA9IFRIUkVFLlJlcGVhdFdyYXBwaW5nO1xuICAgICAgICAgICAgdGV4dHVyZS5yZXBlYXQgPSBuZXcgVEhSRUUuVmVjdG9yMihtYXRlcmlhbCA/IG1hdGVyaWFsLnJlcGVhdFggOiAxLCBtYXRlcmlhbCA/IG1hdGVyaWFsLnJlcGVhdFkgOiAxKTtcbiAgICAgICAgICAgIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgSW1hZ2VVdGlscy50ZXh0dXJlcy5zZXQoaWQsIHRleHR1cmUpO1xuICAgICAgICAgICAgcmVzb2x2ZSh0ZXh0dXJlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXREb2NCb2R5V2l0aE1pbWVUeXBlRGVmaW5pdGlvbihmaWxlTmFtZTogc3RyaW5nLCBkb2N1bWVudEJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGRvY3VtZW50Qm9keSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50Qm9keTtcbiAgICB9XG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbjogc3RyaW5nID0gZmlsZU5hbWUuc3Vic3RyKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTtcbiAgICBzd2l0Y2ggKGZpbGVFeHRlbnNpb24udG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImpwZ1wiOlxuICAgICAgY2FzZSBcImpwZWdcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9qcGc7YmFzZTY0LFwiICsgZG9jdW1lbnRCb2R5O1xuICAgICAgY2FzZSBcInBuZ1wiOlxuICAgICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsXCIgKyBkb2N1bWVudEJvZHk7XG4gICAgICBjYXNlIFwiZ2lmXCI6XG4gICAgICAgIHJldHVybiBcImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxcIiArIGRvY3VtZW50Qm9keTtcbiAgICAgIGNhc2UgXCJibXBcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9ibXA7YmFzZTY0LFwiICsgZG9jdW1lbnRCb2R5O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LFwiICsgZG9jdW1lbnRCb2R5O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Rml4ZWRJbWFnZUZpbGVwYXRoVXJsKGltYWdlRmlsZXBhdGhVcmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGltYWdlRmlsZXBhdGhVcmwucmVwbGFjZShcIi9jb250ZW50L1wiLCBcIi9jb250ZW50NDMvXCIpO1xuICB9XG59XG4iXX0=
@@ -1,56 +1,56 @@
1
- import { Mesh } from "three";
2
- var ObjectUtils = /** @class */ (function () {
3
- function ObjectUtils() {
4
- }
5
- ObjectUtils.DisposeMaterial = function (material) {
6
- var _this = this;
7
- if (!material) {
8
- return;
9
- }
10
- if (Array.isArray(material)) {
11
- material.forEach(function (mtrl) {
12
- _this.materialProps
13
- .filter(function (mapType) { return mtrl[mapType]; })
14
- .forEach(function (mapType) { return mtrl[mapType].dispose(); });
15
- mtrl.dispose();
16
- });
17
- }
18
- else {
19
- this.materialProps
20
- .filter(function (mapType) { return material[mapType] && material[mapType].dispose; })
21
- .forEach(function (mapType) { return material[mapType].dispose(); });
22
- if (material.dispose) {
23
- material.dispose();
24
- }
25
- }
26
- };
27
- ObjectUtils.DisposeObject = function (object) {
28
- var _this = this;
29
- if (!object) {
30
- return;
31
- }
32
- if (object.children.length) {
33
- object.children.forEach(function (child) { return _this.DisposeObject(child); });
34
- }
35
- this.DisposeNode(object);
36
- };
37
- ObjectUtils.DisposeNode = function (node) {
38
- var _this = this;
39
- node.traverse(function (obj) {
40
- if (obj instanceof Mesh) {
41
- if (obj.geometry) {
42
- obj.geometry.dispose();
43
- }
44
- _this.DisposeMaterial(obj.material);
45
- }
46
- if (typeof obj.dispose === 'function') {
47
- // @ts-ignore
48
- obj.dispose();
49
- }
50
- });
51
- };
52
- ObjectUtils.materialProps = ['map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap', 'envMap', 'aoMap', 'roughnessMap', 'metalnessMap'];
53
- return ObjectUtils;
54
- }());
55
- export { ObjectUtils };
1
+ import { Mesh } from "three";
2
+ var ObjectUtils = /** @class */ (function () {
3
+ function ObjectUtils() {
4
+ }
5
+ ObjectUtils.DisposeMaterial = function (material) {
6
+ var _this = this;
7
+ if (!material) {
8
+ return;
9
+ }
10
+ if (Array.isArray(material)) {
11
+ material.forEach(function (mtrl) {
12
+ _this.materialProps
13
+ .filter(function (mapType) { return mtrl[mapType]; })
14
+ .forEach(function (mapType) { return mtrl[mapType].dispose(); });
15
+ mtrl.dispose();
16
+ });
17
+ }
18
+ else {
19
+ this.materialProps
20
+ .filter(function (mapType) { return material[mapType] && material[mapType].dispose; })
21
+ .forEach(function (mapType) { return material[mapType].dispose(); });
22
+ if (material.dispose) {
23
+ material.dispose();
24
+ }
25
+ }
26
+ };
27
+ ObjectUtils.DisposeObject = function (object) {
28
+ var _this = this;
29
+ if (!object) {
30
+ return;
31
+ }
32
+ if (object.children.length) {
33
+ object.children.forEach(function (child) { return _this.DisposeObject(child); });
34
+ }
35
+ this.DisposeNode(object);
36
+ };
37
+ ObjectUtils.DisposeNode = function (node) {
38
+ var _this = this;
39
+ node.traverse(function (obj) {
40
+ if (obj instanceof Mesh) {
41
+ if (obj.geometry) {
42
+ obj.geometry.dispose();
43
+ }
44
+ _this.DisposeMaterial(obj.material);
45
+ }
46
+ if (typeof obj.dispose === 'function') {
47
+ // @ts-ignore
48
+ obj.dispose();
49
+ }
50
+ });
51
+ };
52
+ ObjectUtils.materialProps = ['map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap', 'envMap', 'aoMap', 'roughnessMap', 'metalnessMap'];
53
+ return ObjectUtils;
54
+ }());
55
+ export { ObjectUtils };
56
56
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LnV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvbGlqbml0L2NvbmZpZ3VyYXRvci8iLCJzb3VyY2VzIjpbInV0aWxzL29iamVjdC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsSUFBSSxFQUFXLE1BQU0sT0FBTyxDQUFDO0FBRS9DO0lBQUE7SUFpREEsQ0FBQztJQTlDaUIsMkJBQWUsR0FBN0IsVUFBOEIsUUFBK0I7UUFBN0QsaUJBbUJDO1FBbEJHLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDWCxPQUFPO1NBQ1Y7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDekIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFBLElBQUk7Z0JBQ2pCLEtBQUksQ0FBQyxhQUFhO3FCQUNiLE1BQU0sQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBYixDQUFhLENBQUM7cUJBQ2hDLE9BQU8sQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBdkIsQ0FBdUIsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUM7U0FDTjthQUFNO1lBQ0gsSUFBSSxDQUFDLGFBQWE7aUJBQ2IsTUFBTSxDQUFDLFVBQUEsT0FBTyxJQUFJLE9BQUEsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQTlDLENBQThDLENBQUM7aUJBQ2pFLE9BQU8sQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBM0IsQ0FBMkIsQ0FBQyxDQUFDO1lBQ3JELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtnQkFDbEIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3RCO1NBQ0o7SUFDTCxDQUFDO0lBRWEseUJBQWEsR0FBM0IsVUFBNEIsTUFBdUI7UUFBbkQsaUJBUUM7UUFQRyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTztTQUNWO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQXpCLENBQXlCLENBQUMsQ0FBQztTQUMvRDtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVjLHVCQUFXLEdBQTFCLFVBQTJCLElBQXFCO1FBQWhELGlCQWFDO1FBWkcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFDLEdBQWE7WUFDeEIsSUFBSSxHQUFHLFlBQVksSUFBSSxFQUFFO2dCQUNyQixJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7b0JBQ2QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDMUI7Z0JBQ0QsS0FBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDdEM7WUFDRCxJQUFJLE9BQVEsR0FBVyxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUU7Z0JBQzVDLGFBQWE7Z0JBQ2IsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2pCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBOUNNLHlCQUFhLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBZ0R6SSxrQkFBQztDQUFBLEFBakRELElBaURDO1NBakRZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01hdGVyaWFsLCBNZXNoLCBPYmplY3QzRH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgT2JqZWN0VXRpbHMge1xyXG4gICAgc3RhdGljIG1hdGVyaWFsUHJvcHMgPSBbJ21hcCcsICdsaWdodE1hcCcsICdidW1wTWFwJywgJ25vcm1hbE1hcCcsICdzcGVjdWxhck1hcCcsICdlbnZNYXAnLCAnYW9NYXAnLCAncm91Z2huZXNzTWFwJywgJ21ldGFsbmVzc01hcCddO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgRGlzcG9zZU1hdGVyaWFsKG1hdGVyaWFsOiBNYXRlcmlhbCB8IE1hdGVyaWFsW10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoIW1hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICAgIG1hdGVyaWFsLmZvckVhY2gobXRybCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGVyaWFsUHJvcHNcclxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKG1hcFR5cGUgPT4gbXRybFttYXBUeXBlXSlcclxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChtYXBUeXBlID0+IG10cmxbbWFwVHlwZV0uZGlzcG9zZSgpKTtcclxuICAgICAgICAgICAgICAgIG10cmwuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1hdGVyaWFsUHJvcHNcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIobWFwVHlwZSA9PiBtYXRlcmlhbFttYXBUeXBlXSAmJiBtYXRlcmlhbFttYXBUeXBlXS5kaXNwb3NlKVxyXG4gICAgICAgICAgICAgICAgLmZvckVhY2gobWFwVHlwZSA9PiBtYXRlcmlhbFttYXBUeXBlXS5kaXNwb3NlKCkpO1xyXG4gICAgICAgICAgICBpZiAobWF0ZXJpYWwuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgRGlzcG9zZU9iamVjdChvYmplY3Q6IE9iamVjdDNEIHwgTWVzaCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghb2JqZWN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9iamVjdC5jaGlsZHJlbi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgb2JqZWN0LmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gdGhpcy5EaXNwb3NlT2JqZWN0KGNoaWxkKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuRGlzcG9zZU5vZGUob2JqZWN0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBEaXNwb3NlTm9kZShub2RlOiBPYmplY3QzRCB8IE1lc2gpOiB2b2lkIHtcclxuICAgICAgICBub2RlLnRyYXZlcnNlKChvYmo6IE9iamVjdDNEKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNZXNoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob2JqLmdlb21ldHJ5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuRGlzcG9zZU1hdGVyaWFsKG9iai5tYXRlcmlhbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiAob2JqIGFzIGFueSkuZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgb2JqLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=
@@ -1,98 +1,98 @@
1
- import * as THREE from 'three';
2
- var SceneUtils = /** @class */ (function () {
3
- function SceneUtils() {
4
- }
5
- SceneUtils.TrySelectorConnection = function (scene, parent, part1, part2, createAddableFn) {
6
- var addable;
7
- if (createAddableFn) {
8
- addable = part2;
9
- part2 = createAddableFn(addable);
10
- }
11
- for (var i = 0; i < part1.children.length; i++) {
12
- for (var ii = 0; ii < part2.children.length; ii++) {
13
- var con1 = part1.children[i];
14
- var con2 = part2.children[ii];
15
- // if these connectors can connect connect them
16
- if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(con1, con2)) {
17
- // if addable, continue this loop with a new addable
18
- if (addable) {
19
- var newPart2 = createAddableFn(addable, part2, part1);
20
- // reference of part2 changed, so refresh con2
21
- this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
22
- }
23
- else {
24
- return this.SelectorConnect(scene, parent, con1, con2);
25
- }
26
- }
27
- }
28
- }
29
- return false;
30
- };
31
- SceneUtils.Convert3DPointToScreenPoint = function (point, camera, width, height) {
32
- if (!point) {
33
- return new THREE.Vector2();
34
- }
35
- var vector = point.clone().project(camera);
36
- vector.x = (vector.x + 1) / 2 * width;
37
- vector.y = -(vector.y - 1) / 2 * height;
38
- return new THREE.Vector2(vector.x, vector.y);
39
- };
40
- SceneUtils.CanSelectorConnect = function (con1, con2) {
41
- var con1Name = con1 instanceof THREE.Object3D ? con1.name : con1.connector;
42
- var con2Name = con2 instanceof THREE.Object3D ? con2.name : con2.connector;
43
- var sameParent = con1 instanceof THREE.Object3D && con2 instanceof THREE.Object3D ? con1.parent === con2.parent : false;
44
- var parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
45
- if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
46
- var connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
47
- parts1[1] === parts2[1] && parts1[2] !== parts2[2];
48
- return connectable;
49
- }
50
- return false;
51
- };
52
- SceneUtils.SelectorConnect = function (scene, parent, con1, con2) {
53
- if (!scene || !parent) {
54
- return false;
55
- }
56
- con1['connectedTo'] = con2.parent.name;
57
- con2['connectedTo'] = con1.parent.name;
58
- var motherRotation = new THREE.Euler(0, 0, 0);
59
- var motherPosition = new THREE.Vector3(0, 0, 0);
60
- scene.updateMatrixWorld(true);
61
- motherRotation.copy(parent.rotation);
62
- parent.getWorldPosition(motherPosition);
63
- parent.rotation.set(0, 0, 0);
64
- parent.position.set(0, 0, 0);
65
- var con1Quat = new THREE.Quaternion();
66
- con1.getWorldQuaternion(con1Quat);
67
- var con2Quat = new THREE.Quaternion();
68
- con2.getWorldQuaternion(con2Quat);
69
- var con1QuatParent = new THREE.Quaternion();
70
- con1.parent.getWorldQuaternion(con1QuatParent);
71
- var con2QuatParent = new THREE.Quaternion();
72
- con2.parent.getWorldQuaternion(con2QuatParent);
73
- var rotation = new THREE.Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new THREE.Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
74
- con2.parent.quaternion.copy(rotation);
75
- // Update because the matrix has been tempered with
76
- scene.updateMatrixWorld(true);
77
- // Move the connectors towards eachother
78
- var con1Pos = new THREE.Vector3();
79
- con1.getWorldPosition(con1Pos);
80
- var con2Pos = new THREE.Vector3();
81
- con2.getWorldPosition(con2Pos);
82
- var move = con1Pos.sub(con2Pos);
83
- con2.parent.position.x += move.x;
84
- con2.parent.position.y += move.y;
85
- con2.parent.position.z += move.z;
86
- // reset parent's objects rotation and position
87
- parent.rotation.copy(motherRotation);
88
- parent.position.copy(motherPosition);
89
- scene.updateMatrixWorld(true);
90
- // Set the connected flag
91
- con1['connected'] = true;
92
- con2['connected'] = true;
93
- return true;
94
- };
95
- return SceneUtils;
96
- }());
97
- export { SceneUtils };
1
+ import * as THREE from 'three';
2
+ var SceneUtils = /** @class */ (function () {
3
+ function SceneUtils() {
4
+ }
5
+ SceneUtils.TrySelectorConnection = function (scene, parent, part1, part2, createAddableFn) {
6
+ var addable;
7
+ if (createAddableFn) {
8
+ addable = part2;
9
+ part2 = createAddableFn(addable);
10
+ }
11
+ for (var i = 0; i < part1.children.length; i++) {
12
+ for (var ii = 0; ii < part2.children.length; ii++) {
13
+ var con1 = part1.children[i];
14
+ var con2 = part2.children[ii];
15
+ // if these connectors can connect connect them
16
+ if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(con1, con2)) {
17
+ // if addable, continue this loop with a new addable
18
+ if (addable) {
19
+ var newPart2 = createAddableFn(addable, part2, part1);
20
+ // reference of part2 changed, so refresh con2
21
+ this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
22
+ }
23
+ else {
24
+ return this.SelectorConnect(scene, parent, con1, con2);
25
+ }
26
+ }
27
+ }
28
+ }
29
+ return false;
30
+ };
31
+ SceneUtils.Convert3DPointToScreenPoint = function (point, camera, width, height) {
32
+ if (!point) {
33
+ return new THREE.Vector2();
34
+ }
35
+ var vector = point.clone().project(camera);
36
+ vector.x = (vector.x + 1) / 2 * width;
37
+ vector.y = -(vector.y - 1) / 2 * height;
38
+ return new THREE.Vector2(vector.x, vector.y);
39
+ };
40
+ SceneUtils.CanSelectorConnect = function (con1, con2) {
41
+ var con1Name = con1 instanceof THREE.Object3D ? con1.name : con1.connector;
42
+ var con2Name = con2 instanceof THREE.Object3D ? con2.name : con2.connector;
43
+ var sameParent = con1 instanceof THREE.Object3D && con2 instanceof THREE.Object3D ? con1.parent === con2.parent : false;
44
+ var parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
45
+ if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
46
+ var connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
47
+ parts1[1] === parts2[1] && parts1[2] !== parts2[2];
48
+ return connectable;
49
+ }
50
+ return false;
51
+ };
52
+ SceneUtils.SelectorConnect = function (scene, parent, con1, con2) {
53
+ if (!scene || !parent) {
54
+ return false;
55
+ }
56
+ con1['connectedTo'] = con2.parent.name;
57
+ con2['connectedTo'] = con1.parent.name;
58
+ var motherRotation = new THREE.Euler(0, 0, 0);
59
+ var motherPosition = new THREE.Vector3(0, 0, 0);
60
+ scene.updateMatrixWorld(true);
61
+ motherRotation.copy(parent.rotation);
62
+ parent.getWorldPosition(motherPosition);
63
+ parent.rotation.set(0, 0, 0);
64
+ parent.position.set(0, 0, 0);
65
+ var con1Quat = new THREE.Quaternion();
66
+ con1.getWorldQuaternion(con1Quat);
67
+ var con2Quat = new THREE.Quaternion();
68
+ con2.getWorldQuaternion(con2Quat);
69
+ var con1QuatParent = new THREE.Quaternion();
70
+ con1.parent.getWorldQuaternion(con1QuatParent);
71
+ var con2QuatParent = new THREE.Quaternion();
72
+ con2.parent.getWorldQuaternion(con2QuatParent);
73
+ var rotation = new THREE.Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new THREE.Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
74
+ con2.parent.quaternion.copy(rotation);
75
+ // Update because the matrix has been tempered with
76
+ scene.updateMatrixWorld(true);
77
+ // Move the connectors towards eachother
78
+ var con1Pos = new THREE.Vector3();
79
+ con1.getWorldPosition(con1Pos);
80
+ var con2Pos = new THREE.Vector3();
81
+ con2.getWorldPosition(con2Pos);
82
+ var move = con1Pos.sub(con2Pos);
83
+ con2.parent.position.x += move.x;
84
+ con2.parent.position.y += move.y;
85
+ con2.parent.position.z += move.z;
86
+ // reset parent's objects rotation and position
87
+ parent.rotation.copy(motherRotation);
88
+ parent.position.copy(motherPosition);
89
+ scene.updateMatrixWorld(true);
90
+ // Set the connected flag
91
+ con1['connected'] = true;
92
+ con2['connected'] = true;
93
+ return true;
94
+ };
95
+ return SceneUtils;
96
+ }());
97
+ export { SceneUtils };
98
98
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29saWpuaXQvY29uZmlndXJhdG9yLyIsInNvdXJjZXMiOlsidXRpbHMvc2NlbmUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0I7SUFBQTtJQW9IQSxDQUFDO0lBbEhpQixnQ0FBcUIsR0FBbkMsVUFBb0MsS0FBa0IsRUFBRSxNQUFzQixFQUMxRSxLQUFVLEVBQUUsS0FBVSxFQUFFLGVBQTBCO1FBQ2xELElBQUksT0FBWSxDQUFDO1FBQ2pCLElBQUksZUFBZSxFQUFFO1lBQ2pCLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQy9DLElBQU0sSUFBSSxHQUFtQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxJQUFNLElBQUksR0FBbUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEQsK0NBQStDO2dCQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQ2pGLG9EQUFvRDtvQkFDcEQsSUFBSSxPQUFPLEVBQUU7d0JBQ1QsSUFBTSxRQUFRLEdBQW1CLGVBQWUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxF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QztRQUVyQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUIseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUwsaUJBQUM7QUFBRCxDQUFDLEFBcEhELElBb0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNjZW5lVXRpbHMge1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHNjZW5lOiBUSFJFRS5TY2VuZSwgcGFyZW50OiBUSFJFRS5PYmplY3QzRCxcclxuICAgICAgICBwYXJ0MTogYW55LCBwYXJ0MjogYW55LCBjcmVhdGVBZGRhYmxlRm4/OiBGdW5jdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBhZGRhYmxlOiBhbnk7XHJcbiAgICAgICAgaWYgKGNyZWF0ZUFkZGFibGVGbikge1xyXG4gICAgICAgICAgICBhZGRhYmxlID0gcGFydDI7XHJcbiAgICAgICAgICAgIHBhcnQyID0gY3JlYXRlQWRkYWJsZUZuKGFkZGFibGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQxLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBwYXJ0Mi5jaGlsZHJlbi5sZW5ndGg7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbjE6IFRIUkVFLk9iamVjdDNEID0gcGFydDEuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb24yOiBUSFJFRS5PYmplY3QzRCA9IHBhcnQyLmNoaWxkcmVuW2lpXTtcclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXNlIGNvbm5lY3RvcnMgY2FuIGNvbm5lY3QgY29ubmVjdCB0aGVtXHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbjFbJ2Nvbm5lY3RlZCddICYmICFjb24yWydjb25uZWN0ZWQnXSAmJiB0aGlzLkNhblNlbGVjdG9yQ29ubmVjdChjb24xLCBjb24yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXJ0MjogVEhSRUUuT2JqZWN0M0QgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIG9mIHBhcnQyIGNoYW5nZWQsIHNvIHJlZnJlc2ggY29uMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBuZXdQYXJ0Mi5jaGlsZHJlbltpaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBjb24yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQ29udmVydDNEUG9pbnRUb1NjcmVlblBvaW50KHBvaW50OiBUSFJFRS5WZWN0b3IzLCBjYW1lcmE6IFRIUkVFLkNhbWVyYSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBUSFJFRS5WZWN0b3IyIHtcclxuICAgICAgICBpZiAoIXBvaW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB2ZWN0b3I6IFRIUkVFLlZlY3RvcjMgPSBwb2ludC5jbG9uZSgpLnByb2plY3QoY2FtZXJhKTtcclxuICAgICAgICB2ZWN0b3IueCA9ICh2ZWN0b3IueCArIDEpIC8gMiAqIHdpZHRoO1xyXG4gICAgICAgIHZlY3Rvci55ID0gLSh2ZWN0b3IueSAtIDEpIC8gMiAqIGhlaWdodDtcclxuICAgICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjIodmVjdG9yLngsIHZlY3Rvci55KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIENhblNlbGVjdG9yQ29ubmVjdChjb24xOiBUSFJFRS5PYmplY3QzRCB8IGFueSwgY29uMjogVEhSRUUuT2JqZWN0M0QgfCBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBjb24xTmFtZTogc3RyaW5nID0gY29uMSBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEID8gY29uMS5uYW1lIDogY29uMS5jb25uZWN0b3I7XHJcbiAgICAgICAgY29uc3QgY29uMk5hbWU6IHN0cmluZyA9IGNvbjIgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCA/IGNvbjIubmFtZSA6IGNvbjIuY29ubmVjdG9yO1xyXG4gICAgICAgIGNvbnN0IHNhbWVQYXJlbnQ6IGJvb2xlYW4gPSBjb24xIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgJiYgY29uMiBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEID8gY29uMS5wYXJlbnQgPT09IGNvbjIucGFyZW50IDogZmFsc2U7XHJcbiAgICAgICAgY29uc3QgcGFydHMxOiBzdHJpbmdbXSA9IGNvbjFOYW1lLnRvVXBwZXJDYXNlKCkuc3BsaXQoJ18nKSxcclxuICAgICAgICAgICAgcGFydHMyOiBzdHJpbmdbXSA9IGNvbjJOYW1lLnRvVXBwZXJDYXNlKCkuc3BsaXQoJ18nKTtcclxuICAgICAgICBpZiAocGFydHMxLmxlbmd0aCA+PSAzICYmIHBhcnRzMi5sZW5ndGggPj0gMyAmJiAhc2FtZVBhcmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0YWJsZTogYm9vbGVhbiA9IHBhcnRzMVswXSA9PT0gJ0MnICYmIHBhcnRzMlswXSA9PT0gJ0MnICYmXHJcbiAgICAgICAgICAgICAgICBwYXJ0czFbMV0gPT09IHBhcnRzMlsxXSAmJiBwYXJ0czFbMl0gIT09IHBhcnRzMlsyXTtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3RhYmxlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgU2VsZWN0b3JDb25uZWN0KHNjZW5lOiBUSFJFRS5TY2VuZSwgcGFyZW50OiBUSFJFRS5PYmplY3QzRCwgY29uMTogVEhSRUUuT2JqZWN0M0QsIGNvbjI6IFRIUkVFLk9iamVjdDNEKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFzY2VuZSB8fCAhcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uMVsnY29ubmVjdGVkVG8nXSA9IGNvbjIucGFyZW50Lm5hbWU7XHJcbiAgICAgICAgY29uMlsnY29ubmVjdGVkVG8nXSA9IGNvbjEucGFyZW50Lm5hbWU7XHJcblxyXG4gICAgICAgIGNvbnN0IG1vdGhlclJvdGF0aW9uOiBUSFJFRS5FdWxlciA9IG5ldyBUSFJFRS5FdWxlcigwLCAwLCAwKTtcclxuICAgICAgICBjb25zdCBtb3RoZXJQb3NpdGlvbjogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIDApO1xyXG5cclxuICAgICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgICAgICBtb3RoZXJSb3RhdGlvbi5jb3B5KHBhcmVudC5yb3RhdGlvbik7XHJcbiAgICAgICAgcGFyZW50LmdldFdvcmxkUG9zaXRpb24obW90aGVyUG9zaXRpb24pO1xyXG5cclxuICAgICAgICBwYXJlbnQucm90YXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgICAgIHBhcmVudC5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbjFRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBjb24xLmdldFdvcmxkUXVhdGVybmlvbihjb24xUXVhdCk7XHJcbiAgICAgICAgY29uc3QgY29uMlF1YXQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gICAgICAgIGNvbjIuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjJRdWF0KTtcclxuICAgICAgICBjb25zdCBjb24xUXVhdFBhcmVudDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAgICAgY29uMS5wYXJlbnQuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0UGFyZW50KTtcclxuICAgICAgICBjb25zdCBjb24yUXVhdFBhcmVudDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAgICAgY29uMi5wYXJlbnQuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjJRdWF0UGFyZW50KTtcclxuXHJcbiAgICAgICAgY29uc3Qgcm90YXRpb246IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpLm11bHRpcGx5UXVhdGVybmlvbnMoXHJcbiAgICAgICAgICAgIGNvbjFRdWF0LmludmVydCgpLFxyXG4gICAgICAgICAgICBjb24yUXVhdFxyXG4gICAgICAgICkubXVsdGlwbHkoXHJcbiAgICAgICAgICAgIG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhcclxuICAgICAgICAgICAgICAgIGNvbjFRdWF0UGFyZW50LFxyXG4gICAgICAgICAgICAgICAgY29uMVF1YXRQYXJlbnRcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbjIucGFyZW50LnF1YXRlcm5pb24uY29weShyb3RhdGlvbik7XHJcbiAgICAgICAgLy8gVXBkYXRlIGJlY2F1c2UgdGhlIG1hdHJpeCBoYXMgYmVlbiB0ZW1wZXJlZCB3aXRoXHJcbiAgICAgICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIE1vdmUgdGhlIGNvbm5lY3RvcnMgdG93YXJkcyBlYWNob3RoZXJcclxuICAgICAgICBjb25zdCBjb24xUG9zOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgICAgICBjb24xLmdldFdvcmxkUG9zaXRpb24oY29uMVBvcyk7XHJcbiAgICAgICAgY29uc3QgY29uMlBvczogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICAgICAgY29uMi5nZXRXb3JsZFBvc2l0aW9uKGNvbjJQb3MpO1xyXG5cclxuICAgICAgICBjb25zdCBtb3ZlOiBUSFJFRS5WZWN0b3IzID0gY29uMVBvcy5zdWIoY29uMlBvcyk7XHJcbiAgICAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueCArPSBtb3ZlLng7XHJcbiAgICAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueSArPSBtb3ZlLnk7XHJcbiAgICAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueiArPSBtb3ZlLno7XHJcblxyXG4gICAgICAgIC8vIHJlc2V0IHBhcmVudCdzIG9iamVjdHMgcm90YXRpb24gYW5kIHBvc2l0aW9uXHJcbiAgICAgICAgcGFyZW50LnJvdGF0aW9uLmNvcHkobW90aGVyUm90YXRpb24pO1xyXG4gICAgICAgIHBhcmVudC5wb3NpdGlvbi5jb3B5KG1vdGhlclBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgY29ubmVjdGVkIGZsYWdcclxuICAgICAgICBjb24xWydjb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgICAgY29uMlsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=