sonamu 0.5.7 → 0.6.0
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/base-frame.js +12 -2
- package/dist/api/caster.js +66 -2
- package/dist/api/code-converters.js +489 -2
- package/dist/api/config.d.ts +76 -0
- package/dist/api/config.d.ts.map +1 -0
- package/dist/api/config.js +32 -0
- package/dist/api/context.d.ts +1 -0
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +3 -2
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +142 -2
- package/dist/api/index.js +9 -2
- package/dist/api/sonamu.d.ts +8 -22
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +482 -2
- package/dist/bin/build-config.d.ts +2 -1
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +12 -2
- package/dist/bin/cli-wrapper.js +71 -2
- package/dist/bin/cli.js +418 -2
- package/dist/bin/hot-hook-register.d.ts +11 -0
- package/dist/bin/hot-hook-register.d.ts.map +1 -0
- package/dist/bin/hot-hook-register.js +21 -0
- package/dist/database/_batch_update.js +78 -2
- package/dist/database/base-model.js +247 -2
- package/dist/database/code-generator.js +53 -2
- package/dist/database/db.d.ts +2 -16
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +132 -2
- package/dist/database/knex-plugins/knex-on-duplicate-update.js +39 -2
- package/dist/database/puri-wrapper.js +109 -2
- package/dist/database/puri.d.ts +23 -16
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +539 -2
- package/dist/database/puri.types.d.ts +8 -3
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +3 -2
- package/dist/database/transaction-context.js +14 -2
- package/dist/database/upsert-builder.js +215 -2
- package/dist/entity/entity-manager.d.ts +3 -1
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +114 -2
- package/dist/entity/entity-utils.js +210 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +651 -2
- package/dist/exceptions/error-handler.js +29 -2
- package/dist/exceptions/so-exceptions.js +85 -2
- package/dist/file-storage/driver.js +79 -2
- package/dist/file-storage/file-storage.js +75 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -2
- package/dist/migration/code-generation.js +558 -2
- package/dist/migration/migration-set.js +364 -2
- package/dist/migration/migrator.d.ts +0 -9
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +510 -2
- package/dist/migration/types.js +3 -2
- package/dist/naite/naite.d.ts +12 -0
- package/dist/naite/naite.d.ts.map +1 -0
- package/dist/naite/naite.js +72 -0
- package/dist/stream/index.js +3 -2
- package/dist/stream/sse.js +38 -2
- package/dist/syncer/api-parser.d.ts +20 -0
- package/dist/syncer/api-parser.d.ts.map +1 -0
- package/dist/syncer/api-parser.js +229 -0
- package/dist/syncer/checksum.d.ts +21 -0
- package/dist/syncer/checksum.d.ts.map +1 -0
- package/dist/syncer/checksum.js +98 -0
- package/dist/syncer/code-generator.d.ts +20 -0
- package/dist/syncer/code-generator.d.ts.map +1 -0
- package/dist/syncer/code-generator.js +141 -0
- package/dist/syncer/entity-operations.d.ts +17 -0
- package/dist/syncer/entity-operations.d.ts.map +1 -0
- package/dist/syncer/entity-operations.js +58 -0
- package/dist/syncer/file-patterns.d.ts +29 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -0
- package/dist/syncer/file-patterns.js +38 -0
- package/dist/syncer/index.d.ts +6 -0
- package/dist/syncer/index.d.ts.map +1 -1
- package/dist/syncer/index.js +9 -2
- package/dist/syncer/module-loader.d.ts +35 -0
- package/dist/syncer/module-loader.d.ts.map +1 -0
- package/dist/syncer/module-loader.js +82 -0
- package/dist/syncer/syncer.d.ts +93 -108
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +375 -2
- package/dist/template/entity-converter.d.ts +14 -0
- package/dist/template/entity-converter.d.ts.map +1 -0
- package/dist/template/entity-converter.js +101 -0
- package/dist/template/helpers.d.ts +23 -0
- package/dist/template/helpers.d.ts.map +1 -0
- package/dist/template/helpers.js +64 -0
- package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
- package/dist/template/implementations/entity.template.d.ts.map +1 -0
- package/dist/template/implementations/entity.template.js +87 -0
- package/dist/{templates → template/implementations}/generated.template.d.ts +3 -3
- package/dist/template/implementations/generated.template.d.ts.map +1 -0
- package/dist/template/implementations/generated.template.js +232 -0
- package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -3
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_http.template.js +131 -0
- package/dist/{templates → template/implementations}/generated_sso.template.d.ts +3 -3
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_sso.template.js +105 -0
- package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
- package/dist/template/implementations/init_types.template.d.ts.map +1 -0
- package/dist/template/implementations/init_types.template.js +38 -0
- package/dist/template/implementations/model.template.d.ts +17 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -0
- package/dist/template/implementations/model.template.js +171 -0
- package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
- package/dist/template/implementations/model_test.template.d.ts.map +1 -0
- package/dist/template/implementations/model_test.template.js +35 -0
- package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
- package/dist/template/implementations/service.template.d.ts.map +1 -0
- package/dist/template/implementations/service.template.js +193 -0
- package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
- package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
- package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
- package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
- package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
- package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_select.template.js +55 -0
- package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
- package/dist/template/implementations/view_form.template.d.ts.map +1 -0
- package/dist/template/implementations/view_form.template.js +337 -0
- package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_id_all_select.template.js +31 -0
- package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_id_async_select.template.js +105 -0
- package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
- package/dist/template/implementations/view_list.template.d.ts.map +1 -0
- package/dist/template/implementations/view_list.template.js +465 -0
- package/dist/{templates → template/implementations}/view_list_columns.template.d.ts +3 -3
- package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
- package/dist/template/implementations/view_list_columns.template.js +49 -0
- package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
- package/dist/template/implementations/view_search_input.template.js +64 -0
- package/dist/template/index.d.ts +5 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +6 -0
- package/dist/template/template.d.ts +39 -0
- package/dist/template/template.d.ts.map +1 -0
- package/dist/template/template.js +47 -0
- package/dist/template/zod-converter.d.ts +18 -0
- package/dist/template/zod-converter.d.ts.map +1 -0
- package/dist/template/zod-converter.js +166 -0
- package/dist/testing/_relation-graph.js +80 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +521 -2
- package/dist/types/types.d.ts +39 -40
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +289 -2
- package/dist/typings/knex.d.js +3 -2
- package/dist/utils/async-utils.d.ts +7 -0
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +57 -2
- package/dist/utils/console-util.d.ts +2 -0
- package/dist/utils/console-util.d.ts.map +1 -0
- package/dist/utils/console-util.js +6 -0
- package/dist/utils/controller.js +26 -2
- package/dist/utils/esm-utils.d.ts +45 -0
- package/dist/utils/esm-utils.d.ts.map +1 -0
- package/dist/utils/esm-utils.js +56 -0
- package/dist/utils/fs-utils.js +17 -2
- package/dist/utils/lodash-able.js +6 -2
- package/dist/utils/model.js +22 -2
- package/dist/utils/path-utils.d.ts +89 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +60 -0
- package/dist/utils/process-utils.d.ts +13 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +36 -0
- package/dist/utils/sql-parser.js +35 -2
- package/dist/utils/utils.d.ts +4 -7
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +33 -2
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +19 -2
- package/package.json +21 -8
- package/src/api/code-converters.ts +2 -2
- package/src/api/config.ts +142 -0
- package/src/api/context.ts +1 -0
- package/src/api/decorators.ts +1 -0
- package/src/api/sonamu.ts +81 -67
- package/src/bin/build-config.ts +2 -1
- package/src/bin/cli-wrapper.ts +10 -3
- package/src/bin/cli.ts +108 -56
- package/src/bin/hot-hook-register.ts +22 -0
- package/src/database/base-model.ts +1 -1
- package/src/database/code-generator.ts +1 -1
- package/src/database/db.ts +10 -52
- package/src/database/puri.ts +78 -53
- package/src/database/puri.types.ts +18 -5
- package/src/database/upsert-builder.ts +1 -1
- package/src/entity/entity-manager.ts +19 -15
- package/src/entity/entity.ts +4 -3
- package/src/index.ts +2 -0
- package/src/migration/code-generation.ts +1 -1
- package/src/migration/migration-set.ts +1 -1
- package/src/migration/migrator.ts +23 -152
- package/src/naite/naite.ts +70 -0
- package/src/syncer/api-parser.ts +299 -0
- package/src/syncer/checksum.ts +152 -0
- package/src/syncer/code-generator.ts +202 -0
- package/src/syncer/entity-operations.ts +68 -0
- package/src/syncer/file-patterns.ts +56 -0
- package/src/syncer/index.ts +6 -0
- package/src/syncer/module-loader.ts +125 -0
- package/src/syncer/syncer.ts +363 -1420
- package/src/template/entity-converter.ts +123 -0
- package/src/template/helpers.ts +84 -0
- package/src/{templates → template/implementations}/entity.template.ts +4 -4
- package/src/{templates → template/implementations}/generated.template.ts +9 -9
- package/src/{templates → template/implementations}/generated_http.template.ts +9 -6
- package/src/{templates → template/implementations}/generated_sso.template.ts +7 -7
- package/src/{templates → template/implementations}/init_types.template.ts +4 -4
- package/src/{templates → template/implementations}/model.template.ts +9 -9
- package/src/{templates → template/implementations}/model_test.template.ts +5 -5
- package/src/{templates → template/implementations}/service.template.ts +19 -11
- package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
- package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +5 -21
- package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
- package/src/{templates → template/implementations}/view_form.template.ts +11 -13
- package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_id_async_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_list.template.ts +13 -64
- package/src/{templates → template/implementations}/view_list_columns.template.ts +3 -3
- package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
- package/src/template/index.ts +4 -0
- package/src/template/template.ts +86 -0
- package/src/template/zod-converter.ts +219 -0
- package/src/testing/fixture-manager.ts +8 -1
- package/src/types/types.ts +38 -61
- package/src/utils/async-utils.ts +17 -0
- package/src/utils/console-util.ts +4 -0
- package/src/utils/esm-utils.ts +69 -0
- package/src/utils/path-utils.ts +102 -0
- package/src/utils/process-utils.ts +46 -0
- package/src/utils/sql-parser.ts +1 -1
- package/src/utils/utils.ts +14 -40
- package/src/utils/zod-error.ts +0 -1
- package/dist/api/base-frame.js.map +0 -1
- package/dist/api/caster.js.map +0 -1
- package/dist/api/code-converters.js.map +0 -1
- package/dist/api/context.js.map +0 -1
- package/dist/api/decorators.js.map +0 -1
- package/dist/api/index.js.map +0 -1
- package/dist/api/sonamu.js.map +0 -1
- package/dist/bin/build-config.js.map +0 -1
- package/dist/bin/cli-wrapper.js.map +0 -1
- package/dist/bin/cli.js.map +0 -1
- package/dist/database/_batch_update.js.map +0 -1
- package/dist/database/base-model.js.map +0 -1
- package/dist/database/code-generator.js.map +0 -1
- package/dist/database/db.js.map +0 -1
- package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
- package/dist/database/puri-wrapper.js.map +0 -1
- package/dist/database/puri.js.map +0 -1
- package/dist/database/puri.types.js.map +0 -1
- package/dist/database/transaction-context.js.map +0 -1
- package/dist/database/upsert-builder.js.map +0 -1
- package/dist/entity/entity-manager.js.map +0 -1
- package/dist/entity/entity-utils.js.map +0 -1
- package/dist/entity/entity.js.map +0 -1
- package/dist/exceptions/error-handler.js.map +0 -1
- package/dist/exceptions/so-exceptions.js.map +0 -1
- package/dist/file-storage/driver.js.map +0 -1
- package/dist/file-storage/file-storage.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/migration/code-generation.js.map +0 -1
- package/dist/migration/migration-set.js.map +0 -1
- package/dist/migration/migrator.js.map +0 -1
- package/dist/migration/types.js.map +0 -1
- package/dist/stream/index.js.map +0 -1
- package/dist/stream/sse.js.map +0 -1
- package/dist/syncer/index.js.map +0 -1
- package/dist/syncer/syncer.js.map +0 -1
- package/dist/templates/base-template.d.ts +0 -13
- package/dist/templates/base-template.d.ts.map +0 -1
- package/dist/templates/base-template.js +0 -2
- package/dist/templates/base-template.js.map +0 -1
- package/dist/templates/entity.template.d.ts.map +0 -1
- package/dist/templates/entity.template.js +0 -2
- package/dist/templates/entity.template.js.map +0 -1
- package/dist/templates/generated.template.d.ts.map +0 -1
- package/dist/templates/generated.template.js +0 -2
- package/dist/templates/generated.template.js.map +0 -1
- package/dist/templates/generated_http.template.d.ts.map +0 -1
- package/dist/templates/generated_http.template.js +0 -2
- package/dist/templates/generated_http.template.js.map +0 -1
- package/dist/templates/generated_sso.template.d.ts.map +0 -1
- package/dist/templates/generated_sso.template.js +0 -2
- package/dist/templates/generated_sso.template.js.map +0 -1
- package/dist/templates/index.d.ts +0 -2
- package/dist/templates/index.d.ts.map +0 -1
- package/dist/templates/index.js +0 -2
- package/dist/templates/index.js.map +0 -1
- package/dist/templates/init_types.template.d.ts.map +0 -1
- package/dist/templates/init_types.template.js +0 -2
- package/dist/templates/init_types.template.js.map +0 -1
- package/dist/templates/model.template.d.ts +0 -17
- package/dist/templates/model.template.d.ts.map +0 -1
- package/dist/templates/model.template.js +0 -2
- package/dist/templates/model.template.js.map +0 -1
- package/dist/templates/model_test.template.d.ts.map +0 -1
- package/dist/templates/model_test.template.js +0 -2
- package/dist/templates/model_test.template.js.map +0 -1
- package/dist/templates/service.template.d.ts.map +0 -1
- package/dist/templates/service.template.js +0 -2
- package/dist/templates/service.template.js.map +0 -1
- package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
- package/dist/templates/view_enums_buttonset.template.js +0 -2
- package/dist/templates/view_enums_buttonset.template.js.map +0 -1
- package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
- package/dist/templates/view_enums_dropdown.template.js +0 -2
- package/dist/templates/view_enums_dropdown.template.js.map +0 -1
- package/dist/templates/view_enums_select.template.d.ts.map +0 -1
- package/dist/templates/view_enums_select.template.js +0 -2
- package/dist/templates/view_enums_select.template.js.map +0 -1
- package/dist/templates/view_form.template.d.ts.map +0 -1
- package/dist/templates/view_form.template.js +0 -2
- package/dist/templates/view_form.template.js.map +0 -1
- package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
- package/dist/templates/view_id_all_select.template.js +0 -2
- package/dist/templates/view_id_all_select.template.js.map +0 -1
- package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
- package/dist/templates/view_id_async_select.template.js +0 -2
- package/dist/templates/view_id_async_select.template.js.map +0 -1
- package/dist/templates/view_list.template.d.ts.map +0 -1
- package/dist/templates/view_list.template.js +0 -2
- package/dist/templates/view_list.template.js.map +0 -1
- package/dist/templates/view_list_columns.template.d.ts.map +0 -1
- package/dist/templates/view_list_columns.template.js +0 -2
- package/dist/templates/view_list_columns.template.js.map +0 -1
- package/dist/templates/view_search_input.template.d.ts.map +0 -1
- package/dist/templates/view_search_input.template.js +0 -2
- package/dist/templates/view_search_input.template.js.map +0 -1
- package/dist/testing/_relation-graph.js.map +0 -1
- package/dist/testing/fixture-manager.js.map +0 -1
- package/dist/types/types.js.map +0 -1
- package/dist/typings/knex.d.js.map +0 -1
- package/dist/utils/async-utils.js.map +0 -1
- package/dist/utils/controller.js.map +0 -1
- package/dist/utils/fs-utils.js.map +0 -1
- package/dist/utils/lodash-able.js.map +0 -1
- package/dist/utils/model.js.map +0 -1
- package/dist/utils/sql-parser.js.map +0 -1
- package/dist/utils/utils.js.map +0 -1
- package/dist/utils/zod-error.js.map +0 -1
- package/src/templates/base-template.ts +0 -19
- package/src/templates/index.ts +0 -1
|
@@ -1,2 +1,489 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get apiParamToTsCode(){return apiParamToTsCode},get apiParamToTsCodeAsObject(){return apiParamToTsCodeAsObject},get apiParamTypeToTsType(){return apiParamTypeToTsType},get getTextTypeLength(){return getTextTypeLength},get getZodObjectFromApi(){return getZodObjectFromApi},get getZodObjectFromApiParams(){return getZodObjectFromApiParams},get getZodTypeFromApiParamType(){return getZodTypeFromApiParamType},get propNodeToZodTypeDef(){return propNodeToZodTypeDef},get propToZodTypeDef(){return propToZodTypeDef},get serializeZodType(){return serializeZodType},get unwrapPromiseOnce(){return unwrapPromiseOnce},get zodTypeToTsTypeDef(){return zodTypeToTsTypeDef},get zodTypeToZodCode(){return zodTypeToZodCode}});var _zod=require("zod");var _types=require("../types/types");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _instanceof(left,right){if(right!=null&&typeof Symbol!=="undefined"&&right[Symbol.hasInstance]){return!!right[Symbol.hasInstance](left)}else{return left instanceof right}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly){symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable})}keys.push.apply(keys,symbols)}return keys}function _object_spread_props(target,source){source=source!=null?source:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}return target}function _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function getZodObjectFromApi(api){var references=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};var _api_typeParameters;if(((_api_typeParameters=api.typeParameters)===null||_api_typeParameters===void 0?void 0:_api_typeParameters.length)>0){api.typeParameters.map(function(typeParam){if(typeParam.constraint){var zodType=getZodTypeFromApiParamType(typeParam.constraint,references);references[typeParam.id]=zodType}})}var ReqType=getZodObjectFromApiParams(api.parameters.filter(function(param){return!_types.ApiParamType.isContext(param.type)&&!_types.ApiParamType.isRefKnex(param.type)&&!(param.optional===true&¶m.name.startsWith("_"))}),references);return ReqType}function getZodObjectFromApiParams(apiParams){var references=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return _zod.z.object(apiParams.reduce(function(r,param){var zodType=getZodTypeFromApiParamType(param.type,references);if(param.optional){zodType=zodType.optional()}return _object_spread_props(_object_spread({},r),_define_property({},param.name,zodType))},{}))}function getZodTypeFromApiParamType(paramType,references){switch(paramType){case"string":return _zod.z.string();case"number":return _zod.z.number();case"boolean":return _zod.z.boolean();default:var advType=paramType;switch(advType.t){case"string-literal":case"numeric-literal":return _zod.z.literal(advType.value);case"object":var objType=paramType;return getZodObjectFromApiParams(objType.props);case"array":var arrType=paramType;return _zod.z.array(getZodTypeFromApiParamType(arrType.elementsType,references));case"ref":var refType=paramType;if(refType.id==="Date"){return _zod.z.date()}if(["Pick","Omit"].includes(refType.id)){var _refType_args;if(((_refType_args=refType.args)===null||_refType_args===void 0?void 0:_refType_args.length)!==2){throw new Error("잘못된 ".concat(refType.id))}var _refType_args_map=_sliced_to_array(refType.args.map(function(arg){return getZodTypeFromApiParamType(arg,references)}),2),obj=_refType_args_map[0],literalOrUnion=_refType_args_map[1];var keys=[];if(_instanceof(literalOrUnion,_zod.z.ZodUnion)){keys=literalOrUnion.def.options.map(function(option){return option.def.value})}else{keys=literalOrUnion.def.values}var keyRecord=keys.reduce(function(result,key){return _object_spread_props(_object_spread({},result),_define_property({},key,true))},{});if(refType.id==="Pick"){if(obj.pick){return obj.pick(keyRecord)}}else{if(obj.omit){return obj.omit(keyRecord)}}}if(["Partial"].includes(refType.id)){var _refType_args1;if(((_refType_args1=refType.args)===null||_refType_args1===void 0?void 0:_refType_args1.length)!==1){throw new Error("잘못된 ".concat(refType.id))}var obj1=getZodTypeFromApiParamType(refType.args[0],references);return obj1.partial()}var reference=references[refType.id];if(reference===undefined){return _zod.z.string()}return reference;case"union":var unionType=paramType;if(unionType.types.length===2&&unionType.types.some(function(type){return type==="null"})){if(unionType.types[0]==="null"){return getZodTypeFromApiParamType(unionType.types[1],references).nullable()}else{return getZodTypeFromApiParamType(unionType.types[0],references).nullable()}}return _zod.z.union(unionType.types.map(function(type){return getZodTypeFromApiParamType(type,references)}));case"intersection":var intersectionType=paramType;return intersectionType.types.reduce(function(result,type,index){var resolvedType=getZodTypeFromApiParamType(type,references);if(index===0){return resolvedType}else{return _zod.z.intersection(result,resolvedType)}},_zod.z.unknown());case"tuple-type":var tupleType=paramType;return _zod.z.tuple(tupleType.elements.map(function(elem){return getZodTypeFromApiParamType(elem,references)}))}return _zod.z.unknown()}}function propNodeToZodTypeDef(propNode,injectImportKeys){if(propNode.nodeType==="plain"){return propToZodTypeDef(propNode.prop,injectImportKeys)}else if(propNode.nodeType==="array"){return[propNode.prop?"".concat(propNode.prop.name,": "):"","z.array(z.object({",propNode.children.map(function(childPropNode){return propNodeToZodTypeDef(childPropNode,injectImportKeys)}).join("\n"),"","})),"].join("\n")}else if(propNode.nodeType==="object"){return[propNode.prop?"".concat(propNode.prop.name,": "):"","z.object({",propNode.children.map(function(childPropNode){return propNodeToZodTypeDef(childPropNode,injectImportKeys)}).join("\n"),"","})".concat(propNode.prop&&propNode.prop.nullable?".nullable()":"",",")].join("\n")}else{throw Error}}function getTextTypeLength(textType){switch(textType){case"text":return 1024*64-1;case"mediumtext":return 1024*1024*16-1;case"longtext":return 1024*1024*1024*4-1}}function propToZodTypeDef(prop,injectImportKeys){var stmt;if((0,_types.isIntegerProp)(prop)){stmt="".concat(prop.name,": z.int()")}else if((0,_types.isBigIntegerProp)(prop)){stmt="".concat(prop.name,": z.bigint()")}else if((0,_types.isTextProp)(prop)){stmt="".concat(prop.name,": z.string().max(").concat(getTextTypeLength(prop.textType),")")}else if((0,_types.isEnumProp)(prop)){stmt="".concat(prop.name,": ").concat(prop.id);injectImportKeys.push(prop.id)}else if((0,_types.isStringProp)(prop)){stmt="".concat(prop.name,": z.string().max(").concat(prop.length,")")}else if((0,_types.isDecimalProp)(prop)){stmt="".concat(prop.name,": z.string()")}else if((0,_types.isFloatProp)(prop)||(0,_types.isDoubleProp)(prop)){stmt="".concat(prop.name,": z.number()")}else if((0,_types.isBooleanProp)(prop)){stmt="".concat(prop.name,": z.boolean()")}else if((0,_types.isDateProp)(prop)){stmt="".concat(prop.name,": z.string().length(10)")}else if((0,_types.isTimeProp)(prop)){stmt="".concat(prop.name,": z.string().length(8)")}else if((0,_types.isDateTimeProp)(prop)){stmt="".concat(prop.name,": z.date()")}else if((0,_types.isTimestampProp)(prop)){stmt="".concat(prop.name,": z.date()")}else if((0,_types.isJsonProp)(prop)){stmt="".concat(prop.name,": ").concat(prop.id);injectImportKeys.push(prop.id)}else if((0,_types.isUuidProp)(prop)){stmt="".concat(prop.name,": z.uuid()")}else if((0,_types.isVirtualProp)(prop)){stmt="".concat(prop.name,": ").concat(prop.id);injectImportKeys.push(prop.id)}else if((0,_types.isRelationProp)(prop)){if((0,_types.isBelongsToOneRelationProp)(prop)||(0,_types.isOneToOneRelationProp)(prop)&&prop.hasJoinColumn){stmt="".concat(prop.name,"_id: z.int()")}else{return"// ".concat(prop.name,": ").concat(prop.relationType," ").concat(prop.with)}}else{return"// unable to resolve"}if(prop.unsigned){stmt+=".nonnegative()"}if(prop.nullable){stmt+=".nullable()"}return stmt+","}function zodTypeToZodCode(zt){switch(zt.def.type){case"string":return"z.string()";case"number":return"z.number()";case"bigint":return"z.bigint()";case"boolean":return"z.boolean()";case"date":return"z.date()";case"null":return"z.null()";case"undefined":return"z.undefined()";case"any":return"z.any()";case"unknown":return"z.unknown()";case"never":return"z.never()";case"nullable":return zodTypeToZodCode(zt.def.innerType)+".nullable()";case"default":var zDefaultDef=zt.def;return zodTypeToZodCode(zDefaultDef.innerType)+".default(".concat(zDefaultDef.defaultValue,")");case"record":var zRecordDef=zt.def;return"z.record(".concat(zodTypeToZodCode(zRecordDef.keyType),", ").concat(zodTypeToZodCode(zRecordDef.valueType),")");case"literal":var items=Array.from(zt.values).map(function(value){if(typeof value==="string"){return'"'.concat(value,'"')}if(value===null){return"null"}if(value===undefined){return"undefined"}return"".concat(value)});if(items.length===1){return"z.literal(".concat(items[0],")")}return"z.literal([".concat(items.join(", "),"])");case"union":return"z.union([".concat(zt.def.options.map(function(option){return zodTypeToZodCode(option)}).join(","),"])");case"enum":return"z.enum({".concat(Object.entries(zt.def.entries).map(function(param){var _param=_sliced_to_array(param,2),key=_param[0],val=_param[1];return typeof val==="string"?"".concat(key,': "').concat(val,'"'):"".concat(key,": ").concat(val)}).join(", "),"})");case"array":return"z.array(".concat(zodTypeToZodCode(zt.def.element),")");case"object":var shape=zt.shape;return["z.object({"].concat(_to_consumable_array(Object.keys(shape).map(function(key){return"".concat(key,": ").concat(zodTypeToZodCode(shape[key]),",")})),["})"]).join("\n");case"optional":return zodTypeToZodCode(zt.def.innerType)+".optional()";case"file":return"z.file()";case"intersection":var zIntersectionDef=zt.def;return"z.intersection(".concat(zodTypeToZodCode(zIntersectionDef.left),", ").concat(zodTypeToZodCode(zIntersectionDef.right),")");case"file":return"z.file()";default:throw new Error("처리되지 않은 ZodType ".concat(zt.def.type))}}function apiParamToTsCode(params,injectImportKeys){return params.map(function(param){return"".concat(param.name).concat(param.optional&&!param.defaultDef?"?":"",": ").concat(apiParamTypeToTsType(param.type,injectImportKeys)).concat(param.defaultDef?"= ".concat(param.defaultDef):"")}).join(", ")}function apiParamToTsCodeAsObject(params,injectImportKeys){return"{ ".concat(params.map(function(param){return"".concat(param.name).concat(param.optional?"?":"",": ").concat(apiParamTypeToTsType(param.type,injectImportKeys)).concat(param.defaultDef?"= ".concat(param.defaultDef):"")}).join(", ")," }")}function apiParamTypeToTsType(paramType,injectImportKeys){if(["string","number","boolean","true","false","null","undefined","void","any","unknown"].includes(paramType)){return paramType}else if(_types.ApiParamType.isObject(paramType)){return"{ ".concat(apiParamToTsCode(paramType.props,injectImportKeys)," }")}else if(_types.ApiParamType.isStringLiteral(paramType)){return'"'.concat(paramType.value,'"')}else if(_types.ApiParamType.isNumericLiteral(paramType)){return String(paramType.value)}else if(_types.ApiParamType.isUnion(paramType)){return paramType.types.map(function(type){return apiParamTypeToTsType(type,injectImportKeys)}).join(" | ")}else if(_types.ApiParamType.isIntersection(paramType)){return paramType.types.map(function(type){return apiParamTypeToTsType(type,injectImportKeys)}).join(" & ")}else if(_types.ApiParamType.isArray(paramType)){return apiParamTypeToTsType(paramType.elementsType,injectImportKeys)+"[]"}else if(_types.ApiParamType.isRef(paramType)){if(["Pick","Omit","Promise","Partial","Date"].includes(paramType.id)===false){injectImportKeys.push(paramType.id)}if(paramType.args===undefined||paramType.args.length===0){return paramType.id}else{return"".concat(paramType.id,"<").concat(paramType.args.map(function(arg){return apiParamTypeToTsType(arg,injectImportKeys)}).join(","),">")}}else if(_types.ApiParamType.isIndexedAccess(paramType)){return"".concat(apiParamTypeToTsType(paramType.object,injectImportKeys),"[").concat(apiParamTypeToTsType(paramType.index,injectImportKeys),"]")}else if(_types.ApiParamType.isTupleType(paramType)){return"[ ".concat(paramType.elements.map(function(elem){return apiParamTypeToTsType(elem,injectImportKeys)})," ]")}else if(_types.ApiParamType.isTypeParam(paramType)){return"<".concat(paramType.id).concat(paramType.constraint?" extends ".concat(apiParamTypeToTsType(paramType.constraint,injectImportKeys)):"",">")}else{throw new Error("resolve 불가 ApiParamType ".concat(paramType))}}function unwrapPromiseOnce(paramType){if(_types.ApiParamType.isPromise(paramType)){return paramType.args[0]}else{return paramType}}function serializeZodType(zt){switch(zt.def.type){case"object":return{type:"object",shape:Object.keys(zt.shape).reduce(function(result,key){return _object_spread_props(_object_spread({},result),_define_property({},key,serializeZodType(zt.shape[key])))},{})};case"array":return{type:"array",element:serializeZodType(zt.def.element)};case"enum":return{type:"enum",values:zt.def.entries};case"string":return{type:"string",checks:zt.def.checks};case"number":return{type:"number",checks:zt.def.checks};case"boolean":return{type:"boolean"};case"nullable":return _object_spread_props(_object_spread({},serializeZodType(zt.def.innerType)),{nullable:true});case"optional":return _object_spread_props(_object_spread({},serializeZodType(zt.def.innerType)),{optional:true});case"any":return{type:"any"};case"record":return{type:"record",keyType:serializeZodType(zt.def.keyType),valueType:serializeZodType(zt.def.valueType)};case"union":return{type:"union",options:zt.def.options.map(function(option){return serializeZodType(option)})};default:throw new Error("Serialize 로직이 정의되지 않은 ZodType: ".concat(zt.def.type))}}function zodTypeToTsTypeDef(zt){switch(zt.def.type){case"string":case"number":case"boolean":case"bigint":case"date":case"null":case"undefined":case"any":case"unknown":case"never":return zt.def.type;case"nullable":return zodTypeToTsTypeDef(zt.def.innerType)+" | null";case"default":return zodTypeToTsTypeDef(zt.def.innerType);case"record":var recordType=zt;return"{ [ key: ".concat(zodTypeToTsTypeDef(recordType.def.keyType)," ]: ").concat(zodTypeToTsTypeDef(recordType.def.valueType),"}");case"literal":return Array.from(zt.values).map(function(value){if(typeof value==="string"){return'"'.concat(value,'"')}if(value===null){return"null"}if(value===undefined){return"undefined"}return"".concat(value)}).join(" | ");case"union":return"".concat(zt.options.map(function(option){return zodTypeToTsTypeDef(option)}).join(" | "));case"enum":return"".concat(zt.options.map(function(val){return'"'.concat(val,'"')}).join(" | "));case"array":return"".concat(zodTypeToTsTypeDef(zt.element),"[]");case"object":var shape=zt.shape;return["{"].concat(_to_consumable_array(Object.keys(shape).map(function(key){if(shape[key].def.type==="optional"){return"".concat(key,"?: ").concat(zodTypeToTsTypeDef(shape[key].def.innerType),",")}else{return"".concat(key,": ").concat(zodTypeToTsTypeDef(shape[key]),",")}})),["}"]).join("\n");case"optional":return zodTypeToTsTypeDef(zt.def.innerType)+" | undefined";default:throw new Error("처리되지 않은 ZodType ".concat(zt.def.type))}}
|
|
2
|
-
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ApiParamType, isBelongsToOneRelationProp, isBigIntegerProp, isBooleanProp, isDateProp, isDateTimeProp, isDecimalProp, isDoubleProp, isEnumProp, isFloatProp, isIntegerProp, isJsonProp, isOneToOneRelationProp, isRelationProp, isStringProp, isTextProp, isTimeProp, isTimestampProp, isUuidProp, isVirtualProp } from "../types/types.js";
|
|
3
|
+
/*
|
|
4
|
+
ExtendedApi 에서 ZodObject 리턴
|
|
5
|
+
*/ export function getZodObjectFromApi(api, references = {}) {
|
|
6
|
+
if (api.typeParameters?.length > 0) {
|
|
7
|
+
api.typeParameters.map((typeParam)=>{
|
|
8
|
+
if (typeParam.constraint) {
|
|
9
|
+
let zodType = getZodTypeFromApiParamType(typeParam.constraint, references);
|
|
10
|
+
references[typeParam.id] = zodType;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
const ReqType = getZodObjectFromApiParams(api.parameters.filter((param)=>!ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional === true && param.name.startsWith("_") // _로 시작하는 파라미터는 제외
|
|
15
|
+
)), references);
|
|
16
|
+
return ReqType;
|
|
17
|
+
}
|
|
18
|
+
/*
|
|
19
|
+
ZodObject를 통해 ApiParam 리턴
|
|
20
|
+
*/ export function getZodObjectFromApiParams(apiParams, references = {}) {
|
|
21
|
+
return z.object(apiParams.reduce((r, param)=>{
|
|
22
|
+
let zodType = getZodTypeFromApiParamType(param.type, references);
|
|
23
|
+
if (param.optional) {
|
|
24
|
+
zodType = zodType.optional();
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
...r,
|
|
28
|
+
[param.name]: zodType
|
|
29
|
+
};
|
|
30
|
+
}, {}));
|
|
31
|
+
}
|
|
32
|
+
/*
|
|
33
|
+
ApiParamType으로 ZodType 컨버팅
|
|
34
|
+
*/ export function getZodTypeFromApiParamType(paramType, references) {
|
|
35
|
+
switch(paramType){
|
|
36
|
+
case "string":
|
|
37
|
+
return z.string();
|
|
38
|
+
case "number":
|
|
39
|
+
return z.number();
|
|
40
|
+
case "boolean":
|
|
41
|
+
return z.boolean();
|
|
42
|
+
default:
|
|
43
|
+
const advType = paramType;
|
|
44
|
+
switch(advType.t){
|
|
45
|
+
case "string-literal":
|
|
46
|
+
case "numeric-literal":
|
|
47
|
+
return z.literal(advType.value);
|
|
48
|
+
case "object":
|
|
49
|
+
const objType = paramType;
|
|
50
|
+
return getZodObjectFromApiParams(objType.props);
|
|
51
|
+
case "array":
|
|
52
|
+
const arrType = paramType;
|
|
53
|
+
return z.array(getZodTypeFromApiParamType(arrType.elementsType, references));
|
|
54
|
+
case "ref":
|
|
55
|
+
const refType = paramType;
|
|
56
|
+
// Date 타입 처리
|
|
57
|
+
if (refType.id === "Date") {
|
|
58
|
+
return z.date();
|
|
59
|
+
}
|
|
60
|
+
// 객체 키 관리 유틸리티
|
|
61
|
+
if ([
|
|
62
|
+
"Pick",
|
|
63
|
+
"Omit"
|
|
64
|
+
].includes(refType.id)) {
|
|
65
|
+
if (refType.args?.length !== 2) {
|
|
66
|
+
throw new Error(`잘못된 ${refType.id}`);
|
|
67
|
+
}
|
|
68
|
+
const [obj, literalOrUnion] = refType.args.map((arg)=>getZodTypeFromApiParamType(arg, references));
|
|
69
|
+
let keys = [];
|
|
70
|
+
if (literalOrUnion instanceof z.ZodUnion) {
|
|
71
|
+
keys = literalOrUnion.def.options.map((option)=>option.def.value);
|
|
72
|
+
} else {
|
|
73
|
+
keys = literalOrUnion.def.values;
|
|
74
|
+
}
|
|
75
|
+
const keyRecord = keys.reduce((result, key)=>{
|
|
76
|
+
return {
|
|
77
|
+
...result,
|
|
78
|
+
[key]: true
|
|
79
|
+
};
|
|
80
|
+
}, {});
|
|
81
|
+
if (refType.id === "Pick") {
|
|
82
|
+
if (obj.pick) {
|
|
83
|
+
return obj.pick(keyRecord);
|
|
84
|
+
}
|
|
85
|
+
} else {
|
|
86
|
+
if (obj.omit) {
|
|
87
|
+
return obj.omit(keyRecord);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if ([
|
|
92
|
+
"Partial"
|
|
93
|
+
].includes(refType.id)) {
|
|
94
|
+
if (refType.args?.length !== 1) {
|
|
95
|
+
throw new Error(`잘못된 ${refType.id}`);
|
|
96
|
+
}
|
|
97
|
+
const obj = getZodTypeFromApiParamType(refType.args[0], references);
|
|
98
|
+
return obj.partial();
|
|
99
|
+
}
|
|
100
|
+
const reference = references[refType.id];
|
|
101
|
+
if (reference === undefined) {
|
|
102
|
+
return z.string();
|
|
103
|
+
// throw new Error(`ref 참조 불가 ${refType.id}`);
|
|
104
|
+
}
|
|
105
|
+
return reference;
|
|
106
|
+
case "union":
|
|
107
|
+
const unionType = paramType;
|
|
108
|
+
// nullable 유니온
|
|
109
|
+
if (unionType.types.length === 2 && unionType.types.some((type)=>type === "null")) {
|
|
110
|
+
if (unionType.types[0] === "null") {
|
|
111
|
+
return getZodTypeFromApiParamType(unionType.types[1], references).nullable();
|
|
112
|
+
} else {
|
|
113
|
+
return getZodTypeFromApiParamType(unionType.types[0], references).nullable();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// 일반 유니온
|
|
117
|
+
return z.union(unionType.types.map((type)=>getZodTypeFromApiParamType(type, references)));
|
|
118
|
+
case "intersection":
|
|
119
|
+
const intersectionType = paramType;
|
|
120
|
+
return intersectionType.types.reduce((result, type, index)=>{
|
|
121
|
+
const resolvedType = getZodTypeFromApiParamType(type, references);
|
|
122
|
+
if (index === 0) {
|
|
123
|
+
return resolvedType;
|
|
124
|
+
} else {
|
|
125
|
+
return z.intersection(result, resolvedType);
|
|
126
|
+
}
|
|
127
|
+
}, z.unknown());
|
|
128
|
+
case "tuple-type":
|
|
129
|
+
const tupleType = paramType;
|
|
130
|
+
return z.tuple(tupleType.elements.map((elem)=>getZodTypeFromApiParamType(elem, references)));
|
|
131
|
+
}
|
|
132
|
+
return z.unknown();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export function propNodeToZodTypeDef(propNode, injectImportKeys) {
|
|
136
|
+
if (propNode.nodeType === "plain") {
|
|
137
|
+
return propToZodTypeDef(propNode.prop, injectImportKeys);
|
|
138
|
+
} else if (propNode.nodeType === "array") {
|
|
139
|
+
return [
|
|
140
|
+
propNode.prop ? `${propNode.prop.name}: ` : "",
|
|
141
|
+
"z.array(z.object({",
|
|
142
|
+
propNode.children.map((childPropNode)=>propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
|
|
143
|
+
"",
|
|
144
|
+
"})),"
|
|
145
|
+
].join("\n");
|
|
146
|
+
} else if (propNode.nodeType === "object") {
|
|
147
|
+
return [
|
|
148
|
+
propNode.prop ? `${propNode.prop.name}: ` : "",
|
|
149
|
+
"z.object({",
|
|
150
|
+
propNode.children.map((childPropNode)=>propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
|
|
151
|
+
"",
|
|
152
|
+
`})${propNode.prop && propNode.prop.nullable ? ".nullable()" : ""},`
|
|
153
|
+
].join("\n");
|
|
154
|
+
} else {
|
|
155
|
+
throw Error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export function getTextTypeLength(textType) {
|
|
159
|
+
switch(textType){
|
|
160
|
+
case "text":
|
|
161
|
+
return 1024 * 64 - 1;
|
|
162
|
+
case "mediumtext":
|
|
163
|
+
return 1024 * 1024 * 16 - 1;
|
|
164
|
+
case "longtext":
|
|
165
|
+
return 1024 * 1024 * 1024 * 4 - 1;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
export function propToZodTypeDef(prop, injectImportKeys) {
|
|
169
|
+
let stmt;
|
|
170
|
+
if (isIntegerProp(prop)) {
|
|
171
|
+
stmt = `${prop.name}: z.int()`;
|
|
172
|
+
} else if (isBigIntegerProp(prop)) {
|
|
173
|
+
stmt = `${prop.name}: z.bigint()`;
|
|
174
|
+
} else if (isTextProp(prop)) {
|
|
175
|
+
stmt = `${prop.name}: z.string().max(${getTextTypeLength(prop.textType)})`;
|
|
176
|
+
} else if (isEnumProp(prop)) {
|
|
177
|
+
stmt = `${prop.name}: ${prop.id}`;
|
|
178
|
+
injectImportKeys.push(prop.id);
|
|
179
|
+
} else if (isStringProp(prop)) {
|
|
180
|
+
stmt = `${prop.name}: z.string().max(${prop.length})`;
|
|
181
|
+
} else if (isDecimalProp(prop)) {
|
|
182
|
+
stmt = `${prop.name}: z.string()`;
|
|
183
|
+
} else if (isFloatProp(prop) || isDoubleProp(prop)) {
|
|
184
|
+
stmt = `${prop.name}: z.number()`;
|
|
185
|
+
} else if (isBooleanProp(prop)) {
|
|
186
|
+
stmt = `${prop.name}: z.boolean()`;
|
|
187
|
+
} else if (isDateProp(prop)) {
|
|
188
|
+
stmt = `${prop.name}: z.string().length(10)`;
|
|
189
|
+
} else if (isTimeProp(prop)) {
|
|
190
|
+
stmt = `${prop.name}: z.string().length(8)`;
|
|
191
|
+
} else if (isDateTimeProp(prop)) {
|
|
192
|
+
stmt = `${prop.name}: z.date()`;
|
|
193
|
+
} else if (isTimestampProp(prop)) {
|
|
194
|
+
stmt = `${prop.name}: z.date()`;
|
|
195
|
+
} else if (isJsonProp(prop)) {
|
|
196
|
+
stmt = `${prop.name}: ${prop.id}`;
|
|
197
|
+
injectImportKeys.push(prop.id);
|
|
198
|
+
} else if (isUuidProp(prop)) {
|
|
199
|
+
stmt = `${prop.name}: z.uuid()`;
|
|
200
|
+
} else if (isVirtualProp(prop)) {
|
|
201
|
+
stmt = `${prop.name}: ${prop.id}`;
|
|
202
|
+
injectImportKeys.push(prop.id);
|
|
203
|
+
} else if (isRelationProp(prop)) {
|
|
204
|
+
if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
|
|
205
|
+
stmt = `${prop.name}_id: z.int()`;
|
|
206
|
+
} else {
|
|
207
|
+
// 그외 relation 케이스 제외
|
|
208
|
+
return `// ${prop.name}: ${prop.relationType} ${prop.with}`;
|
|
209
|
+
}
|
|
210
|
+
} else {
|
|
211
|
+
return "// unable to resolve";
|
|
212
|
+
}
|
|
213
|
+
if (prop.unsigned) {
|
|
214
|
+
stmt += ".nonnegative()";
|
|
215
|
+
}
|
|
216
|
+
if (prop.nullable) {
|
|
217
|
+
stmt += ".nullable()";
|
|
218
|
+
}
|
|
219
|
+
return stmt + ",";
|
|
220
|
+
}
|
|
221
|
+
// TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
|
|
222
|
+
export function zodTypeToZodCode(zt) {
|
|
223
|
+
switch(zt.def.type){
|
|
224
|
+
case "string":
|
|
225
|
+
return "z.string()";
|
|
226
|
+
case "number":
|
|
227
|
+
return "z.number()";
|
|
228
|
+
case "bigint":
|
|
229
|
+
return "z.bigint()";
|
|
230
|
+
case "boolean":
|
|
231
|
+
return "z.boolean()";
|
|
232
|
+
case "date":
|
|
233
|
+
return "z.date()";
|
|
234
|
+
case "null":
|
|
235
|
+
return "z.null()";
|
|
236
|
+
case "undefined":
|
|
237
|
+
return "z.undefined()";
|
|
238
|
+
case "any":
|
|
239
|
+
return "z.any()";
|
|
240
|
+
case "unknown":
|
|
241
|
+
return "z.unknown()";
|
|
242
|
+
case "never":
|
|
243
|
+
return "z.never()";
|
|
244
|
+
case "nullable":
|
|
245
|
+
return zodTypeToZodCode(zt.def.innerType) + ".nullable()";
|
|
246
|
+
case "default":
|
|
247
|
+
const zDefaultDef = zt.def;
|
|
248
|
+
return zodTypeToZodCode(zDefaultDef.innerType) + `.default(${zDefaultDef.defaultValue})`;
|
|
249
|
+
case "record":
|
|
250
|
+
const zRecordDef = zt.def;
|
|
251
|
+
return `z.record(${zodTypeToZodCode(zRecordDef.keyType)}, ${zodTypeToZodCode(zRecordDef.valueType)})`;
|
|
252
|
+
case "literal":
|
|
253
|
+
const items = Array.from(zt.values).map((value)=>{
|
|
254
|
+
if (typeof value === "string") {
|
|
255
|
+
return `"${value}"`;
|
|
256
|
+
}
|
|
257
|
+
if (value === null) {
|
|
258
|
+
return `null`;
|
|
259
|
+
}
|
|
260
|
+
if (value === undefined) {
|
|
261
|
+
return `undefined`;
|
|
262
|
+
}
|
|
263
|
+
return `${value}`;
|
|
264
|
+
});
|
|
265
|
+
if (items.length === 1) {
|
|
266
|
+
return `z.literal(${items[0]})`;
|
|
267
|
+
}
|
|
268
|
+
return `z.literal([${items.join(", ")}])`;
|
|
269
|
+
case "union":
|
|
270
|
+
return `z.union([${zt.def.options.map((option)=>zodTypeToZodCode(option)).join(",")}])`;
|
|
271
|
+
case "enum":
|
|
272
|
+
// NOTE: z.enum(["A", "B"])도 z.enum({ A: "A", B: "B" })로 처리됨.
|
|
273
|
+
return `z.enum({${Object.entries(zt.def.entries).map(([key, val])=>typeof val === "string" ? `${key}: "${val}"` : `${key}: ${val}`).join(", ")}})`;
|
|
274
|
+
case "array":
|
|
275
|
+
return `z.array(${zodTypeToZodCode(zt.def.element)})`;
|
|
276
|
+
case "object":
|
|
277
|
+
const shape = zt.shape;
|
|
278
|
+
return [
|
|
279
|
+
"z.object({",
|
|
280
|
+
...Object.keys(shape).map((key)=>`${key}: ${zodTypeToZodCode(shape[key])},`),
|
|
281
|
+
"})"
|
|
282
|
+
].join("\n");
|
|
283
|
+
case "optional":
|
|
284
|
+
return zodTypeToZodCode(zt.def.innerType) + ".optional()";
|
|
285
|
+
case "file":
|
|
286
|
+
return `z.file()`;
|
|
287
|
+
case "intersection":
|
|
288
|
+
const zIntersectionDef = zt.def;
|
|
289
|
+
return `z.intersection(${zodTypeToZodCode(zIntersectionDef.left)}, ${zodTypeToZodCode(zIntersectionDef.right)})`;
|
|
290
|
+
case "file":
|
|
291
|
+
return `z.file()`;
|
|
292
|
+
default:
|
|
293
|
+
throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
export function apiParamToTsCode(params, injectImportKeys) {
|
|
297
|
+
return params.map((param)=>{
|
|
298
|
+
return `${param.name}${param.optional && !param.defaultDef ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`;
|
|
299
|
+
}).join(", ");
|
|
300
|
+
}
|
|
301
|
+
export function apiParamToTsCodeAsObject(params, injectImportKeys) {
|
|
302
|
+
return `{ ${params.map((param)=>`${param.name}${param.optional ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`).join(", ")} }`;
|
|
303
|
+
}
|
|
304
|
+
export function apiParamTypeToTsType(paramType, injectImportKeys) {
|
|
305
|
+
if ([
|
|
306
|
+
"string",
|
|
307
|
+
"number",
|
|
308
|
+
"boolean",
|
|
309
|
+
"true",
|
|
310
|
+
"false",
|
|
311
|
+
"null",
|
|
312
|
+
"undefined",
|
|
313
|
+
"void",
|
|
314
|
+
"any",
|
|
315
|
+
"unknown"
|
|
316
|
+
].includes(paramType)) {
|
|
317
|
+
return paramType;
|
|
318
|
+
} else if (ApiParamType.isObject(paramType)) {
|
|
319
|
+
return `{ ${apiParamToTsCode(paramType.props, injectImportKeys)} }`;
|
|
320
|
+
} else if (ApiParamType.isStringLiteral(paramType)) {
|
|
321
|
+
return `"${paramType.value}"`;
|
|
322
|
+
} else if (ApiParamType.isNumericLiteral(paramType)) {
|
|
323
|
+
return String(paramType.value);
|
|
324
|
+
} else if (ApiParamType.isUnion(paramType)) {
|
|
325
|
+
return paramType.types.map((type)=>apiParamTypeToTsType(type, injectImportKeys)).join(" | ");
|
|
326
|
+
} else if (ApiParamType.isIntersection(paramType)) {
|
|
327
|
+
return paramType.types.map((type)=>apiParamTypeToTsType(type, injectImportKeys)).join(" & ");
|
|
328
|
+
} else if (ApiParamType.isArray(paramType)) {
|
|
329
|
+
return apiParamTypeToTsType(paramType.elementsType, injectImportKeys) + "[]";
|
|
330
|
+
} else if (ApiParamType.isRef(paramType)) {
|
|
331
|
+
if ([
|
|
332
|
+
"Pick",
|
|
333
|
+
"Omit",
|
|
334
|
+
"Promise",
|
|
335
|
+
"Partial",
|
|
336
|
+
"Date"
|
|
337
|
+
].includes(paramType.id) === false) {
|
|
338
|
+
// importKeys 인젝션
|
|
339
|
+
injectImportKeys.push(paramType.id);
|
|
340
|
+
}
|
|
341
|
+
if (paramType.args === undefined || paramType.args.length === 0) {
|
|
342
|
+
return paramType.id;
|
|
343
|
+
} else {
|
|
344
|
+
return `${paramType.id}<${paramType.args.map((arg)=>apiParamTypeToTsType(arg, injectImportKeys)).join(",")}>`;
|
|
345
|
+
}
|
|
346
|
+
} else if (ApiParamType.isIndexedAccess(paramType)) {
|
|
347
|
+
return `${apiParamTypeToTsType(paramType.object, injectImportKeys)}[${apiParamTypeToTsType(paramType.index, injectImportKeys)}]`;
|
|
348
|
+
} else if (ApiParamType.isTupleType(paramType)) {
|
|
349
|
+
return `[ ${paramType.elements.map((elem)=>apiParamTypeToTsType(elem, injectImportKeys))} ]`;
|
|
350
|
+
} else if (ApiParamType.isTypeParam(paramType)) {
|
|
351
|
+
return `<${paramType.id}${paramType.constraint ? ` extends ${apiParamTypeToTsType(paramType.constraint, injectImportKeys)}` : ""}>`;
|
|
352
|
+
} else {
|
|
353
|
+
throw new Error(`resolve 불가 ApiParamType ${paramType}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
export function unwrapPromiseOnce(paramType) {
|
|
357
|
+
if (ApiParamType.isPromise(paramType)) {
|
|
358
|
+
return paramType.args[0];
|
|
359
|
+
} else {
|
|
360
|
+
return paramType;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
|
|
364
|
+
export function serializeZodType(zt) {
|
|
365
|
+
switch(zt.def.type){
|
|
366
|
+
case "object":
|
|
367
|
+
return {
|
|
368
|
+
type: "object",
|
|
369
|
+
shape: Object.keys(zt.shape).reduce((result, key)=>{
|
|
370
|
+
return {
|
|
371
|
+
...result,
|
|
372
|
+
[key]: serializeZodType(zt.shape[key])
|
|
373
|
+
};
|
|
374
|
+
}, {})
|
|
375
|
+
};
|
|
376
|
+
case "array":
|
|
377
|
+
return {
|
|
378
|
+
type: "array",
|
|
379
|
+
element: serializeZodType(zt.def.element)
|
|
380
|
+
};
|
|
381
|
+
case "enum":
|
|
382
|
+
return {
|
|
383
|
+
type: "enum",
|
|
384
|
+
values: zt.def.entries
|
|
385
|
+
};
|
|
386
|
+
case "string":
|
|
387
|
+
return {
|
|
388
|
+
type: "string",
|
|
389
|
+
checks: zt.def.checks
|
|
390
|
+
};
|
|
391
|
+
case "number":
|
|
392
|
+
return {
|
|
393
|
+
type: "number",
|
|
394
|
+
checks: zt.def.checks
|
|
395
|
+
};
|
|
396
|
+
case "boolean":
|
|
397
|
+
return {
|
|
398
|
+
type: "boolean"
|
|
399
|
+
};
|
|
400
|
+
case "nullable":
|
|
401
|
+
return {
|
|
402
|
+
...serializeZodType(zt.def.innerType),
|
|
403
|
+
nullable: true
|
|
404
|
+
};
|
|
405
|
+
case "optional":
|
|
406
|
+
return {
|
|
407
|
+
...serializeZodType(zt.def.innerType),
|
|
408
|
+
optional: true
|
|
409
|
+
};
|
|
410
|
+
case "any":
|
|
411
|
+
return {
|
|
412
|
+
type: "any"
|
|
413
|
+
};
|
|
414
|
+
case "record":
|
|
415
|
+
return {
|
|
416
|
+
type: "record",
|
|
417
|
+
keyType: serializeZodType(zt.def.keyType),
|
|
418
|
+
valueType: serializeZodType(zt.def.valueType)
|
|
419
|
+
};
|
|
420
|
+
case "union":
|
|
421
|
+
return {
|
|
422
|
+
type: "union",
|
|
423
|
+
options: zt.def.options.map((option)=>serializeZodType(option))
|
|
424
|
+
};
|
|
425
|
+
default:
|
|
426
|
+
throw new Error(`Serialize 로직이 정의되지 않은 ZodType: ${zt.def.type}`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
|
|
430
|
+
export function zodTypeToTsTypeDef(zt) {
|
|
431
|
+
switch(zt.def.type){
|
|
432
|
+
case "string":
|
|
433
|
+
case "number":
|
|
434
|
+
case "boolean":
|
|
435
|
+
case "bigint":
|
|
436
|
+
case "date":
|
|
437
|
+
case "null":
|
|
438
|
+
case "undefined":
|
|
439
|
+
case "any":
|
|
440
|
+
case "unknown":
|
|
441
|
+
case "never":
|
|
442
|
+
return zt.def.type;
|
|
443
|
+
case "nullable":
|
|
444
|
+
return zodTypeToTsTypeDef(zt.def.innerType) + " | null";
|
|
445
|
+
case "default":
|
|
446
|
+
return zodTypeToTsTypeDef(zt.def.innerType);
|
|
447
|
+
case "record":
|
|
448
|
+
const recordType = zt;
|
|
449
|
+
return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
|
|
450
|
+
case "literal":
|
|
451
|
+
return Array.from(zt.values).map((value)=>{
|
|
452
|
+
if (typeof value === "string") {
|
|
453
|
+
return `"${value}"`;
|
|
454
|
+
}
|
|
455
|
+
if (value === null) {
|
|
456
|
+
return `null`;
|
|
457
|
+
}
|
|
458
|
+
if (value === undefined) {
|
|
459
|
+
return `undefined`;
|
|
460
|
+
}
|
|
461
|
+
return `${value}`;
|
|
462
|
+
}).join(" | ");
|
|
463
|
+
case "union":
|
|
464
|
+
return `${zt.options.map((option)=>zodTypeToTsTypeDef(option)).join(" | ")}`;
|
|
465
|
+
case "enum":
|
|
466
|
+
return `${zt.options.map((val)=>`"${val}"`).join(" | ")}`;
|
|
467
|
+
case "array":
|
|
468
|
+
return `${zodTypeToTsTypeDef(zt.element)}[]`;
|
|
469
|
+
case "object":
|
|
470
|
+
const shape = zt.shape;
|
|
471
|
+
return [
|
|
472
|
+
"{",
|
|
473
|
+
...Object.keys(shape).map((key)=>{
|
|
474
|
+
if (shape[key].def.type === "optional") {
|
|
475
|
+
return `${key}?: ${zodTypeToTsTypeDef(shape[key].def.innerType)},`;
|
|
476
|
+
} else {
|
|
477
|
+
return `${key}: ${zodTypeToTsTypeDef(shape[key])},`;
|
|
478
|
+
}
|
|
479
|
+
}),
|
|
480
|
+
"}"
|
|
481
|
+
].join("\n");
|
|
482
|
+
case "optional":
|
|
483
|
+
return zodTypeToTsTypeDef(zt.def.innerType) + " | undefined";
|
|
484
|
+
default:
|
|
485
|
+
throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29kZS1jb252ZXJ0ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7ICRab2RMb29zZVNoYXBlIH0gZnJvbSBcInpvZC92NC9jb3JlXCJcbmltcG9ydCB7XG4gIEFwaVBhcmFtLFxuICBBcGlQYXJhbVR5cGUsXG4gIEVudGl0eVByb3AsXG4gIEVudGl0eVByb3BOb2RlLFxuICBUZXh0UHJvcCxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlclByb3AsXG4gIGlzQm9vbGVhblByb3AsXG4gIGlzRGF0ZVByb3AsXG4gIGlzRGF0ZVRpbWVQcm9wLFxuICBpc0RlY2ltYWxQcm9wLFxuICBpc0RvdWJsZVByb3AsXG4gIGlzRW51bVByb3AsXG4gIGlzRmxvYXRQcm9wLFxuICBpc0ludGVnZXJQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNTdHJpbmdQcm9wLFxuICBpc1RleHRQcm9wLFxuICBpc1RpbWVQcm9wLFxuICBpc1RpbWVzdGFtcFByb3AsXG4gIGlzVXVpZFByb3AsXG4gIGlzVmlydHVhbFByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IGNvcmUgfSBmcm9tIFwiem9kL3Y0XCI7XG5cbi8vIDxhbnk+66W8IOyekOygnO2VmOqzoCwgWm9k7JeQ7IScIOygnOyVve2VmOuKlCDquLDrs7jsoIHsnbggR2VuZXJpYyBUeXBlIFBhcmFtZXRlcuulvCDsgqzsmqntlaguXG50eXBlIEFueVpvZFJlY29yZCA9IHouWm9kUmVjb3JkPHouWm9kU3RyaW5nIHwgei5ab2ROdW1iZXIgfCB6LlpvZFN5bWJvbCwgei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT2JqZWN0ID0gei5ab2RPYmplY3Q8JFpvZExvb3NlU2hhcGU+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2REZWZhdWx0ID0gei5ab2REZWZhdWx0PHouWm9kVHlwZT47XG50eXBlIEFueVpvZExpdGVyYWwgPSB6LlpvZExpdGVyYWw8Y29yZS51dGlsLkxpdGVyYWw+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xuXG4vKlxuICBFeHRlbmRlZEFwaSDsl5DshJwgWm9kT2JqZWN0IOumrO2EtFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRab2RPYmplY3RGcm9tQXBpKFxuICBhcGk6IEV4dGVuZGVkQXBpLFxuICByZWZlcmVuY2VzOiB7XG4gICAgW2lkOiBzdHJpbmddOiBBbnlab2RPYmplY3Q7XG4gIH0gPSB7fVxuKSB7XG4gIGlmIChhcGkudHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA+IDApIHtcbiAgICBhcGkudHlwZVBhcmFtZXRlcnMubWFwKCh0eXBlUGFyYW0pID0+IHtcbiAgICAgIGlmICh0eXBlUGFyYW0uY29uc3RyYWludCkge1xuICAgICAgICBsZXQgem9kVHlwZSA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKFxuICAgICAgICAgIHR5cGVQYXJhbS5jb25zdHJhaW50LFxuICAgICAgICAgIHJlZmVyZW5jZXNcbiAgICAgICAgKTtcbiAgICAgICAgKHJlZmVyZW5jZXNbdHlwZVBhcmFtLmlkXSBhcyBhbnkpID0gem9kVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IFJlcVR5cGUgPSBnZXRab2RPYmplY3RGcm9tQXBpUGFyYW1zKFxuICAgIGFwaS5wYXJhbWV0ZXJzLmZpbHRlcihcbiAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgIUFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkgJiZcbiAgICAgICAgIUFwaVBhcmFtVHlwZS5pc1JlZktuZXgocGFyYW0udHlwZSkgJiZcbiAgICAgICAgIShwYXJhbS5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBwYXJhbS5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSAvLyBf66GcIOyLnOyeke2VmOuKlCDtjIzrnbzrr7jthLDripQg7KCc7Jm4XG4gICAgKSxcbiAgICByZWZlcmVuY2VzXG4gICk7XG4gIHJldHVybiBSZXFUeXBlO1xufVxuXG4vKlxuICBab2RPYmplY3Trpbwg7Ya17ZW0IEFwaVBhcmFtIOumrO2EtFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRab2RPYmplY3RGcm9tQXBpUGFyYW1zKFxuICBhcGlQYXJhbXM6IEFwaVBhcmFtW10sXG4gIHJlZmVyZW5jZXM6IHtcbiAgICBbaWQ6IHN0cmluZ106IEFueVpvZE9iamVjdDtcbiAgfSA9IHt9XG4pOiB6LlpvZE9iamVjdCB7XG4gIHJldHVybiB6Lm9iamVjdChcbiAgICBhcGlQYXJhbXMucmVkdWNlKChyLCBwYXJhbSkgPT4ge1xuICAgICAgbGV0IHpvZFR5cGUgPSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShwYXJhbS50eXBlLCByZWZlcmVuY2VzKTtcbiAgICAgIGlmIChwYXJhbS5vcHRpb25hbCkge1xuICAgICAgICB6b2RUeXBlID0gem9kVHlwZS5vcHRpb25hbCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucixcbiAgICAgICAgW3BhcmFtLm5hbWVdOiB6b2RUeXBlLFxuICAgICAgfTtcbiAgICB9LCB7fSlcbiAgKTtcbn1cblxuLypcbiAgQXBpUGFyYW1UeXBl7Jy866GcIFpvZFR5cGUg7Luo67KE7YyFXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKFxuICBwYXJhbVR5cGU6IEFwaVBhcmFtVHlwZSxcbiAgcmVmZXJlbmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogQW55Wm9kT2JqZWN0O1xuICB9XG4pOiB6LlpvZFR5cGU8dW5rbm93bj4ge1xuICBzd2l0Y2ggKHBhcmFtVHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiB6LnN0cmluZygpO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiB6Lm51bWJlcigpO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gei5ib29sZWFuKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnN0IGFkdlR5cGUgPSBwYXJhbVR5cGUgYXMgeyB0OiBzdHJpbmcgfTtcbiAgICAgIHN3aXRjaCAoYWR2VHlwZS50KSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmctbGl0ZXJhbFwiOlxuICAgICAgICBjYXNlIFwibnVtZXJpYy1saXRlcmFsXCI6XG4gICAgICAgICAgcmV0dXJuIHoubGl0ZXJhbCgoYWR2VHlwZSBhcyBhbnkpLnZhbHVlKTtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgIGNvbnN0IG9ialR5cGUgPSBwYXJhbVR5cGUgYXMgeyB0OiBzdHJpbmc7IHByb3BzOiBBcGlQYXJhbVtdIH07XG4gICAgICAgICAgcmV0dXJuIGdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMob2JqVHlwZS5wcm9wcyk7XG4gICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgIGNvbnN0IGFyclR5cGUgPSBwYXJhbVR5cGUgYXMge1xuICAgICAgICAgICAgdDogc3RyaW5nO1xuICAgICAgICAgICAgZWxlbWVudHNUeXBlOiBBcGlQYXJhbVR5cGU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gei5hcnJheShcbiAgICAgICAgICAgIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGFyclR5cGUuZWxlbWVudHNUeXBlLCByZWZlcmVuY2VzKVxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJyZWZcIjpcbiAgICAgICAgICBjb25zdCByZWZUeXBlID0gcGFyYW1UeXBlIGFzIHtcbiAgICAgICAgICAgIHQ6IHN0cmluZztcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBhcmdzPzogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIERhdGUg7YOA7J6FIOyymOumrFxuICAgICAgICAgIGlmIChyZWZUeXBlLmlkID09PSBcIkRhdGVcIikge1xuICAgICAgICAgICAgcmV0dXJuIHouZGF0ZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIOqwneyytCDtgqQg6rSA66asIOycoO2LuOumrO2LsFxuICAgICAgICAgIGlmIChbXCJQaWNrXCIsIFwiT21pdFwiXS5pbmNsdWRlcyhyZWZUeXBlLmlkKSkge1xuICAgICAgICAgICAgaWYgKHJlZlR5cGUuYXJncz8ubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFtvYmosIGxpdGVyYWxPclVuaW9uXSA9IHJlZlR5cGUuYXJncyEubWFwKChhcmcpID0+XG4gICAgICAgICAgICAgIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGFyZywgcmVmZXJlbmNlcylcbiAgICAgICAgICAgICkgYXMgW0FueVpvZE9iamVjdCwgei5ab2RVbmlvbjxhbnk+IHwgQW55Wm9kTGl0ZXJhbF07XG4gICAgICAgICAgICBsZXQga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChsaXRlcmFsT3JVbmlvbiBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICAgICAgICAgICAga2V5cyA9IGxpdGVyYWxPclVuaW9uLmRlZi5vcHRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAob3B0aW9uOiB7IGRlZjogeyB2YWx1ZTogc3RyaW5nIH0gfSkgPT4gb3B0aW9uLmRlZi52YWx1ZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAga2V5cyA9IChsaXRlcmFsT3JVbmlvbiBhcyB6LlpvZExpdGVyYWw8c3RyaW5nPikuZGVmLnZhbHVlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleVJlY29yZCA9IGtleXMucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgICAgICBba2V5XTogdHJ1ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sIHt9IGFzIGFueSk7XG5cbiAgICAgICAgICAgIGlmIChyZWZUeXBlLmlkID09PSBcIlBpY2tcIikge1xuICAgICAgICAgICAgICBpZiAob2JqLnBpY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnBpY2soa2V5UmVjb3JkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKG9iai5vbWl0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai5vbWl0KGtleVJlY29yZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFtcIlBhcnRpYWxcIl0uaW5jbHVkZXMocmVmVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIGlmIChyZWZUeXBlLmFyZ3M/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCAke3JlZlR5cGUuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvYmogPSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShyZWZUeXBlLmFyZ3NbMF0sIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgcmV0dXJuIChvYmogYXMgYW55KS5wYXJ0aWFsKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1tyZWZUeXBlLmlkXTtcbiAgICAgICAgICBpZiAocmVmZXJlbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB6LnN0cmluZygpO1xuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKGByZWYg7LC47KGwIOu2iOqwgCAke3JlZlR5cGUuaWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZWZlcmVuY2U7XG4gICAgICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgICAgIGNvbnN0IHVuaW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBudWxsYWJsZSDsnKDri4jsmKhcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB1bmlvblR5cGUudHlwZXMubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgICB1bmlvblR5cGUudHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJudWxsXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodW5pb25UeXBlLnR5cGVzWzBdID09PSBcIm51bGxcIikge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUoXG4gICAgICAgICAgICAgICAgdW5pb25UeXBlLnR5cGVzWzFdLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXNcbiAgICAgICAgICAgICAgKS5udWxsYWJsZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKFxuICAgICAgICAgICAgICAgIHVuaW9uVHlwZS50eXBlc1swXSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzXG4gICAgICAgICAgICAgICkubnVsbGFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDsnbzrsJgg7Jyg64uI7JioXG4gICAgICAgICAgcmV0dXJuIHoudW5pb24oXG4gICAgICAgICAgICB1bmlvblR5cGUudHlwZXMubWFwKCh0eXBlKSA9PlxuICAgICAgICAgICAgICBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSh0eXBlLCByZWZlcmVuY2VzKVxuICAgICAgICAgICAgKSBhcyBhbnlcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwiaW50ZXJzZWN0aW9uXCI6XG4gICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uVHlwZS50eXBlcy5yZWR1Y2UoKHJlc3VsdCwgdHlwZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHR5cGUsIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFR5cGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gei5pbnRlcnNlY3Rpb24ocmVzdWx0IGFzIGFueSwgcmVzb2x2ZWRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB6LnVua25vd24oKSBhcyBhbnkpIGFzIGFueTtcbiAgICAgICAgY2FzZSBcInR1cGxlLXR5cGVcIjpcbiAgICAgICAgICBjb25zdCB0dXBsZVR5cGUgPSBwYXJhbVR5cGUgYXMgQXBpUGFyYW1UeXBlLlR1cGxlVHlwZTtcbiAgICAgICAgICByZXR1cm4gei50dXBsZShcbiAgICAgICAgICAgIHR1cGxlVHlwZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+XG4gICAgICAgICAgICAgIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGVsZW0sIHJlZmVyZW5jZXMpXG4gICAgICAgICAgICApIGFzIGFueVxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gei51bmtub3duKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BOb2RlVG9ab2RUeXBlRGVmKFxuICBwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsXG4gIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwicGxhaW5cIikge1xuICAgIHJldHVybiBwcm9wVG9ab2RUeXBlRGVmKHByb3BOb2RlLnByb3AsIGluamVjdEltcG9ydEtleXMpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6LmFycmF5KHoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+XG4gICAgICAgICAgcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cylcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBcIn0pKSxcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PlxuICAgICAgICAgIHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgYH0pJHtwcm9wTm9kZS5wcm9wICYmIHByb3BOb2RlLnByb3AubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dFR5cGVMZW5ndGgodGV4dFR5cGU6IFRleHRQcm9wW1widGV4dFR5cGVcIl0pOiBudW1iZXIge1xuICBzd2l0Y2ggKHRleHRUeXBlKSB7XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICAgIHJldHVybiAxMDI0ICogNjQgLSAxO1xuICAgIGNhc2UgXCJtZWRpdW10ZXh0XCI6XG4gICAgICByZXR1cm4gMTAyNCAqIDEwMjQgKiAxNiAtIDE7XG4gICAgY2FzZSBcImxvbmd0ZXh0XCI6XG4gICAgICByZXR1cm4gMTAyNCAqIDEwMjQgKiAxMDI0ICogNCAtIDE7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYoXG4gIHByb3A6IEVudGl0eVByb3AsXG4gIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzVGV4dFByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtnZXRUZXh0VHlwZUxlbmd0aChwcm9wLnRleHRUeXBlKX0pYDtcbiAgfSBlbHNlIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1Byb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pYDtcbiAgfSBlbHNlIGlmIChpc0RlY2ltYWxQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzRmxvYXRQcm9wKHByb3ApIHx8IGlzRG91YmxlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5Qcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubGVuZ3RoKDEwKWA7XG4gIH0gZWxzZSBpZiAoaXNUaW1lUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmxlbmd0aCg4KWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlVGltZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKClgO1xuICB9IGVsc2UgaWYgKGlzVGltZXN0YW1wUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoXG4gICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX1faWQ6IHouaW50KClgO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDqt7jsmbggcmVsYXRpb24g7LyA7J207IqkIOygnOyZuFxuICAgICAgcmV0dXJuIGAvLyAke3Byb3AubmFtZX06ICR7cHJvcC5yZWxhdGlvblR5cGV9ICR7cHJvcC53aXRofWA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIi8vIHVuYWJsZSB0byByZXNvbHZlXCI7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgcmV0dXJuIHN0bXQgKyBcIixcIjtcbn1cblxuLy8gVE9ETyhIYXplLCAyNTEwMzEpOiBcInRlbXBsYXRlX2xpdGVyYWxcIiwgXCJmaWxlXCLsl5Ag64yA7ZWcIOyngOybkOydtCDtlYTsmpTtlaguXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSkgKyBcIi5udWxsYWJsZSgpXCI7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIGNvbnN0IHpEZWZhdWx0RGVmID0gKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZjtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHpvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlKSArXG4gICAgICAgIGAuZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYFxuICAgICAgKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID0gKHp0IGFzIEFueVpvZFJlY29yZCkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGVcbiAgICAgICl9KWA7XG4gICAgY2FzZSBcImxpdGVyYWxcIjpcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsPGFueT4pLnZhbHVlcykubWFwKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYHoudW5pb24oWyR7KHp0IGFzIEFueVpvZFVuaW9uKS5kZWYub3B0aW9uc1xuICAgICAgICAubWFwKChvcHRpb246IHouWm9kVHlwZSkgPT4gem9kVHlwZVRvWm9kQ29kZShvcHRpb24pKVxuICAgICAgICAuam9pbihcIixcIil9XSlgO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAvLyBOT1RFOiB6LmVudW0oW1wiQVwiLCBcIkJcIl0p64+EIHouZW51bSh7IEE6IFwiQVwiLCBCOiBcIkJcIiB9KeuhnCDsspjrpqzrkKguXG4gICAgICByZXR1cm4gYHouZW51bSh7JHtPYmplY3QuZW50cmllcygoenQgYXMgei5ab2RFbnVtKS5kZWYuZW50cmllcylcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsXSkgPT5cbiAgICAgICAgICB0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKVxuICAgICAgICAuam9pbihcIiwgXCIpfX0pYDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgei5hcnJheSgke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlPikuZGVmLmVsZW1lbnQpfSlgO1xuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIGFueSkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcChcbiAgICAgICAgICAoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUoc2hhcGVba2V5XSl9LGBcbiAgICAgICAgKSxcbiAgICAgICAgXCJ9KVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIHpvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSkgKyBcIi5vcHRpb25hbCgpXCI7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBgei5maWxlKClgO1xuICAgIGNhc2UgXCJpbnRlcnNlY3Rpb25cIjpcbiAgICAgIGNvbnN0IHpJbnRlcnNlY3Rpb25EZWYgPSAoenQgYXMgei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlLCB6LlpvZFR5cGU+KS5kZWY7XG4gICAgICByZXR1cm4gYHouaW50ZXJzZWN0aW9uKCR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLmxlZnQpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQpfSlgO1xuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gYHouZmlsZSgpYDtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBpUGFyYW1Ub1RzQ29kZShcbiAgcGFyYW1zOiBBcGlQYXJhbVtdLFxuICBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhcmFtc1xuICAgIC5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICByZXR1cm4gYCR7cGFyYW0ubmFtZX0ke1xuICAgICAgICBwYXJhbS5vcHRpb25hbCAmJiAhcGFyYW0uZGVmYXVsdERlZiA/IFwiP1wiIDogXCJcIlxuICAgICAgfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwYXJhbS50eXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ke1xuICAgICAgICBwYXJhbS5kZWZhdWx0RGVmID8gYD0gJHtwYXJhbS5kZWZhdWx0RGVmfWAgOiBcIlwiXG4gICAgICB9YDtcbiAgICB9KVxuICAgIC5qb2luKFwiLCBcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcGlQYXJhbVRvVHNDb2RlQXNPYmplY3QoXG4gIHBhcmFtczogQXBpUGFyYW1bXSxcbiAgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW11cbik6IHN0cmluZyB7XG4gIHJldHVybiBgeyAke3BhcmFtc1xuICAgIC5tYXAoXG4gICAgICAocGFyYW0pID0+XG4gICAgICAgIGAke3BhcmFtLm5hbWV9JHtwYXJhbS5vcHRpb25hbCA/IFwiP1wiIDogXCJcIn06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUoXG4gICAgICAgICAgcGFyYW0udHlwZSxcbiAgICAgICAgICBpbmplY3RJbXBvcnRLZXlzXG4gICAgICAgICl9JHtwYXJhbS5kZWZhdWx0RGVmID8gYD0gJHtwYXJhbS5kZWZhdWx0RGVmfWAgOiBcIlwifWBcbiAgICApXG4gICAgLmpvaW4oXCIsIFwiKX0gfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgcGFyYW1UeXBlOiBBcGlQYXJhbVR5cGUsXG4gIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBpZiAoXG4gICAgW1xuICAgICAgXCJzdHJpbmdcIixcbiAgICAgIFwibnVtYmVyXCIsXG4gICAgICBcImJvb2xlYW5cIixcbiAgICAgIFwidHJ1ZVwiLFxuICAgICAgXCJmYWxzZVwiLFxuICAgICAgXCJudWxsXCIsXG4gICAgICBcInVuZGVmaW5lZFwiLFxuICAgICAgXCJ2b2lkXCIsXG4gICAgICBcImFueVwiLFxuICAgICAgXCJ1bmtub3duXCIsXG4gICAgXS5pbmNsdWRlcyhwYXJhbVR5cGUgYXMgc3RyaW5nKVxuICApIHtcbiAgICByZXR1cm4gcGFyYW1UeXBlIGFzIHN0cmluZztcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNPYmplY3QocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgeyAke2FwaVBhcmFtVG9Uc0NvZGUocGFyYW1UeXBlLnByb3BzLCBpbmplY3RJbXBvcnRLZXlzKX0gfWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzU3RyaW5nTGl0ZXJhbChwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIGBcIiR7cGFyYW1UeXBlLnZhbHVlfVwiYDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNOdW1lcmljTGl0ZXJhbChwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIFN0cmluZyhwYXJhbVR5cGUudmFsdWUpO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc1VuaW9uKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gcGFyYW1UeXBlLnR5cGVzXG4gICAgICAubWFwKCh0eXBlKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgIC5qb2luKFwiIHwgXCIpO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0ludGVyc2VjdGlvbihwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZS50eXBlc1xuICAgICAgLm1hcCgodHlwZSkgPT4gYXBpUGFyYW1UeXBlVG9Uc1R5cGUodHlwZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAuam9pbihcIiAmIFwiKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNBcnJheShwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGFwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtVHlwZS5lbGVtZW50c1R5cGUsIGluamVjdEltcG9ydEtleXMpICsgXCJbXVwiXG4gICAgKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNSZWYocGFyYW1UeXBlKSkge1xuICAgIGlmIChcbiAgICAgIFtcIlBpY2tcIiwgXCJPbWl0XCIsIFwiUHJvbWlzZVwiLCBcIlBhcnRpYWxcIiwgXCJEYXRlXCJdLmluY2x1ZGVzKHBhcmFtVHlwZS5pZCkgPT09XG4gICAgICBmYWxzZVxuICAgICkge1xuICAgICAgLy8gaW1wb3J0S2V5cyDsnbjsoJ3shZhcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwYXJhbVR5cGUuaWQpO1xuICAgIH1cbiAgICBpZiAocGFyYW1UeXBlLmFyZ3MgPT09IHVuZGVmaW5lZCB8fCBwYXJhbVR5cGUuYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBwYXJhbVR5cGUuaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtwYXJhbVR5cGUuaWR9PCR7cGFyYW1UeXBlLmFyZ3NcbiAgICAgICAgLm1hcCgoYXJnKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZShhcmcsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIixcIil9PmA7XG4gICAgfVxuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0luZGV4ZWRBY2Nlc3MocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgJHthcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgIHBhcmFtVHlwZS5vYmplY3QsXG4gICAgICBpbmplY3RJbXBvcnRLZXlzXG4gICAgKX1bJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwYXJhbVR5cGUuaW5kZXgsIGluamVjdEltcG9ydEtleXMpfV1gO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc1R1cGxlVHlwZShwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIGBbICR7cGFyYW1UeXBlLmVsZW1lbnRzLm1hcCgoZWxlbSkgPT5cbiAgICAgIGFwaVBhcmFtVHlwZVRvVHNUeXBlKGVsZW0sIGluamVjdEltcG9ydEtleXMpXG4gICAgKX0gXWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzVHlwZVBhcmFtKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYDwke3BhcmFtVHlwZS5pZH0ke1xuICAgICAgcGFyYW1UeXBlLmNvbnN0cmFpbnRcbiAgICAgICAgPyBgIGV4dGVuZHMgJHthcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgICAgICAgIHBhcmFtVHlwZS5jb25zdHJhaW50LFxuICAgICAgICAgICAgaW5qZWN0SW1wb3J0S2V5c1xuICAgICAgICAgICl9YFxuICAgICAgICA6IFwiXCJcbiAgICB9PmA7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZXNvbHZlIOu2iOqwgCBBcGlQYXJhbVR5cGUgJHtwYXJhbVR5cGV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcFByb21pc2VPbmNlKHBhcmFtVHlwZTogQXBpUGFyYW1UeXBlKSB7XG4gIGlmIChBcGlQYXJhbVR5cGUuaXNQcm9taXNlKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gcGFyYW1UeXBlLmFyZ3MhWzBdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJhbVR5cGU7XG4gIH1cbn1cblxuLy8gVE9ETyhIYXplLCAyNTEwMzEpOiBcInRlbXBsYXRlX2xpdGVyYWxcIiwgXCJmaWxlXCLsl5Ag64yA7ZWcIOyngOybkOydtCDtlYTsmpTtlaguXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplWm9kVHlwZSh6dDogei5ab2RUeXBlKTogYW55IHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIHNoYXBlOiBPYmplY3Qua2V5cygoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZSkucmVkdWNlKFxuICAgICAgICAgIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgICBba2V5XTogc2VyaWFsaXplWm9kVHlwZSgoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZVtrZXldKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fVxuICAgICAgICApLFxuICAgICAgfTtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgZWxlbWVudDogc2VyaWFsaXplWm9kVHlwZSgoenQgYXMgQW55Wm9kQXJyYXkpLmRlZi5lbGVtZW50KSxcbiAgICAgIH07XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZW51bVwiLFxuICAgICAgICB2YWx1ZXM6ICh6dCBhcyB6LlpvZEVudW0pLmRlZi5lbnRyaWVzLFxuICAgICAgfTtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBjaGVja3M6IHp0LmRlZi5jaGVja3MsXG4gICAgICB9O1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGNoZWNrczogenQuZGVmLmNoZWNrcyxcbiAgICAgIH07XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfTtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnNlcmlhbGl6ZVpvZFR5cGUoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKSxcbiAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICB9O1xuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc2VyaWFsaXplWm9kVHlwZSgoenQgYXMgQW55Wm9kT3B0aW9uYWwpLmRlZi5pbm5lclR5cGUpLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIH07XG4gICAgY2FzZSBcImFueVwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJhbnlcIixcbiAgICAgIH07XG4gICAgY2FzZSBcInJlY29yZFwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJyZWNvcmRcIixcbiAgICAgICAga2V5VHlwZTogc2VyaWFsaXplWm9kVHlwZSgoenQgYXMgQW55Wm9kUmVjb3JkKS5kZWYua2V5VHlwZSksXG4gICAgICAgIHZhbHVlVHlwZTogc2VyaWFsaXplWm9kVHlwZSgoenQgYXMgQW55Wm9kUmVjb3JkKS5kZWYudmFsdWVUeXBlKSxcbiAgICAgIH07XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgICAgIG9wdGlvbnM6ICh6dC5kZWYgYXMgQW55Wm9kVW5pb24pLm9wdGlvbnMubWFwKChvcHRpb24pID0+XG4gICAgICAgICAgc2VyaWFsaXplWm9kVHlwZShvcHRpb24pXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTZXJpYWxpemUg66Gc7KeB7J20IOygleydmOuQmOyngCDslYrsnYAgWm9kVHlwZTogJHt6dC5kZWYudHlwZX1gXG4gICAgICApO1xuICB9XG59XG5cbi8vIFRPRE8oSGF6ZSwgMjUxMDMxKTogXCJ0ZW1wbGF0ZV9saXRlcmFsXCIsIFwiZmlsZVwi7JeQIOuMgO2VnCDsp4Dsm5DsnbQg7ZWE7JqU7ZWoLlxuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1RzVHlwZURlZih6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKSArIFwiIHwgbnVsbFwiO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6XG4gICAgICByZXR1cm4gem9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWYuaW5uZXJUeXBlKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6XG4gICAgICBjb25zdCByZWNvcmRUeXBlID0genQgYXMgQW55Wm9kUmVjb3JkO1xuICAgICAgcmV0dXJuIGB7IFsga2V5OiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi5rZXlUeXBlKX0gXTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYudmFsdWVUeXBlKX19YDtcbiAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbCkudmFsdWVzKS5tYXAodmFsdWUgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICB9KS5qb2luKFwiIHwgXCIpXG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIEFueVpvZFVuaW9uKS5vcHRpb25zXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gem9kVHlwZVRvVHNUeXBlRGVmKG9wdGlvbikpXG4gICAgICAgIC5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgei5ab2RFbnVtKS5vcHRpb25zLm1hcCgodmFsKSA9PiBgXCIke3ZhbH1cImApLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZEFycmF5KS5lbGVtZW50KX1bXWA7XG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgY29uc3Qgc2hhcGUgPSAoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwie1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhzaGFwZSkubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoc2hhcGVba2V5XS5kZWYudHlwZSA9PT0gXCJvcHRpb25hbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fT86ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0uZGVmLmlubmVyVHlwZSl9LGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldKX0sYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKSArIFwiIHwgdW5kZWZpbmVkXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJ6IiwiQXBpUGFyYW1UeXBlIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0JpZ0ludGVnZXJQcm9wIiwiaXNCb29sZWFuUHJvcCIsImlzRGF0ZVByb3AiLCJpc0RhdGVUaW1lUHJvcCIsImlzRGVjaW1hbFByb3AiLCJpc0RvdWJsZVByb3AiLCJpc0VudW1Qcm9wIiwiaXNGbG9hdFByb3AiLCJpc0ludGVnZXJQcm9wIiwiaXNKc29uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzU3RyaW5nUHJvcCIsImlzVGV4dFByb3AiLCJpc1RpbWVQcm9wIiwiaXNUaW1lc3RhbXBQcm9wIiwiaXNVdWlkUHJvcCIsImlzVmlydHVhbFByb3AiLCJnZXRab2RPYmplY3RGcm9tQXBpIiwiYXBpIiwicmVmZXJlbmNlcyIsInR5cGVQYXJhbWV0ZXJzIiwibGVuZ3RoIiwibWFwIiwidHlwZVBhcmFtIiwiY29uc3RyYWludCIsInpvZFR5cGUiLCJnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSIsImlkIiwiUmVxVHlwZSIsImdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMiLCJwYXJhbWV0ZXJzIiwiZmlsdGVyIiwicGFyYW0iLCJpc0NvbnRleHQiLCJ0eXBlIiwiaXNSZWZLbmV4Iiwib3B0aW9uYWwiLCJuYW1lIiwic3RhcnRzV2l0aCIsImFwaVBhcmFtcyIsIm9iamVjdCIsInJlZHVjZSIsInIiLCJwYXJhbVR5cGUiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwiYWR2VHlwZSIsInQiLCJsaXRlcmFsIiwidmFsdWUiLCJvYmpUeXBlIiwicHJvcHMiLCJhcnJUeXBlIiwiYXJyYXkiLCJlbGVtZW50c1R5cGUiLCJyZWZUeXBlIiwiZGF0ZSIsImluY2x1ZGVzIiwiYXJncyIsIkVycm9yIiwib2JqIiwibGl0ZXJhbE9yVW5pb24iLCJhcmciLCJrZXlzIiwiWm9kVW5pb24iLCJkZWYiLCJvcHRpb25zIiwib3B0aW9uIiwidmFsdWVzIiwia2V5UmVjb3JkIiwicmVzdWx0Iiwia2V5IiwicGljayIsIm9taXQiLCJwYXJ0aWFsIiwicmVmZXJlbmNlIiwidW5kZWZpbmVkIiwidW5pb25UeXBlIiwidHlwZXMiLCJzb21lIiwibnVsbGFibGUiLCJ1bmlvbiIsImludGVyc2VjdGlvblR5cGUiLCJpbmRleCIsInJlc29sdmVkVHlwZSIsImludGVyc2VjdGlvbiIsInVua25vd24iLCJ0dXBsZVR5cGUiLCJ0dXBsZSIsImVsZW1lbnRzIiwiZWxlbSIsInByb3BOb2RlVG9ab2RUeXBlRGVmIiwicHJvcE5vZGUiLCJpbmplY3RJbXBvcnRLZXlzIiwibm9kZVR5cGUiLCJwcm9wVG9ab2RUeXBlRGVmIiwicHJvcCIsImNoaWxkcmVuIiwiY2hpbGRQcm9wTm9kZSIsImpvaW4iLCJnZXRUZXh0VHlwZUxlbmd0aCIsInRleHRUeXBlIiwic3RtdCIsInB1c2giLCJoYXNKb2luQ29sdW1uIiwicmVsYXRpb25UeXBlIiwid2l0aCIsInVuc2lnbmVkIiwiem9kVHlwZVRvWm9kQ29kZSIsInp0IiwiaW5uZXJUeXBlIiwiekRlZmF1bHREZWYiLCJkZWZhdWx0VmFsdWUiLCJ6UmVjb3JkRGVmIiwia2V5VHlwZSIsInZhbHVlVHlwZSIsIml0ZW1zIiwiQXJyYXkiLCJmcm9tIiwiT2JqZWN0IiwiZW50cmllcyIsInZhbCIsImVsZW1lbnQiLCJzaGFwZSIsInpJbnRlcnNlY3Rpb25EZWYiLCJsZWZ0IiwicmlnaHQiLCJhcGlQYXJhbVRvVHNDb2RlIiwicGFyYW1zIiwiZGVmYXVsdERlZiIsImFwaVBhcmFtVHlwZVRvVHNUeXBlIiwiYXBpUGFyYW1Ub1RzQ29kZUFzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1N0cmluZ0xpdGVyYWwiLCJpc051bWVyaWNMaXRlcmFsIiwiU3RyaW5nIiwiaXNVbmlvbiIsImlzSW50ZXJzZWN0aW9uIiwiaXNBcnJheSIsImlzUmVmIiwiaXNJbmRleGVkQWNjZXNzIiwiaXNUdXBsZVR5cGUiLCJpc1R5cGVQYXJhbSIsInVud3JhcFByb21pc2VPbmNlIiwiaXNQcm9taXNlIiwic2VyaWFsaXplWm9kVHlwZSIsImNoZWNrcyIsInpvZFR5cGVUb1RzVHlwZURlZiIsInJlY29yZFR5cGUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLENBQUMsUUFBUSxNQUFNO0FBRXhCLFNBRUVDLFlBQVksRUFJWkMsMEJBQTBCLEVBQzFCQyxn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
|