@colijnit/configurator 1.0.21 → 1.0.22

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 (158) hide show
  1. package/app/builder.d.ts +53 -0
  2. package/app/components/answers/answer/answer.component.d.ts +11 -0
  3. package/app/components/answers/answers.component.d.ts +8 -0
  4. package/app/components/answers/answers.module.d.ts +2 -0
  5. package/app/components/selections/selections.component.d.ts +22 -0
  6. package/app/components/selections/selections.module.d.ts +2 -0
  7. package/app/components/shared/loader/loader.component.d.ts +2 -0
  8. package/app/components/shared/shared.module.d.ts +2 -0
  9. package/app/directives/visibility-observer-master.directive.d.ts +9 -0
  10. package/app/directives/visibility-observer.directive.d.ts +13 -0
  11. package/app/services/configurator.service.d.ts +22 -0
  12. package/app/services/image-cache.service.d.ts +10 -0
  13. package/app/services/locator.service.d.ts +4 -0
  14. package/bundles/colijnit-configurator.umd.js +2745 -0
  15. package/bundles/colijnit-configurator.umd.js.map +1 -0
  16. package/bundles/colijnit-configurator.umd.min.js +17 -0
  17. package/bundles/colijnit-configurator.umd.min.js.map +1 -0
  18. package/colijnit-configurator.d.ts +10 -0
  19. package/colijnit-configurator.metadata.json +1 -0
  20. package/esm2015/app/builder.js +477 -0
  21. package/esm2015/app/components/answers/answer/answer.component.js +69 -0
  22. package/esm2015/app/components/answers/answers.component.js +43 -0
  23. package/esm2015/app/components/answers/answers.module.js +29 -0
  24. package/esm2015/app/components/selections/selections.component.js +134 -0
  25. package/esm2015/app/components/selections/selections.module.js +23 -0
  26. package/esm2015/app/components/shared/loader/loader.component.js +24 -0
  27. package/esm2015/app/components/shared/shared.module.js +21 -0
  28. package/esm2015/app/directives/visibility-observer-master.directive.js +51 -0
  29. package/esm2015/app/directives/visibility-observer.directive.js +57 -0
  30. package/esm2015/app/services/configurator.service.js +94 -0
  31. package/esm2015/app/services/image-cache.service.js +66 -0
  32. package/esm2015/app/services/locator.service.js +10 -0
  33. package/esm2015/colijnit-configurator.js +11 -0
  34. package/esm2015/helper/variation-helper.js +216 -0
  35. package/esm2015/model/material.js +11 -0
  36. package/esm2015/model/variation-settings.js +6 -0
  37. package/esm2015/model/variation.js +3 -0
  38. package/esm2015/public_api.js +7 -0
  39. package/esm2015/utils/asset.utils.js +74 -0
  40. package/esm2015/utils/file.utils.js +139 -0
  41. package/esm2015/utils/image.utils.js +52 -0
  42. package/esm2015/utils/object.utils.js +49 -0
  43. package/esm2015/utils/scene-utils.js +94 -0
  44. package/esm2015/utils/threed.utils.js +222 -0
  45. package/esm2015/utils/variation-utils.js +224 -0
  46. package/esm5/app/builder.js +591 -0
  47. package/esm5/app/components/answers/answer/answer.component.js +64 -0
  48. package/esm5/app/components/answers/answers.component.js +27 -0
  49. package/esm5/app/components/answers/answers.module.js +32 -0
  50. package/esm5/app/components/selections/selections.component.js +104 -0
  51. package/esm5/app/components/selections/selections.module.js +26 -0
  52. package/esm5/app/components/shared/loader/loader.component.js +16 -0
  53. package/esm5/app/components/shared/shared.module.js +24 -0
  54. package/esm5/app/directives/visibility-observer-master.directive.js +64 -0
  55. package/esm5/app/directives/visibility-observer.directive.js +59 -0
  56. package/esm5/app/services/configurator.service.js +160 -0
  57. package/esm5/app/services/image-cache.service.js +69 -0
  58. package/esm5/app/services/locator.service.js +13 -0
  59. package/esm5/colijnit-configurator.js +11 -0
  60. package/esm5/helper/variation-helper.js +268 -0
  61. package/esm5/model/material.js +13 -0
  62. package/esm5/model/variation-settings.js +8 -0
  63. package/esm5/model/variation.js +7 -0
  64. package/esm5/public_api.js +7 -0
  65. package/esm5/utils/asset.utils.js +106 -0
  66. package/esm5/utils/file.utils.js +151 -0
  67. package/esm5/utils/image.utils.js +56 -0
  68. package/esm5/utils/object.utils.js +56 -0
  69. package/esm5/utils/scene-utils.js +98 -0
  70. package/esm5/utils/threed.utils.js +279 -0
  71. package/esm5/utils/variation-utils.js +327 -0
  72. package/fesm2015/colijnit-configurator.js +2109 -0
  73. package/fesm2015/colijnit-configurator.js.map +1 -0
  74. package/fesm5/colijnit-configurator.js +2527 -0
  75. package/fesm5/colijnit-configurator.js.map +1 -0
  76. package/helper/variation-helper.d.ts +14 -0
  77. package/model/material.d.ts +17 -0
  78. package/model/variation-settings.d.ts +14 -0
  79. package/model/variation.d.ts +10 -0
  80. package/package.json +12 -45
  81. package/{src/public_api.ts → public_api.d.ts} +6 -6
  82. package/utils/asset.utils.d.ts +13 -0
  83. package/utils/file.utils.d.ts +27 -0
  84. package/utils/image.utils.d.ts +8 -0
  85. package/utils/object.utils.d.ts +7 -0
  86. package/utils/scene-utils.d.ts +7 -0
  87. package/utils/threed.utils.d.ts +16 -0
  88. package/utils/variation-utils.d.ts +12 -0
  89. package/.idea/Configurator.iml +0 -12
  90. package/.idea/codeStyles/Project.xml +0 -21
  91. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  92. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  93. package/.idea/misc.xml +0 -9
  94. package/.idea/modules.xml +0 -8
  95. package/.idea/vcs.xml +0 -6
  96. package/angular.json +0 -193
  97. package/configurator.iml +0 -11
  98. package/dist/configurator/index.html +0 -14
  99. package/dist/configurator/main-es2015.js +0 -3129
  100. package/dist/configurator/main-es2015.js.map +0 -1
  101. package/dist/configurator/main-es5.js +0 -5482
  102. package/dist/configurator/main-es5.js.map +0 -1
  103. package/dist/configurator/polyfills-es2015.js +0 -4520
  104. package/dist/configurator/polyfills-es2015.js.map +0 -1
  105. package/dist/configurator/polyfills-es5.js +0 -18375
  106. package/dist/configurator/polyfills-es5.js.map +0 -1
  107. package/dist/configurator/runtime-es2015.js +0 -155
  108. package/dist/configurator/runtime-es2015.js.map +0 -1
  109. package/dist/configurator/runtime-es5.js +0 -155
  110. package/dist/configurator/runtime-es5.js.map +0 -1
  111. package/dist/configurator/styles-es2015.js +0 -450
  112. package/dist/configurator/styles-es2015.js.map +0 -1
  113. package/dist/configurator/styles-es5.js +0 -432
  114. package/dist/configurator/styles-es5.js.map +0 -1
  115. package/dist/configurator/vendor-es2015.js +0 -155551
  116. package/dist/configurator/vendor-es2015.js.map +0 -1
  117. package/dist/configurator/vendor-es5.js +0 -183588
  118. package/dist/configurator/vendor-es5.js.map +0 -1
  119. package/ng-package.json +0 -9
  120. package/src/app/app.component.ts +0 -222
  121. package/src/app/app.module.ts +0 -34
  122. package/src/app/builder.ts +0 -480
  123. package/src/app/components/answers/answer/answer.component.ts +0 -61
  124. package/src/app/components/answers/answers.component.ts +0 -41
  125. package/src/app/components/answers/answers.module.ts +0 -26
  126. package/src/app/components/selections/selections.component.ts +0 -131
  127. package/src/app/components/selections/selections.module.ts +0 -20
  128. package/src/app/components/shared/loader/loader.component.scss +0 -33
  129. package/src/app/components/shared/loader/loader.component.ts +0 -20
  130. package/src/app/components/shared/shared.module.ts +0 -16
  131. package/src/app/directives/visibility-observer-master.directive.ts +0 -71
  132. package/src/app/directives/visibility-observer.directive.ts +0 -74
  133. package/src/app/services/configurator.service.ts +0 -86
  134. package/src/app/services/image-cache.service.ts +0 -56
  135. package/src/app/services/locator.service.ts +0 -6
  136. package/src/environments/environment.prod.ts +0 -3
  137. package/src/environments/environment.ts +0 -8
  138. package/src/helper/variation-helper.ts +0 -220
  139. package/src/index.html +0 -14
  140. package/src/main.ts +0 -11
  141. package/src/model/material.ts +0 -22
  142. package/src/model/variation-settings.ts +0 -14
  143. package/src/model/variation.ts +0 -11
  144. package/src/polyfills.ts +0 -73
  145. package/src/style/shared.scss +0 -173
  146. package/src/style/styles.scss +0 -45
  147. package/src/tsconfig.app.json +0 -16
  148. package/src/tsconfig.spec.json +0 -19
  149. package/src/utils/asset.utils.ts +0 -88
  150. package/src/utils/file.utils.ts +0 -156
  151. package/src/utils/file.utils.unit.test.ts +0 -8
  152. package/src/utils/image.utils.ts +0 -54
  153. package/src/utils/object.utils.ts +0 -52
  154. package/src/utils/scene-utils.ts +0 -119
  155. package/src/utils/threed.utils.ts +0 -219
  156. package/src/utils/variation-utils.ts +0 -216
  157. package/tsconfig.json +0 -23
  158. package/tslint.json +0 -132
@@ -0,0 +1,139 @@
1
+ import { __awaiter } from "tslib";
2
+ import axios from "axios";
3
+ // Static utility functions holder related to files.
4
+ // @dynamic
5
+ export class FileUtils {
6
+ // Returns the given dataUri string stripped of the mimetype part.
7
+ static StripMimeStringFromDataUri(dataUri) {
8
+ if (!dataUri) {
9
+ return '';
10
+ }
11
+ const mimeString = this.GetMimeStringFromDataUri(dataUri);
12
+ return dataUri.substr(mimeString.length + 1);
13
+ }
14
+ static GetMimeStringFromDataUri(dataUri) {
15
+ if (!dataUri) {
16
+ return '';
17
+ }
18
+ return dataUri.split(',')[0];
19
+ }
20
+ static FileExists(url, assetPath) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ const result = yield axios({
23
+ method: 'get',
24
+ url: `${assetPath}getFiles.php?assetUrl=${url}`,
25
+ responseType: "json"
26
+ });
27
+ return !!result.data;
28
+ });
29
+ }
30
+ /**
31
+ * There is some discrepancy regarding locations of h3d objects
32
+ * Therefor we need to (temporarily?!) fix the content url
33
+ * Also we need to change some additionals
34
+ */
35
+ static FixUrl(assetUrl) {
36
+ if (!assetUrl) {
37
+ return '';
38
+ }
39
+ let fixedUrl = assetUrl;
40
+ if (!fixedUrl.endsWith('glb') && !fixedUrl.endsWith('obj') && !fixedUrl.endsWith('glb.gz') && !fixedUrl.endsWith('obj.gz')) {
41
+ fixedUrl = FileUtils.FixUnityUrl(fixedUrl);
42
+ }
43
+ fixedUrl = fixedUrl.replace('/content/', '/content43/');
44
+ return fixedUrl;
45
+ }
46
+ static FixGlbUrl(assetUrl) {
47
+ if (!assetUrl) {
48
+ return '';
49
+ }
50
+ let fixedUrl = assetUrl;
51
+ if (assetUrl.indexOf('_webplayer') === -1) {
52
+ fixedUrl = assetUrl.concat('_webplayer');
53
+ }
54
+ fixedUrl = fixedUrl.replace('/content/', '/content43/');
55
+ if (!fixedUrl.endsWith('.glb')) {
56
+ fixedUrl = fixedUrl.concat('.glb');
57
+ }
58
+ return fixedUrl;
59
+ }
60
+ // Return the mimetype of the given filename.
61
+ static MimeTypeFromFilename(fileName) {
62
+ const regEx = /(?:\.([^.]+))?$/; // regex to find extension
63
+ const extension = regEx.exec(fileName)[1];
64
+ switch (extension) {
65
+ case 'jpg':
66
+ case 'jpeg':
67
+ return 'image/jpeg';
68
+ case 'png':
69
+ return 'image/png';
70
+ case 'bmp':
71
+ return 'image/bmp';
72
+ }
73
+ }
74
+ /**
75
+ * Downloads the given file to the users default download location.
76
+ * @param fileName With or without extension
77
+ * @param content File content as a string
78
+ * @param [mimeType = 'text/plain']
79
+ */
80
+ static DownloadFile(fileName, content, mimeType = 'text/plain') {
81
+ const element = document.createElement('a');
82
+ element.setAttribute('href', 'data:' + mimeType + ';charset=utf-8,' + encodeURIComponent(content));
83
+ element.setAttribute('download', fileName);
84
+ element.style.display = 'none';
85
+ document.body.appendChild(element);
86
+ element.click();
87
+ document.body.removeChild(element);
88
+ }
89
+ // Returns the contents of given file as a text string.
90
+ static ReadAsText(file) {
91
+ return new Promise((resolve) => {
92
+ const reader = new FileReader();
93
+ reader.readAsText(file);
94
+ reader.onloadend = (event) => {
95
+ if (event.target.readyState === 2) {
96
+ resolve(event.target.result);
97
+ }
98
+ };
99
+ });
100
+ }
101
+ static GetExtensionFromDataUri(dataUri) {
102
+ return dataUri.replace(/(data:image\/)(.*?)(;base64.*)/gi, '$2');
103
+ }
104
+ static CreateDownloadFileNameFromBase64(dataUri) {
105
+ const ext = this.GetExtensionFromDataUri(dataUri);
106
+ return 'preview.' + ext;
107
+ }
108
+ static DownloadFromDataUri(dataUri, fileName) {
109
+ const link = document.createElement('a');
110
+ link.download = fileName;
111
+ link.href = dataUri;
112
+ document.body.appendChild(link);
113
+ link.click();
114
+ document.body.removeChild(link);
115
+ }
116
+ // todo remove once Connector deals with mimetypes and this method isn't used anymore
117
+ static DocumentBodyToDataUri(documentBody, mimeType) {
118
+ if (!!documentBody) {
119
+ return 'data:' + mimeType + ';base64,' + documentBody;
120
+ }
121
+ else {
122
+ return '';
123
+ }
124
+ }
125
+ static FixUnityUrl(url) {
126
+ if (url.indexOf('_webplayer') === -1) {
127
+ url = url.concat('_webplayer.ione3d');
128
+ }
129
+ else {
130
+ url = url.replace('_webplayer', '_webplayer.ione3d');
131
+ }
132
+ if (!url.endsWith('.gz')) {
133
+ url = url.concat('.gz');
134
+ }
135
+ return url.replace('.unity3d', '');
136
+ }
137
+ }
138
+ FileUtils._cachedTextureUploads = new Map();
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2xpam5pdC9jb25maWd1cmF0b3IvIiwic291cmNlcyI6WyJ1dGlscy9maWxlLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsb0RBQW9EO0FBQ3BELFdBQVc7QUFDWCxNQUFNLE9BQU8sU0FBUztJQUlwQixrRUFBa0U7SUFDM0QsTUFBTSxDQUFDLDBCQUEwQixDQUFDLE9BQWU7UUFDdEQsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxNQUFNLFVBQVUsR0FBVyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEUsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxPQUFlO1FBQ3BELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxNQUFNLENBQU8sVUFBVSxDQUFDLEdBQVcsRUFBRSxTQUFpQjs7WUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUM7Z0JBQ3pCLE1BQU0sRUFBRSxLQUFLO2dCQUNiLEdBQUcsRUFBRSxHQUFHLFNBQVMseUJBQXlCLEdBQUcsRUFBRTtnQkFDL0MsWUFBWSxFQUFFLE1BQU07YUFDckIsQ0FBQyxDQUFBO1lBQ0YsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN6QixDQUFDO0tBQUE7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFnQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxF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U0FDWDtJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUc7UUFDNUIsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3BDLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDdkM7YUFBTTtZQUNMLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekI7UUFDRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7O0FBckpjLCtCQUFxQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xuLy8gU3RhdGljIHV0aWxpdHkgZnVuY3Rpb25zIGhvbGRlciByZWxhdGVkIHRvIGZpbGVzLlxuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBGaWxlVXRpbHMge1xuXG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZWRUZXh0dXJlVXBsb2FkczogTWFwPHN0cmluZywgT2JqZWN0PiA9IG5ldyBNYXAoKTtcblxuICAvLyBSZXR1cm5zIHRoZSBnaXZlbiBkYXRhVXJpIHN0cmluZyBzdHJpcHBlZCBvZiB0aGUgbWltZXR5cGUgcGFydC5cbiAgcHVibGljIHN0YXRpYyBTdHJpcE1pbWVTdHJpbmdGcm9tRGF0YVVyaShkYXRhVXJpOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghZGF0YVVyaSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbWVTdHJpbmc6IHN0cmluZyA9IHRoaXMuR2V0TWltZVN0cmluZ0Zyb21EYXRhVXJpKGRhdGFVcmkpO1xuICAgIHJldHVybiBkYXRhVXJpLnN1YnN0cihtaW1lU3RyaW5nLmxlbmd0aCArIDEpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBHZXRNaW1lU3RyaW5nRnJvbURhdGFVcmkoZGF0YVVyaTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWRhdGFVcmkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YVVyaS5zcGxpdCgnLCcpWzBdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBGaWxlRXhpc3RzKHVybDogc3RyaW5nLCBhc3NldFBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXhpb3Moe1xuICAgICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgICB1cmw6IGAke2Fzc2V0UGF0aH1nZXRGaWxlcy5waHA/YXNzZXRVcmw9JHt1cmx9YCxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiBcImpzb25cIlxuICAgICAgfSlcbiAgICAgIHJldHVybiAhIXJlc3VsdC5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZXJlIGlzIHNvbWUgZGlzY3JlcGFuY3kgcmVnYXJkaW5nIGxvY2F0aW9ucyBvZiBoM2Qgb2JqZWN0c1xuICAgKiBUaGVyZWZvciB3ZSBuZWVkIHRvICh0ZW1wb3JhcmlseT8hKSBmaXggdGhlIGNvbnRlbnQgdXJsXG4gICAqIEFsc28gd2UgbmVlZCB0byBjaGFuZ2Ugc29tZSBhZGRpdGlvbmFsc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBGaXhVcmwoYXNzZXRVcmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFhc3NldFVybCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBsZXQgZml4ZWRVcmw6IHN0cmluZyA9IGFzc2V0VXJsO1xuICAgIGlmICghZml4ZWRVcmwuZW5kc1dpdGgoJ2dsYicpICYmICFmaXhlZFVybC5lbmRzV2l0aCgnb2JqJykgJiYgIWZpeGVkVXJsLmVuZHNXaXRoKCdnbGIuZ3onKSAmJiAhZml4ZWRVcmwuZW5kc1dpdGgoJ29iai5neicpKSB7XG4gICAgICBmaXhlZFVybCA9IEZpbGVVdGlscy5GaXhVbml0eVVybChmaXhlZFVybCk7XG4gICAgfVxuICAgIGZpeGVkVXJsID0gZml4ZWRVcmwucmVwbGFjZSgnL2NvbnRlbnQvJywgJy9jb250ZW50NDMvJyk7XG4gICAgcmV0dXJuIGZpeGVkVXJsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBGaXhHbGJVcmwoYXNzZXRVcmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFhc3NldFVybCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBsZXQgZml4ZWRVcmw6IHN0cmluZyA9IGFzc2V0VXJsO1xuICAgIGlmIChhc3NldFVybC5pbmRleE9mKCdfd2VicGxheWVyJykgPT09IC0xKSB7XG4gICAgICBmaXhlZFVybCA9IGFzc2V0VXJsLmNvbmNhdCgnX3dlYnBsYXllcicpO1xuICAgIH1cbiAgICBmaXhlZFVybCA9IGZpeGVkVXJsLnJlcGxhY2UoJy9jb250ZW50LycsICcvY29udGVudDQzLycpO1xuICAgIGlmICghZml4ZWRVcmwuZW5kc1dpdGgoJy5nbGInKSkge1xuICAgICAgZml4ZWRVcmwgPSBmaXhlZFVybC5jb25jYXQoJy5nbGInKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpeGVkVXJsO1xuICB9XG5cbiAgLy8gUmV0dXJuIHRoZSBtaW1ldHlwZSBvZiB0aGUgZ2l2ZW4gZmlsZW5hbWUuXG4gIHB1YmxpYyBzdGF0aWMgTWltZVR5cGVGcm9tRmlsZW5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVnRXg6IFJlZ0V4cCA9IC8oPzpcXC4oW14uXSspKT8kLzsgLy8gcmVnZXggdG8gZmluZCBleHRlbnNpb25cbiAgICBjb25zdCBleHRlbnNpb246IGFueSA9IHJlZ0V4LmV4ZWMoZmlsZU5hbWUpWzFdO1xuICAgIHN3aXRjaCAoZXh0ZW5zaW9uKSB7XG4gICAgICBjYXNlICdqcGcnOlxuICAgICAgY2FzZSAnanBlZyc6XG4gICAgICAgIHJldHVybiAnaW1hZ2UvanBlZyc7XG4gICAgICBjYXNlICdwbmcnOlxuICAgICAgICByZXR1cm4gJ2ltYWdlL3BuZyc7XG4gICAgICBjYXNlICdibXAnOlxuICAgICAgICByZXR1cm4gJ2ltYWdlL2JtcCc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkcyB0aGUgZ2l2ZW4gZmlsZSB0byB0aGUgdXNlcnMgZGVmYXVsdCBkb3dubG9hZCBsb2NhdGlvbi5cbiAgICogQHBhcmFtIGZpbGVOYW1lIFdpdGggb3Igd2l0aG91dCBleHRlbnNpb25cbiAgICogQHBhcmFtIGNvbnRlbnQgRmlsZSBjb250ZW50IGFzIGEgc3RyaW5nXG4gICAqIEBwYXJhbSBbbWltZVR5cGUgPSAndGV4dC9wbGFpbiddXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIERvd25sb2FkRmlsZShcbiAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBtaW1lVHlwZTogc3RyaW5nID0gJ3RleHQvcGxhaW4nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgJ2RhdGE6JyArIG1pbWVUeXBlICsgJztjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQoY29udGVudCkpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVOYW1lKTtcblxuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgZWxlbWVudC5jbGljaygpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGdpdmVuIGZpbGUgYXMgYSB0ZXh0IHN0cmluZy5cbiAgcHVibGljIHN0YXRpYyBSZWFkQXNUZXh0KGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlOiBGdW5jdGlvbikgPT4ge1xuICAgICAgY29uc3QgcmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IChldmVudDogYW55KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQucmVhZHlTdGF0ZSA9PT0gMikge1xuICAgICAgICAgIHJlc29sdmUoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEdldEV4dGVuc2lvbkZyb21EYXRhVXJpKGRhdGFVcmk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGFVcmkucmVwbGFjZSgvKGRhdGE6aW1hZ2VcXC8pKC4qPykoO2Jhc2U2NC4qKS9naSwgJyQyJyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIENyZWF0ZURvd25sb2FkRmlsZU5hbWVGcm9tQmFzZTY0KGRhdGFVcmk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZXh0OiBzdHJpbmcgPSB0aGlzLkdldEV4dGVuc2lvbkZyb21EYXRhVXJpKGRhdGFVcmkpO1xuICAgIHJldHVybiAncHJldmlldy4nICsgZXh0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBEb3dubG9hZEZyb21EYXRhVXJpKGRhdGFVcmk6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGxpbms6IGFueSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XG4gICAgbGluay5ocmVmID0gZGF0YVVyaTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgIGxpbmsuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICB9XG5cbiAgLy8gdG9kbyByZW1vdmUgb25jZSBDb25uZWN0b3IgZGVhbHMgd2l0aCBtaW1ldHlwZXMgYW5kIHRoaXMgbWV0aG9kIGlzbid0IHVzZWQgYW55bW9yZVxuICBwdWJsaWMgc3RhdGljIERvY3VtZW50Qm9keVRvRGF0YVVyaShkb2N1bWVudEJvZHk6IHN0cmluZywgbWltZVR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCEhZG9jdW1lbnRCb2R5KSB7XG4gICAgICByZXR1cm4gJ2RhdGE6JyArIG1pbWVUeXBlICsgJztiYXNlNjQsJyArIGRvY3VtZW50Qm9keTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIEZpeFVuaXR5VXJsKHVybCk6IHN0cmluZyB7XG4gICAgaWYgKHVybC5pbmRleE9mKCdfd2VicGxheWVyJykgPT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuY29uY2F0KCdfd2VicGxheWVyLmlvbmUzZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cmwgPSB1cmwucmVwbGFjZSgnX3dlYnBsYXllcicsICdfd2VicGxheWVyLmlvbmUzZCcpO1xuICAgIH1cbiAgICBpZiAoIXVybC5lbmRzV2l0aCgnLmd6JykpIHtcbiAgICAgIHVybCA9IHVybC5jb25jYXQoJy5neicpO1xuICAgIH1cbiAgICByZXR1cm4gdXJsLnJlcGxhY2UoJy51bml0eTNkJywgJycpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,52 @@
1
+ import * as THREE from 'three';
2
+ // @dynamic
3
+ export class ImageUtils {
4
+ static CreateTextureFromBase64(id, base64, material) {
5
+ return new Promise((resolve) => {
6
+ if (ImageUtils.textures.has(id)) {
7
+ resolve(ImageUtils.textures.get(id));
8
+ }
9
+ else {
10
+ if (!base64) {
11
+ resolve(new THREE.Texture());
12
+ }
13
+ else {
14
+ const loader = new THREE.TextureLoader();
15
+ loader.load(base64, (texture) => {
16
+ texture.anisotropy = 16;
17
+ texture.wrapS = THREE.RepeatWrapping;
18
+ texture.wrapT = THREE.RepeatWrapping;
19
+ texture.repeat = new THREE.Vector2(material ? material.repeatX : 1, material ? material.repeatY : 1);
20
+ texture.needsUpdate = true;
21
+ ImageUtils.textures.set(id, texture);
22
+ resolve(texture);
23
+ });
24
+ }
25
+ }
26
+ });
27
+ }
28
+ static getDocBodyWithMimeTypeDefinition(fileName, documentBody) {
29
+ if (documentBody === null) {
30
+ return documentBody;
31
+ }
32
+ const fileExtension = fileName.substr(fileName.lastIndexOf('.') + 1);
33
+ switch (fileExtension.toLowerCase()) {
34
+ case "jpg":
35
+ case "jpeg":
36
+ return "data:image/jpg;base64," + documentBody;
37
+ case "png":
38
+ return "data:image/png;base64," + documentBody;
39
+ case "gif":
40
+ return "data:image/gif;base64," + documentBody;
41
+ case "bmp":
42
+ return "data:image/bmp;base64," + documentBody;
43
+ default:
44
+ return "data:image/png;base64," + documentBody;
45
+ }
46
+ }
47
+ static getFixedImageFilepathUrl(imageFilepathUrl) {
48
+ return imageFilepathUrl.replace("/content/", "/content43/");
49
+ }
50
+ }
51
+ ImageUtils.textures = new Map();
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UudXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29saWpuaXQvY29uZmlndXJhdG9yLyIsInNvdXJjZXMiOlsidXRpbHMvaW1hZ2UudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsV0FBVztBQUNYLE1BQU0sT0FBTyxVQUFVO0lBSWQsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEVBQVUsRUFBRSxNQUFjLEVBQUUsUUFBa0I7UUFDbEYsT0FBTyxJQUFJLE9BQU8sQ0FBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM1QyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUMvQixPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN0QztpQkFBTTtnQkFDTCxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNYLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2lCQUM5QjtxQkFBTTtvQkFDTCxNQUFNLE1BQU0sR0FBd0IsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQzlELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBc0IsRUFBRSxFQUFFO3dCQUM3QyxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQzt3QkFDeEIsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO3dCQUNyQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7d0JBQ3JDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3JHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO3dCQUMzQixVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7d0JBQ3JDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkIsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFnQixFQUFFLFlBQW9CO1FBQ25GLElBQUksWUFBWSxLQUFLLElBQUksRUFBRTtZQUN6QixPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUNELE1BQU0sYUFBYSxHQUFXLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RSxRQUFRLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNuQyxLQUFLLEtBQUssQ0FBQztZQUNYLEtBQUssTUFBTTtnQkFDVCxPQUFPLHdCQUF3QixHQUFHLFlBQVksQ0FBQztZQUNqRCxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyx3QkFBd0IsR0FBRyxZQUFZLENBQUM7WUFDakQsS0FBSyxLQUFLO2dCQUNSLE9BQU8sd0JBQXdCLEdBQUcsWUFBWSxDQUFDO1lBQ2pELEtBQUssS0FBSztnQkFDUixPQUFPLHdCQUF3QixHQUFHLFlBQVksQ0FBQztZQUNqRDtnQkFDRSxPQUFPLHdCQUF3QixHQUFHLFlBQVksQ0FBQztTQUNsRDtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsd0JBQXdCLENBQUMsZ0JBQXdCO1FBQzdELE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUM5RCxDQUFDOztBQS9DYSxtQkFBUSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtNYXRlcmlhbH0gZnJvbSAnLi4vbW9kZWwvbWF0ZXJpYWwnO1xuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBJbWFnZVV0aWxzIHtcblxuICBwdWJsaWMgc3RhdGljIHRleHR1cmVzOiBNYXA8c3RyaW5nLCBUSFJFRS5UZXh0dXJlPiA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgc3RhdGljIENyZWF0ZVRleHR1cmVGcm9tQmFzZTY0KGlkOiBzdHJpbmcsIGJhc2U2NDogc3RyaW5nLCBtYXRlcmlhbDogTWF0ZXJpYWwpOiBQcm9taXNlPFRIUkVFLlRleHR1cmU+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VEhSRUUuVGV4dHVyZT4oKHJlc29sdmUpID0+IHtcbiAgICAgIGlmIChJbWFnZVV0aWxzLnRleHR1cmVzLmhhcyhpZCkpIHtcbiAgICAgICAgcmVzb2x2ZShJbWFnZVV0aWxzLnRleHR1cmVzLmdldChpZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFiYXNlNjQpIHtcbiAgICAgICAgICByZXNvbHZlKG5ldyBUSFJFRS5UZXh0dXJlKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGxvYWRlcjogVEhSRUUuVGV4dHVyZUxvYWRlciA9IG5ldyBUSFJFRS5UZXh0dXJlTG9hZGVyKCk7XG4gICAgICAgICAgbG9hZGVyLmxvYWQoYmFzZTY0LCAodGV4dHVyZTogVEhSRUUuVGV4dHVyZSkgPT4ge1xuICAgICAgICAgICAgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gMTY7XG4gICAgICAgICAgICB0ZXh0dXJlLndyYXBTID0gVEhSRUUuUmVwZWF0V3JhcHBpbmc7XG4gICAgICAgICAgICB0ZXh0dXJlLndyYXBUID0gVEhSRUUuUmVwZWF0V3JhcHBpbmc7XG4gICAgICAgICAgICB0ZXh0dXJlLnJlcGVhdCA9IG5ldyBUSFJFRS5WZWN0b3IyKG1hdGVyaWFsID8gbWF0ZXJpYWwucmVwZWF0WCA6IDEsIG1hdGVyaWFsID8gbWF0ZXJpYWwucmVwZWF0WSA6IDEpO1xuICAgICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICBJbWFnZVV0aWxzLnRleHR1cmVzLnNldChpZCwgdGV4dHVyZSk7XG4gICAgICAgICAgICByZXNvbHZlKHRleHR1cmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldERvY0JvZHlXaXRoTWltZVR5cGVEZWZpbml0aW9uKGZpbGVOYW1lOiBzdHJpbmcsIGRvY3VtZW50Qm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoZG9jdW1lbnRCb2R5ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnRCb2R5O1xuICAgIH1cbiAgICBjb25zdCBmaWxlRXh0ZW5zaW9uOiBzdHJpbmcgPSBmaWxlTmFtZS5zdWJzdHIoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpO1xuICAgIHN3aXRjaCAoZmlsZUV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwianBnXCI6XG4gICAgICBjYXNlIFwianBlZ1wiOlxuICAgICAgICByZXR1cm4gXCJkYXRhOmltYWdlL2pwZztiYXNlNjQsXCIgKyBkb2N1bWVudEJvZHk7XG4gICAgICBjYXNlIFwicG5nXCI6XG4gICAgICAgIHJldHVybiBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxcIiArIGRvY3VtZW50Qm9keTtcbiAgICAgIGNhc2UgXCJnaWZcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFwiICsgZG9jdW1lbnRCb2R5O1xuICAgICAgY2FzZSBcImJtcFwiOlxuICAgICAgICByZXR1cm4gXCJkYXRhOmltYWdlL2JtcDtiYXNlNjQsXCIgKyBkb2N1bWVudEJvZHk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsXCIgKyBkb2N1bWVudEJvZHk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRGaXhlZEltYWdlRmlsZXBhdGhVcmwoaW1hZ2VGaWxlcGF0aFVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaW1hZ2VGaWxlcGF0aFVybC5yZXBsYWNlKFwiL2NvbnRlbnQvXCIsIFwiL2NvbnRlbnQ0My9cIik7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,49 @@
1
+ import { Mesh } from "three";
2
+ export class ObjectUtils {
3
+ static DisposeMaterial(material) {
4
+ if (!material) {
5
+ return;
6
+ }
7
+ if (Array.isArray(material)) {
8
+ material.forEach(mtrl => {
9
+ this.materialProps
10
+ .filter(mapType => mtrl[mapType])
11
+ .forEach(mapType => mtrl[mapType].dispose());
12
+ mtrl.dispose();
13
+ });
14
+ }
15
+ else {
16
+ this.materialProps
17
+ .filter(mapType => material[mapType] && material[mapType].dispose)
18
+ .forEach(mapType => material[mapType].dispose());
19
+ if (material.dispose) {
20
+ material.dispose();
21
+ }
22
+ }
23
+ }
24
+ static DisposeObject(object) {
25
+ if (!object) {
26
+ return;
27
+ }
28
+ if (object.children.length) {
29
+ object.children.forEach(child => this.DisposeObject(child));
30
+ }
31
+ this.DisposeNode(object);
32
+ }
33
+ static DisposeNode(node) {
34
+ node.traverse((obj) => {
35
+ if (obj instanceof Mesh) {
36
+ if (obj.geometry) {
37
+ obj.geometry.dispose();
38
+ }
39
+ this.DisposeMaterial(obj.material);
40
+ }
41
+ if (typeof obj.dispose === 'function') {
42
+ // @ts-ignore
43
+ obj.dispose();
44
+ }
45
+ });
46
+ }
47
+ }
48
+ ObjectUtils.materialProps = ['map', 'lightMap', 'bumpMap', 'normalMap', 'specularMap', 'envMap', 'aoMap', 'roughnessMap', 'metalnessMap'];
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LnV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvbGlqbml0L2NvbmZpZ3VyYXRvci8iLCJzb3VyY2VzIjpbInV0aWxzL29iamVjdC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsSUFBSSxFQUFXLE1BQU0sT0FBTyxDQUFDO0FBRS9DLE1BQU0sT0FBTyxXQUFXO0lBR2IsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUErQjtRQUN6RCxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ1gsT0FBTztTQUNWO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3pCLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxhQUFhO3FCQUNiLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDaEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDSCxJQUFJLENBQUMsYUFBYTtpQkFDYixNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQztpQkFDakUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO2dCQUNsQixRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDdEI7U0FDSjtJQUNMLENBQUM7SUFFTSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQXVCO1FBQy9DLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxPQUFPO1NBQ1Y7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFxQjtRQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBYSxFQUFFLEVBQUU7WUFDNUIsSUFBSSxHQUFHLFlBQVksSUFBSSxFQUFFO2dCQUNyQixJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7b0JBQ2QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDMUI7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDdEM7WUFDRCxJQUFJLE9BQVEsR0FBVyxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUU7Z0JBQzVDLGFBQWE7Z0JBQ2IsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2pCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOztBQTlDTSx5QkFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0ZXJpYWwsIE1lc2gsIE9iamVjdDNEfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBPYmplY3RVdGlscyB7XHJcbiAgICBzdGF0aWMgbWF0ZXJpYWxQcm9wcyA9IFsnbWFwJywgJ2xpZ2h0TWFwJywgJ2J1bXBNYXAnLCAnbm9ybWFsTWFwJywgJ3NwZWN1bGFyTWFwJywgJ2Vudk1hcCcsICdhb01hcCcsICdyb3VnaG5lc3NNYXAnLCAnbWV0YWxuZXNzTWFwJ107XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBEaXNwb3NlTWF0ZXJpYWwobWF0ZXJpYWw6IE1hdGVyaWFsIHwgTWF0ZXJpYWxbXSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghbWF0ZXJpYWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRlcmlhbCkpIHtcclxuICAgICAgICAgICAgbWF0ZXJpYWwuZm9yRWFjaChtdHJsID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWF0ZXJpYWxQcm9wc1xyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobWFwVHlwZSA9PiBtdHJsW21hcFR5cGVdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKG1hcFR5cGUgPT4gbXRybFttYXBUeXBlXS5kaXNwb3NlKCkpO1xyXG4gICAgICAgICAgICAgICAgbXRybC5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0ZXJpYWxQcm9wc1xyXG4gICAgICAgICAgICAgICAgLmZpbHRlcihtYXBUeXBlID0+IG1hdGVyaWFsW21hcFR5cGVdICYmIG1hdGVyaWFsW21hcFR5cGVdLmRpc3Bvc2UpXHJcbiAgICAgICAgICAgICAgICAuZm9yRWFjaChtYXBUeXBlID0+IG1hdGVyaWFsW21hcFR5cGVdLmRpc3Bvc2UoKSk7XHJcbiAgICAgICAgICAgIGlmIChtYXRlcmlhbC5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBEaXNwb3NlT2JqZWN0KG9iamVjdDogT2JqZWN0M0QgfCBNZXNoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFvYmplY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JqZWN0LmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBvYmplY3QuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB0aGlzLkRpc3Bvc2VPYmplY3QoY2hpbGQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5EaXNwb3NlTm9kZShvYmplY3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIERpc3Bvc2VOb2RlKG5vZGU6IE9iamVjdDNEIHwgTWVzaCk6IHZvaWQge1xyXG4gICAgICAgIG5vZGUudHJhdmVyc2UoKG9iajogT2JqZWN0M0QpID0+IHtcclxuICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1lc2gpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvYmouZ2VvbWV0cnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBvYmouZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5EaXNwb3NlTWF0ZXJpYWwob2JqLm1hdGVyaWFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIChvYmogYXMgYW55KS5kaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICBvYmouZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -0,0 +1,94 @@
1
+ import * as THREE from 'three';
2
+ export class SceneUtils {
3
+ static TrySelectorConnection(scene, parent, part1, part2, createAddableFn) {
4
+ let addable;
5
+ if (createAddableFn) {
6
+ addable = part2;
7
+ part2 = createAddableFn(addable);
8
+ }
9
+ for (let i = 0; i < part1.children.length; i++) {
10
+ for (let ii = 0; ii < part2.children.length; ii++) {
11
+ const con1 = part1.children[i];
12
+ const con2 = part2.children[ii];
13
+ // if these connectors can connect connect them
14
+ if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(con1, con2)) {
15
+ // if addable, continue this loop with a new addable
16
+ if (addable) {
17
+ const newPart2 = createAddableFn(addable, part2, part1);
18
+ // reference of part2 changed, so refresh con2
19
+ this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
20
+ }
21
+ else {
22
+ return this.SelectorConnect(scene, parent, con1, con2);
23
+ }
24
+ }
25
+ }
26
+ }
27
+ return false;
28
+ }
29
+ static Convert3DPointToScreenPoint(point, camera, width, height) {
30
+ if (!point) {
31
+ return new THREE.Vector2();
32
+ }
33
+ const vector = point.clone().project(camera);
34
+ vector.x = (vector.x + 1) / 2 * width;
35
+ vector.y = -(vector.y - 1) / 2 * height;
36
+ return new THREE.Vector2(vector.x, vector.y);
37
+ }
38
+ static CanSelectorConnect(con1, con2) {
39
+ const con1Name = con1 instanceof THREE.Object3D ? con1.name : con1.connector;
40
+ const con2Name = con2 instanceof THREE.Object3D ? con2.name : con2.connector;
41
+ const sameParent = con1 instanceof THREE.Object3D && con2 instanceof THREE.Object3D ? con1.parent === con2.parent : false;
42
+ const parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
43
+ if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
44
+ const connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
45
+ parts1[1] === parts2[1] && parts1[2] !== parts2[2];
46
+ return connectable;
47
+ }
48
+ return false;
49
+ }
50
+ static SelectorConnect(scene, parent, con1, con2) {
51
+ if (!scene || !parent) {
52
+ return false;
53
+ }
54
+ con1['connectedTo'] = con2.parent.name;
55
+ con2['connectedTo'] = con1.parent.name;
56
+ const motherRotation = new THREE.Euler(0, 0, 0);
57
+ const motherPosition = new THREE.Vector3(0, 0, 0);
58
+ scene.updateMatrixWorld(true);
59
+ motherRotation.copy(parent.rotation);
60
+ parent.getWorldPosition(motherPosition);
61
+ parent.rotation.set(0, 0, 0);
62
+ parent.position.set(0, 0, 0);
63
+ const con1Quat = new THREE.Quaternion();
64
+ con1.getWorldQuaternion(con1Quat);
65
+ const con2Quat = new THREE.Quaternion();
66
+ con2.getWorldQuaternion(con2Quat);
67
+ const con1QuatParent = new THREE.Quaternion();
68
+ con1.parent.getWorldQuaternion(con1QuatParent);
69
+ const con2QuatParent = new THREE.Quaternion();
70
+ con2.parent.getWorldQuaternion(con2QuatParent);
71
+ const rotation = new THREE.Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new THREE.Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
72
+ con2.parent.quaternion.copy(rotation);
73
+ // Update because the matrix has been tempered with
74
+ scene.updateMatrixWorld(true);
75
+ // Move the connectors towards eachother
76
+ const con1Pos = new THREE.Vector3();
77
+ con1.getWorldPosition(con1Pos);
78
+ const con2Pos = new THREE.Vector3();
79
+ con2.getWorldPosition(con2Pos);
80
+ const move = con1Pos.sub(con2Pos);
81
+ con2.parent.position.x += move.x;
82
+ con2.parent.position.y += move.y;
83
+ con2.parent.position.z += move.z;
84
+ // reset parent's objects rotation and position
85
+ parent.rotation.copy(motherRotation);
86
+ parent.position.copy(motherPosition);
87
+ scene.updateMatrixWorld(true);
88
+ // Set the connected flag
89
+ con1['connected'] = true;
90
+ con2['connected'] = true;
91
+ return true;
92
+ }
93
+ }
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29saWpuaXQvY29uZmlndXJhdG9yLyIsInNvdXJjZXMiOlsidXRpbHMvc2NlbmUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsTUFBTSxPQUFPLFVBQVU7SUFFWixNQUFNLENBQUMscUJBQXFCLENBQUMsS0FBa0IsRUFBRSxNQUFzQixFQUMxRSxLQUFVLEVBQUUsS0FBVSxFQUFFLGVBQTBCO1FBQ2xELElBQUksT0FBWSxDQUFDO1FBQ2pCLElBQUksZUFBZSxFQUFFO1lBQ2pCLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQy9DLE1BQU0sSUFBSSxHQUFtQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLElBQUksR0FBbUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEQsK0NBQStDO2dCQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQ2pGLG9EQUFvRDtvQkFDcEQsSUFBSSxPQUFPLEVBQUU7d0JBQ1QsTUFBTSxRQUFRLEdBQW1CLGVBQWUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxF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Q0FBQyxDQUFDO1FBRXJDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5Qix5QkFBeUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FFSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTY2VuZVV0aWxzIHtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFRyeVNlbGVjdG9yQ29ubmVjdGlvbihzY2VuZTogVEhSRUUuU2NlbmUsIHBhcmVudDogVEhSRUUuT2JqZWN0M0QsXHJcbiAgICAgICAgcGFydDE6IGFueSwgcGFydDI6IGFueSwgY3JlYXRlQWRkYWJsZUZuPzogRnVuY3Rpb24pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgYWRkYWJsZTogYW55O1xyXG4gICAgICAgIGlmIChjcmVhdGVBZGRhYmxlRm4pIHtcclxuICAgICAgICAgICAgYWRkYWJsZSA9IHBhcnQyO1xyXG4gICAgICAgICAgICBwYXJ0MiA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0MS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb24xOiBUSFJFRS5PYmplY3QzRCA9IHBhcnQxLmNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29uMjogVEhSRUUuT2JqZWN0M0QgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVzZSBjb25uZWN0b3JzIGNhbiBjb25uZWN0IGNvbm5lY3QgdGhlbVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjb24xWydjb25uZWN0ZWQnXSAmJiAhY29uMlsnY29ubmVjdGVkJ10gJiYgdGhpcy5DYW5TZWxlY3RvckNvbm5lY3QoY29uMSwgY29uMikpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFydDI6IFRIUkVFLk9iamVjdDNEID0gY3JlYXRlQWRkYWJsZUZuKGFkZGFibGUsIHBhcnQyLCBwYXJ0MSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgbmV3UGFydDIuY2hpbGRyZW5baWldKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbnZlcnQzRFBvaW50VG9TY3JlZW5Qb2ludChwb2ludDogVEhSRUUuVmVjdG9yMywgY2FtZXJhOiBUSFJFRS5DYW1lcmEsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogVEhSRUUuVmVjdG9yMiB7XHJcbiAgICAgICAgaWYgKCFwb2ludCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmVjdG9yOiBUSFJFRS5WZWN0b3IzID0gcG9pbnQuY2xvbmUoKS5wcm9qZWN0KGNhbWVyYSk7XHJcbiAgICAgICAgdmVjdG9yLnggPSAodmVjdG9yLnggKyAxKSAvIDIgKiB3aWR0aDtcclxuICAgICAgICB2ZWN0b3IueSA9IC0odmVjdG9yLnkgLSAxKSAvIDIgKiBoZWlnaHQ7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IyKHZlY3Rvci54LCB2ZWN0b3IueSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDYW5TZWxlY3RvckNvbm5lY3QoY29uMTogVEhSRUUuT2JqZWN0M0QgfCBhbnksIGNvbjI6IFRIUkVFLk9iamVjdDNEIHwgYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgY29uMU5hbWU6IHN0cmluZyA9IGNvbjEgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCA/IGNvbjEubmFtZSA6IGNvbjEuY29ubmVjdG9yO1xyXG4gICAgICAgIGNvbnN0IGNvbjJOYW1lOiBzdHJpbmcgPSBjb24yIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24yLm5hbWUgOiBjb24yLmNvbm5lY3RvcjtcclxuICAgICAgICBjb25zdCBzYW1lUGFyZW50OiBib29sZWFuID0gY29uMSBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEICYmIGNvbjIgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCA/IGNvbjEucGFyZW50ID09PSBjb24yLnBhcmVudCA6IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHBhcnRzMTogc3RyaW5nW10gPSBjb24xTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyksXHJcbiAgICAgICAgICAgIHBhcnRzMjogc3RyaW5nW10gPSBjb24yTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyk7XHJcbiAgICAgICAgaWYgKHBhcnRzMS5sZW5ndGggPj0gMyAmJiBwYXJ0czIubGVuZ3RoID49IDMgJiYgIXNhbWVQYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgY29ubmVjdGFibGU6IGJvb2xlYW4gPSBwYXJ0czFbMF0gPT09ICdDJyAmJiBwYXJ0czJbMF0gPT09ICdDJyAmJlxyXG4gICAgICAgICAgICAgICAgcGFydHMxWzFdID09PSBwYXJ0czJbMV0gJiYgcGFydHMxWzJdICE9PSBwYXJ0czJbMl07XHJcbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0YWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIFNlbGVjdG9yQ29ubmVjdChzY2VuZTogVEhSRUUuU2NlbmUsIHBhcmVudDogVEhSRUUuT2JqZWN0M0QsIGNvbjE6IFRIUkVFLk9iamVjdDNELCBjb24yOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghc2NlbmUgfHwgIXBhcmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbjFbJ2Nvbm5lY3RlZFRvJ10gPSBjb24yLnBhcmVudC5uYW1lO1xyXG4gICAgICAgIGNvbjJbJ2Nvbm5lY3RlZFRvJ10gPSBjb24xLnBhcmVudC5uYW1lO1xyXG5cclxuICAgICAgICBjb25zdCBtb3RoZXJSb3RhdGlvbjogVEhSRUUuRXVsZXIgPSBuZXcgVEhSRUUuRXVsZXIoMCwgMCwgMCk7XHJcbiAgICAgICAgY29uc3QgbW90aGVyUG9zaXRpb246IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCAwKTtcclxuXHJcbiAgICAgICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcbiAgICAgICAgbW90aGVyUm90YXRpb24uY29weShwYXJlbnQucm90YXRpb24pO1xyXG4gICAgICAgIHBhcmVudC5nZXRXb3JsZFBvc2l0aW9uKG1vdGhlclBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgcGFyZW50LnJvdGF0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgICAgICBwYXJlbnQucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG5cclxuICAgICAgICBjb25zdCBjb24xUXVhdDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAgICAgY29uMS5nZXRXb3JsZFF1YXRlcm5pb24oY29uMVF1YXQpO1xyXG4gICAgICAgIGNvbnN0IGNvbjJRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBjb24yLmdldFdvcmxkUXVhdGVybmlvbihjb24yUXVhdCk7XHJcbiAgICAgICAgY29uc3QgY29uMVF1YXRQYXJlbnQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gICAgICAgIGNvbjEucGFyZW50LmdldFdvcmxkUXVhdGVybmlvbihjb24xUXVhdFBhcmVudCk7XHJcbiAgICAgICAgY29uc3QgY29uMlF1YXRQYXJlbnQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gICAgICAgIGNvbjIucGFyZW50LmdldFdvcmxkUXVhdGVybmlvbihjb24yUXVhdFBhcmVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJvdGF0aW9uOiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgICAgICAgICBjb24xUXVhdC5pbnZlcnQoKSxcclxuICAgICAgICAgICAgY29uMlF1YXRcclxuICAgICAgICApLm11bHRpcGx5KFxyXG4gICAgICAgICAgICBuZXcgVEhSRUUuUXVhdGVybmlvbigpLm11bHRpcGx5UXVhdGVybmlvbnMoXHJcbiAgICAgICAgICAgICAgICBjb24xUXVhdFBhcmVudCxcclxuICAgICAgICAgICAgICAgIGNvbjFRdWF0UGFyZW50XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb24yLnBhcmVudC5xdWF0ZXJuaW9uLmNvcHkocm90YXRpb24pO1xyXG4gICAgICAgIC8vIFVwZGF0ZSBiZWNhdXNlIHRoZSBtYXRyaXggaGFzIGJlZW4gdGVtcGVyZWQgd2l0aFxyXG4gICAgICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgICAgICAvLyBNb3ZlIHRoZSBjb25uZWN0b3JzIHRvd2FyZHMgZWFjaG90aGVyXHJcbiAgICAgICAgY29uc3QgY29uMVBvczogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICAgICAgY29uMS5nZXRXb3JsZFBvc2l0aW9uKGNvbjFQb3MpO1xyXG4gICAgICAgIGNvbnN0IGNvbjJQb3M6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuXHJcbiAgICAgICAgY29uc3QgbW92ZTogVEhSRUUuVmVjdG9yMyA9IGNvbjFQb3Muc3ViKGNvbjJQb3MpO1xyXG4gICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnggKz0gbW92ZS54O1xyXG4gICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnkgKz0gbW92ZS55O1xyXG4gICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnogKz0gbW92ZS56O1xyXG5cclxuICAgICAgICAvLyByZXNldCBwYXJlbnQncyBvYmplY3RzIHJvdGF0aW9uIGFuZCBwb3NpdGlvblxyXG4gICAgICAgIHBhcmVudC5yb3RhdGlvbi5jb3B5KG1vdGhlclJvdGF0aW9uKTtcclxuICAgICAgICBwYXJlbnQucG9zaXRpb24uY29weShtb3RoZXJQb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIGNvbm5lY3RlZCBmbGFnXHJcbiAgICAgICAgY29uMVsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICAgIGNvbjJbJ2Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbn1cclxuIl19