sonamu 0.10.7 → 0.10.9
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.
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +5 -12
- package/dist/bin/cli.js +10 -253
- package/dist/database/base-model.d.ts +1 -0
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +14 -8
- package/dist/database/db.d.ts +2 -1
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +13 -3
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +4 -11
- package/dist/database/transaction-context.d.ts +8 -3
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +12 -7
- package/dist/migration/code-generation.js +2 -2
- package/dist/naite/naite-reporter.d.ts +8 -3
- package/dist/naite/naite-reporter.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +9 -4
- package/dist/ui-web/assets/{index-D0MHYbxl.js → index-CJf8uJYf.js} +47 -41
- package/dist/ui-web/assets/index-GMMIVGja.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/package.json +3 -3
- package/src/api/decorators.ts +11 -22
- package/src/bin/cli.ts +12 -375
- package/src/database/__tests__/transaction-scope.test.ts +227 -0
- package/src/database/base-model.ts +31 -6
- package/src/database/db.ts +17 -2
- package/src/database/puri-wrapper.ts +5 -22
- package/src/database/transaction-context.ts +14 -6
- package/src/migration/code-generation.ts +1 -1
- package/src/naite/naite-reporter.ts +8 -3
- package/dist/ui-web/assets/index-Dx_JX4aQ.css +0 -1
- package/src/skills/AGENTS.md +0 -108
- package/src/skills/sonamu/SKILL.md +0 -75
- package/src/skills/sonamu-ai-agents/SKILL.md +0 -205
- package/src/skills/sonamu-api/SKILL.md +0 -480
- package/src/skills/sonamu-auth/SKILL.md +0 -327
- package/src/skills/sonamu-auth/references/plugins.md +0 -310
- package/src/skills/sonamu-auth/references/user-id-migration-followups.md +0 -192
- package/src/skills/sonamu-auth/references/user-id-migration.md +0 -455
- package/src/skills/sonamu-config/SKILL.md +0 -203
- package/src/skills/sonamu-config/references/database.md +0 -452
- package/src/skills/sonamu-config/references/environments.md +0 -178
- package/src/skills/sonamu-config/references/server-options.md +0 -400
- package/src/skills/sonamu-entity/SKILL.md +0 -180
- package/src/skills/sonamu-entity/references/creation-workflow.md +0 -581
- package/src/skills/sonamu-entity/references/design-guides.md +0 -243
- package/src/skills/sonamu-entity/references/field-types.md +0 -170
- package/src/skills/sonamu-entity/references/relations-detail.md +0 -245
- package/src/skills/sonamu-entity/references/relations.md +0 -463
- package/src/skills/sonamu-entity/references/subset.md +0 -156
- package/src/skills/sonamu-fixture/SKILL.md +0 -180
- package/src/skills/sonamu-fixture/references/cli-usage.md +0 -439
- package/src/skills/sonamu-fixture/references/cone.md +0 -298
- package/src/skills/sonamu-frontend/SKILL.md +0 -142
- package/src/skills/sonamu-frontend/references/components.md +0 -323
- package/src/skills/sonamu-frontend/references/examples.md +0 -64
- package/src/skills/sonamu-frontend/references/hooks.md +0 -273
- package/src/skills/sonamu-frontend/references/runtime.md +0 -165
- package/src/skills/sonamu-frontend/references/scaffolding.md +0 -439
- package/src/skills/sonamu-i18n/SKILL.md +0 -287
- package/src/skills/sonamu-migration/SKILL.md +0 -316
- package/src/skills/sonamu-naite/SKILL.md +0 -266
- package/src/skills/sonamu-query/SKILL.md +0 -48
- package/src/skills/sonamu-query/references/model-patterns.md +0 -390
- package/src/skills/sonamu-query/references/model.md +0 -366
- package/src/skills/sonamu-query/references/puri.md +0 -413
- package/src/skills/sonamu-query/references/search.md +0 -238
- package/src/skills/sonamu-query/references/upsert.md +0 -324
- package/src/skills/sonamu-tasks/SKILL.md +0 -236
- package/src/skills/sonamu-testing/SKILL.md +0 -251
- package/src/skills/sonamu-testing/references/devrunner.md +0 -405
- package/src/skills/sonamu-testing/references/helpers.md +0 -185
- package/src/skills/sonamu-testing/references/patterns.md +0 -263
- package/src/skills/sonamu-testing/references/pitfalls.md +0 -588
- package/src/skills/sonamu-testing/references/quick-start.md +0 -285
- package/src/skills/sonamu-testing/references/type-safety.md +0 -172
- package/src/skills/sonamu-testing/references/writing-plan.md +0 -375
- package/src/skills/sonamu-vector/SKILL.md +0 -222
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
*
|
|
7
7
|
* 프로젝트별로 고유한 소켓을 사용하기 위해 sonamu.config.ts 경로의 해시를 사용합니다.
|
|
8
8
|
*
|
|
9
|
+
* 모듈 싱글턴이지만 인스턴스는 프로세스마다 별개입니다. run/start·run/end는
|
|
10
|
+
* Vitest 메인 프로세스(NaiteVitestReporter 커스텀 리포터)에서, test/result는
|
|
11
|
+
* 각 worker 프로세스(bootstrap의 afterEach)에서 전송되므로 buffer와 소켓
|
|
12
|
+
* 연결을 서로 공유하지 않습니다.
|
|
13
|
+
*
|
|
9
14
|
* fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
|
|
10
15
|
*/
|
|
11
16
|
|
|
@@ -24,17 +29,17 @@ declare class NaiteReporterClass {
|
|
|
24
29
|
*/
|
|
25
30
|
private send;
|
|
26
31
|
/**
|
|
27
|
-
*
|
|
32
|
+
* Vitest 커스텀 리포터(NaiteVitestReporter)의 onTestRunStart에서 호출합니다.
|
|
28
33
|
* 테스트 run 시작을 알립니다 (데이터 클리어 신호).
|
|
29
34
|
*/
|
|
30
35
|
startTestRun(): Promise<void>;
|
|
31
36
|
/**
|
|
32
|
-
* afterEach에서 호출합니다.
|
|
37
|
+
* bootstrap()의 afterEach에서 호출합니다.
|
|
33
38
|
* 테스트 케이스 결과를 traces와 함께 전송합니다.
|
|
34
39
|
*/
|
|
35
40
|
reportTestResult(result: Omit<NaiteMessagingTypes.TestResult, "receivedAt">): Promise<void>;
|
|
36
41
|
/**
|
|
37
|
-
*
|
|
42
|
+
* Vitest 커스텀 리포터(NaiteVitestReporter)의 onTestRunEnd에서 호출합니다.
|
|
38
43
|
* 테스트 run 종료를 알립니다.
|
|
39
44
|
*/
|
|
40
45
|
endTestRun(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naite-reporter.d.ts","sourceRoot":"","sources":["../../src/naite/naite-reporter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"naite-reporter.d.ts","sourceRoot":"","sources":["../../src/naite/naite-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;;AAUH,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AA+B7D,cAAM,kBAAkB;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAE9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,IAAI;IAgBlB;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;;OAGG;IACG,gBAAgB,CACpB,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC;IAYhB;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBlC;AAED,eAAO,MAAM,aAAa,oBAA2B,CAAC"}
|
|
@@ -12,6 +12,11 @@ import { connect } from "net";
|
|
|
12
12
|
*
|
|
13
13
|
* 프로젝트별로 고유한 소켓을 사용하기 위해 sonamu.config.ts 경로의 해시를 사용합니다.
|
|
14
14
|
*
|
|
15
|
+
* 모듈 싱글턴이지만 인스턴스는 프로세스마다 별개입니다. run/start·run/end는
|
|
16
|
+
* Vitest 메인 프로세스(NaiteVitestReporter 커스텀 리포터)에서, test/result는
|
|
17
|
+
* 각 worker 프로세스(bootstrap의 afterEach)에서 전송되므로 buffer와 소켓
|
|
18
|
+
* 연결을 서로 공유하지 않습니다.
|
|
19
|
+
*
|
|
15
20
|
* fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
|
|
16
21
|
*/
|
|
17
22
|
init_utils();
|
|
@@ -78,7 +83,7 @@ var NaiteReporterClass = class {
|
|
|
78
83
|
}
|
|
79
84
|
}
|
|
80
85
|
/**
|
|
81
|
-
*
|
|
86
|
+
* Vitest 커스텀 리포터(NaiteVitestReporter)의 onTestRunStart에서 호출합니다.
|
|
82
87
|
* 테스트 run 시작을 알립니다 (데이터 클리어 신호).
|
|
83
88
|
*/
|
|
84
89
|
async startTestRun() {
|
|
@@ -89,7 +94,7 @@ var NaiteReporterClass = class {
|
|
|
89
94
|
});
|
|
90
95
|
}
|
|
91
96
|
/**
|
|
92
|
-
* afterEach에서 호출합니다.
|
|
97
|
+
* bootstrap()의 afterEach에서 호출합니다.
|
|
93
98
|
* 테스트 케이스 결과를 traces와 함께 전송합니다.
|
|
94
99
|
*/
|
|
95
100
|
async reportTestResult(result) {
|
|
@@ -101,7 +106,7 @@ var NaiteReporterClass = class {
|
|
|
101
106
|
});
|
|
102
107
|
}
|
|
103
108
|
/**
|
|
104
|
-
*
|
|
109
|
+
* Vitest 커스텀 리포터(NaiteVitestReporter)의 onTestRunEnd에서 호출합니다.
|
|
105
110
|
* 테스트 run 종료를 알립니다.
|
|
106
111
|
*/
|
|
107
112
|
async endTestRun() {
|
|
@@ -121,4 +126,4 @@ const NaiteReporter = new NaiteReporterClass();
|
|
|
121
126
|
//#endregion
|
|
122
127
|
export { NaiteReporter };
|
|
123
128
|
|
|
124
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUtcmVwb3J0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLXJlcG9ydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFpdGVSZXBvcnRlclxuICpcbiAqIO2FjOyKpO2KuCDqsrDqs7zsmYAgVHJhY2Ug7KCV67O066W8IFVuaXggU29ja2V07Jy866GcIFZTIENvZGUgZXh0ZW5zaW9u7JeQIOyghOuLrO2VqeuLiOuLpC5cbiAqIGV4dGVuc2lvbuydtCB+
|
|
129
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUtcmVwb3J0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLXJlcG9ydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFpdGVSZXBvcnRlclxuICpcbiAqIO2FjOyKpO2KuCDqsrDqs7zsmYAgVHJhY2Ug7KCV67O066W8IFVuaXggU29ja2V07Jy866GcIFZTIENvZGUgZXh0ZW5zaW9u7JeQIOyghOuLrO2VqeuLiOuLpC5cbiAqIGV4dGVuc2lvbuydtCB+Ly5zb25hbXUvbmFpdGUte2hhc2h9LnNvY2vsl5Ag7IaM7LyTIOyEnOuyhOulvCDsl7TslrTrkaHri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq467OE66GcIOqzoOycoO2VnCDshozsvJPsnYQg7IKs7Jqp7ZWY6riwIOychO2VtCBzb25hbXUuY29uZmlnLnRzIOqyveuhnOydmCDtlbTsi5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOuqqOuTiCDsi7HquIDthLTsnbTsp4Drp4wg7J247Iqk7YS07Iqk64qUIO2UhOuhnOyEuOyKpOuniOuLpCDrs4TqsJzsnoXri4jri6QuIHJ1bi9zdGFydMK3cnVuL2VuZOuKlFxuICogVml0ZXN0IOuplOyduCDtlITroZzshLjsiqQoTmFpdGVWaXRlc3RSZXBvcnRlciDsu6TsiqTthYAg66as7Y+s7YSwKeyXkOyEnCwgdGVzdC9yZXN1bHTripRcbiAqIOqwgSB3b3JrZXIg7ZSE66Gc7IS47IqkKGJvb3RzdHJhcOydmCBhZnRlckVhY2gp7JeQ7IScIOyghOyGoeuQmOuvgOuhnCBidWZmZXLsmYAg7IaM7LyTXG4gKiDsl7DqsrDsnYQg7ISc66GcIOqzteycoO2VmOyngCDslYrsirXri4jri6QuXG4gKlxuICogZnMgbW9jayDstqnrj4zsnYQg7ZS87ZWY6riwIOychO2VtCBuZXQg66qo65OI66eMIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuLyogb3hsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyAvLyBOYWl0ZeuKlCBleHBlY3TsmYAg7Zi47J2R7ZWY64+E66GdIGFueeulvCDtl4jsmqntlahcblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgeyB0eXBlIFNvY2tldCB9IGZyb20gXCJuZXRcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBmaW5kQXBpUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgTmFpdGVNZXNzYWdpbmdUeXBlcyB9IGZyb20gXCIuL21lc3NhZ2luZy10eXBlc1wiO1xuXG4vKipcbiAqIHNvbmFtdS5jb25maWcudHMg6rK966Gc66W8IOuwm+yVhOyEnCDtlITroZzsoJ3tirjrs4Qg6rOg7JygIO2VtOyLnOulvCDsg53shLHtlanri4jri6QuXG4gKiDsnbXsiqTthZDshZjqs7wg64+Z7J287ZWcIOuwqeyLneycvOuhnCDqs4TsgrDtlbTslbwg7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0SGFzaChjb25maWdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoY29uZmlnUGF0aCkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDgpO1xufVxuXG4vKipcbiAqIO2YhOyerCDtlITroZzsoJ3tirjsnZgg7IaM7LyTIOqyveuhnOulvCDqs4TsgrDtlanri4jri6QuXG4gKiBTb25hbXUuYXBpUm9vdFBhdGjqsIAg7ISk7KCV65CcIO2bhOyXkCDtmLjstpztlbTslbwg7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRTb2NrZXRQYXRoKCk6IHN0cmluZyB7XG4gIC8vIHNvbmFtdS5jb25maWcudHPsnZgg7KCI64yAIOqyveuhnCDqs4TsgrBcbiAgLy8gYXBpUm9vdFBhdGjripQgL3Byb2plY3QvYXBpIO2Yle2DnOydtOqzoCwgY29uZmln64qUIC9wcm9qZWN0L2FwaS9zcmMvc29uYW11LmNvbmZpZy50c+yXkCDsnojsnYxcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oZmluZEFwaVJvb3RQYXRoKCksIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbiAgY29uc3QgaGFzaCA9IGdldFByb2plY3RIYXNoKGNvbmZpZ1BhdGgpO1xuXG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCJcbiAgICA/IGBcXFxcXFxcXC5cXFxccGlwZVxcXFxuYWl0ZS0ke2hhc2h9YFxuICAgIDogam9pbihob21lZGlyKCksIFwiLnNvbmFtdVwiLCBgbmFpdGUtJHtoYXNofS5zb2NrYCk7XG59XG5cbi8qKlxuICog7Jew6rKwIOyLpO2MqOqwgCDsp4Dsho3rkKAg65WMKGV4dGVuc2lvbiDrr7jsi6Ttlokg65OxKSBidWZmZXLqsIAg66y07ZWc7Z6IIOy7pOyngOyngCDslYrrj4TroZ1cbiAqIOy1nOq3vCDrqZTsi5zsp4Drp4wg7J20IOqwnOyImOunjO2BvCDsnKDsp4Dtlanri4jri6QuXG4gKi9cbmNvbnN0IE1BWF9CVUZGRVJFRF9NRVNTQUdFUyA9IDEwMDA7XG5cbmNsYXNzIE5haXRlUmVwb3J0ZXJDbGFzcyB7XG4gIHByaXZhdGUgc29ja2V0UGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc29ja2V0OiBTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBidWZmZXI6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIOyGjOy8kyDsl7DqsrAg7Iuc64+EXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUNvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGVkIHx8IHRoaXMuc29ja2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNvY2tldFBhdGgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXRQYXRoID0gZ2V0U29ja2V0UGF0aCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zb2NrZXQgPSBjb25uZWN0KHRoaXMuc29ja2V0UGF0aCk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8g67KE7Y287JeQIOyMk+yduCDrqZTsi5zsp4Ag7KCE7IahXG4gICAgICAgIGZvciAoY29uc3QgbXNnIG9mIHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQ/LndyaXRlKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICAgICAgcmVzKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJlcnJvclwiLCAoZSkgPT4ge1xuICAgICAgICAvLyDsl7DqsrAg7Iuk7YyoIOustOyLnCAoZXh0ZW5zaW9u7J20IOq6vOyguOyeiOydhCDsiJgg7J6I7J2MKVxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgICAgIHJlaihlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog66mU7Iuc7KeAIOyghOyGoSAo7KSE67CU6r+I7Jy866GcIOq1rOu2hClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZChkYXRhOiBOYWl0ZU1lc3NhZ2luZ1R5cGVzLk5haXRlTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1zZyA9IGAke0pTT04uc3RyaW5naWZ5KGRhdGEpfVxcbmA7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24oKS5jYXRjaCgoXykgPT4ge30pO1xuXG4gICAgaWYgKHRoaXMuY29ubmVjdGVkICYmIHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLnNvY2tldC53cml0ZShtc2cpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDsl7DqsrAg64yA6riwIOykkeydtOuptCDrsoTtjbzsl5Ag7KCA7J6lLCDsg4HtlZwg7LSI6rO8IOyLnCDsmKTrnpjrkJwg66mU7Iuc7KeA67aA7YSwIO2PkOq4sFxuICAgICAgdGhpcy5idWZmZXIucHVzaChtc2cpO1xuICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA+IE1BWF9CVUZGRVJFRF9NRVNTQUdFUykge1xuICAgICAgICB0aGlzLmJ1ZmZlci5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXRlc3Qg7Luk7Iqk7YWAIOumrO2PrO2EsChOYWl0ZVZpdGVzdFJlcG9ydGVyKeydmCBvblRlc3RSdW5TdGFydOyXkOyEnCDtmLjstpztlanri4jri6QuXG4gICAqIO2FjOyKpO2KuCBydW4g7Iuc7J6R7J2EIOyVjOumveuLiOuLpCAo642w7J207YSwIO2BtOumrOyWtCDsi6DtmLgpLlxuICAgKi9cbiAgYXN5bmMgc3RhcnRUZXN0UnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInJ1bi9zdGFydFwiLFxuICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogYm9vdHN0cmFwKCnsnZggYWZ0ZXJFYWNo7JeQ7IScIO2YuOy2nO2VqeuLiOuLpC5cbiAgICog7YWM7Iqk7Yq4IOy8gOydtOyKpCDqsrDqs7zrpbwgdHJhY2Vz7JmAIO2VqOq7mCDsoITshqHtlanri4jri6QuXG4gICAqL1xuICBhc3luYyByZXBvcnRUZXN0UmVzdWx0KFxuICAgIHJlc3VsdDogT21pdDxOYWl0ZU1lc3NhZ2luZ1R5cGVzLlRlc3RSZXN1bHQsIFwicmVjZWl2ZWRBdFwiPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkNJKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgIHR5cGU6IFwidGVzdC9yZXN1bHRcIixcbiAgICAgIHJlY2VpdmVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLnJlc3VsdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXRlc3Qg7Luk7Iqk7YWAIOumrO2PrO2EsChOYWl0ZVZpdGVzdFJlcG9ydGVyKeydmCBvblRlc3RSdW5FbmTsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyiheujjOulvCDslYzrpr3ri4jri6QuXG4gICAqL1xuICBhc3luYyBlbmRUZXN0UnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInJ1bi9lbmRcIixcbiAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIC8vIOyXsOqysCDsooXro4xcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuc29ja2V0LmVuZCgpO1xuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0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
|