@cloudbase/js-sdk 3.4.6 → 3.4.7
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/CHANGELOG.md +3 -0
- package/ai/dist/index.esm.js +2 -3
- package/ai/dist/index.esm.js.map +1 -0
- package/ai/dist/index.js +2 -21
- package/ai/dist/index.js.map +1 -0
- package/apis/dist/index.esm.js +2 -3
- package/apis/dist/index.esm.js.map +1 -0
- package/apis/dist/index.js +2 -21
- package/apis/dist/index.js.map +1 -0
- package/app/dist/index.esm.js +2 -11
- package/app/dist/index.esm.js.map +1 -0
- package/app/dist/index.js +2 -18
- package/app/dist/index.js.map +1 -0
- package/auth/dist/index.esm.js +3 -8
- package/auth/dist/index.esm.js.LICENSE.txt +12 -0
- package/auth/dist/index.esm.js.map +1 -0
- package/auth/dist/index.js +3 -13
- package/auth/dist/index.js.LICENSE.txt +12 -0
- package/auth/dist/index.js.map +1 -0
- package/cloudrun/dist/index.esm.js +2 -3
- package/cloudrun/dist/index.esm.js.map +1 -0
- package/cloudrun/dist/index.js +2 -21
- package/cloudrun/dist/index.js.map +1 -0
- package/container/dist/index.esm.js +2 -8
- package/container/dist/index.esm.js.map +1 -0
- package/container/dist/index.js +2 -13
- package/container/dist/index.js.map +1 -0
- package/database/package.json +34 -4
- package/dist/index.cjs.js +3 -38
- package/dist/index.cjs.js.LICENSE.txt +12 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.esm.js +3 -33
- package/dist/index.esm.js.LICENSE.txt +12 -0
- package/dist/index.esm.js.map +1 -0
- package/functions/dist/index.esm.js +2 -8
- package/functions/dist/index.esm.js.map +1 -0
- package/functions/dist/index.js +2 -13
- package/functions/dist/index.js.map +1 -0
- package/miniprogram_dist/ai.js +1 -1
- package/miniprogram_dist/apis.js +1 -1
- package/miniprogram_dist/app.js +1 -1
- package/miniprogram_dist/auth.js +1 -1
- package/miniprogram_dist/cloudrun.js +1 -1
- package/miniprogram_dist/container.js +1 -1
- package/miniprogram_dist/database.js +1 -1
- package/miniprogram_dist/functions.js +1 -1
- package/miniprogram_dist/index.js +1 -1
- package/miniprogram_dist/model.js +1 -1
- package/miniprogram_dist/mysql.js +1 -1
- package/miniprogram_dist/oauth.js +2 -1
- package/miniprogram_dist/realtime.js +1 -1
- package/miniprogram_dist/storage.js +1 -1
- package/model/dist/index.esm.js +2 -3
- package/model/dist/index.esm.js.map +1 -0
- package/model/dist/index.js +2 -21
- package/model/dist/index.js.map +1 -0
- package/mysql/dist/index.esm.js +2 -3
- package/mysql/dist/index.esm.js.map +1 -0
- package/mysql/dist/index.js +2 -21
- package/mysql/dist/index.js.map +1 -0
- package/oauth/dist/index.esm.js +3 -3
- package/oauth/dist/index.esm.js.LICENSE.txt +12 -0
- package/oauth/dist/index.esm.js.map +1 -0
- package/oauth/dist/index.js +3 -21
- package/oauth/dist/index.js.LICENSE.txt +12 -0
- package/oauth/dist/index.js.map +1 -0
- package/package.json +29 -47
- package/realtime/dist/index.esm.js +2 -8
- package/realtime/dist/index.esm.js.map +1 -0
- package/realtime/dist/index.js +2 -13
- package/realtime/dist/index.js.map +1 -0
- package/storage/dist/index.esm.js +2 -4
- package/storage/dist/index.esm.js.map +1 -0
- package/storage/dist/index.js +2 -9
- package/storage/dist/index.js.map +1 -0
- package/types/analytics.d.ts +51 -0
- package/types/container.d.ts +93 -0
- package/{node_modules/@cloudbase/types → types}/package.json +1 -1
- package/{node_modules/@cloudbase/utilities → utilities}/package.json +2 -2
- package/ai/src/index.d.ts +0 -1
- package/ai/src/index.ts +0 -1
- package/apis/src/index.d.ts +0 -1
- package/apis/src/index.ts +0 -1
- package/app/src/index.ts +0 -17
- package/auth/src/index.d.ts +0 -2
- package/auth/src/index.ts +0 -8
- package/cloudrun/src/index.d.ts +0 -1
- package/cloudrun/src/index.ts +0 -1
- package/container/src/index.d.ts +0 -2
- package/container/src/index.ts +0 -8
- package/database/dist/index.d.ts +0 -3
- package/database/dist/index.esm.js +0 -503
- package/database/dist/index.js +0 -509
- package/database/src/index.d.ts +0 -3
- package/database/src/index.ts +0 -486
- package/functions/src/index.d.ts +0 -2
- package/functions/src/index.ts +0 -8
- package/model/src/index.d.ts +0 -1
- package/model/src/index.ts +0 -1
- package/mysql/src/index.d.ts +0 -1
- package/mysql/src/index.ts +0 -1
- package/node_modules/@cloudbase/ai/.eslintrc.js +0 -15
- package/node_modules/@cloudbase/ai/dist/cjs/AI.d.ts +0 -27
- package/node_modules/@cloudbase/ai/dist/cjs/AI.js +0 -224
- package/node_modules/@cloudbase/ai/dist/cjs/bot/index.d.ts +0 -41
- package/node_modules/@cloudbase/ai/dist/cjs/bot/index.js +0 -376
- package/node_modules/@cloudbase/ai/dist/cjs/bot/types.d.ts +0 -144
- package/node_modules/@cloudbase/ai/dist/cjs/bot/types.js +0 -3
- package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/index.d.ts +0 -2
- package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/index.js +0 -6
- package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/parse.d.ts +0 -2
- package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/parse.js +0 -126
- package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/stream.d.ts +0 -5
- package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/stream.js +0 -40
- package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/types.d.ts +0 -16
- package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/types.js +0 -3
- package/node_modules/@cloudbase/ai/dist/cjs/index.d.ts +0 -40
- package/node_modules/@cloudbase/ai/dist/cjs/index.js +0 -187
- package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/index.js +0 -130
- package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/type.d.ts +0 -71
- package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/type.js +0 -3
- package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/index.js +0 -130
- package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/type.d.ts +0 -74
- package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/type.js +0 -3
- package/node_modules/@cloudbase/ai/dist/cjs/models/DeepSeek/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/DeepSeek/index.js +0 -126
- package/node_modules/@cloudbase/ai/dist/cjs/models/Default/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/Default/index.js +0 -122
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/index.js +0 -135
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/type.d.ts +0 -74
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/type.js +0 -3
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/util.d.ts +0 -4
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/util.js +0 -56
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanBeta/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanBeta/index.js +0 -127
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanExp/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanExp/index.js +0 -125
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanOpen/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanOpen/index.js +0 -127
- package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/index.js +0 -130
- package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/type.d.ts +0 -85
- package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/type.js +0 -3
- package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/index.js +0 -133
- package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/type.d.ts +0 -75
- package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/type.js +0 -3
- package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/index.js +0 -139
- package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/type.d.ts +0 -71
- package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/type.js +0 -3
- package/node_modules/@cloudbase/ai/dist/cjs/models/image-model.d.ts +0 -18
- package/node_modules/@cloudbase/ai/dist/cjs/models/image-model.js +0 -85
- package/node_modules/@cloudbase/ai/dist/cjs/models/index.d.ts +0 -26
- package/node_modules/@cloudbase/ai/dist/cjs/models/index.js +0 -42
- package/node_modules/@cloudbase/ai/dist/cjs/models/model.d.ts +0 -40
- package/node_modules/@cloudbase/ai/dist/cjs/models/model.js +0 -481
- package/node_modules/@cloudbase/ai/dist/cjs/type.d.ts +0 -190
- package/node_modules/@cloudbase/ai/dist/cjs/type.js +0 -10
- package/node_modules/@cloudbase/ai/dist/cjs/utils.d.ts +0 -38
- package/node_modules/@cloudbase/ai/dist/cjs/utils.js +0 -263
- package/node_modules/@cloudbase/ai/dist/esm/AI.d.ts +0 -27
- package/node_modules/@cloudbase/ai/dist/esm/AI.js +0 -198
- package/node_modules/@cloudbase/ai/dist/esm/bot/index.d.ts +0 -41
- package/node_modules/@cloudbase/ai/dist/esm/bot/index.js +0 -373
- package/node_modules/@cloudbase/ai/dist/esm/bot/types.d.ts +0 -144
- package/node_modules/@cloudbase/ai/dist/esm/bot/types.js +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/index.d.ts +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/index.js +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/parse.d.ts +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/parse.js +0 -122
- package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/stream.d.ts +0 -5
- package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/stream.js +0 -37
- package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/types.d.ts +0 -16
- package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/types.js +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/index.d.ts +0 -40
- package/node_modules/@cloudbase/ai/dist/esm/index.js +0 -152
- package/node_modules/@cloudbase/ai/dist/esm/models/Ark/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/Ark/index.js +0 -127
- package/node_modules/@cloudbase/ai/dist/esm/models/Ark/type.d.ts +0 -71
- package/node_modules/@cloudbase/ai/dist/esm/models/Ark/type.js +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/index.js +0 -127
- package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/type.d.ts +0 -74
- package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/type.js +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/models/DeepSeek/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/DeepSeek/index.js +0 -123
- package/node_modules/@cloudbase/ai/dist/esm/models/Default/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/Default/index.js +0 -119
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/index.js +0 -132
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/type.d.ts +0 -74
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/type.js +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/util.d.ts +0 -4
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/util.js +0 -51
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanBeta/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanBeta/index.js +0 -124
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanExp/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanExp/index.js +0 -122
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanOpen/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanOpen/index.js +0 -124
- package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/index.js +0 -127
- package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/type.d.ts +0 -85
- package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/type.js +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/models/Yi/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/Yi/index.js +0 -130
- package/node_modules/@cloudbase/ai/dist/esm/models/Yi/type.d.ts +0 -75
- package/node_modules/@cloudbase/ai/dist/esm/models/Yi/type.js +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/index.d.ts +0 -10
- package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/index.js +0 -136
- package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/type.d.ts +0 -71
- package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/type.js +0 -2
- package/node_modules/@cloudbase/ai/dist/esm/models/image-model.d.ts +0 -18
- package/node_modules/@cloudbase/ai/dist/esm/models/image-model.js +0 -82
- package/node_modules/@cloudbase/ai/dist/esm/models/index.d.ts +0 -26
- package/node_modules/@cloudbase/ai/dist/esm/models/index.js +0 -27
- package/node_modules/@cloudbase/ai/dist/esm/models/model.d.ts +0 -40
- package/node_modules/@cloudbase/ai/dist/esm/models/model.js +0 -478
- package/node_modules/@cloudbase/ai/dist/esm/type.d.ts +0 -190
- package/node_modules/@cloudbase/ai/dist/esm/type.js +0 -7
- package/node_modules/@cloudbase/ai/dist/esm/utils.d.ts +0 -38
- package/node_modules/@cloudbase/ai/dist/esm/utils.js +0 -252
- package/node_modules/@cloudbase/ai/dist/miniprogram/index.js +0 -2
- package/node_modules/@cloudbase/ai/dist/miniprogram/index.js.LICENSE.txt +0 -22
- package/node_modules/@cloudbase/ai/package.json +0 -32
- package/node_modules/@cloudbase/apis/.eslintrc.js +0 -15
- package/node_modules/@cloudbase/apis/dist/cjs/callApis.d.ts +0 -20
- package/node_modules/@cloudbase/apis/dist/cjs/callApis.js +0 -154
- package/node_modules/@cloudbase/apis/dist/cjs/index.d.ts +0 -5
- package/node_modules/@cloudbase/apis/dist/cjs/index.js +0 -53
- package/node_modules/@cloudbase/apis/dist/cjs/type.d.ts +0 -14
- package/node_modules/@cloudbase/apis/dist/cjs/type.js +0 -3
- package/node_modules/@cloudbase/apis/dist/esm/callApis.d.ts +0 -20
- package/node_modules/@cloudbase/apis/dist/esm/callApis.js +0 -148
- package/node_modules/@cloudbase/apis/dist/esm/index.d.ts +0 -5
- package/node_modules/@cloudbase/apis/dist/esm/index.js +0 -35
- package/node_modules/@cloudbase/apis/dist/esm/type.d.ts +0 -14
- package/node_modules/@cloudbase/apis/dist/esm/type.js +0 -2
- package/node_modules/@cloudbase/apis/dist/miniprogram/index.js +0 -1
- package/node_modules/@cloudbase/apis/package.json +0 -28
- package/node_modules/@cloudbase/app/.eslintrc.js +0 -12
- package/node_modules/@cloudbase/app/dist/cjs/constants/common.d.ts +0 -38
- package/node_modules/@cloudbase/app/dist/cjs/constants/common.js +0 -103
- package/node_modules/@cloudbase/app/dist/cjs/index.d.ts +0 -65
- package/node_modules/@cloudbase/app/dist/cjs/index.js +0 -340
- package/node_modules/@cloudbase/app/dist/cjs/index.node.d.ts +0 -6
- package/node_modules/@cloudbase/app/dist/cjs/index.node.js +0 -27
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/constants.d.ts +0 -33
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/constants.js +0 -38
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/context.d.ts +0 -17
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/context.js +0 -189
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/index.d.ts +0 -25
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/index.js +0 -150
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/metadata.d.ts +0 -14
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/metadata.js +0 -130
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/request.d.ts +0 -41
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/request.js +0 -521
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/tool.d.ts +0 -2
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/tool.js +0 -354
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/types.d.ts +0 -102
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/types.js +0 -3
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/utils.d.ts +0 -37
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/utils.js +0 -286
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/wx.d.ts +0 -39
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/wx.js +0 -272
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter.d.ts +0 -3
- package/node_modules/@cloudbase/app/dist/cjs/libs/adapter.js +0 -163
- package/node_modules/@cloudbase/app/dist/cjs/libs/cache.d.ts +0 -6
- package/node_modules/@cloudbase/app/dist/cjs/libs/cache.js +0 -38
- package/node_modules/@cloudbase/app/dist/cjs/libs/component.d.ts +0 -3
- package/node_modules/@cloudbase/app/dist/cjs/libs/component.js +0 -126
- package/node_modules/@cloudbase/app/dist/cjs/libs/lang.d.ts +0 -23
- package/node_modules/@cloudbase/app/dist/cjs/libs/lang.js +0 -59
- package/node_modules/@cloudbase/app/dist/cjs/libs/request.d.ts +0 -62
- package/node_modules/@cloudbase/app/dist/cjs/libs/request.js +0 -480
- package/node_modules/@cloudbase/app/dist/esm/constants/common.d.ts +0 -38
- package/node_modules/@cloudbase/app/dist/esm/constants/common.js +0 -91
- package/node_modules/@cloudbase/app/dist/esm/index.d.ts +0 -65
- package/node_modules/@cloudbase/app/dist/esm/index.js +0 -335
- package/node_modules/@cloudbase/app/dist/esm/index.node.d.ts +0 -6
- package/node_modules/@cloudbase/app/dist/esm/index.node.js +0 -19
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/constants.d.ts +0 -33
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/constants.js +0 -35
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/context.d.ts +0 -17
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/context.js +0 -181
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/index.d.ts +0 -25
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/index.js +0 -120
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/metadata.d.ts +0 -14
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/metadata.js +0 -123
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/request.d.ts +0 -41
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/request.js +0 -495
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/tool.d.ts +0 -2
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/tool.js +0 -350
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/types.d.ts +0 -102
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/types.js +0 -2
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/utils.d.ts +0 -37
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/utils.js +0 -264
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/wx.d.ts +0 -39
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/wx.js +0 -237
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter.d.ts +0 -3
- package/node_modules/@cloudbase/app/dist/esm/libs/adapter.js +0 -136
- package/node_modules/@cloudbase/app/dist/esm/libs/cache.d.ts +0 -6
- package/node_modules/@cloudbase/app/dist/esm/libs/cache.js +0 -32
- package/node_modules/@cloudbase/app/dist/esm/libs/component.d.ts +0 -3
- package/node_modules/@cloudbase/app/dist/esm/libs/component.js +0 -121
- package/node_modules/@cloudbase/app/dist/esm/libs/lang.d.ts +0 -23
- package/node_modules/@cloudbase/app/dist/esm/libs/lang.js +0 -54
- package/node_modules/@cloudbase/app/dist/esm/libs/request.d.ts +0 -62
- package/node_modules/@cloudbase/app/dist/esm/libs/request.js +0 -475
- package/node_modules/@cloudbase/app/dist/miniprogram/index.js +0 -2
- package/node_modules/@cloudbase/app/dist/miniprogram/index.js.LICENSE.txt +0 -7
- package/node_modules/@cloudbase/app/package.json +0 -59
- package/node_modules/@cloudbase/auth/.eslintrc.js +0 -15
- package/node_modules/@cloudbase/auth/dist/cjs/adapter.d.ts +0 -2
- package/node_modules/@cloudbase/auth/dist/cjs/adapter.js +0 -272
- package/node_modules/@cloudbase/auth/dist/cjs/index.d.ts +0 -283
- package/node_modules/@cloudbase/auth/dist/cjs/index.js +0 -3018
- package/node_modules/@cloudbase/auth/dist/cjs/type.d.ts +0 -258
- package/node_modules/@cloudbase/auth/dist/cjs/type.js +0 -6
- package/node_modules/@cloudbase/auth/dist/cjs/utilities.d.ts +0 -7
- package/node_modules/@cloudbase/auth/dist/cjs/utilities.js +0 -23
- package/node_modules/@cloudbase/auth/dist/cjs/utils.d.ts +0 -5
- package/node_modules/@cloudbase/auth/dist/cjs/utils.js +0 -60
- package/node_modules/@cloudbase/auth/dist/cjs/v1-compat.d.ts +0 -77
- package/node_modules/@cloudbase/auth/dist/cjs/v1-compat.js +0 -423
- package/node_modules/@cloudbase/auth/dist/esm/adapter.d.ts +0 -2
- package/node_modules/@cloudbase/auth/dist/esm/adapter.js +0 -268
- package/node_modules/@cloudbase/auth/dist/esm/index.d.ts +0 -283
- package/node_modules/@cloudbase/auth/dist/esm/index.js +0 -3008
- package/node_modules/@cloudbase/auth/dist/esm/type.d.ts +0 -258
- package/node_modules/@cloudbase/auth/dist/esm/type.js +0 -3
- package/node_modules/@cloudbase/auth/dist/esm/utilities.d.ts +0 -7
- package/node_modules/@cloudbase/auth/dist/esm/utilities.js +0 -8
- package/node_modules/@cloudbase/auth/dist/esm/utils.d.ts +0 -5
- package/node_modules/@cloudbase/auth/dist/esm/utils.js +0 -52
- package/node_modules/@cloudbase/auth/dist/esm/v1-compat.d.ts +0 -77
- package/node_modules/@cloudbase/auth/dist/esm/v1-compat.js +0 -419
- package/node_modules/@cloudbase/auth/dist/miniprogram/index.js +0 -1
- package/node_modules/@cloudbase/auth/package.json +0 -31
- package/node_modules/@cloudbase/cloudrun/.eslintrc.js +0 -15
- package/node_modules/@cloudbase/cloudrun/dist/cjs/index.d.ts +0 -4
- package/node_modules/@cloudbase/cloudrun/dist/cjs/index.js +0 -154
- package/node_modules/@cloudbase/cloudrun/dist/esm/index.d.ts +0 -4
- package/node_modules/@cloudbase/cloudrun/dist/esm/index.js +0 -149
- package/node_modules/@cloudbase/cloudrun/package.json +0 -30
- package/node_modules/@cloudbase/container/.eslintrc.js +0 -15
- package/node_modules/@cloudbase/container/.prettierrc.js +0 -41
- package/node_modules/@cloudbase/container/dist/cjs/constants/index.d.ts +0 -1
- package/node_modules/@cloudbase/container/dist/cjs/constants/index.js +0 -5
- package/node_modules/@cloudbase/container/dist/cjs/go_wams_exec.d.ts +0 -2
- package/node_modules/@cloudbase/container/dist/cjs/go_wams_exec.js +0 -538
- package/node_modules/@cloudbase/container/dist/cjs/index.d.ts +0 -13
- package/node_modules/@cloudbase/container/dist/cjs/index.js +0 -343
- package/node_modules/@cloudbase/container/dist/cjs/utils/index.d.ts +0 -3
- package/node_modules/@cloudbase/container/dist/cjs/utils/index.js +0 -83
- package/node_modules/@cloudbase/container/dist/cjs/utils/loader.d.ts +0 -8
- package/node_modules/@cloudbase/container/dist/cjs/utils/loader.js +0 -186
- package/node_modules/@cloudbase/container/dist/cjs/utils/request.d.ts +0 -12
- package/node_modules/@cloudbase/container/dist/cjs/utils/request.js +0 -106
- package/node_modules/@cloudbase/container/dist/esm/constants/index.d.ts +0 -1
- package/node_modules/@cloudbase/container/dist/esm/constants/index.js +0 -2
- package/node_modules/@cloudbase/container/dist/esm/go_wams_exec.d.ts +0 -2
- package/node_modules/@cloudbase/container/dist/esm/go_wams_exec.js +0 -536
- package/node_modules/@cloudbase/container/dist/esm/index.d.ts +0 -13
- package/node_modules/@cloudbase/container/dist/esm/index.js +0 -338
- package/node_modules/@cloudbase/container/dist/esm/utils/index.d.ts +0 -3
- package/node_modules/@cloudbase/container/dist/esm/utils/index.js +0 -77
- package/node_modules/@cloudbase/container/dist/esm/utils/loader.d.ts +0 -8
- package/node_modules/@cloudbase/container/dist/esm/utils/loader.js +0 -178
- package/node_modules/@cloudbase/container/dist/esm/utils/request.d.ts +0 -12
- package/node_modules/@cloudbase/container/dist/esm/utils/request.js +0 -102
- package/node_modules/@cloudbase/container/package.json +0 -30
- package/node_modules/@cloudbase/database/README.md +0 -119
- package/node_modules/@cloudbase/database/package.json +0 -36
- package/node_modules/@cloudbase/database/tsconfig.test.json +0 -15
- package/node_modules/@cloudbase/functions/.eslintrc.js +0 -15
- package/node_modules/@cloudbase/functions/dist/cjs/index.d.ts +0 -2
- package/node_modules/@cloudbase/functions/dist/cjs/index.js +0 -223
- package/node_modules/@cloudbase/functions/dist/esm/index.d.ts +0 -2
- package/node_modules/@cloudbase/functions/dist/esm/index.js +0 -219
- package/node_modules/@cloudbase/functions/package.json +0 -32
- package/node_modules/@cloudbase/model/.eslintrc.js +0 -15
- package/node_modules/@cloudbase/model/dist/cjs/index.d.ts +0 -5
- package/node_modules/@cloudbase/model/dist/cjs/index.js +0 -144
- package/node_modules/@cloudbase/model/dist/esm/index.d.ts +0 -5
- package/node_modules/@cloudbase/model/dist/esm/index.js +0 -125
- package/node_modules/@cloudbase/model/package.json +0 -29
- package/node_modules/@cloudbase/mysql/.eslintrc.js +0 -6
- package/node_modules/@cloudbase/mysql/dist/cjs/index.d.ts +0 -4
- package/node_modules/@cloudbase/mysql/dist/cjs/index.d.ts.map +0 -1
- package/node_modules/@cloudbase/mysql/dist/cjs/index.js +0 -173
- package/node_modules/@cloudbase/mysql/dist/esm/index.d.ts +0 -3
- package/node_modules/@cloudbase/mysql/dist/esm/index.js +0 -155
- package/node_modules/@cloudbase/mysql/package.json +0 -30
- package/node_modules/@cloudbase/oauth/.eslintrc.js +0 -15
- package/node_modules/@cloudbase/oauth/dist/cjs/auth/apis.d.ts +0 -142
- package/node_modules/@cloudbase/oauth/dist/cjs/auth/apis.js +0 -1280
- package/node_modules/@cloudbase/oauth/dist/cjs/auth/auth-error.d.ts +0 -22
- package/node_modules/@cloudbase/oauth/dist/cjs/auth/auth-error.js +0 -278
- package/node_modules/@cloudbase/oauth/dist/cjs/auth/consts.d.ts +0 -139
- package/node_modules/@cloudbase/oauth/dist/cjs/auth/consts.js +0 -147
- package/node_modules/@cloudbase/oauth/dist/cjs/auth/models.d.ts +0 -557
- package/node_modules/@cloudbase/oauth/dist/cjs/auth/models.js +0 -3
- package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha-dom.d.ts +0 -3
- package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha-dom.js +0 -223
- package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha.d.ts +0 -42
- package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha.js +0 -205
- package/node_modules/@cloudbase/oauth/dist/cjs/index.d.ts +0 -22
- package/node_modules/@cloudbase/oauth/dist/cjs/index.js +0 -107
- package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/consts.d.ts +0 -20
- package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/consts.js +0 -26
- package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/interface.d.ts +0 -15
- package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/interface.js +0 -10
- package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/models.d.ts +0 -74
- package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/models.js +0 -3
- package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/oauth2client.d.ts +0 -129
- package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/oauth2client.js +0 -1174
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/base64.d.ts +0 -9
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/base64.js +0 -112
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/encrypt.d.ts +0 -4
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/encrypt.js +0 -26
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/encryptlong/index.d.ts +0 -546
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/encryptlong/index.js +0 -2982
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/function/single-promise.d.ts +0 -6
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/function/single-promise.js +0 -94
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/index.d.ts +0 -2
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/index.js +0 -56
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/mp.d.ts +0 -2
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/mp.js +0 -66
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/urlSearchParams.d.ts +0 -13
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/urlSearchParams.js +0 -66
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/uuid.d.ts +0 -1
- package/node_modules/@cloudbase/oauth/dist/cjs/utils/uuid.js +0 -12
- package/node_modules/@cloudbase/oauth/dist/esm/auth/apis.d.ts +0 -142
- package/node_modules/@cloudbase/oauth/dist/esm/auth/apis.js +0 -768
- package/node_modules/@cloudbase/oauth/dist/esm/auth/auth-error.d.ts +0 -22
- package/node_modules/@cloudbase/oauth/dist/esm/auth/auth-error.js +0 -255
- package/node_modules/@cloudbase/oauth/dist/esm/auth/consts.d.ts +0 -139
- package/node_modules/@cloudbase/oauth/dist/esm/auth/consts.js +0 -144
- package/node_modules/@cloudbase/oauth/dist/esm/auth/models.d.ts +0 -557
- package/node_modules/@cloudbase/oauth/dist/esm/auth/models.js +0 -2
- package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha-dom.d.ts +0 -3
- package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha-dom.js +0 -130
- package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha.d.ts +0 -42
- package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha.js +0 -104
- package/node_modules/@cloudbase/oauth/dist/esm/index.d.ts +0 -22
- package/node_modules/@cloudbase/oauth/dist/esm/index.js +0 -64
- package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/consts.d.ts +0 -20
- package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/consts.js +0 -22
- package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/interface.d.ts +0 -15
- package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/interface.js +0 -3
- package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/models.d.ts +0 -74
- package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/models.js +0 -2
- package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/oauth2client.d.ts +0 -129
- package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/oauth2client.js +0 -711
- package/node_modules/@cloudbase/oauth/dist/esm/utils/base64.d.ts +0 -9
- package/node_modules/@cloudbase/oauth/dist/esm/utils/base64.js +0 -104
- package/node_modules/@cloudbase/oauth/dist/esm/utils/encrypt.d.ts +0 -4
- package/node_modules/@cloudbase/oauth/dist/esm/utils/encrypt.js +0 -18
- package/node_modules/@cloudbase/oauth/dist/esm/utils/encryptlong/index.d.ts +0 -546
- package/node_modules/@cloudbase/oauth/dist/esm/utils/encryptlong/index.js +0 -2953
- package/node_modules/@cloudbase/oauth/dist/esm/utils/function/single-promise.d.ts +0 -6
- package/node_modules/@cloudbase/oauth/dist/esm/utils/function/single-promise.js +0 -34
- package/node_modules/@cloudbase/oauth/dist/esm/utils/index.d.ts +0 -2
- package/node_modules/@cloudbase/oauth/dist/esm/utils/index.js +0 -51
- package/node_modules/@cloudbase/oauth/dist/esm/utils/mp.d.ts +0 -2
- package/node_modules/@cloudbase/oauth/dist/esm/utils/mp.js +0 -61
- package/node_modules/@cloudbase/oauth/dist/esm/utils/urlSearchParams.d.ts +0 -13
- package/node_modules/@cloudbase/oauth/dist/esm/utils/urlSearchParams.js +0 -58
- package/node_modules/@cloudbase/oauth/dist/esm/utils/uuid.d.ts +0 -1
- package/node_modules/@cloudbase/oauth/dist/esm/utils/uuid.js +0 -8
- package/node_modules/@cloudbase/oauth/dist/miniprogram/index.js +0 -1
- package/node_modules/@cloudbase/oauth/package.json +0 -20
- package/node_modules/@cloudbase/realtime/.eslintrc.js +0 -15
- package/node_modules/@cloudbase/realtime/dist/cjs/common.d.ts +0 -4
- package/node_modules/@cloudbase/realtime/dist/cjs/common.js +0 -22
- package/node_modules/@cloudbase/realtime/dist/cjs/error.d.ts +0 -36
- package/node_modules/@cloudbase/realtime/dist/cjs/error.js +0 -106
- package/node_modules/@cloudbase/realtime/dist/cjs/index.d.ts +0 -2
- package/node_modules/@cloudbase/realtime/dist/cjs/index.js +0 -36
- package/node_modules/@cloudbase/realtime/dist/cjs/listener.d.ts +0 -14
- package/node_modules/@cloudbase/realtime/dist/cjs/listener.js +0 -18
- package/node_modules/@cloudbase/realtime/dist/cjs/message.d.ts +0 -3
- package/node_modules/@cloudbase/realtime/dist/cjs/message.js +0 -13
- package/node_modules/@cloudbase/realtime/dist/cjs/snapshot.d.ts +0 -17
- package/node_modules/@cloudbase/realtime/dist/cjs/snapshot.js +0 -45
- package/node_modules/@cloudbase/realtime/dist/cjs/utils.d.ts +0 -1
- package/node_modules/@cloudbase/realtime/dist/cjs/utils.js +0 -9
- package/node_modules/@cloudbase/realtime/dist/cjs/virtual-websocket-client.d.ts +0 -62
- package/node_modules/@cloudbase/realtime/dist/cjs/virtual-websocket-client.js +0 -960
- package/node_modules/@cloudbase/realtime/dist/cjs/websocket-client.d.ts +0 -78
- package/node_modules/@cloudbase/realtime/dist/cjs/websocket-client.js +0 -750
- package/node_modules/@cloudbase/realtime/dist/cjs/ws-event.d.ts +0 -126
- package/node_modules/@cloudbase/realtime/dist/cjs/ws-event.js +0 -141
- package/node_modules/@cloudbase/realtime/dist/esm/common.d.ts +0 -4
- package/node_modules/@cloudbase/realtime/dist/esm/common.js +0 -15
- package/node_modules/@cloudbase/realtime/dist/esm/error.d.ts +0 -36
- package/node_modules/@cloudbase/realtime/dist/esm/error.js +0 -100
- package/node_modules/@cloudbase/realtime/dist/esm/index.d.ts +0 -2
- package/node_modules/@cloudbase/realtime/dist/esm/index.js +0 -32
- package/node_modules/@cloudbase/realtime/dist/esm/listener.d.ts +0 -14
- package/node_modules/@cloudbase/realtime/dist/esm/listener.js +0 -15
- package/node_modules/@cloudbase/realtime/dist/esm/message.d.ts +0 -3
- package/node_modules/@cloudbase/realtime/dist/esm/message.js +0 -8
- package/node_modules/@cloudbase/realtime/dist/esm/snapshot.d.ts +0 -17
- package/node_modules/@cloudbase/realtime/dist/esm/snapshot.js +0 -42
- package/node_modules/@cloudbase/realtime/dist/esm/utils.d.ts +0 -1
- package/node_modules/@cloudbase/realtime/dist/esm/utils.js +0 -5
- package/node_modules/@cloudbase/realtime/dist/esm/virtual-websocket-client.d.ts +0 -62
- package/node_modules/@cloudbase/realtime/dist/esm/virtual-websocket-client.js +0 -954
- package/node_modules/@cloudbase/realtime/dist/esm/websocket-client.d.ts +0 -78
- package/node_modules/@cloudbase/realtime/dist/esm/websocket-client.js +0 -747
- package/node_modules/@cloudbase/realtime/dist/esm/ws-event.d.ts +0 -126
- package/node_modules/@cloudbase/realtime/dist/esm/ws-event.js +0 -137
- package/node_modules/@cloudbase/realtime/package.json +0 -29
- package/node_modules/@cloudbase/storage/.eslintrc.js +0 -15
- package/node_modules/@cloudbase/storage/dist/cjs/index.d.ts +0 -195
- package/node_modules/@cloudbase/storage/dist/cjs/index.js +0 -1426
- package/node_modules/@cloudbase/storage/dist/cjs/supabase/errors.d.ts +0 -20
- package/node_modules/@cloudbase/storage/dist/cjs/supabase/errors.js +0 -65
- package/node_modules/@cloudbase/storage/dist/cjs/supabase/types.d.ts +0 -64
- package/node_modules/@cloudbase/storage/dist/cjs/supabase/types.js +0 -3
- package/node_modules/@cloudbase/storage/dist/esm/index.d.ts +0 -195
- package/node_modules/@cloudbase/storage/dist/esm/index.js +0 -1422
- package/node_modules/@cloudbase/storage/dist/esm/supabase/errors.d.ts +0 -20
- package/node_modules/@cloudbase/storage/dist/esm/supabase/errors.js +0 -61
- package/node_modules/@cloudbase/storage/dist/esm/supabase/types.d.ts +0 -64
- package/node_modules/@cloudbase/storage/dist/esm/supabase/types.js +0 -2
- package/node_modules/@cloudbase/storage/package.json +0 -28
- package/node_modules/@cloudbase/types/index.js +0 -1
- package/node_modules/@cloudbase/utilities/.eslintrc.js +0 -15
- package/oauth/src/index.d.ts +0 -1
- package/oauth/src/index.ts +0 -1
- package/realtime/src/index.d.ts +0 -2
- package/realtime/src/index.ts +0 -8
- package/storage/src/index.d.ts +0 -2
- package/storage/src/index.js +0 -5
- package/storage/src/index.ts +0 -4
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/aggregate.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/aggregate.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/collection.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/collection.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/command.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/command.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/logic.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/logic.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/query.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/query.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/update.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/update.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/config/app.config.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/config/app.config.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/config/error.config.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/config/error.config.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/const/code.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/const/code.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/constant.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/constant.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/document.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/document.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/interface.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/interface.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/lineString.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/lineString.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiLineString.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiLineString.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiPoint.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiPoint.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiPolygon.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiPolygon.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/point.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/point.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/polygon.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/polygon.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/helper/symbol.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/helper/symbol.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/lib/util.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/lib/util.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/operator-map.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/operator-map.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/query.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/query.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/regexp/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/regexp/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/common.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/common.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/datatype.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/datatype.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/query.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/query.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/update.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/update.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serverDate/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serverDate/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/collection.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/collection.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/document.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/document.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/query.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/query.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/typings/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/typings/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/typings/realtime.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/typings/realtime.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/util.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/util.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/error.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/error.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/msg.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/msg.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/symbol.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/symbol.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/type.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/type.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/utils.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/utils.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/validate.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/commonjs/validate.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/aggregate.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/aggregate.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/collection.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/collection.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/command.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/command.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/logic.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/logic.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/query.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/query.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/update.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/update.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/config/app.config.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/config/app.config.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/config/error.config.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/config/error.config.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/const/code.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/const/code.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/constant.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/constant.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/document.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/document.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/interface.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/interface.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/lineString.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/lineString.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiLineString.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiLineString.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiPoint.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiPoint.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiPolygon.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiPolygon.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/point.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/point.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/polygon.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/polygon.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/helper/symbol.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/helper/symbol.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/lib/util.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/lib/util.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/operator-map.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/operator-map.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/query.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/query.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/regexp/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/regexp/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/common.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/common.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/datatype.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/datatype.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/query.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/query.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/update.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/update.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/serverDate/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/serverDate/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/collection.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/collection.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/document.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/document.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/query.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/query.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/typings/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/typings/index.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/typings/realtime.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/typings/realtime.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/util.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/util.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/error.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/error.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/msg.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/msg.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/symbol.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/symbol.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/type.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/type.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/utils.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/utils.js +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/validate.d.ts +0 -0
- /package/{node_modules/@cloudbase/database → database}/dist/esm/validate.js +0 -0
- /package/{app/src → dist}/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/auth.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/cache.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/cloudrun.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/component.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/database.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/events.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/functions.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/realtime.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/request.d.ts +0 -0
- /package/{node_modules/@cloudbase/types → types}/storage.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/adapters/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/adapters/index.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/adapters/platforms/web.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/adapters/platforms/web.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/common.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/common.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/errors.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/errors.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/index.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/helpers/decorators.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/helpers/decorators.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/helpers/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/helpers/index.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/index.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/abortController.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/abortController.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/cache.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/cache.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/events.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/events.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/langEvent.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/langEvent.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/util.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/util.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/adapters/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/adapters/index.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/adapters/platforms/web.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/adapters/platforms/web.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/common.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/common.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/errors.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/errors.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/index.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/helpers/decorators.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/helpers/decorators.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/helpers/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/helpers/index.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/index.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/index.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/abortController.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/abortController.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/cache.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/cache.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/events.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/events.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/langEvent.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/langEvent.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/util.d.ts +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/util.js +0 -0
- /package/{node_modules/@cloudbase/utilities → utilities}/dist/miniprogram/index.js +0 -0
|
@@ -1,3008 +0,0 @@
|
|
|
1
|
-
var __extends = (this && this.__extends) || (function () {
|
|
2
|
-
var extendStatics = function (d, b) {
|
|
3
|
-
extendStatics = Object.setPrototypeOf ||
|
|
4
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
-
return extendStatics(d, b);
|
|
7
|
-
};
|
|
8
|
-
return function (d, b) {
|
|
9
|
-
if (typeof b !== "function" && b !== null)
|
|
10
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
-
extendStatics(d, b);
|
|
12
|
-
function __() { this.constructor = d; }
|
|
13
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
-
};
|
|
15
|
-
})();
|
|
16
|
-
var __assign = (this && this.__assign) || function () {
|
|
17
|
-
__assign = Object.assign || function(t) {
|
|
18
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
19
|
-
s = arguments[i];
|
|
20
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
21
|
-
t[p] = s[p];
|
|
22
|
-
}
|
|
23
|
-
return t;
|
|
24
|
-
};
|
|
25
|
-
return __assign.apply(this, arguments);
|
|
26
|
-
};
|
|
27
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
28
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
29
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
30
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
31
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
32
|
-
};
|
|
33
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
34
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
35
|
-
};
|
|
36
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
37
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
38
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
39
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
40
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
41
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
42
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
46
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
47
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
48
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
49
|
-
function step(op) {
|
|
50
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
51
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
52
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
53
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
54
|
-
switch (op[0]) {
|
|
55
|
-
case 0: case 1: t = op; break;
|
|
56
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
57
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
58
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
59
|
-
default:
|
|
60
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
61
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
62
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
63
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
64
|
-
if (t[2]) _.ops.pop();
|
|
65
|
-
_.trys.pop(); continue;
|
|
66
|
-
}
|
|
67
|
-
op = body.call(thisArg, _);
|
|
68
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
69
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
73
|
-
var t = {};
|
|
74
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
75
|
-
t[p] = s[p];
|
|
76
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
77
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
78
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
79
|
-
t[p[i]] = s[p[i]];
|
|
80
|
-
}
|
|
81
|
-
return t;
|
|
82
|
-
};
|
|
83
|
-
import { CloudbaseOAuth, AUTH_API_PREFIX, LOGIN_STATE_CHANGED_TYPE, EVENTS, AUTH_STATE_CHANGED_TYPE, OAUTH_TYPE, weAppJwtDecodeAll, AuthError, AuthErrorCategory, authModels, DEFAULT_NODE_ACCESS_SCOPE, } from '@cloudbase/oauth';
|
|
84
|
-
import { useAuthAdapter } from './adapter';
|
|
85
|
-
import { printWarn, throwError, ERRORS, COMMUNITY_SITE_URL, catchErrorsDecorator, CloudbaseEventEmitter, CloudbaseCache, adapterForWxMp, useDefaultAdapter, } from './utilities';
|
|
86
|
-
import { saveToBrowserSession, getBrowserSession, removeBrowserSession, addUrlSearch } from './utils';
|
|
87
|
-
import { AuthV1Compat, WeixinAuthProvider, CustomAuthProvider, AnonymousAuthProvider, applyUserV1Compat, } from './v1-compat';
|
|
88
|
-
import { utils } from '@cloudbase/utilities';
|
|
89
|
-
var isBrowser = function () { return typeof window !== 'undefined' && typeof document !== 'undefined'; };
|
|
90
|
-
var COMPONENT_NAME = 'auth';
|
|
91
|
-
var onCredentialsError = function (eventBus) { return function (params) {
|
|
92
|
-
eventBus.fire(EVENTS.LOGIN_STATE_CHANGED, __assign(__assign({}, params), { eventType: LOGIN_STATE_CHANGED_TYPE.CREDENTIALS_ERROR }));
|
|
93
|
-
}; };
|
|
94
|
-
export var User = (function () {
|
|
95
|
-
function User(options) {
|
|
96
|
-
var cache = options.cache, oauthInstance = options.oauthInstance;
|
|
97
|
-
this.cache = cache;
|
|
98
|
-
this.oauthInstance = oauthInstance;
|
|
99
|
-
this.setUserInfo();
|
|
100
|
-
}
|
|
101
|
-
User.prototype.checkLocalInfo = function () {
|
|
102
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
103
|
-
return __generator(this, function (_a) {
|
|
104
|
-
this.uid = this.getLocalUserInfo('uid');
|
|
105
|
-
this.gender = this.getLocalUserInfo('gender');
|
|
106
|
-
this.picture = this.getLocalUserInfo('picture');
|
|
107
|
-
this.email = this.getLocalUserInfo('email');
|
|
108
|
-
this.emailVerified = this.getLocalUserInfo('email_verified');
|
|
109
|
-
this.phoneNumber = this.getLocalUserInfo('phone_number');
|
|
110
|
-
this.username = this.getLocalUserInfo('username');
|
|
111
|
-
this.name = this.getLocalUserInfo('name');
|
|
112
|
-
this.birthdate = this.getLocalUserInfo('birthdate');
|
|
113
|
-
this.zoneinfo = this.getLocalUserInfo('zoneinfo');
|
|
114
|
-
this.locale = this.getLocalUserInfo('locale');
|
|
115
|
-
this.sub = this.getLocalUserInfo('sub');
|
|
116
|
-
this.createdFrom = this.getLocalUserInfo('created_from');
|
|
117
|
-
this.providers = this.getLocalUserInfo('providers');
|
|
118
|
-
return [2];
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
};
|
|
122
|
-
User.prototype.checkLocalInfoAsync = function () {
|
|
123
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
124
|
-
var _a, _b, _c, _d;
|
|
125
|
-
return __generator(this, function (_e) {
|
|
126
|
-
switch (_e.label) {
|
|
127
|
-
case 0:
|
|
128
|
-
_a = this;
|
|
129
|
-
return [4, this.getLocalUserInfoAsync('uid')];
|
|
130
|
-
case 1:
|
|
131
|
-
_a.uid = _e.sent();
|
|
132
|
-
_b = this;
|
|
133
|
-
return [4, this.getLocalUserInfoAsync('gender')];
|
|
134
|
-
case 2:
|
|
135
|
-
_b.gender = _e.sent();
|
|
136
|
-
this.picture = this.getLocalUserInfo('picture');
|
|
137
|
-
_c = this;
|
|
138
|
-
return [4, this.getLocalUserInfoAsync('email')];
|
|
139
|
-
case 3:
|
|
140
|
-
_c.email = _e.sent();
|
|
141
|
-
this.emailVerified = this.getLocalUserInfo('email_verified');
|
|
142
|
-
this.phoneNumber = this.getLocalUserInfo('phone_number');
|
|
143
|
-
_d = this;
|
|
144
|
-
return [4, this.getLocalUserInfoAsync('username')];
|
|
145
|
-
case 4:
|
|
146
|
-
_d.username = _e.sent();
|
|
147
|
-
this.name = this.getLocalUserInfo('name');
|
|
148
|
-
this.birthdate = this.getLocalUserInfo('birthdate');
|
|
149
|
-
this.zoneinfo = this.getLocalUserInfo('zoneinfo');
|
|
150
|
-
this.locale = this.getLocalUserInfo('locale');
|
|
151
|
-
this.sub = this.getLocalUserInfo('sub');
|
|
152
|
-
this.createdFrom = this.getLocalUserInfo('created_from');
|
|
153
|
-
this.providers = this.getLocalUserInfo('providers');
|
|
154
|
-
return [2];
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
};
|
|
159
|
-
User.prototype.update = function (userInfo) {
|
|
160
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
161
|
-
var newUserInfo;
|
|
162
|
-
return __generator(this, function (_a) {
|
|
163
|
-
switch (_a.label) {
|
|
164
|
-
case 0: return [4, this.oauthInstance.authApi.setUserProfile(__assign({}, userInfo))];
|
|
165
|
-
case 1:
|
|
166
|
-
newUserInfo = _a.sent();
|
|
167
|
-
this.setLocalUserInfo(newUserInfo);
|
|
168
|
-
return [2];
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
};
|
|
173
|
-
User.prototype.updateUserBasicInfo = function (params) {
|
|
174
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
175
|
-
return __generator(this, function (_a) {
|
|
176
|
-
switch (_a.label) {
|
|
177
|
-
case 0: return [4, this.oauthInstance.authApi.updateUserBasicInfo(__assign({}, params))];
|
|
178
|
-
case 1:
|
|
179
|
-
_a.sent();
|
|
180
|
-
return [4, this.refresh()];
|
|
181
|
-
case 2:
|
|
182
|
-
_a.sent();
|
|
183
|
-
return [2];
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
};
|
|
188
|
-
User.prototype.updatePassword = function (newPassword, oldPassword) {
|
|
189
|
-
return this.oauthInstance.authApi.updatePasswordByOld({
|
|
190
|
-
old_password: oldPassword,
|
|
191
|
-
new_password: newPassword,
|
|
192
|
-
});
|
|
193
|
-
};
|
|
194
|
-
User.prototype.updateUsername = function (username) {
|
|
195
|
-
if (typeof username !== 'string') {
|
|
196
|
-
throwError(ERRORS.INVALID_PARAMS, 'username must be a string');
|
|
197
|
-
}
|
|
198
|
-
return this.update({
|
|
199
|
-
username: username,
|
|
200
|
-
});
|
|
201
|
-
};
|
|
202
|
-
User.prototype.refresh = function (params) {
|
|
203
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
204
|
-
var newUserInfo;
|
|
205
|
-
return __generator(this, function (_a) {
|
|
206
|
-
switch (_a.label) {
|
|
207
|
-
case 0: return [4, this.oauthInstance.authApi.getUserInfo(params)];
|
|
208
|
-
case 1:
|
|
209
|
-
newUserInfo = _a.sent();
|
|
210
|
-
if (newUserInfo.code === 'INVALID_ACCESS_TOKEN') {
|
|
211
|
-
this.setLocalUserInfo({});
|
|
212
|
-
throw newUserInfo;
|
|
213
|
-
}
|
|
214
|
-
this.setLocalUserInfo(newUserInfo);
|
|
215
|
-
return [2, newUserInfo];
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
};
|
|
220
|
-
User.prototype.getLocalUserInfo = function (key) {
|
|
221
|
-
var userInfoKey = this.cache.keys.userInfoKey;
|
|
222
|
-
var userInfo = this.cache.getStore(userInfoKey);
|
|
223
|
-
if (!key)
|
|
224
|
-
return userInfo || {};
|
|
225
|
-
return userInfo[key];
|
|
226
|
-
};
|
|
227
|
-
User.prototype.setLocalUserInfo = function (userInfo) {
|
|
228
|
-
var userInfoKey = this.cache.keys.userInfoKey;
|
|
229
|
-
this.cache.setStore(userInfoKey, userInfo);
|
|
230
|
-
this.setUserInfo();
|
|
231
|
-
};
|
|
232
|
-
User.prototype.getLocalUserInfoAsync = function (key) {
|
|
233
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
234
|
-
var userInfoKey, userInfo;
|
|
235
|
-
return __generator(this, function (_a) {
|
|
236
|
-
switch (_a.label) {
|
|
237
|
-
case 0:
|
|
238
|
-
userInfoKey = this.cache.keys.userInfoKey;
|
|
239
|
-
return [4, this.cache.getStoreAsync(userInfoKey)];
|
|
240
|
-
case 1:
|
|
241
|
-
userInfo = _a.sent();
|
|
242
|
-
return [2, userInfo[key]];
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
});
|
|
246
|
-
};
|
|
247
|
-
User.prototype.setUserInfo = function () {
|
|
248
|
-
var _this = this;
|
|
249
|
-
var userInfoKey = this.cache.keys.userInfoKey;
|
|
250
|
-
var userInfo = this.cache.getStore(userInfoKey);
|
|
251
|
-
[
|
|
252
|
-
'uid',
|
|
253
|
-
'email',
|
|
254
|
-
'name',
|
|
255
|
-
'gender',
|
|
256
|
-
'picture',
|
|
257
|
-
'email_verified',
|
|
258
|
-
'phone_number',
|
|
259
|
-
'birthdate',
|
|
260
|
-
'zoneinfo',
|
|
261
|
-
'locale',
|
|
262
|
-
'sub',
|
|
263
|
-
'created_from',
|
|
264
|
-
'providers',
|
|
265
|
-
'username',
|
|
266
|
-
'created_at',
|
|
267
|
-
'open_id',
|
|
268
|
-
].forEach(function (infoKey) {
|
|
269
|
-
_this[infoKey] = userInfo[infoKey];
|
|
270
|
-
});
|
|
271
|
-
};
|
|
272
|
-
__decorate([
|
|
273
|
-
catchErrorsDecorator({
|
|
274
|
-
title: '更新用户信息失败',
|
|
275
|
-
messages: [
|
|
276
|
-
'请确认以下各项:',
|
|
277
|
-
' 1 - 调用 User.update() 的语法或参数是否正确',
|
|
278
|
-
' 2 - 用户信息中是否包含非法值',
|
|
279
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
280
|
-
],
|
|
281
|
-
}),
|
|
282
|
-
__metadata("design:type", Function),
|
|
283
|
-
__metadata("design:paramtypes", [Object]),
|
|
284
|
-
__metadata("design:returntype", Promise)
|
|
285
|
-
], User.prototype, "update", null);
|
|
286
|
-
__decorate([
|
|
287
|
-
catchErrorsDecorator({
|
|
288
|
-
title: '更新密码失败',
|
|
289
|
-
messages: [
|
|
290
|
-
'请确认以下各项:',
|
|
291
|
-
' 1 - 调用 User.updatePassword() 的语法或参数是否正确',
|
|
292
|
-
' 3 - 新密码中是否包含非法字符',
|
|
293
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
294
|
-
],
|
|
295
|
-
}),
|
|
296
|
-
__metadata("design:type", Function),
|
|
297
|
-
__metadata("design:paramtypes", [String, String]),
|
|
298
|
-
__metadata("design:returntype", void 0)
|
|
299
|
-
], User.prototype, "updatePassword", null);
|
|
300
|
-
__decorate([
|
|
301
|
-
catchErrorsDecorator({
|
|
302
|
-
title: '更新用户名失败',
|
|
303
|
-
messages: [
|
|
304
|
-
'请确认以下各项:',
|
|
305
|
-
' 1 - 调用 User.updateUsername() 的语法或参数是否正确',
|
|
306
|
-
' 2 - 当前环境是否开通了用户名密码登录',
|
|
307
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
308
|
-
],
|
|
309
|
-
}),
|
|
310
|
-
__metadata("design:type", Function),
|
|
311
|
-
__metadata("design:paramtypes", [String]),
|
|
312
|
-
__metadata("design:returntype", void 0)
|
|
313
|
-
], User.prototype, "updateUsername", null);
|
|
314
|
-
__decorate([
|
|
315
|
-
catchErrorsDecorator({
|
|
316
|
-
title: '刷新本地用户信息失败',
|
|
317
|
-
messages: [
|
|
318
|
-
'请确认以下各项:',
|
|
319
|
-
' 1 - 调用 User.refresh() 的语法或参数是否正确',
|
|
320
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
321
|
-
],
|
|
322
|
-
}),
|
|
323
|
-
__metadata("design:type", Function),
|
|
324
|
-
__metadata("design:paramtypes", [Object]),
|
|
325
|
-
__metadata("design:returntype", Promise)
|
|
326
|
-
], User.prototype, "refresh", null);
|
|
327
|
-
return User;
|
|
328
|
-
}());
|
|
329
|
-
applyUserV1Compat(User);
|
|
330
|
-
var LoginState = (function () {
|
|
331
|
-
function LoginState(options) {
|
|
332
|
-
var envId = options.envId, cache = options.cache, oauthInstance = options.oauthInstance;
|
|
333
|
-
if (!envId) {
|
|
334
|
-
throwError(ERRORS.INVALID_PARAMS, 'envId is not defined');
|
|
335
|
-
}
|
|
336
|
-
this.cache = cache;
|
|
337
|
-
this.oauthInstance = oauthInstance;
|
|
338
|
-
this.user = new User({
|
|
339
|
-
cache: this.cache,
|
|
340
|
-
oauthInstance: oauthInstance,
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
LoginState.prototype.checkLocalState = function () {
|
|
344
|
-
var _a;
|
|
345
|
-
this.oauthLoginState = (_a = this.oauthInstance) === null || _a === void 0 ? void 0 : _a.authApi.hasLoginStateSync();
|
|
346
|
-
this.user.checkLocalInfo();
|
|
347
|
-
};
|
|
348
|
-
LoginState.prototype.checkLocalStateAsync = function () {
|
|
349
|
-
var _a;
|
|
350
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
351
|
-
return __generator(this, function (_b) {
|
|
352
|
-
switch (_b.label) {
|
|
353
|
-
case 0: return [4, ((_a = this.oauthInstance) === null || _a === void 0 ? void 0 : _a.authApi.getLoginState())];
|
|
354
|
-
case 1:
|
|
355
|
-
_b.sent();
|
|
356
|
-
return [4, this.user.checkLocalInfoAsync()];
|
|
357
|
-
case 2:
|
|
358
|
-
_b.sent();
|
|
359
|
-
return [2];
|
|
360
|
-
}
|
|
361
|
-
});
|
|
362
|
-
});
|
|
363
|
-
};
|
|
364
|
-
return LoginState;
|
|
365
|
-
}());
|
|
366
|
-
export { LoginState };
|
|
367
|
-
var Auth = (function (_super) {
|
|
368
|
-
__extends(Auth, _super);
|
|
369
|
-
function Auth(config) {
|
|
370
|
-
var _this = _super.call(this) || this;
|
|
371
|
-
_this.listeners = new Map();
|
|
372
|
-
_this.hasListenerSetUp = false;
|
|
373
|
-
_this.config = config;
|
|
374
|
-
_this.oauthInstance = config.oauthInstance;
|
|
375
|
-
_this.cache = config.cache;
|
|
376
|
-
_this.init();
|
|
377
|
-
_this.setAccessKey();
|
|
378
|
-
return _this;
|
|
379
|
-
}
|
|
380
|
-
Auth.prototype.signInAnonymously = function (params) {
|
|
381
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
382
|
-
var loginState, _a, _b, session, error_1, authError;
|
|
383
|
-
return __generator(this, function (_c) {
|
|
384
|
-
switch (_c.label) {
|
|
385
|
-
case 0:
|
|
386
|
-
_c.trys.push([0, 4, , 5]);
|
|
387
|
-
return [4, this.oauthInstance.authApi.signInAnonymously(params)];
|
|
388
|
-
case 1:
|
|
389
|
-
_c.sent();
|
|
390
|
-
return [4, this.createLoginState()];
|
|
391
|
-
case 2:
|
|
392
|
-
loginState = _c.sent();
|
|
393
|
-
return [4, this.getSession()];
|
|
394
|
-
case 3:
|
|
395
|
-
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
396
|
-
return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
|
|
397
|
-
case 4:
|
|
398
|
-
error_1 = _c.sent();
|
|
399
|
-
authError = new AuthError(error_1, { method: 'signInAnonymously' });
|
|
400
|
-
if (authError.category === AuthErrorCategory.PROVIDER_NOT_ENABLED) {
|
|
401
|
-
console.error(authError.helpMessage);
|
|
402
|
-
console.error('[CloudBase Auth] 提示:匿名登录需要在控制台开启「匿名登录」。\n'
|
|
403
|
-
+ ' 如果您需要使用用户名密码登录,请改用 auth.signInWithPassword({ username, password })。\n'
|
|
404
|
-
+ ' 不要在匿名登录失败后自动回退到密码登录,这两种方式的使用场景不同。');
|
|
405
|
-
}
|
|
406
|
-
else {
|
|
407
|
-
console.warn("[CloudBase Auth] signInAnonymously \u5931\u8D25 [".concat(authError.category, "]: ").concat(authError.message));
|
|
408
|
-
if (authError.loginMethodHint) {
|
|
409
|
-
console.warn(authError.loginMethodHint);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
return [2, { data: {}, error: authError }];
|
|
413
|
-
case 5: return [2];
|
|
414
|
-
}
|
|
415
|
-
});
|
|
416
|
-
});
|
|
417
|
-
};
|
|
418
|
-
Auth.prototype.signUp = function (params) {
|
|
419
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
420
|
-
var verificationInfo_1, error_2;
|
|
421
|
-
var _this = this;
|
|
422
|
-
return __generator(this, function (_a) {
|
|
423
|
-
switch (_a.label) {
|
|
424
|
-
case 0:
|
|
425
|
-
if (!(params.phone_number || params.verification_code || params.verification_token || params.provider_token)) return [3, 2];
|
|
426
|
-
if (params.phone_number) {
|
|
427
|
-
params.phone_number = this.formatPhone(params.phone_number);
|
|
428
|
-
}
|
|
429
|
-
return [4, this.oauthInstance.authApi.signUp(params)];
|
|
430
|
-
case 1:
|
|
431
|
-
_a.sent();
|
|
432
|
-
return [2, this.createLoginState()];
|
|
433
|
-
case 2:
|
|
434
|
-
_a.trys.push([2, 4, , 5]);
|
|
435
|
-
this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
|
|
436
|
-
return [4, this.getVerification(params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })];
|
|
437
|
-
case 3:
|
|
438
|
-
verificationInfo_1 = _a.sent();
|
|
439
|
-
return [2, {
|
|
440
|
-
data: {
|
|
441
|
-
verifyOtp: function (_a) {
|
|
442
|
-
var token = _a.token, _b = _a.messageId, messageId = _b === void 0 ? verificationInfo_1.verification_id : _b;
|
|
443
|
-
return __awaiter(_this, void 0, void 0, function () {
|
|
444
|
-
var verificationTokenRes, data, _c, _d, session, error_3;
|
|
445
|
-
return __generator(this, function (_e) {
|
|
446
|
-
switch (_e.label) {
|
|
447
|
-
case 0:
|
|
448
|
-
_e.trys.push([0, 8, , 9]);
|
|
449
|
-
return [4, this.verify({
|
|
450
|
-
verification_id: messageId || verificationInfo_1.verification_id,
|
|
451
|
-
verification_code: token,
|
|
452
|
-
})];
|
|
453
|
-
case 1:
|
|
454
|
-
verificationTokenRes = _e.sent();
|
|
455
|
-
if (!verificationInfo_1.is_user) return [3, 3];
|
|
456
|
-
return [4, this.signIn({
|
|
457
|
-
username: params.email || this.formatPhone(params.phone),
|
|
458
|
-
verification_token: verificationTokenRes.verification_token,
|
|
459
|
-
})];
|
|
460
|
-
case 2:
|
|
461
|
-
_e.sent();
|
|
462
|
-
return [3, 6];
|
|
463
|
-
case 3:
|
|
464
|
-
data = JSON.parse(JSON.stringify(params));
|
|
465
|
-
delete data.email;
|
|
466
|
-
delete data.phone;
|
|
467
|
-
return [4, this.oauthInstance.authApi.signUp(__assign(__assign(__assign({}, data), (params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })), { verification_token: verificationTokenRes.verification_token, verification_code: token }))];
|
|
468
|
-
case 4:
|
|
469
|
-
_e.sent();
|
|
470
|
-
return [4, this.createLoginState()];
|
|
471
|
-
case 5:
|
|
472
|
-
_e.sent();
|
|
473
|
-
_e.label = 6;
|
|
474
|
-
case 6: return [4, this.getSession()];
|
|
475
|
-
case 7:
|
|
476
|
-
_c = (_e.sent()).data, _d = _c === void 0 ? {} : _c, session = _d.session;
|
|
477
|
-
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
478
|
-
case 8:
|
|
479
|
-
error_3 = _e.sent();
|
|
480
|
-
return [2, { data: {}, error: new AuthError(error_3, { method: 'signUp' }) }];
|
|
481
|
-
case 9: return [2];
|
|
482
|
-
}
|
|
483
|
-
});
|
|
484
|
-
});
|
|
485
|
-
},
|
|
486
|
-
},
|
|
487
|
-
error: null,
|
|
488
|
-
}];
|
|
489
|
-
case 4:
|
|
490
|
-
error_2 = _a.sent();
|
|
491
|
-
return [2, { data: {}, error: new AuthError(error_2, { method: 'signUp' }) }];
|
|
492
|
-
case 5: return [2];
|
|
493
|
-
}
|
|
494
|
-
});
|
|
495
|
-
});
|
|
496
|
-
};
|
|
497
|
-
Auth.prototype.signOut = function (params) {
|
|
498
|
-
var _a, _b;
|
|
499
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
500
|
-
var userInfoKey, res, error_4;
|
|
501
|
-
return __generator(this, function (_c) {
|
|
502
|
-
switch (_c.label) {
|
|
503
|
-
case 0:
|
|
504
|
-
_c.trys.push([0, 3, , 4]);
|
|
505
|
-
userInfoKey = this.cache.keys.userInfoKey;
|
|
506
|
-
return [4, this.oauthInstance.authApi.signOut(params)];
|
|
507
|
-
case 1:
|
|
508
|
-
res = _c.sent();
|
|
509
|
-
return [4, this.cache.removeStoreAsync(userInfoKey)];
|
|
510
|
-
case 2:
|
|
511
|
-
_c.sent();
|
|
512
|
-
this.setAccessKey();
|
|
513
|
-
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.LOGIN_STATE_CHANGED, { eventType: LOGIN_STATE_CHANGED_TYPE.SIGN_OUT });
|
|
514
|
-
(_b = this.config.eventBus) === null || _b === void 0 ? void 0 : _b.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_OUT });
|
|
515
|
-
return [2, __assign(__assign({}, res), { data: {}, error: null })];
|
|
516
|
-
case 3:
|
|
517
|
-
error_4 = _c.sent();
|
|
518
|
-
return [2, { data: {}, error: new AuthError(error_4, { method: 'signOut' }) }];
|
|
519
|
-
case 4: return [2];
|
|
520
|
-
}
|
|
521
|
-
});
|
|
522
|
-
});
|
|
523
|
-
};
|
|
524
|
-
Auth.prototype.onAuthStateChange = function (callback) {
|
|
525
|
-
var _this = this;
|
|
526
|
-
if (!this.hasListenerSetUp) {
|
|
527
|
-
this.setupListeners();
|
|
528
|
-
this.hasListenerSetUp = true;
|
|
529
|
-
}
|
|
530
|
-
var id = Math.random().toString(36);
|
|
531
|
-
if (!this.listeners.has(id)) {
|
|
532
|
-
this.listeners.set(id, new Set());
|
|
533
|
-
}
|
|
534
|
-
this.listeners.get(id).add(callback);
|
|
535
|
-
var subscription = {
|
|
536
|
-
id: id,
|
|
537
|
-
callback: callback,
|
|
538
|
-
unsubscribe: function () {
|
|
539
|
-
var callbacks = _this.listeners.get(id);
|
|
540
|
-
if (callbacks) {
|
|
541
|
-
callbacks.delete(callback);
|
|
542
|
-
if (callbacks.size === 0) {
|
|
543
|
-
_this.listeners.delete(id);
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
},
|
|
547
|
-
};
|
|
548
|
-
return {
|
|
549
|
-
data: { subscription: subscription },
|
|
550
|
-
};
|
|
551
|
-
};
|
|
552
|
-
Auth.prototype.signInWithPassword = function (params) {
|
|
553
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
554
|
-
var _a, _b, session, error_5, authError;
|
|
555
|
-
return __generator(this, function (_c) {
|
|
556
|
-
switch (_c.label) {
|
|
557
|
-
case 0:
|
|
558
|
-
_c.trys.push([0, 3, , 4]);
|
|
559
|
-
this.validateAtLeastOne(params, [['username'], ['email'], ['phone']], 'You must provide either username, email, or phone');
|
|
560
|
-
this.validateParams(params, {
|
|
561
|
-
password: { required: true, message: 'Password is required' },
|
|
562
|
-
});
|
|
563
|
-
return [4, this.signIn(__assign({ username: params.username || params.email || this.formatPhone(params.phone), password: params.password }, (params.is_encrypt ? { isEncrypt: true, version: 'v2' } : {})))];
|
|
564
|
-
case 1:
|
|
565
|
-
_c.sent();
|
|
566
|
-
return [4, this.getSession()];
|
|
567
|
-
case 2:
|
|
568
|
-
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
569
|
-
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
570
|
-
case 3:
|
|
571
|
-
error_5 = _c.sent();
|
|
572
|
-
authError = new AuthError(error_5, { method: 'signInWithPassword' });
|
|
573
|
-
if (authError.category === AuthErrorCategory.PROVIDER_NOT_ENABLED) {
|
|
574
|
-
console.error(authError.helpMessage);
|
|
575
|
-
}
|
|
576
|
-
else if (authError.category === AuthErrorCategory.INVALID_CREDENTIALS) {
|
|
577
|
-
console.warn(authError.helpMessage);
|
|
578
|
-
}
|
|
579
|
-
else if (authError.category === AuthErrorCategory.USER_NOT_FOUND) {
|
|
580
|
-
console.warn(authError.helpMessage);
|
|
581
|
-
}
|
|
582
|
-
else {
|
|
583
|
-
console.warn("[CloudBase Auth] signInWithPassword \u5931\u8D25 [".concat(authError.category, "]: ").concat(authError.message));
|
|
584
|
-
}
|
|
585
|
-
if (authError.loginMethodHint) {
|
|
586
|
-
console.info(authError.loginMethodHint);
|
|
587
|
-
}
|
|
588
|
-
return [2, { data: {}, error: authError }];
|
|
589
|
-
case 4: return [2];
|
|
590
|
-
}
|
|
591
|
-
});
|
|
592
|
-
});
|
|
593
|
-
};
|
|
594
|
-
Auth.prototype.signInWithIdToken = function (params) {
|
|
595
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
596
|
-
var _a, _b, session, error_6;
|
|
597
|
-
return __generator(this, function (_c) {
|
|
598
|
-
switch (_c.label) {
|
|
599
|
-
case 0:
|
|
600
|
-
_c.trys.push([0, 3, , 4]);
|
|
601
|
-
this.validateParams(params, {
|
|
602
|
-
token: { required: true, message: 'Token is required' },
|
|
603
|
-
});
|
|
604
|
-
return [4, this.signInWithProvider({
|
|
605
|
-
provider_token: params.token,
|
|
606
|
-
})];
|
|
607
|
-
case 1:
|
|
608
|
-
_c.sent();
|
|
609
|
-
return [4, this.getSession()];
|
|
610
|
-
case 2:
|
|
611
|
-
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
612
|
-
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
613
|
-
case 3:
|
|
614
|
-
error_6 = _c.sent();
|
|
615
|
-
return [2, { data: {}, error: new AuthError(error_6, { method: 'signInWithIdToken' }) }];
|
|
616
|
-
case 4: return [2];
|
|
617
|
-
}
|
|
618
|
-
});
|
|
619
|
-
});
|
|
620
|
-
};
|
|
621
|
-
Auth.prototype.signInWithOtp = function (params) {
|
|
622
|
-
var _a, _b, _c, _d;
|
|
623
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
624
|
-
var verificationInfo_2, error_7;
|
|
625
|
-
var _this = this;
|
|
626
|
-
return __generator(this, function (_e) {
|
|
627
|
-
switch (_e.label) {
|
|
628
|
-
case 0:
|
|
629
|
-
if (!((_a = params.options) === null || _a === void 0 ? void 0 : _a.emailRedirectTo) && (((_b = params.options) === null || _b === void 0 ? void 0 : _b.shouldCreateUser) === undefined || !!((_c = params.options) === null || _c === void 0 ? void 0 : _c.shouldCreateUser))) {
|
|
630
|
-
return [2, this.signUp({
|
|
631
|
-
email: params.email,
|
|
632
|
-
phone: params.phone,
|
|
633
|
-
})];
|
|
634
|
-
}
|
|
635
|
-
_e.label = 1;
|
|
636
|
-
case 1:
|
|
637
|
-
_e.trys.push([1, 3, , 4]);
|
|
638
|
-
this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
|
|
639
|
-
return [4, this.getVerification(__assign({ email_redirect_to: (_d = params.options) === null || _d === void 0 ? void 0 : _d.emailRedirectTo }, (params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })))];
|
|
640
|
-
case 2:
|
|
641
|
-
verificationInfo_2 = _e.sent();
|
|
642
|
-
return [2, {
|
|
643
|
-
data: {
|
|
644
|
-
user: null,
|
|
645
|
-
session: null,
|
|
646
|
-
verifyOtp: function (_a) {
|
|
647
|
-
var token = _a.token, _b = _a.messageId, messageId = _b === void 0 ? verificationInfo_2.verification_id : _b;
|
|
648
|
-
return __awaiter(_this, void 0, void 0, function () {
|
|
649
|
-
return __generator(this, function (_c) {
|
|
650
|
-
return [2, this.verifyOtp({
|
|
651
|
-
email: params.email,
|
|
652
|
-
phone: params.phone,
|
|
653
|
-
token: token,
|
|
654
|
-
messageId: messageId,
|
|
655
|
-
})];
|
|
656
|
-
});
|
|
657
|
-
});
|
|
658
|
-
},
|
|
659
|
-
},
|
|
660
|
-
error: null,
|
|
661
|
-
}];
|
|
662
|
-
case 3:
|
|
663
|
-
error_7 = _e.sent();
|
|
664
|
-
return [2, { data: {}, error: new AuthError(error_7, { method: 'signInWithOtp' }) }];
|
|
665
|
-
case 4: return [2];
|
|
666
|
-
}
|
|
667
|
-
});
|
|
668
|
-
});
|
|
669
|
-
};
|
|
670
|
-
Auth.prototype.verifyOAuth = function (params) {
|
|
671
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
672
|
-
var data, code, state, cacheData, provider, token, res, localSearch, error_8;
|
|
673
|
-
return __generator(this, function (_a) {
|
|
674
|
-
switch (_a.label) {
|
|
675
|
-
case 0:
|
|
676
|
-
data = {};
|
|
677
|
-
_a.label = 1;
|
|
678
|
-
case 1:
|
|
679
|
-
_a.trys.push([1, 7, , 8]);
|
|
680
|
-
code = (params === null || params === void 0 ? void 0 : params.code) || utils.getQuery('code');
|
|
681
|
-
state = (params === null || params === void 0 ? void 0 : params.state) || utils.getQuery('state');
|
|
682
|
-
if (!code) {
|
|
683
|
-
return [2, { data: {}, error: new AuthError({ message: 'Code is required' }) }];
|
|
684
|
-
}
|
|
685
|
-
if (!state) {
|
|
686
|
-
return [2, { data: {}, error: new AuthError({ message: 'State is required' }) }];
|
|
687
|
-
}
|
|
688
|
-
cacheData = getBrowserSession(state);
|
|
689
|
-
data.type = cacheData === null || cacheData === void 0 ? void 0 : cacheData.type;
|
|
690
|
-
provider = (params === null || params === void 0 ? void 0 : params.provider) || (cacheData === null || cacheData === void 0 ? void 0 : cacheData.provider) || utils.getQuery('provider');
|
|
691
|
-
if (!provider) {
|
|
692
|
-
return [2, { data: data, error: new AuthError({ message: 'Provider is required' }) }];
|
|
693
|
-
}
|
|
694
|
-
return [4, this.grantProviderToken({
|
|
695
|
-
provider_id: provider,
|
|
696
|
-
provider_redirect_uri: location.origin + location.pathname,
|
|
697
|
-
provider_code: code,
|
|
698
|
-
})];
|
|
699
|
-
case 2:
|
|
700
|
-
token = (_a.sent()).provider_token;
|
|
701
|
-
res = void 0;
|
|
702
|
-
if (!(cacheData.type === OAUTH_TYPE.BIND_IDENTITY)) return [3, 4];
|
|
703
|
-
return [4, this.oauthInstance.authApi.toBindIdentity({ provider_token: token, provider: provider, fireEvent: true })];
|
|
704
|
-
case 3:
|
|
705
|
-
res = _a.sent();
|
|
706
|
-
return [3, 6];
|
|
707
|
-
case 4: return [4, this.signInWithIdToken({
|
|
708
|
-
token: token,
|
|
709
|
-
})];
|
|
710
|
-
case 5:
|
|
711
|
-
res = _a.sent();
|
|
712
|
-
res.data = __assign(__assign({}, data), res.data);
|
|
713
|
-
_a.label = 6;
|
|
714
|
-
case 6:
|
|
715
|
-
localSearch = new URLSearchParams(location === null || location === void 0 ? void 0 : location.search);
|
|
716
|
-
localSearch.delete('code');
|
|
717
|
-
localSearch.delete('state');
|
|
718
|
-
res.data.redirectUrl = addUrlSearch((cacheData === null || cacheData === void 0 ? void 0 : cacheData.search) === undefined ? "?".concat(localSearch.toString()) : cacheData === null || cacheData === void 0 ? void 0 : cacheData.search, (cacheData === null || cacheData === void 0 ? void 0 : cacheData.hash) || location.hash);
|
|
719
|
-
removeBrowserSession(state);
|
|
720
|
-
return [2, res];
|
|
721
|
-
case 7:
|
|
722
|
-
error_8 = _a.sent();
|
|
723
|
-
return [2, { data: data, error: new AuthError(error_8, { method: 'verifyOAuth' }) }];
|
|
724
|
-
case 8: return [2];
|
|
725
|
-
}
|
|
726
|
-
});
|
|
727
|
-
});
|
|
728
|
-
};
|
|
729
|
-
Auth.prototype.signInWithOAuth = function (params) {
|
|
730
|
-
var _a, _b, _c, _d, _e;
|
|
731
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
732
|
-
var href, urlObject, provider_redirect_uri, state, uri, decodedUri, finalUri, url_1, error_9;
|
|
733
|
-
return __generator(this, function (_f) {
|
|
734
|
-
switch (_f.label) {
|
|
735
|
-
case 0:
|
|
736
|
-
_f.trys.push([0, 2, , 3]);
|
|
737
|
-
this.validateParams(params, {
|
|
738
|
-
provider: { required: true, message: 'Provider is required' },
|
|
739
|
-
});
|
|
740
|
-
href = ((_a = params.options) === null || _a === void 0 ? void 0 : _a.redirectTo) || location.href;
|
|
741
|
-
urlObject = new URL(href);
|
|
742
|
-
provider_redirect_uri = urlObject.origin + urlObject.pathname;
|
|
743
|
-
state = ((_b = params.options) === null || _b === void 0 ? void 0 : _b.state) || "prd-".concat(params.provider, "-").concat(Math.random().toString(36)
|
|
744
|
-
.slice(2));
|
|
745
|
-
return [4, this.genProviderRedirectUri({
|
|
746
|
-
provider_id: params.provider,
|
|
747
|
-
provider_redirect_uri: provider_redirect_uri,
|
|
748
|
-
state: state,
|
|
749
|
-
})];
|
|
750
|
-
case 1:
|
|
751
|
-
uri = (_f.sent()).uri;
|
|
752
|
-
decodedUri = decodeURIComponent(uri);
|
|
753
|
-
finalUri = decodedUri;
|
|
754
|
-
if ((_c = params.options) === null || _c === void 0 ? void 0 : _c.queryParams) {
|
|
755
|
-
url_1 = new URL(decodedUri);
|
|
756
|
-
Object.entries(params.options.queryParams).forEach(function (_a) {
|
|
757
|
-
var key = _a[0], value = _a[1];
|
|
758
|
-
url_1.searchParams.set(key, value);
|
|
759
|
-
});
|
|
760
|
-
finalUri = url_1.toString();
|
|
761
|
-
}
|
|
762
|
-
saveToBrowserSession(state, {
|
|
763
|
-
provider: params.provider,
|
|
764
|
-
search: urlObject.search,
|
|
765
|
-
hash: urlObject.hash,
|
|
766
|
-
type: ((_d = params.options) === null || _d === void 0 ? void 0 : _d.type) || OAUTH_TYPE.SIGN_IN,
|
|
767
|
-
});
|
|
768
|
-
if (isBrowser() && !((_e = params.options) === null || _e === void 0 ? void 0 : _e.skipBrowserRedirect)) {
|
|
769
|
-
window.location.assign(finalUri);
|
|
770
|
-
}
|
|
771
|
-
return [2, { data: { url: finalUri, provider: params.provider }, error: null }];
|
|
772
|
-
case 2:
|
|
773
|
-
error_9 = _f.sent();
|
|
774
|
-
return [2, { data: {}, error: new AuthError(error_9, { method: 'signInWithOAuth' }) }];
|
|
775
|
-
case 3: return [2];
|
|
776
|
-
}
|
|
777
|
-
});
|
|
778
|
-
});
|
|
779
|
-
};
|
|
780
|
-
Auth.prototype.getClaims = function () {
|
|
781
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
782
|
-
var accessToken, parsedToken, error_10;
|
|
783
|
-
return __generator(this, function (_a) {
|
|
784
|
-
switch (_a.label) {
|
|
785
|
-
case 0:
|
|
786
|
-
_a.trys.push([0, 2, , 3]);
|
|
787
|
-
return [4, this.getAccessToken()];
|
|
788
|
-
case 1:
|
|
789
|
-
accessToken = (_a.sent()).accessToken;
|
|
790
|
-
parsedToken = weAppJwtDecodeAll(accessToken);
|
|
791
|
-
return [2, { data: parsedToken, error: null }];
|
|
792
|
-
case 2:
|
|
793
|
-
error_10 = _a.sent();
|
|
794
|
-
return [2, { data: {}, error: new AuthError(error_10, { method: 'getClaims' }) }];
|
|
795
|
-
case 3: return [2];
|
|
796
|
-
}
|
|
797
|
-
});
|
|
798
|
-
});
|
|
799
|
-
};
|
|
800
|
-
Auth.prototype.resetPasswordForEmail = function (emailOrPhone, options) {
|
|
801
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
802
|
-
var redirectTo_1, isEmail_1, verificationParams, formattedPhone, verificationInfo_3, error_11;
|
|
803
|
-
var _this = this;
|
|
804
|
-
return __generator(this, function (_a) {
|
|
805
|
-
switch (_a.label) {
|
|
806
|
-
case 0:
|
|
807
|
-
_a.trys.push([0, 2, , 3]);
|
|
808
|
-
this.validateParams({ emailOrPhone: emailOrPhone }, {
|
|
809
|
-
emailOrPhone: { required: true, message: 'Email or phone is required' },
|
|
810
|
-
});
|
|
811
|
-
redirectTo_1 = (options || {}).redirectTo;
|
|
812
|
-
isEmail_1 = emailOrPhone.includes('@');
|
|
813
|
-
verificationParams = void 0;
|
|
814
|
-
if (isEmail_1) {
|
|
815
|
-
verificationParams = { email: emailOrPhone };
|
|
816
|
-
}
|
|
817
|
-
else {
|
|
818
|
-
formattedPhone = this.formatPhone(emailOrPhone);
|
|
819
|
-
verificationParams = { phone_number: formattedPhone };
|
|
820
|
-
}
|
|
821
|
-
return [4, this.getVerification(verificationParams)];
|
|
822
|
-
case 1:
|
|
823
|
-
verificationInfo_3 = _a.sent();
|
|
824
|
-
return [2, {
|
|
825
|
-
data: {
|
|
826
|
-
updateUser: function (attributes) { return __awaiter(_this, void 0, void 0, function () {
|
|
827
|
-
var verificationTokenRes, res, error_12;
|
|
828
|
-
var _a;
|
|
829
|
-
return __generator(this, function (_b) {
|
|
830
|
-
switch (_b.label) {
|
|
831
|
-
case 0:
|
|
832
|
-
this.validateParams(attributes, {
|
|
833
|
-
nonce: { required: true, message: 'Nonce is required' },
|
|
834
|
-
password: { required: true, message: 'Password is required' },
|
|
835
|
-
});
|
|
836
|
-
_b.label = 1;
|
|
837
|
-
case 1:
|
|
838
|
-
_b.trys.push([1, 5, , 6]);
|
|
839
|
-
return [4, this.verify({
|
|
840
|
-
verification_id: verificationInfo_3.verification_id,
|
|
841
|
-
verification_code: attributes.nonce,
|
|
842
|
-
})];
|
|
843
|
-
case 2:
|
|
844
|
-
verificationTokenRes = _b.sent();
|
|
845
|
-
return [4, this.oauthInstance.authApi.resetPassword({
|
|
846
|
-
email: isEmail_1 ? emailOrPhone : undefined,
|
|
847
|
-
phone_number: !isEmail_1 ? emailOrPhone : undefined,
|
|
848
|
-
new_password: attributes.password,
|
|
849
|
-
verification_token: verificationTokenRes.verification_token,
|
|
850
|
-
})];
|
|
851
|
-
case 3:
|
|
852
|
-
_b.sent();
|
|
853
|
-
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, {
|
|
854
|
-
event: AUTH_STATE_CHANGED_TYPE.PASSWORD_RECOVERY,
|
|
855
|
-
});
|
|
856
|
-
return [4, this.signInWithPassword({
|
|
857
|
-
email: isEmail_1 ? emailOrPhone : undefined,
|
|
858
|
-
phone: !isEmail_1 ? emailOrPhone : undefined,
|
|
859
|
-
password: attributes.password,
|
|
860
|
-
})];
|
|
861
|
-
case 4:
|
|
862
|
-
res = _b.sent();
|
|
863
|
-
if (redirectTo_1 && isBrowser()) {
|
|
864
|
-
window.location.assign(redirectTo_1);
|
|
865
|
-
}
|
|
866
|
-
return [2, res];
|
|
867
|
-
case 5:
|
|
868
|
-
error_12 = _b.sent();
|
|
869
|
-
return [2, { data: {}, error: new AuthError(error_12, { method: 'resetPasswordForEmail' }) }];
|
|
870
|
-
case 6: return [2];
|
|
871
|
-
}
|
|
872
|
-
});
|
|
873
|
-
}); },
|
|
874
|
-
},
|
|
875
|
-
error: null,
|
|
876
|
-
}];
|
|
877
|
-
case 2:
|
|
878
|
-
error_11 = _a.sent();
|
|
879
|
-
return [2, { data: {}, error: new AuthError(error_11, { method: 'resetPasswordForEmail' }) }];
|
|
880
|
-
case 3: return [2];
|
|
881
|
-
}
|
|
882
|
-
});
|
|
883
|
-
});
|
|
884
|
-
};
|
|
885
|
-
Auth.prototype.resetPasswordForOld = function (params) {
|
|
886
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
887
|
-
var _a, _b, session, error_13;
|
|
888
|
-
return __generator(this, function (_c) {
|
|
889
|
-
switch (_c.label) {
|
|
890
|
-
case 0:
|
|
891
|
-
_c.trys.push([0, 3, , 4]);
|
|
892
|
-
return [4, this.oauthInstance.authApi.updatePasswordByOld({
|
|
893
|
-
old_password: params.old_password,
|
|
894
|
-
new_password: params.new_password,
|
|
895
|
-
})];
|
|
896
|
-
case 1:
|
|
897
|
-
_c.sent();
|
|
898
|
-
return [4, this.getSession()];
|
|
899
|
-
case 2:
|
|
900
|
-
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
901
|
-
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
902
|
-
case 3:
|
|
903
|
-
error_13 = _c.sent();
|
|
904
|
-
return [2, { data: {}, error: new AuthError(error_13, { method: 'resetPasswordForOld' }) }];
|
|
905
|
-
case 4: return [2];
|
|
906
|
-
}
|
|
907
|
-
});
|
|
908
|
-
});
|
|
909
|
-
};
|
|
910
|
-
Auth.prototype.verifyOtp = function (params) {
|
|
911
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
912
|
-
var type, _a, _b, session, error_14;
|
|
913
|
-
return __generator(this, function (_c) {
|
|
914
|
-
switch (_c.label) {
|
|
915
|
-
case 0:
|
|
916
|
-
_c.trys.push([0, 6, , 7]);
|
|
917
|
-
type = params.type;
|
|
918
|
-
this.validateParams(params, {
|
|
919
|
-
token: { required: true, message: 'Token is required' },
|
|
920
|
-
messageId: { required: true, message: 'messageId is required' },
|
|
921
|
-
});
|
|
922
|
-
if (!['phone_change', 'email_change'].includes(type)) return [3, 2];
|
|
923
|
-
return [4, this.verify({
|
|
924
|
-
verification_id: params.messageId,
|
|
925
|
-
verification_code: params.token,
|
|
926
|
-
})];
|
|
927
|
-
case 1:
|
|
928
|
-
_c.sent();
|
|
929
|
-
return [3, 4];
|
|
930
|
-
case 2: return [4, this.signInWithUsername({
|
|
931
|
-
verificationInfo: { verification_id: params.messageId, is_user: true },
|
|
932
|
-
verificationCode: params.token,
|
|
933
|
-
username: params.email || this.formatPhone(params.phone) || '',
|
|
934
|
-
loginType: params.email ? 'email' : 'phone',
|
|
935
|
-
})];
|
|
936
|
-
case 3:
|
|
937
|
-
_c.sent();
|
|
938
|
-
_c.label = 4;
|
|
939
|
-
case 4: return [4, this.getSession()];
|
|
940
|
-
case 5:
|
|
941
|
-
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
942
|
-
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
943
|
-
case 6:
|
|
944
|
-
error_14 = _c.sent();
|
|
945
|
-
return [2, { data: {}, error: new AuthError(error_14, { method: 'verifyOtp' }) }];
|
|
946
|
-
case 7: return [2];
|
|
947
|
-
}
|
|
948
|
-
});
|
|
949
|
-
});
|
|
950
|
-
};
|
|
951
|
-
Auth.prototype.getSession = function () {
|
|
952
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
953
|
-
var credentials, _a, _b, user, error_15;
|
|
954
|
-
return __generator(this, function (_c) {
|
|
955
|
-
switch (_c.label) {
|
|
956
|
-
case 0:
|
|
957
|
-
_c.trys.push([0, 3, , 4]);
|
|
958
|
-
return [4, this.oauthInstance.oauth2client.getCredentials()];
|
|
959
|
-
case 1:
|
|
960
|
-
credentials = _c.sent();
|
|
961
|
-
if (!credentials || credentials.scope === 'accessKey') {
|
|
962
|
-
return [2, { data: { session: null }, error: null }];
|
|
963
|
-
}
|
|
964
|
-
return [4, this.getUser(false)];
|
|
965
|
-
case 2:
|
|
966
|
-
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, user = _b.user;
|
|
967
|
-
return [2, { data: { session: __assign(__assign({}, credentials), { user: user }), user: user }, error: null }];
|
|
968
|
-
case 3:
|
|
969
|
-
error_15 = _c.sent();
|
|
970
|
-
return [2, { data: {}, error: new AuthError(error_15, { method: 'getSession' }) }];
|
|
971
|
-
case 4: return [2];
|
|
972
|
-
}
|
|
973
|
-
});
|
|
974
|
-
});
|
|
975
|
-
};
|
|
976
|
-
Auth.prototype.refreshSession = function (refresh_token) {
|
|
977
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
978
|
-
var credentials, newTokens, _a, _b, user, error_16;
|
|
979
|
-
return __generator(this, function (_c) {
|
|
980
|
-
switch (_c.label) {
|
|
981
|
-
case 0:
|
|
982
|
-
_c.trys.push([0, 4, , 5]);
|
|
983
|
-
return [4, this.oauthInstance.oauth2client.localCredentials.getCredentials()];
|
|
984
|
-
case 1:
|
|
985
|
-
credentials = _c.sent();
|
|
986
|
-
credentials.refresh_token = refresh_token || credentials.refresh_token;
|
|
987
|
-
return [4, this.oauthInstance.oauth2client.refreshToken(credentials)];
|
|
988
|
-
case 2:
|
|
989
|
-
newTokens = _c.sent();
|
|
990
|
-
return [4, this.getUser(false)];
|
|
991
|
-
case 3:
|
|
992
|
-
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, user = _b.user;
|
|
993
|
-
return [2, { data: { user: user, session: __assign(__assign({}, newTokens), { user: user }) }, error: null }];
|
|
994
|
-
case 4:
|
|
995
|
-
error_16 = _c.sent();
|
|
996
|
-
return [2, { data: {}, error: new AuthError(error_16, { method: 'refreshSession' }) }];
|
|
997
|
-
case 5: return [2];
|
|
998
|
-
}
|
|
999
|
-
});
|
|
1000
|
-
});
|
|
1001
|
-
};
|
|
1002
|
-
Auth.prototype.getUser = function (isRefresh) {
|
|
1003
|
-
if (isRefresh === void 0) { isRefresh = true; }
|
|
1004
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1005
|
-
var user, _a, error_17;
|
|
1006
|
-
return __generator(this, function (_b) {
|
|
1007
|
-
switch (_b.label) {
|
|
1008
|
-
case 0:
|
|
1009
|
-
_b.trys.push([0, 2, , 3]);
|
|
1010
|
-
_a = this.convertToUser;
|
|
1011
|
-
return [4, this.getCurrentUser(isRefresh)];
|
|
1012
|
-
case 1:
|
|
1013
|
-
user = _a.apply(this, [_b.sent()]);
|
|
1014
|
-
return [2, { data: { user: user }, error: null }];
|
|
1015
|
-
case 2:
|
|
1016
|
-
error_17 = _b.sent();
|
|
1017
|
-
return [2, { data: {}, error: new AuthError(error_17, { method: 'getUser' }) }];
|
|
1018
|
-
case 3: return [2];
|
|
1019
|
-
}
|
|
1020
|
-
});
|
|
1021
|
-
});
|
|
1022
|
-
};
|
|
1023
|
-
Auth.prototype.refreshUser = function () {
|
|
1024
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1025
|
-
var _a, _b, session, error_18;
|
|
1026
|
-
return __generator(this, function (_c) {
|
|
1027
|
-
switch (_c.label) {
|
|
1028
|
-
case 0:
|
|
1029
|
-
_c.trys.push([0, 3, , 4]);
|
|
1030
|
-
return [4, this.currentUser.refresh()];
|
|
1031
|
-
case 1:
|
|
1032
|
-
_c.sent();
|
|
1033
|
-
return [4, this.getSession()];
|
|
1034
|
-
case 2:
|
|
1035
|
-
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
1036
|
-
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
1037
|
-
case 3:
|
|
1038
|
-
error_18 = _c.sent();
|
|
1039
|
-
return [2, { data: {}, error: new AuthError(error_18, { method: 'refreshUser' }) }];
|
|
1040
|
-
case 4: return [2];
|
|
1041
|
-
}
|
|
1042
|
-
});
|
|
1043
|
-
});
|
|
1044
|
-
};
|
|
1045
|
-
Auth.prototype.updateUser = function (params) {
|
|
1046
|
-
var _a;
|
|
1047
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1048
|
-
var hasValue, email, phone, restParams, needsEmailVerification_1, needsPhoneVerification, extraRes, verificationParams, verificationType_1, formattedPhone, verificationInfo_4, _b, user, error_19;
|
|
1049
|
-
var _this = this;
|
|
1050
|
-
return __generator(this, function (_c) {
|
|
1051
|
-
switch (_c.label) {
|
|
1052
|
-
case 0:
|
|
1053
|
-
_c.trys.push([0, 8, , 9]);
|
|
1054
|
-
hasValue = Object.keys(params).some(function (key) { return params[key] !== undefined && params[key] !== null && params[key] !== ''; });
|
|
1055
|
-
if (!hasValue) {
|
|
1056
|
-
throw new AuthError({ message: 'At least one field must be provided for update' });
|
|
1057
|
-
}
|
|
1058
|
-
email = params.email, phone = params.phone, restParams = __rest(params, ["email", "phone"]);
|
|
1059
|
-
needsEmailVerification_1 = email !== undefined;
|
|
1060
|
-
needsPhoneVerification = phone !== undefined;
|
|
1061
|
-
extraRes = {};
|
|
1062
|
-
if (!(needsEmailVerification_1 || needsPhoneVerification)) return [3, 4];
|
|
1063
|
-
verificationParams = void 0;
|
|
1064
|
-
if (needsEmailVerification_1) {
|
|
1065
|
-
verificationParams = { email: params.email };
|
|
1066
|
-
verificationType_1 = 'email_change';
|
|
1067
|
-
}
|
|
1068
|
-
else {
|
|
1069
|
-
formattedPhone = this.formatPhone(params.phone);
|
|
1070
|
-
verificationParams = { phone_number: formattedPhone };
|
|
1071
|
-
verificationType_1 = 'phone_change';
|
|
1072
|
-
}
|
|
1073
|
-
return [4, this.getVerification(verificationParams)];
|
|
1074
|
-
case 1:
|
|
1075
|
-
verificationInfo_4 = _c.sent();
|
|
1076
|
-
_b = Object.keys(restParams).length > 0;
|
|
1077
|
-
if (!_b) return [3, 3];
|
|
1078
|
-
return [4, this.updateUserBasicInfo(restParams)];
|
|
1079
|
-
case 2:
|
|
1080
|
-
_b = (_c.sent());
|
|
1081
|
-
_c.label = 3;
|
|
1082
|
-
case 3:
|
|
1083
|
-
_b;
|
|
1084
|
-
extraRes = {
|
|
1085
|
-
messageId: verificationInfo_4.verification_id,
|
|
1086
|
-
verifyOtp: function (verifyParams) { return __awaiter(_this, void 0, void 0, function () {
|
|
1087
|
-
var user_1, error_20;
|
|
1088
|
-
var _a;
|
|
1089
|
-
return __generator(this, function (_b) {
|
|
1090
|
-
switch (_b.label) {
|
|
1091
|
-
case 0:
|
|
1092
|
-
_b.trys.push([0, 11, , 12]);
|
|
1093
|
-
if (!(verifyParams.email && params.email === verifyParams.email)) return [3, 3];
|
|
1094
|
-
return [4, this.verifyOtp({
|
|
1095
|
-
type: 'email_change',
|
|
1096
|
-
email: params.email,
|
|
1097
|
-
token: verifyParams.token,
|
|
1098
|
-
messageId: verificationInfo_4.verification_id,
|
|
1099
|
-
})];
|
|
1100
|
-
case 1:
|
|
1101
|
-
_b.sent();
|
|
1102
|
-
return [4, this.updateUserBasicInfo({ email: params.email })];
|
|
1103
|
-
case 2:
|
|
1104
|
-
_b.sent();
|
|
1105
|
-
return [3, 9];
|
|
1106
|
-
case 3:
|
|
1107
|
-
if (!(verifyParams.phone && params.phone === verifyParams.phone)) return [3, 6];
|
|
1108
|
-
return [4, this.verifyOtp({
|
|
1109
|
-
type: 'phone_change',
|
|
1110
|
-
phone: params.phone,
|
|
1111
|
-
token: verifyParams.token,
|
|
1112
|
-
messageId: verificationInfo_4.verification_id,
|
|
1113
|
-
})];
|
|
1114
|
-
case 4:
|
|
1115
|
-
_b.sent();
|
|
1116
|
-
return [4, this.updateUserBasicInfo({ phone: this.formatPhone(params.phone) })];
|
|
1117
|
-
case 5:
|
|
1118
|
-
_b.sent();
|
|
1119
|
-
return [3, 9];
|
|
1120
|
-
case 6: return [4, this.verifyOtp({
|
|
1121
|
-
type: verificationType_1,
|
|
1122
|
-
email: needsEmailVerification_1 ? params.email : undefined,
|
|
1123
|
-
phone: !needsEmailVerification_1 ? params.phone : undefined,
|
|
1124
|
-
token: verifyParams.token,
|
|
1125
|
-
messageId: verificationInfo_4.verification_id,
|
|
1126
|
-
})];
|
|
1127
|
-
case 7:
|
|
1128
|
-
_b.sent();
|
|
1129
|
-
return [4, this.updateUserBasicInfo(params)];
|
|
1130
|
-
case 8:
|
|
1131
|
-
_b.sent();
|
|
1132
|
-
_b.label = 9;
|
|
1133
|
-
case 9: return [4, this.getUser(false)];
|
|
1134
|
-
case 10:
|
|
1135
|
-
user_1 = (_b.sent()).data.user;
|
|
1136
|
-
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
|
|
1137
|
-
return [2, { data: { user: user_1 }, error: null }];
|
|
1138
|
-
case 11:
|
|
1139
|
-
error_20 = _b.sent();
|
|
1140
|
-
return [2, { data: {}, error: new AuthError(error_20, { method: 'updateUser' }) }];
|
|
1141
|
-
case 12: return [2];
|
|
1142
|
-
}
|
|
1143
|
-
});
|
|
1144
|
-
}); },
|
|
1145
|
-
};
|
|
1146
|
-
return [3, 6];
|
|
1147
|
-
case 4: return [4, this.updateUserBasicInfo(params)];
|
|
1148
|
-
case 5:
|
|
1149
|
-
_c.sent();
|
|
1150
|
-
_c.label = 6;
|
|
1151
|
-
case 6: return [4, this.getUser(false)];
|
|
1152
|
-
case 7:
|
|
1153
|
-
user = (_c.sent()).data.user;
|
|
1154
|
-
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
|
|
1155
|
-
return [2, { data: __assign({ user: user }, extraRes), error: null }];
|
|
1156
|
-
case 8:
|
|
1157
|
-
error_19 = _c.sent();
|
|
1158
|
-
return [2, { data: {}, error: new AuthError(error_19, { method: 'updateUser' }) }];
|
|
1159
|
-
case 9: return [2];
|
|
1160
|
-
}
|
|
1161
|
-
});
|
|
1162
|
-
});
|
|
1163
|
-
};
|
|
1164
|
-
Auth.prototype.getUserIdentities = function () {
|
|
1165
|
-
var _a;
|
|
1166
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1167
|
-
var providers, error_21;
|
|
1168
|
-
return __generator(this, function (_b) {
|
|
1169
|
-
switch (_b.label) {
|
|
1170
|
-
case 0:
|
|
1171
|
-
_b.trys.push([0, 2, , 3]);
|
|
1172
|
-
return [4, this.oauthInstance.authApi.getProviders()];
|
|
1173
|
-
case 1:
|
|
1174
|
-
providers = _b.sent();
|
|
1175
|
-
return [2, {
|
|
1176
|
-
data: {
|
|
1177
|
-
identities: (_a = providers === null || providers === void 0 ? void 0 : providers.data) === null || _a === void 0 ? void 0 : _a.filter(function (v) { return !!v.bind; }),
|
|
1178
|
-
},
|
|
1179
|
-
error: null,
|
|
1180
|
-
}];
|
|
1181
|
-
case 2:
|
|
1182
|
-
error_21 = _b.sent();
|
|
1183
|
-
return [2, { data: {}, error: new AuthError(error_21, { method: 'getUserIdentities' }) }];
|
|
1184
|
-
case 3: return [2];
|
|
1185
|
-
}
|
|
1186
|
-
});
|
|
1187
|
-
});
|
|
1188
|
-
};
|
|
1189
|
-
Auth.prototype.linkIdentity = function (params) {
|
|
1190
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1191
|
-
var error_22;
|
|
1192
|
-
return __generator(this, function (_a) {
|
|
1193
|
-
switch (_a.label) {
|
|
1194
|
-
case 0:
|
|
1195
|
-
_a.trys.push([0, 2, , 3]);
|
|
1196
|
-
this.validateParams(params, {
|
|
1197
|
-
provider: { required: true, message: 'Provider is required' },
|
|
1198
|
-
});
|
|
1199
|
-
return [4, this.signInWithOAuth({
|
|
1200
|
-
provider: params.provider,
|
|
1201
|
-
options: {
|
|
1202
|
-
type: OAUTH_TYPE.BIND_IDENTITY,
|
|
1203
|
-
},
|
|
1204
|
-
})];
|
|
1205
|
-
case 1:
|
|
1206
|
-
_a.sent();
|
|
1207
|
-
return [2, { data: { provider: params.provider }, error: null }];
|
|
1208
|
-
case 2:
|
|
1209
|
-
error_22 = _a.sent();
|
|
1210
|
-
return [2, { data: {}, error: new AuthError(error_22, { method: 'linkIdentity' }) }];
|
|
1211
|
-
case 3: return [2];
|
|
1212
|
-
}
|
|
1213
|
-
});
|
|
1214
|
-
});
|
|
1215
|
-
};
|
|
1216
|
-
Auth.prototype.unlinkIdentity = function (params) {
|
|
1217
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1218
|
-
var error_23;
|
|
1219
|
-
return __generator(this, function (_a) {
|
|
1220
|
-
switch (_a.label) {
|
|
1221
|
-
case 0:
|
|
1222
|
-
_a.trys.push([0, 2, , 3]);
|
|
1223
|
-
this.validateParams(params, {
|
|
1224
|
-
provider: { required: true, message: 'Provider is required' },
|
|
1225
|
-
});
|
|
1226
|
-
return [4, this.oauthInstance.authApi.unbindProvider({ provider_id: params.provider })];
|
|
1227
|
-
case 1:
|
|
1228
|
-
_a.sent();
|
|
1229
|
-
return [2, { data: {}, error: null }];
|
|
1230
|
-
case 2:
|
|
1231
|
-
error_23 = _a.sent();
|
|
1232
|
-
return [2, { data: {}, error: new AuthError(error_23, { method: 'unlinkIdentity' }) }];
|
|
1233
|
-
case 3: return [2];
|
|
1234
|
-
}
|
|
1235
|
-
});
|
|
1236
|
-
});
|
|
1237
|
-
};
|
|
1238
|
-
Auth.prototype.reauthenticate = function () {
|
|
1239
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1240
|
-
var user, userInfo_1, verificationInfo_5, error_24;
|
|
1241
|
-
var _this = this;
|
|
1242
|
-
return __generator(this, function (_a) {
|
|
1243
|
-
switch (_a.label) {
|
|
1244
|
-
case 0:
|
|
1245
|
-
_a.trys.push([0, 3, , 4]);
|
|
1246
|
-
return [4, this.getUser(false)];
|
|
1247
|
-
case 1:
|
|
1248
|
-
user = (_a.sent()).data.user;
|
|
1249
|
-
this.validateAtLeastOne(user, [['email', 'phone']], 'You must provide either an email or phone number');
|
|
1250
|
-
userInfo_1 = user.email ? { email: user.email } : { phone_number: this.formatPhone(user.phone) };
|
|
1251
|
-
return [4, this.getVerification(userInfo_1)];
|
|
1252
|
-
case 2:
|
|
1253
|
-
verificationInfo_5 = _a.sent();
|
|
1254
|
-
return [2, {
|
|
1255
|
-
data: {
|
|
1256
|
-
updateUser: function (attributes) { return __awaiter(_this, void 0, void 0, function () {
|
|
1257
|
-
var verificationTokenRes, sudoRes, _a, _b, session, error_25;
|
|
1258
|
-
return __generator(this, function (_c) {
|
|
1259
|
-
switch (_c.label) {
|
|
1260
|
-
case 0:
|
|
1261
|
-
this.validateParams(attributes, {
|
|
1262
|
-
nonce: { required: true, message: 'Nonce is required' },
|
|
1263
|
-
});
|
|
1264
|
-
_c.label = 1;
|
|
1265
|
-
case 1:
|
|
1266
|
-
_c.trys.push([1, 9, , 10]);
|
|
1267
|
-
if (!attributes.password) return [3, 5];
|
|
1268
|
-
return [4, this.verify({
|
|
1269
|
-
verification_id: verificationInfo_5.verification_id,
|
|
1270
|
-
verification_code: attributes.nonce,
|
|
1271
|
-
})];
|
|
1272
|
-
case 2:
|
|
1273
|
-
verificationTokenRes = _c.sent();
|
|
1274
|
-
return [4, this.oauthInstance.authApi.sudo({
|
|
1275
|
-
verification_token: verificationTokenRes.verification_token,
|
|
1276
|
-
})];
|
|
1277
|
-
case 3:
|
|
1278
|
-
sudoRes = _c.sent();
|
|
1279
|
-
return [4, this.oauthInstance.authApi.setPassword({
|
|
1280
|
-
new_password: attributes.password,
|
|
1281
|
-
sudo_token: sudoRes.sudo_token,
|
|
1282
|
-
})];
|
|
1283
|
-
case 4:
|
|
1284
|
-
_c.sent();
|
|
1285
|
-
return [3, 7];
|
|
1286
|
-
case 5: return [4, this.signInWithUsername(__assign(__assign({ verificationInfo: verificationInfo_5, verificationCode: attributes.nonce }, userInfo_1), { loginType: userInfo_1.email ? 'email' : 'phone' }))];
|
|
1287
|
-
case 6:
|
|
1288
|
-
_c.sent();
|
|
1289
|
-
_c.label = 7;
|
|
1290
|
-
case 7: return [4, this.getSession()];
|
|
1291
|
-
case 8:
|
|
1292
|
-
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
1293
|
-
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
1294
|
-
case 9:
|
|
1295
|
-
error_25 = _c.sent();
|
|
1296
|
-
return [2, { data: {}, error: new AuthError(error_25, { method: 'reauthenticate' }) }];
|
|
1297
|
-
case 10: return [2];
|
|
1298
|
-
}
|
|
1299
|
-
});
|
|
1300
|
-
}); },
|
|
1301
|
-
},
|
|
1302
|
-
error: null,
|
|
1303
|
-
}];
|
|
1304
|
-
case 3:
|
|
1305
|
-
error_24 = _a.sent();
|
|
1306
|
-
return [2, { data: {}, error: new AuthError(error_24, { method: 'reauthenticate' }) }];
|
|
1307
|
-
case 4: return [2];
|
|
1308
|
-
}
|
|
1309
|
-
});
|
|
1310
|
-
});
|
|
1311
|
-
};
|
|
1312
|
-
Auth.prototype.resend = function (params) {
|
|
1313
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1314
|
-
var target, data, verificationId, error_26;
|
|
1315
|
-
return __generator(this, function (_a) {
|
|
1316
|
-
switch (_a.label) {
|
|
1317
|
-
case 0:
|
|
1318
|
-
_a.trys.push([0, 2, , 3]);
|
|
1319
|
-
this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
|
|
1320
|
-
target = params.type === 'signup' ? 'ANY' : 'USER';
|
|
1321
|
-
data = { target: target };
|
|
1322
|
-
if ('email' in params) {
|
|
1323
|
-
data.email = params.email;
|
|
1324
|
-
}
|
|
1325
|
-
if ('phone' in params) {
|
|
1326
|
-
data.phone_number = this.formatPhone(params.phone);
|
|
1327
|
-
}
|
|
1328
|
-
return [4, this.oauthInstance.authApi.getVerification(data)];
|
|
1329
|
-
case 1:
|
|
1330
|
-
verificationId = (_a.sent()).verification_id;
|
|
1331
|
-
return [2, {
|
|
1332
|
-
data: { messageId: verificationId },
|
|
1333
|
-
error: null,
|
|
1334
|
-
}];
|
|
1335
|
-
case 2:
|
|
1336
|
-
error_26 = _a.sent();
|
|
1337
|
-
return [2, {
|
|
1338
|
-
data: {},
|
|
1339
|
-
error: new AuthError(error_26, { method: 'resend' }),
|
|
1340
|
-
}];
|
|
1341
|
-
case 3: return [2];
|
|
1342
|
-
}
|
|
1343
|
-
});
|
|
1344
|
-
});
|
|
1345
|
-
};
|
|
1346
|
-
Auth.prototype.setSession = function (params) {
|
|
1347
|
-
var _a;
|
|
1348
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1349
|
-
var _b, _c, session, error_27;
|
|
1350
|
-
return __generator(this, function (_d) {
|
|
1351
|
-
switch (_d.label) {
|
|
1352
|
-
case 0:
|
|
1353
|
-
_d.trys.push([0, 3, , 4]);
|
|
1354
|
-
this.validateParams(params, {
|
|
1355
|
-
access_token: { required: true, message: 'Access token is required' },
|
|
1356
|
-
refresh_token: { required: true, message: 'Refresh token is required' },
|
|
1357
|
-
});
|
|
1358
|
-
return [4, this.oauthInstance.oauth2client.refreshToken(params, { throwError: true })];
|
|
1359
|
-
case 1:
|
|
1360
|
-
_d.sent();
|
|
1361
|
-
return [4, this.getSession()];
|
|
1362
|
-
case 2:
|
|
1363
|
-
_b = (_d.sent()).data, _c = _b === void 0 ? {} : _b, session = _c.session;
|
|
1364
|
-
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN });
|
|
1365
|
-
return [2, { data: { user: session.user, session: session }, error: null }];
|
|
1366
|
-
case 3:
|
|
1367
|
-
error_27 = _d.sent();
|
|
1368
|
-
return [2, { data: {}, error: new AuthError(error_27, { method: 'setSession' }) }];
|
|
1369
|
-
case 4: return [2];
|
|
1370
|
-
}
|
|
1371
|
-
});
|
|
1372
|
-
});
|
|
1373
|
-
};
|
|
1374
|
-
Auth.prototype.exchangeCodeForSession = function () {
|
|
1375
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1376
|
-
return __generator(this, function (_a) {
|
|
1377
|
-
return [2];
|
|
1378
|
-
});
|
|
1379
|
-
});
|
|
1380
|
-
};
|
|
1381
|
-
Auth.prototype.deleteUser = function (params) {
|
|
1382
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1383
|
-
var sudo_token, error_28;
|
|
1384
|
-
return __generator(this, function (_a) {
|
|
1385
|
-
switch (_a.label) {
|
|
1386
|
-
case 0:
|
|
1387
|
-
_a.trys.push([0, 3, , 4]);
|
|
1388
|
-
this.validateParams(params, {
|
|
1389
|
-
password: { required: true, message: 'Password is required' },
|
|
1390
|
-
});
|
|
1391
|
-
return [4, this.oauthInstance.authApi.sudo(params)];
|
|
1392
|
-
case 1:
|
|
1393
|
-
sudo_token = (_a.sent()).sudo_token;
|
|
1394
|
-
return [4, this.oauthInstance.authApi.deleteMe({ sudo_token: sudo_token })];
|
|
1395
|
-
case 2:
|
|
1396
|
-
_a.sent();
|
|
1397
|
-
return [2, { data: {}, error: null }];
|
|
1398
|
-
case 3:
|
|
1399
|
-
error_28 = _a.sent();
|
|
1400
|
-
return [2, { data: {}, error: new AuthError(error_28, { method: 'deleteUser' }) }];
|
|
1401
|
-
case 4: return [2];
|
|
1402
|
-
}
|
|
1403
|
-
});
|
|
1404
|
-
});
|
|
1405
|
-
};
|
|
1406
|
-
Auth.prototype.toDefaultLoginPage = function (params) {
|
|
1407
|
-
if (params === void 0) { params = {}; }
|
|
1408
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1409
|
-
var configVersion, query, redirectUri, urlObj, loginPage;
|
|
1410
|
-
return __generator(this, function (_a) {
|
|
1411
|
-
try {
|
|
1412
|
-
configVersion = params.config_version || 'env';
|
|
1413
|
-
query = Object.keys(params.query || {})
|
|
1414
|
-
.map(function (key) { return "".concat(key, "=").concat(params.query[key]); })
|
|
1415
|
-
.join('&');
|
|
1416
|
-
if (adapterForWxMp.isMatch()) {
|
|
1417
|
-
wx.navigateTo({ url: "/packages/$wd_system/pages/login/index".concat(query ? "?".concat(query) : '') });
|
|
1418
|
-
}
|
|
1419
|
-
else {
|
|
1420
|
-
redirectUri = params.redirect_uri || window.location.href;
|
|
1421
|
-
urlObj = new URL(redirectUri);
|
|
1422
|
-
loginPage = "".concat(urlObj.origin, "/__auth/?app_id=").concat(params.app_id || '', "&env_id=").concat(this.config.env, "&client_id=").concat(this.config.clientId || this.config.env, "&config_version=").concat(configVersion, "&redirect_uri=").concat(encodeURIComponent(redirectUri)).concat(query ? "&".concat(query) : '');
|
|
1423
|
-
window.location.href = loginPage;
|
|
1424
|
-
}
|
|
1425
|
-
return [2, { data: {}, error: null }];
|
|
1426
|
-
}
|
|
1427
|
-
catch (error) {
|
|
1428
|
-
return [2, { data: {}, error: new AuthError(error, { method: 'toDefaultLoginPage' }) }];
|
|
1429
|
-
}
|
|
1430
|
-
return [2];
|
|
1431
|
-
});
|
|
1432
|
-
});
|
|
1433
|
-
};
|
|
1434
|
-
Auth.prototype.signInWithCustomTicket = function (getTickFn) {
|
|
1435
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1436
|
-
var loginState, _a, _b, session, error_29;
|
|
1437
|
-
return __generator(this, function (_c) {
|
|
1438
|
-
switch (_c.label) {
|
|
1439
|
-
case 0:
|
|
1440
|
-
if (getTickFn) {
|
|
1441
|
-
this.setCustomSignFunc(getTickFn);
|
|
1442
|
-
}
|
|
1443
|
-
_c.label = 1;
|
|
1444
|
-
case 1:
|
|
1445
|
-
_c.trys.push([1, 5, , 6]);
|
|
1446
|
-
return [4, this.oauthInstance.authApi.signInWithCustomTicket()];
|
|
1447
|
-
case 2:
|
|
1448
|
-
_c.sent();
|
|
1449
|
-
return [4, this.createLoginState()];
|
|
1450
|
-
case 3:
|
|
1451
|
-
loginState = _c.sent();
|
|
1452
|
-
return [4, this.getSession()];
|
|
1453
|
-
case 4:
|
|
1454
|
-
_a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
|
|
1455
|
-
return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
|
|
1456
|
-
case 5:
|
|
1457
|
-
error_29 = _c.sent();
|
|
1458
|
-
return [2, { data: {}, error: new AuthError(error_29, { method: 'signInWithCustomTicket' }) }];
|
|
1459
|
-
case 6: return [2];
|
|
1460
|
-
}
|
|
1461
|
-
});
|
|
1462
|
-
});
|
|
1463
|
-
};
|
|
1464
|
-
Auth.prototype.signInWithOpenId = function (_a) {
|
|
1465
|
-
var _b = _a === void 0 ? {} : _a, _c = _b.useWxCloud, useWxCloud = _c === void 0 ? true : _c;
|
|
1466
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1467
|
-
var wxInfo, mainFunc, loginState, _d, _e, session, error_30;
|
|
1468
|
-
var _this = this;
|
|
1469
|
-
return __generator(this, function (_f) {
|
|
1470
|
-
switch (_f.label) {
|
|
1471
|
-
case 0:
|
|
1472
|
-
if (!adapterForWxMp.isMatch()) {
|
|
1473
|
-
throw Error('wx api undefined');
|
|
1474
|
-
}
|
|
1475
|
-
wxInfo = wx.getAccountInfoSync().miniProgram;
|
|
1476
|
-
mainFunc = function (code) { return __awaiter(_this, void 0, void 0, function () {
|
|
1477
|
-
var result, credentials, error_31;
|
|
1478
|
-
return __generator(this, function (_a) {
|
|
1479
|
-
switch (_a.label) {
|
|
1480
|
-
case 0:
|
|
1481
|
-
result = undefined;
|
|
1482
|
-
credentials = undefined;
|
|
1483
|
-
_a.label = 1;
|
|
1484
|
-
case 1:
|
|
1485
|
-
_a.trys.push([1, 4, , 5]);
|
|
1486
|
-
return [4, this.oauthInstance.authApi.grantProviderToken({
|
|
1487
|
-
provider_id: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
1488
|
-
provider_code: code,
|
|
1489
|
-
provider_params: {
|
|
1490
|
-
provider_code_type: 'open_id',
|
|
1491
|
-
appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
1492
|
-
},
|
|
1493
|
-
}, useWxCloud)];
|
|
1494
|
-
case 2:
|
|
1495
|
-
result = _a.sent();
|
|
1496
|
-
if ((result === null || result === void 0 ? void 0 : result.error_code) || !result.provider_token) {
|
|
1497
|
-
throw result;
|
|
1498
|
-
}
|
|
1499
|
-
return [4, this.oauthInstance.authApi.signInWithProvider({ provider_token: result.provider_token }, useWxCloud)];
|
|
1500
|
-
case 3:
|
|
1501
|
-
credentials = _a.sent();
|
|
1502
|
-
if (credentials === null || credentials === void 0 ? void 0 : credentials.error_code) {
|
|
1503
|
-
throw credentials;
|
|
1504
|
-
}
|
|
1505
|
-
return [3, 5];
|
|
1506
|
-
case 4:
|
|
1507
|
-
error_31 = _a.sent();
|
|
1508
|
-
throw error_31;
|
|
1509
|
-
case 5: return [4, this.oauthInstance.oauth2client.setCredentials(credentials)];
|
|
1510
|
-
case 6:
|
|
1511
|
-
_a.sent();
|
|
1512
|
-
return [2];
|
|
1513
|
-
}
|
|
1514
|
-
});
|
|
1515
|
-
}); };
|
|
1516
|
-
_f.label = 1;
|
|
1517
|
-
case 1:
|
|
1518
|
-
_f.trys.push([1, 5, , 6]);
|
|
1519
|
-
return [4, new Promise(function (resolve, reject) {
|
|
1520
|
-
wx.login({
|
|
1521
|
-
success: function (res) { return __awaiter(_this, void 0, void 0, function () {
|
|
1522
|
-
var error_32;
|
|
1523
|
-
return __generator(this, function (_a) {
|
|
1524
|
-
switch (_a.label) {
|
|
1525
|
-
case 0:
|
|
1526
|
-
_a.trys.push([0, 2, , 3]);
|
|
1527
|
-
return [4, mainFunc(res.code)];
|
|
1528
|
-
case 1:
|
|
1529
|
-
_a.sent();
|
|
1530
|
-
resolve(true);
|
|
1531
|
-
return [3, 3];
|
|
1532
|
-
case 2:
|
|
1533
|
-
error_32 = _a.sent();
|
|
1534
|
-
reject(error_32);
|
|
1535
|
-
return [3, 3];
|
|
1536
|
-
case 3: return [2];
|
|
1537
|
-
}
|
|
1538
|
-
});
|
|
1539
|
-
}); },
|
|
1540
|
-
fail: function (res) {
|
|
1541
|
-
var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
|
|
1542
|
-
error.code = res === null || res === void 0 ? void 0 : res.errno;
|
|
1543
|
-
reject(error);
|
|
1544
|
-
},
|
|
1545
|
-
});
|
|
1546
|
-
})];
|
|
1547
|
-
case 2:
|
|
1548
|
-
_f.sent();
|
|
1549
|
-
return [4, this.createLoginState()];
|
|
1550
|
-
case 3:
|
|
1551
|
-
loginState = _f.sent();
|
|
1552
|
-
return [4, this.getSession()];
|
|
1553
|
-
case 4:
|
|
1554
|
-
_d = (_f.sent()).data, _e = _d === void 0 ? {} : _d, session = _e.session;
|
|
1555
|
-
return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
|
|
1556
|
-
case 5:
|
|
1557
|
-
error_30 = _f.sent();
|
|
1558
|
-
return [2, { data: {}, error: new AuthError(error_30, { method: 'signInWithOpenId' }) }];
|
|
1559
|
-
case 6: return [2];
|
|
1560
|
-
}
|
|
1561
|
-
});
|
|
1562
|
-
});
|
|
1563
|
-
};
|
|
1564
|
-
Auth.prototype.signInWithPhoneAuth = function (_a) {
|
|
1565
|
-
var _b = _a.phoneCode, phoneCode = _b === void 0 ? '' : _b, _c = _a.useWxCloud, useWxCloud = _c === void 0 ? false : _c;
|
|
1566
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1567
|
-
var wxInfo, providerInfo, code, providerToken, signInRes, error_33, loginState, _d, _e, session;
|
|
1568
|
-
return __generator(this, function (_f) {
|
|
1569
|
-
switch (_f.label) {
|
|
1570
|
-
case 0:
|
|
1571
|
-
if (!adapterForWxMp.isMatch()) {
|
|
1572
|
-
return [2, { data: {}, error: new AuthError({ message: 'wx api undefined' }) }];
|
|
1573
|
-
}
|
|
1574
|
-
wxInfo = wx.getAccountInfoSync().miniProgram;
|
|
1575
|
-
providerInfo = {
|
|
1576
|
-
provider_params: { provider_code_type: 'phone', code: phoneCode, appid: wxInfo.appId },
|
|
1577
|
-
provider_id: wxInfo.appId,
|
|
1578
|
-
};
|
|
1579
|
-
return [4, wx.login()];
|
|
1580
|
-
case 1:
|
|
1581
|
-
code = (_f.sent()).code;
|
|
1582
|
-
providerInfo.provider_code = code;
|
|
1583
|
-
_f.label = 2;
|
|
1584
|
-
case 2:
|
|
1585
|
-
_f.trys.push([2, 5, , 6]);
|
|
1586
|
-
return [4, this.oauthInstance.authApi.grantProviderToken(providerInfo, useWxCloud)];
|
|
1587
|
-
case 3:
|
|
1588
|
-
providerToken = _f.sent();
|
|
1589
|
-
if (providerToken.error_code) {
|
|
1590
|
-
throw providerToken;
|
|
1591
|
-
}
|
|
1592
|
-
return [4, this.oauthInstance.authApi.signInWithProvider({
|
|
1593
|
-
provider_token: providerToken.provider_token,
|
|
1594
|
-
}, useWxCloud)];
|
|
1595
|
-
case 4:
|
|
1596
|
-
signInRes = _f.sent();
|
|
1597
|
-
if (signInRes === null || signInRes === void 0 ? void 0 : signInRes.error_code) {
|
|
1598
|
-
throw signInRes;
|
|
1599
|
-
}
|
|
1600
|
-
return [3, 6];
|
|
1601
|
-
case 5:
|
|
1602
|
-
error_33 = _f.sent();
|
|
1603
|
-
return [2, { data: {}, error: new AuthError(error_33, { method: 'signInWithPhoneAuth' }) }];
|
|
1604
|
-
case 6: return [4, this.createLoginState()];
|
|
1605
|
-
case 7:
|
|
1606
|
-
loginState = _f.sent();
|
|
1607
|
-
return [4, this.getSession()];
|
|
1608
|
-
case 8:
|
|
1609
|
-
_d = (_f.sent()).data, _e = _d === void 0 ? {} : _d, session = _e.session;
|
|
1610
|
-
return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
|
|
1611
|
-
}
|
|
1612
|
-
});
|
|
1613
|
-
});
|
|
1614
|
-
};
|
|
1615
|
-
Auth.prototype.bindPhoneNumber = function (params) {
|
|
1616
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1617
|
-
return __generator(this, function (_a) {
|
|
1618
|
-
return [2, this.oauthInstance.authApi.editContact(params)];
|
|
1619
|
-
});
|
|
1620
|
-
});
|
|
1621
|
-
};
|
|
1622
|
-
Auth.prototype.unbindProvider = function (params) {
|
|
1623
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1624
|
-
return __generator(this, function (_a) {
|
|
1625
|
-
return [2, this.oauthInstance.authApi.unbindProvider(params)];
|
|
1626
|
-
});
|
|
1627
|
-
});
|
|
1628
|
-
};
|
|
1629
|
-
Auth.prototype.bindEmail = function (params) {
|
|
1630
|
-
return this.oauthInstance.authApi.editContact(params);
|
|
1631
|
-
};
|
|
1632
|
-
Auth.prototype.verify = function (params) {
|
|
1633
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1634
|
-
return __generator(this, function (_a) {
|
|
1635
|
-
return [2, this.oauthInstance.authApi.verify(params)];
|
|
1636
|
-
});
|
|
1637
|
-
});
|
|
1638
|
-
};
|
|
1639
|
-
Auth.prototype.getVerification = function (params, options) {
|
|
1640
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1641
|
-
return __generator(this, function (_a) {
|
|
1642
|
-
if (params.phone_number) {
|
|
1643
|
-
params.phone_number = this.formatPhone(params.phone_number);
|
|
1644
|
-
}
|
|
1645
|
-
return [2, this.oauthInstance.authApi.getVerification(params, options)];
|
|
1646
|
-
});
|
|
1647
|
-
});
|
|
1648
|
-
};
|
|
1649
|
-
Object.defineProperty(Auth.prototype, "currentUser", {
|
|
1650
|
-
get: function () {
|
|
1651
|
-
if (this.cache.mode === 'async') {
|
|
1652
|
-
printWarn(ERRORS.INVALID_OPERATION, 'current platform\'s storage is asynchronous, please use getCurrentUser instead');
|
|
1653
|
-
return;
|
|
1654
|
-
}
|
|
1655
|
-
var loginState = this.hasLoginState();
|
|
1656
|
-
if (loginState) {
|
|
1657
|
-
return loginState.user || null;
|
|
1658
|
-
}
|
|
1659
|
-
return null;
|
|
1660
|
-
},
|
|
1661
|
-
enumerable: false,
|
|
1662
|
-
configurable: true
|
|
1663
|
-
});
|
|
1664
|
-
Auth.prototype.getCurrentUser = function (isRefresh) {
|
|
1665
|
-
if (isRefresh === void 0) { isRefresh = true; }
|
|
1666
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1667
|
-
var loginState_1, error_34, loginState, userInfo;
|
|
1668
|
-
return __generator(this, function (_a) {
|
|
1669
|
-
switch (_a.label) {
|
|
1670
|
-
case 0:
|
|
1671
|
-
_a.trys.push([0, 4, , 5]);
|
|
1672
|
-
if (!isRefresh) return [3, 3];
|
|
1673
|
-
return [4, this.getLoginState()];
|
|
1674
|
-
case 1:
|
|
1675
|
-
loginState_1 = _a.sent();
|
|
1676
|
-
if (!loginState_1) return [3, 3];
|
|
1677
|
-
return [4, loginState_1.user.refresh()];
|
|
1678
|
-
case 2:
|
|
1679
|
-
_a.sent();
|
|
1680
|
-
_a.label = 3;
|
|
1681
|
-
case 3: return [3, 5];
|
|
1682
|
-
case 4:
|
|
1683
|
-
error_34 = _a.sent();
|
|
1684
|
-
return [3, 5];
|
|
1685
|
-
case 5: return [4, this.getLoginState()];
|
|
1686
|
-
case 6:
|
|
1687
|
-
loginState = _a.sent();
|
|
1688
|
-
if (!loginState) return [3, 8];
|
|
1689
|
-
userInfo = loginState.user.getLocalUserInfo();
|
|
1690
|
-
return [4, loginState.user.checkLocalInfoAsync()];
|
|
1691
|
-
case 7:
|
|
1692
|
-
_a.sent();
|
|
1693
|
-
return [2, __assign(__assign({}, loginState.user), userInfo)];
|
|
1694
|
-
case 8: return [2, null];
|
|
1695
|
-
}
|
|
1696
|
-
});
|
|
1697
|
-
});
|
|
1698
|
-
};
|
|
1699
|
-
Auth.prototype.signInAnonymouslyInWx = function (_a) {
|
|
1700
|
-
var _b = _a === void 0 ? {} : _a, useWxCloud = _b.useWxCloud;
|
|
1701
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1702
|
-
var wxInfo, mainFunc;
|
|
1703
|
-
var _this = this;
|
|
1704
|
-
return __generator(this, function (_c) {
|
|
1705
|
-
switch (_c.label) {
|
|
1706
|
-
case 0:
|
|
1707
|
-
if (!adapterForWxMp.isMatch()) {
|
|
1708
|
-
throw Error('wx api undefined');
|
|
1709
|
-
}
|
|
1710
|
-
wxInfo = wx.getAccountInfoSync().miniProgram;
|
|
1711
|
-
mainFunc = function (code) { return __awaiter(_this, void 0, void 0, function () {
|
|
1712
|
-
var result, credentials, error_35;
|
|
1713
|
-
return __generator(this, function (_a) {
|
|
1714
|
-
switch (_a.label) {
|
|
1715
|
-
case 0:
|
|
1716
|
-
result = undefined;
|
|
1717
|
-
credentials = undefined;
|
|
1718
|
-
_a.label = 1;
|
|
1719
|
-
case 1:
|
|
1720
|
-
_a.trys.push([1, 4, , 5]);
|
|
1721
|
-
return [4, this.oauthInstance.authApi.grantProviderToken({
|
|
1722
|
-
provider_id: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
1723
|
-
provider_code: code,
|
|
1724
|
-
provider_params: {
|
|
1725
|
-
provider_code_type: 'open_id',
|
|
1726
|
-
appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
1727
|
-
},
|
|
1728
|
-
}, useWxCloud)];
|
|
1729
|
-
case 2:
|
|
1730
|
-
result = _a.sent();
|
|
1731
|
-
if ((result === null || result === void 0 ? void 0 : result.error_code) || !result.provider_token) {
|
|
1732
|
-
throw result;
|
|
1733
|
-
}
|
|
1734
|
-
return [4, this.oauthInstance.authApi.signInAnonymously({ provider_token: result.provider_token }, useWxCloud)];
|
|
1735
|
-
case 3:
|
|
1736
|
-
credentials = _a.sent();
|
|
1737
|
-
if (credentials === null || credentials === void 0 ? void 0 : credentials.error_code) {
|
|
1738
|
-
throw credentials;
|
|
1739
|
-
}
|
|
1740
|
-
return [3, 5];
|
|
1741
|
-
case 4:
|
|
1742
|
-
error_35 = _a.sent();
|
|
1743
|
-
throw error_35;
|
|
1744
|
-
case 5: return [2];
|
|
1745
|
-
}
|
|
1746
|
-
});
|
|
1747
|
-
}); };
|
|
1748
|
-
return [4, new Promise(function (resolve, reject) {
|
|
1749
|
-
wx.login({
|
|
1750
|
-
success: function (res) { return __awaiter(_this, void 0, void 0, function () {
|
|
1751
|
-
var error_36;
|
|
1752
|
-
return __generator(this, function (_a) {
|
|
1753
|
-
switch (_a.label) {
|
|
1754
|
-
case 0:
|
|
1755
|
-
_a.trys.push([0, 2, , 3]);
|
|
1756
|
-
return [4, mainFunc(res.code)];
|
|
1757
|
-
case 1:
|
|
1758
|
-
_a.sent();
|
|
1759
|
-
resolve(true);
|
|
1760
|
-
return [3, 3];
|
|
1761
|
-
case 2:
|
|
1762
|
-
error_36 = _a.sent();
|
|
1763
|
-
reject(error_36);
|
|
1764
|
-
return [3, 3];
|
|
1765
|
-
case 3: return [2];
|
|
1766
|
-
}
|
|
1767
|
-
});
|
|
1768
|
-
}); },
|
|
1769
|
-
fail: function (res) {
|
|
1770
|
-
var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
|
|
1771
|
-
error.code = res === null || res === void 0 ? void 0 : res.errno;
|
|
1772
|
-
reject(error);
|
|
1773
|
-
},
|
|
1774
|
-
});
|
|
1775
|
-
})];
|
|
1776
|
-
case 1:
|
|
1777
|
-
_c.sent();
|
|
1778
|
-
return [2, this.createLoginState(undefined, { asyncRefreshUser: true })];
|
|
1779
|
-
}
|
|
1780
|
-
});
|
|
1781
|
-
});
|
|
1782
|
-
};
|
|
1783
|
-
Auth.prototype.bindOpenId = function () {
|
|
1784
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1785
|
-
var wxInfo, mainFunc;
|
|
1786
|
-
var _this = this;
|
|
1787
|
-
return __generator(this, function (_a) {
|
|
1788
|
-
switch (_a.label) {
|
|
1789
|
-
case 0:
|
|
1790
|
-
if (!adapterForWxMp.isMatch()) {
|
|
1791
|
-
throw Error('wx api undefined');
|
|
1792
|
-
}
|
|
1793
|
-
wxInfo = wx.getAccountInfoSync().miniProgram;
|
|
1794
|
-
mainFunc = function (code) { return __awaiter(_this, void 0, void 0, function () {
|
|
1795
|
-
var result, error_37;
|
|
1796
|
-
return __generator(this, function (_a) {
|
|
1797
|
-
switch (_a.label) {
|
|
1798
|
-
case 0:
|
|
1799
|
-
result = undefined;
|
|
1800
|
-
_a.label = 1;
|
|
1801
|
-
case 1:
|
|
1802
|
-
_a.trys.push([1, 4, , 5]);
|
|
1803
|
-
return [4, this.oauthInstance.authApi.grantProviderToken({
|
|
1804
|
-
provider_id: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
1805
|
-
provider_code: code,
|
|
1806
|
-
provider_params: {
|
|
1807
|
-
provider_code_type: 'open_id',
|
|
1808
|
-
appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
1809
|
-
},
|
|
1810
|
-
})];
|
|
1811
|
-
case 2:
|
|
1812
|
-
result = _a.sent();
|
|
1813
|
-
if ((result === null || result === void 0 ? void 0 : result.error_code) || !result.provider_token) {
|
|
1814
|
-
throw result;
|
|
1815
|
-
}
|
|
1816
|
-
return [4, this.oauthInstance.authApi.bindWithProvider({ provider_token: result.provider_token })];
|
|
1817
|
-
case 3:
|
|
1818
|
-
_a.sent();
|
|
1819
|
-
return [3, 5];
|
|
1820
|
-
case 4:
|
|
1821
|
-
error_37 = _a.sent();
|
|
1822
|
-
throw error_37;
|
|
1823
|
-
case 5: return [2];
|
|
1824
|
-
}
|
|
1825
|
-
});
|
|
1826
|
-
}); };
|
|
1827
|
-
return [4, new Promise(function (resolve, reject) {
|
|
1828
|
-
wx.login({
|
|
1829
|
-
success: function (res) { return __awaiter(_this, void 0, void 0, function () {
|
|
1830
|
-
var error_38;
|
|
1831
|
-
return __generator(this, function (_a) {
|
|
1832
|
-
switch (_a.label) {
|
|
1833
|
-
case 0:
|
|
1834
|
-
_a.trys.push([0, 2, , 3]);
|
|
1835
|
-
return [4, mainFunc(res.code)];
|
|
1836
|
-
case 1:
|
|
1837
|
-
_a.sent();
|
|
1838
|
-
resolve(true);
|
|
1839
|
-
return [3, 3];
|
|
1840
|
-
case 2:
|
|
1841
|
-
error_38 = _a.sent();
|
|
1842
|
-
reject(error_38);
|
|
1843
|
-
return [3, 3];
|
|
1844
|
-
case 3: return [2];
|
|
1845
|
-
}
|
|
1846
|
-
});
|
|
1847
|
-
}); },
|
|
1848
|
-
fail: function (res) {
|
|
1849
|
-
var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
|
|
1850
|
-
error.code = res === null || res === void 0 ? void 0 : res.errno;
|
|
1851
|
-
reject(error);
|
|
1852
|
-
},
|
|
1853
|
-
});
|
|
1854
|
-
})];
|
|
1855
|
-
case 1:
|
|
1856
|
-
_a.sent();
|
|
1857
|
-
return [2];
|
|
1858
|
-
}
|
|
1859
|
-
});
|
|
1860
|
-
});
|
|
1861
|
-
};
|
|
1862
|
-
Auth.prototype.signInWithUnionId = function () {
|
|
1863
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1864
|
-
var error_39;
|
|
1865
|
-
var _this = this;
|
|
1866
|
-
return __generator(this, function (_a) {
|
|
1867
|
-
switch (_a.label) {
|
|
1868
|
-
case 0:
|
|
1869
|
-
if (!adapterForWxMp.isMatch()) {
|
|
1870
|
-
throw Error('wx api undefined');
|
|
1871
|
-
}
|
|
1872
|
-
_a.label = 1;
|
|
1873
|
-
case 1:
|
|
1874
|
-
_a.trys.push([1, 3, , 4]);
|
|
1875
|
-
return [4, new Promise(function (resolve, reject) {
|
|
1876
|
-
var wxInfo = wx.getAccountInfoSync().miniProgram;
|
|
1877
|
-
wx.login({
|
|
1878
|
-
success: function (res) { return __awaiter(_this, void 0, void 0, function () {
|
|
1879
|
-
var providerId, result, providerToken, signInRes, error_40;
|
|
1880
|
-
return __generator(this, function (_a) {
|
|
1881
|
-
switch (_a.label) {
|
|
1882
|
-
case 0:
|
|
1883
|
-
providerId = wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId;
|
|
1884
|
-
_a.label = 1;
|
|
1885
|
-
case 1:
|
|
1886
|
-
_a.trys.push([1, 4, , 5]);
|
|
1887
|
-
return [4, this.oauthInstance.authApi.grantProviderToken({
|
|
1888
|
-
provider_code: res.code,
|
|
1889
|
-
provider_id: providerId,
|
|
1890
|
-
provider_params: {
|
|
1891
|
-
provider_code_type: 'union_id',
|
|
1892
|
-
appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
|
|
1893
|
-
},
|
|
1894
|
-
})];
|
|
1895
|
-
case 2:
|
|
1896
|
-
result = _a.sent();
|
|
1897
|
-
providerToken = result.provider_token;
|
|
1898
|
-
if (!providerToken) {
|
|
1899
|
-
reject(result);
|
|
1900
|
-
return [2];
|
|
1901
|
-
}
|
|
1902
|
-
return [4, this.oauthInstance.authApi.signInWithProvider({
|
|
1903
|
-
provider_id: providerId,
|
|
1904
|
-
provider_token: providerToken,
|
|
1905
|
-
})];
|
|
1906
|
-
case 3:
|
|
1907
|
-
signInRes = _a.sent();
|
|
1908
|
-
if (signInRes === null || signInRes === void 0 ? void 0 : signInRes.error_code) {
|
|
1909
|
-
reject(signInRes);
|
|
1910
|
-
return [2];
|
|
1911
|
-
}
|
|
1912
|
-
resolve(true);
|
|
1913
|
-
return [3, 5];
|
|
1914
|
-
case 4:
|
|
1915
|
-
error_40 = _a.sent();
|
|
1916
|
-
reject(error_40);
|
|
1917
|
-
return [3, 5];
|
|
1918
|
-
case 5: return [2];
|
|
1919
|
-
}
|
|
1920
|
-
});
|
|
1921
|
-
}); },
|
|
1922
|
-
fail: function (res) {
|
|
1923
|
-
var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
|
|
1924
|
-
error.code = res === null || res === void 0 ? void 0 : res.errno;
|
|
1925
|
-
reject(error);
|
|
1926
|
-
},
|
|
1927
|
-
});
|
|
1928
|
-
})];
|
|
1929
|
-
case 2:
|
|
1930
|
-
_a.sent();
|
|
1931
|
-
return [3, 4];
|
|
1932
|
-
case 3:
|
|
1933
|
-
error_39 = _a.sent();
|
|
1934
|
-
throw error_39;
|
|
1935
|
-
case 4: return [2, this.createLoginState()];
|
|
1936
|
-
}
|
|
1937
|
-
});
|
|
1938
|
-
});
|
|
1939
|
-
};
|
|
1940
|
-
Auth.prototype.signInWithSms = function (_a) {
|
|
1941
|
-
var _b = _a.verificationInfo, verificationInfo = _b === void 0 ? { verification_id: '', is_user: false } : _b, _c = _a.verificationCode, verificationCode = _c === void 0 ? '' : _c, _d = _a.phoneNum, phoneNum = _d === void 0 ? '' : _d, _e = _a.bindInfo, bindInfo = _e === void 0 ? undefined : _e;
|
|
1942
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1943
|
-
return __generator(this, function (_f) {
|
|
1944
|
-
try {
|
|
1945
|
-
return [2, this.signInWithUsername({
|
|
1946
|
-
verificationInfo: verificationInfo,
|
|
1947
|
-
verificationCode: verificationCode,
|
|
1948
|
-
bindInfo: bindInfo,
|
|
1949
|
-
username: phoneNum,
|
|
1950
|
-
loginType: 'sms',
|
|
1951
|
-
})];
|
|
1952
|
-
}
|
|
1953
|
-
catch (error) {
|
|
1954
|
-
throw error;
|
|
1955
|
-
}
|
|
1956
|
-
return [2];
|
|
1957
|
-
});
|
|
1958
|
-
});
|
|
1959
|
-
};
|
|
1960
|
-
Auth.prototype.signInWithEmail = function (_a) {
|
|
1961
|
-
var _b = _a.verificationInfo, verificationInfo = _b === void 0 ? { verification_id: '', is_user: false } : _b, _c = _a.verificationCode, verificationCode = _c === void 0 ? '' : _c, _d = _a.bindInfo, bindInfo = _d === void 0 ? undefined : _d, _e = _a.email, email = _e === void 0 ? '' : _e;
|
|
1962
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1963
|
-
return __generator(this, function (_f) {
|
|
1964
|
-
try {
|
|
1965
|
-
return [2, this.signInWithUsername({
|
|
1966
|
-
verificationInfo: verificationInfo,
|
|
1967
|
-
verificationCode: verificationCode,
|
|
1968
|
-
bindInfo: bindInfo,
|
|
1969
|
-
username: email,
|
|
1970
|
-
loginType: 'email',
|
|
1971
|
-
})];
|
|
1972
|
-
}
|
|
1973
|
-
catch (error) {
|
|
1974
|
-
throw error;
|
|
1975
|
-
}
|
|
1976
|
-
return [2];
|
|
1977
|
-
});
|
|
1978
|
-
});
|
|
1979
|
-
};
|
|
1980
|
-
Auth.prototype.setCustomSignFunc = function (getTickFn) {
|
|
1981
|
-
this.oauthInstance.authApi.setCustomSignFunc(getTickFn);
|
|
1982
|
-
};
|
|
1983
|
-
Auth.prototype.signIn = function (params) {
|
|
1984
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1985
|
-
return __generator(this, function (_a) {
|
|
1986
|
-
switch (_a.label) {
|
|
1987
|
-
case 0: return [4, this.oauthInstance.authApi.signIn(params)];
|
|
1988
|
-
case 1:
|
|
1989
|
-
_a.sent();
|
|
1990
|
-
return [2, this.createLoginState(params)];
|
|
1991
|
-
}
|
|
1992
|
-
});
|
|
1993
|
-
});
|
|
1994
|
-
};
|
|
1995
|
-
Auth.prototype.setPassword = function (params) {
|
|
1996
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
1997
|
-
return __generator(this, function (_a) {
|
|
1998
|
-
return [2, this.oauthInstance.authApi.setPassword(params)];
|
|
1999
|
-
});
|
|
2000
|
-
});
|
|
2001
|
-
};
|
|
2002
|
-
Auth.prototype.isUsernameRegistered = function (username) {
|
|
2003
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2004
|
-
var exist;
|
|
2005
|
-
return __generator(this, function (_a) {
|
|
2006
|
-
switch (_a.label) {
|
|
2007
|
-
case 0:
|
|
2008
|
-
if (typeof username !== 'string') {
|
|
2009
|
-
throwError(ERRORS.INVALID_PARAMS, 'username must be a string');
|
|
2010
|
-
}
|
|
2011
|
-
return [4, this.oauthInstance.authApi.checkIfUserExist({ username: username })];
|
|
2012
|
-
case 1:
|
|
2013
|
-
exist = (_a.sent()).exist;
|
|
2014
|
-
return [2, exist];
|
|
2015
|
-
}
|
|
2016
|
-
});
|
|
2017
|
-
});
|
|
2018
|
-
};
|
|
2019
|
-
Auth.prototype.hasLoginState = function () {
|
|
2020
|
-
var _a;
|
|
2021
|
-
if (this.cache.mode === 'async') {
|
|
2022
|
-
printWarn(ERRORS.INVALID_OPERATION, 'current platform\'s storage is asynchronous, please use getLoginState instead');
|
|
2023
|
-
return;
|
|
2024
|
-
}
|
|
2025
|
-
var oauthLoginState = (_a = this.oauthInstance) === null || _a === void 0 ? void 0 : _a.authApi.hasLoginStateSync();
|
|
2026
|
-
if (oauthLoginState) {
|
|
2027
|
-
var loginState = new LoginState({
|
|
2028
|
-
envId: this.config.env,
|
|
2029
|
-
cache: this.cache,
|
|
2030
|
-
oauthInstance: this.oauthInstance,
|
|
2031
|
-
});
|
|
2032
|
-
return loginState;
|
|
2033
|
-
}
|
|
2034
|
-
return null;
|
|
2035
|
-
};
|
|
2036
|
-
Auth.prototype.getLoginState = function () {
|
|
2037
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2038
|
-
var oauthLoginState, error_41, loginState;
|
|
2039
|
-
return __generator(this, function (_a) {
|
|
2040
|
-
switch (_a.label) {
|
|
2041
|
-
case 0:
|
|
2042
|
-
oauthLoginState = null;
|
|
2043
|
-
_a.label = 1;
|
|
2044
|
-
case 1:
|
|
2045
|
-
_a.trys.push([1, 3, , 4]);
|
|
2046
|
-
return [4, this.oauthInstance.authApi.getLoginState()];
|
|
2047
|
-
case 2:
|
|
2048
|
-
oauthLoginState = _a.sent();
|
|
2049
|
-
return [3, 4];
|
|
2050
|
-
case 3:
|
|
2051
|
-
error_41 = _a.sent();
|
|
2052
|
-
return [2, null];
|
|
2053
|
-
case 4:
|
|
2054
|
-
if (oauthLoginState) {
|
|
2055
|
-
loginState = new LoginState({
|
|
2056
|
-
envId: this.config.env,
|
|
2057
|
-
cache: this.cache,
|
|
2058
|
-
oauthInstance: this.oauthInstance,
|
|
2059
|
-
});
|
|
2060
|
-
return [2, loginState];
|
|
2061
|
-
}
|
|
2062
|
-
return [2, null];
|
|
2063
|
-
}
|
|
2064
|
-
});
|
|
2065
|
-
});
|
|
2066
|
-
};
|
|
2067
|
-
Auth.prototype.getUserInfo = function () {
|
|
2068
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2069
|
-
return __generator(this, function (_a) {
|
|
2070
|
-
return [2, this.getCurrentUser()];
|
|
2071
|
-
});
|
|
2072
|
-
});
|
|
2073
|
-
};
|
|
2074
|
-
Auth.prototype.getWedaUserInfo = function () {
|
|
2075
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2076
|
-
return __generator(this, function (_a) {
|
|
2077
|
-
return [2, this.oauthInstance.authApi.getWedaUserInfo()];
|
|
2078
|
-
});
|
|
2079
|
-
});
|
|
2080
|
-
};
|
|
2081
|
-
Auth.prototype.updateUserBasicInfo = function (params) {
|
|
2082
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2083
|
-
var loginState;
|
|
2084
|
-
return __generator(this, function (_a) {
|
|
2085
|
-
switch (_a.label) {
|
|
2086
|
-
case 0: return [4, this.getLoginState()];
|
|
2087
|
-
case 1:
|
|
2088
|
-
loginState = _a.sent();
|
|
2089
|
-
if (!loginState) return [3, 3];
|
|
2090
|
-
return [4, loginState.user.updateUserBasicInfo(params)];
|
|
2091
|
-
case 2:
|
|
2092
|
-
_a.sent();
|
|
2093
|
-
_a.label = 3;
|
|
2094
|
-
case 3: return [2];
|
|
2095
|
-
}
|
|
2096
|
-
});
|
|
2097
|
-
});
|
|
2098
|
-
};
|
|
2099
|
-
Auth.prototype.getAuthHeader = function () {
|
|
2100
|
-
console.error('Auth.getAuthHeader API 已废弃');
|
|
2101
|
-
return {};
|
|
2102
|
-
};
|
|
2103
|
-
Auth.prototype.bindWithProvider = function (params) {
|
|
2104
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2105
|
-
return __generator(this, function (_a) {
|
|
2106
|
-
return [2, this.oauthInstance.authApi.bindWithProvider(params)];
|
|
2107
|
-
});
|
|
2108
|
-
});
|
|
2109
|
-
};
|
|
2110
|
-
Auth.prototype.queryUser = function (queryObj) {
|
|
2111
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2112
|
-
return __generator(this, function (_a) {
|
|
2113
|
-
return [2, this.oauthInstance.authApi.queryUserProfile(queryObj)];
|
|
2114
|
-
});
|
|
2115
|
-
});
|
|
2116
|
-
};
|
|
2117
|
-
Auth.prototype.getAccessToken = function () {
|
|
2118
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2119
|
-
var oauthAccessTokenRes;
|
|
2120
|
-
return __generator(this, function (_a) {
|
|
2121
|
-
switch (_a.label) {
|
|
2122
|
-
case 0: return [4, this.oauthInstance.oauth2client.getAccessToken()];
|
|
2123
|
-
case 1:
|
|
2124
|
-
oauthAccessTokenRes = _a.sent();
|
|
2125
|
-
return [2, {
|
|
2126
|
-
accessToken: oauthAccessTokenRes,
|
|
2127
|
-
env: this.config.env,
|
|
2128
|
-
}];
|
|
2129
|
-
}
|
|
2130
|
-
});
|
|
2131
|
-
});
|
|
2132
|
-
};
|
|
2133
|
-
Auth.prototype.grantProviderToken = function (params) {
|
|
2134
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2135
|
-
return __generator(this, function (_a) {
|
|
2136
|
-
return [2, this.oauthInstance.authApi.grantProviderToken(params)];
|
|
2137
|
-
});
|
|
2138
|
-
});
|
|
2139
|
-
};
|
|
2140
|
-
Auth.prototype.patchProviderToken = function (params) {
|
|
2141
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2142
|
-
return __generator(this, function (_a) {
|
|
2143
|
-
return [2, this.oauthInstance.authApi.patchProviderToken(params)];
|
|
2144
|
-
});
|
|
2145
|
-
});
|
|
2146
|
-
};
|
|
2147
|
-
Auth.prototype.signInWithProvider = function (params) {
|
|
2148
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2149
|
-
return __generator(this, function (_a) {
|
|
2150
|
-
switch (_a.label) {
|
|
2151
|
-
case 0: return [4, this.oauthInstance.authApi.signInWithProvider(params)];
|
|
2152
|
-
case 1:
|
|
2153
|
-
_a.sent();
|
|
2154
|
-
return [2, this.createLoginState(params)];
|
|
2155
|
-
}
|
|
2156
|
-
});
|
|
2157
|
-
});
|
|
2158
|
-
};
|
|
2159
|
-
Auth.prototype.signInWithWechat = function (params) {
|
|
2160
|
-
if (params === void 0) { params = {}; }
|
|
2161
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2162
|
-
return __generator(this, function (_a) {
|
|
2163
|
-
switch (_a.label) {
|
|
2164
|
-
case 0: return [4, this.oauthInstance.authApi.signInWithWechat(params)];
|
|
2165
|
-
case 1:
|
|
2166
|
-
_a.sent();
|
|
2167
|
-
return [2, this.createLoginState(params)];
|
|
2168
|
-
}
|
|
2169
|
-
});
|
|
2170
|
-
});
|
|
2171
|
-
};
|
|
2172
|
-
Auth.prototype.grantToken = function (params) {
|
|
2173
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2174
|
-
return __generator(this, function (_a) {
|
|
2175
|
-
switch (_a.label) {
|
|
2176
|
-
case 0: return [4, this.oauthInstance.authApi.grantToken(params)];
|
|
2177
|
-
case 1:
|
|
2178
|
-
_a.sent();
|
|
2179
|
-
return [2, this.createLoginState()];
|
|
2180
|
-
}
|
|
2181
|
-
});
|
|
2182
|
-
});
|
|
2183
|
-
};
|
|
2184
|
-
Auth.prototype.genProviderRedirectUri = function (params) {
|
|
2185
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2186
|
-
return __generator(this, function (_a) {
|
|
2187
|
-
return [2, this.oauthInstance.authApi.genProviderRedirectUri(params)];
|
|
2188
|
-
});
|
|
2189
|
-
});
|
|
2190
|
-
};
|
|
2191
|
-
Auth.prototype.resetPassword = function (params) {
|
|
2192
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2193
|
-
return __generator(this, function (_a) {
|
|
2194
|
-
return [2, this.oauthInstance.authApi.resetPassword(params)];
|
|
2195
|
-
});
|
|
2196
|
-
});
|
|
2197
|
-
};
|
|
2198
|
-
Auth.prototype.deviceAuthorize = function (params) {
|
|
2199
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2200
|
-
return __generator(this, function (_a) {
|
|
2201
|
-
return [2, this.oauthInstance.authApi.deviceAuthorize(params)];
|
|
2202
|
-
});
|
|
2203
|
-
});
|
|
2204
|
-
};
|
|
2205
|
-
Auth.prototype.sudo = function (params) {
|
|
2206
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2207
|
-
return __generator(this, function (_a) {
|
|
2208
|
-
return [2, this.oauthInstance.authApi.sudo(params)];
|
|
2209
|
-
});
|
|
2210
|
-
});
|
|
2211
|
-
};
|
|
2212
|
-
Auth.prototype.deleteMe = function (params) {
|
|
2213
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2214
|
-
return __generator(this, function (_a) {
|
|
2215
|
-
return [2, this.oauthInstance.authApi.deleteMe(params)];
|
|
2216
|
-
});
|
|
2217
|
-
});
|
|
2218
|
-
};
|
|
2219
|
-
Auth.prototype.getProviders = function () {
|
|
2220
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2221
|
-
return __generator(this, function (_a) {
|
|
2222
|
-
return [2, this.oauthInstance.authApi.getProviders()];
|
|
2223
|
-
});
|
|
2224
|
-
});
|
|
2225
|
-
};
|
|
2226
|
-
Auth.prototype.loginScope = function () {
|
|
2227
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2228
|
-
return __generator(this, function (_a) {
|
|
2229
|
-
return [2, this.oauthInstance.authApi.loginScope()];
|
|
2230
|
-
});
|
|
2231
|
-
});
|
|
2232
|
-
};
|
|
2233
|
-
Auth.prototype.loginGroups = function () {
|
|
2234
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2235
|
-
return __generator(this, function (_a) {
|
|
2236
|
-
return [2, this.oauthInstance.authApi.loginGroups()];
|
|
2237
|
-
});
|
|
2238
|
-
});
|
|
2239
|
-
};
|
|
2240
|
-
Auth.prototype.onLoginStateChanged = function (callback) {
|
|
2241
|
-
var _a;
|
|
2242
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2243
|
-
var loginState;
|
|
2244
|
-
var _this = this;
|
|
2245
|
-
return __generator(this, function (_b) {
|
|
2246
|
-
switch (_b.label) {
|
|
2247
|
-
case 0:
|
|
2248
|
-
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.on(EVENTS.LOGIN_STATE_CHANGED, function (params) { return __awaiter(_this, void 0, void 0, function () {
|
|
2249
|
-
var loginState, _a;
|
|
2250
|
-
var _b;
|
|
2251
|
-
return __generator(this, function (_c) {
|
|
2252
|
-
switch (_c.label) {
|
|
2253
|
-
case 0:
|
|
2254
|
-
if (!(((_b = params === null || params === void 0 ? void 0 : params.data) === null || _b === void 0 ? void 0 : _b.eventType) !== LOGIN_STATE_CHANGED_TYPE.CREDENTIALS_ERROR)) return [3, 2];
|
|
2255
|
-
return [4, this.getLoginState()];
|
|
2256
|
-
case 1:
|
|
2257
|
-
_a = _c.sent();
|
|
2258
|
-
return [3, 3];
|
|
2259
|
-
case 2:
|
|
2260
|
-
_a = {};
|
|
2261
|
-
_c.label = 3;
|
|
2262
|
-
case 3:
|
|
2263
|
-
loginState = _a;
|
|
2264
|
-
callback.call(this, __assign(__assign({}, params), loginState));
|
|
2265
|
-
return [2];
|
|
2266
|
-
}
|
|
2267
|
-
});
|
|
2268
|
-
}); });
|
|
2269
|
-
return [4, this.getLoginState()];
|
|
2270
|
-
case 1:
|
|
2271
|
-
loginState = _b.sent();
|
|
2272
|
-
callback.call(this, loginState);
|
|
2273
|
-
return [2];
|
|
2274
|
-
}
|
|
2275
|
-
});
|
|
2276
|
-
});
|
|
2277
|
-
};
|
|
2278
|
-
Auth.prototype.refreshTokenForce = function (params) {
|
|
2279
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2280
|
-
return __generator(this, function (_a) {
|
|
2281
|
-
return [2, this.oauthInstance.authApi.refreshTokenForce(params)];
|
|
2282
|
-
});
|
|
2283
|
-
});
|
|
2284
|
-
};
|
|
2285
|
-
Auth.prototype.getCredentials = function () {
|
|
2286
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2287
|
-
return __generator(this, function (_a) {
|
|
2288
|
-
return [2, this.oauthInstance.authApi.getCredentials()];
|
|
2289
|
-
});
|
|
2290
|
-
});
|
|
2291
|
-
};
|
|
2292
|
-
Auth.prototype.setCredentials = function (credentials) {
|
|
2293
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2294
|
-
return __generator(this, function (_a) {
|
|
2295
|
-
switch (_a.label) {
|
|
2296
|
-
case 0: return [4, this.oauthInstance.oauth2client.setCredentials(credentials)];
|
|
2297
|
-
case 1:
|
|
2298
|
-
_a.sent();
|
|
2299
|
-
return [2];
|
|
2300
|
-
}
|
|
2301
|
-
});
|
|
2302
|
-
});
|
|
2303
|
-
};
|
|
2304
|
-
Auth.prototype.getProviderSubType = function () {
|
|
2305
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2306
|
-
return __generator(this, function (_a) {
|
|
2307
|
-
return [2, this.oauthInstance.authApi.getProviderSubType()];
|
|
2308
|
-
});
|
|
2309
|
-
});
|
|
2310
|
-
};
|
|
2311
|
-
Auth.prototype.createCaptchaData = function (params) {
|
|
2312
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2313
|
-
return __generator(this, function (_a) {
|
|
2314
|
-
return [2, this.oauthInstance.authApi.createCaptchaData(params)];
|
|
2315
|
-
});
|
|
2316
|
-
});
|
|
2317
|
-
};
|
|
2318
|
-
Auth.prototype.verifyCaptchaData = function (params) {
|
|
2319
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2320
|
-
return __generator(this, function (_a) {
|
|
2321
|
-
return [2, this.oauthInstance.authApi.verifyCaptchaData(params)];
|
|
2322
|
-
});
|
|
2323
|
-
});
|
|
2324
|
-
};
|
|
2325
|
-
Auth.prototype.getMiniProgramQrCode = function (params) {
|
|
2326
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2327
|
-
return __generator(this, function (_a) {
|
|
2328
|
-
return [2, this.oauthInstance.authApi.getMiniProgramCode(params)];
|
|
2329
|
-
});
|
|
2330
|
-
});
|
|
2331
|
-
};
|
|
2332
|
-
Auth.prototype.getMiniProgramQrCodeStatus = function (params) {
|
|
2333
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2334
|
-
return __generator(this, function (_a) {
|
|
2335
|
-
return [2, this.oauthInstance.authApi.getMiniProgramQrCodeStatus(params)];
|
|
2336
|
-
});
|
|
2337
|
-
});
|
|
2338
|
-
};
|
|
2339
|
-
Auth.prototype.modifyPassword = function (params) {
|
|
2340
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2341
|
-
return __generator(this, function (_a) {
|
|
2342
|
-
return [2, this.oauthInstance.authApi.modifyPassword(params)];
|
|
2343
|
-
});
|
|
2344
|
-
});
|
|
2345
|
-
};
|
|
2346
|
-
Auth.prototype.modifyPasswordWithoutLogin = function (params) {
|
|
2347
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2348
|
-
return __generator(this, function (_a) {
|
|
2349
|
-
return [2, this.oauthInstance.authApi.modifyPasswordWithoutLogin(params)];
|
|
2350
|
-
});
|
|
2351
|
-
});
|
|
2352
|
-
};
|
|
2353
|
-
Auth.prototype.getUserBehaviorLog = function (params) {
|
|
2354
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2355
|
-
return __generator(this, function (_a) {
|
|
2356
|
-
return [2, this.oauthInstance.authApi.getUserBehaviorLog(params)];
|
|
2357
|
-
});
|
|
2358
|
-
});
|
|
2359
|
-
};
|
|
2360
|
-
Auth.prototype.signInWithUsername = function (_a) {
|
|
2361
|
-
var _b = _a.verificationInfo, verificationInfo = _b === void 0 ? { verification_id: '', is_user: false } : _b, _c = _a.verificationCode, verificationCode = _c === void 0 ? '' : _c, _d = _a.username, rawUsername = _d === void 0 ? '' : _d, _e = _a.bindInfo, bindInfo = _e === void 0 ? undefined : _e, _f = _a.loginType, loginType = _f === void 0 ? '' : _f;
|
|
2362
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2363
|
-
var verifyRes, verification_token, username, signUpParam, signInRes, bindRes, signUpRes, error_42;
|
|
2364
|
-
return __generator(this, function (_g) {
|
|
2365
|
-
switch (_g.label) {
|
|
2366
|
-
case 0:
|
|
2367
|
-
_g.trys.push([0, 8, , 9]);
|
|
2368
|
-
return [4, this.oauthInstance.authApi.verify({
|
|
2369
|
-
verification_id: verificationInfo.verification_id,
|
|
2370
|
-
verification_code: verificationCode,
|
|
2371
|
-
})];
|
|
2372
|
-
case 1:
|
|
2373
|
-
verifyRes = _g.sent();
|
|
2374
|
-
if (verifyRes === null || verifyRes === void 0 ? void 0 : verifyRes.error_code) {
|
|
2375
|
-
throw verifyRes;
|
|
2376
|
-
}
|
|
2377
|
-
verification_token = verifyRes.verification_token;
|
|
2378
|
-
username = this.formatPhone(rawUsername);
|
|
2379
|
-
signUpParam = { phone_number: username };
|
|
2380
|
-
if (loginType === 'email') {
|
|
2381
|
-
username = rawUsername;
|
|
2382
|
-
signUpParam = { email: username };
|
|
2383
|
-
}
|
|
2384
|
-
if (!verificationInfo.is_user) return [3, 5];
|
|
2385
|
-
return [4, this.oauthInstance.authApi.signIn({
|
|
2386
|
-
username: username,
|
|
2387
|
-
verification_token: verification_token,
|
|
2388
|
-
})];
|
|
2389
|
-
case 2:
|
|
2390
|
-
signInRes = _g.sent();
|
|
2391
|
-
if (signInRes === null || signInRes === void 0 ? void 0 : signInRes.error_code) {
|
|
2392
|
-
throw signInRes;
|
|
2393
|
-
}
|
|
2394
|
-
if (!bindInfo) return [3, 4];
|
|
2395
|
-
return [4, this.oauthInstance.authApi.bindWithProvider({
|
|
2396
|
-
provider_token: bindInfo === null || bindInfo === void 0 ? void 0 : bindInfo.providerToken,
|
|
2397
|
-
})];
|
|
2398
|
-
case 3:
|
|
2399
|
-
bindRes = _g.sent();
|
|
2400
|
-
if (bindRes === null || bindRes === void 0 ? void 0 : bindRes.error_code) {
|
|
2401
|
-
throw bindRes;
|
|
2402
|
-
}
|
|
2403
|
-
_g.label = 4;
|
|
2404
|
-
case 4: return [3, 7];
|
|
2405
|
-
case 5: return [4, this.oauthInstance.authApi.signUp(__assign(__assign({}, signUpParam), { verification_token: verification_token, provider_token: bindInfo === null || bindInfo === void 0 ? void 0 : bindInfo.providerId }))];
|
|
2406
|
-
case 6:
|
|
2407
|
-
signUpRes = _g.sent();
|
|
2408
|
-
if (signUpRes === null || signUpRes === void 0 ? void 0 : signUpRes.error_code) {
|
|
2409
|
-
throw signUpRes;
|
|
2410
|
-
}
|
|
2411
|
-
_g.label = 7;
|
|
2412
|
-
case 7: return [2, this.createLoginState()];
|
|
2413
|
-
case 8:
|
|
2414
|
-
error_42 = _g.sent();
|
|
2415
|
-
throw error_42;
|
|
2416
|
-
case 9: return [2];
|
|
2417
|
-
}
|
|
2418
|
-
});
|
|
2419
|
-
});
|
|
2420
|
-
};
|
|
2421
|
-
Auth.prototype.createLoginState = function (params, options) {
|
|
2422
|
-
var _a, _b;
|
|
2423
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2424
|
-
var loginState;
|
|
2425
|
-
return __generator(this, function (_c) {
|
|
2426
|
-
switch (_c.label) {
|
|
2427
|
-
case 0:
|
|
2428
|
-
loginState = new LoginState({
|
|
2429
|
-
envId: this.config.env,
|
|
2430
|
-
cache: this.cache,
|
|
2431
|
-
oauthInstance: this.oauthInstance,
|
|
2432
|
-
});
|
|
2433
|
-
return [4, loginState.checkLocalStateAsync()];
|
|
2434
|
-
case 1:
|
|
2435
|
-
_c.sent();
|
|
2436
|
-
if (!(options === null || options === void 0 ? void 0 : options.userInfo)) return [3, 2];
|
|
2437
|
-
loginState.user.setLocalUserInfo(options.userInfo);
|
|
2438
|
-
return [3, 5];
|
|
2439
|
-
case 2:
|
|
2440
|
-
if (!(options === null || options === void 0 ? void 0 : options.asyncRefreshUser)) return [3, 3];
|
|
2441
|
-
loginState.user.refresh(params);
|
|
2442
|
-
return [3, 5];
|
|
2443
|
-
case 3: return [4, loginState.user.refresh(params)];
|
|
2444
|
-
case 4:
|
|
2445
|
-
_c.sent();
|
|
2446
|
-
_c.label = 5;
|
|
2447
|
-
case 5:
|
|
2448
|
-
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.LOGIN_STATE_CHANGED, { eventType: LOGIN_STATE_CHANGED_TYPE.SIGN_IN });
|
|
2449
|
-
(_b = this.config.eventBus) === null || _b === void 0 ? void 0 : _b.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN });
|
|
2450
|
-
return [2, loginState];
|
|
2451
|
-
}
|
|
2452
|
-
});
|
|
2453
|
-
});
|
|
2454
|
-
};
|
|
2455
|
-
Auth.prototype.setAccessKey = function () {
|
|
2456
|
-
var _a, _b;
|
|
2457
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2458
|
-
var accessToken, scope;
|
|
2459
|
-
return __generator(this, function (_c) {
|
|
2460
|
-
accessToken = '';
|
|
2461
|
-
scope = '';
|
|
2462
|
-
if (this.config.accessKey) {
|
|
2463
|
-
accessToken = this.config.accessKey;
|
|
2464
|
-
scope = 'accessKey';
|
|
2465
|
-
}
|
|
2466
|
-
else if (((_a = this.config.auth) === null || _a === void 0 ? void 0 : _a.secretId) && ((_b = this.config.auth) === null || _b === void 0 ? void 0 : _b.secretKey)) {
|
|
2467
|
-
accessToken = '';
|
|
2468
|
-
scope = DEFAULT_NODE_ACCESS_SCOPE;
|
|
2469
|
-
}
|
|
2470
|
-
if (!scope) {
|
|
2471
|
-
return [2];
|
|
2472
|
-
}
|
|
2473
|
-
try {
|
|
2474
|
-
this.oauthInstance.oauth2client.setAccessKeyCredentials({
|
|
2475
|
-
access_token: accessToken,
|
|
2476
|
-
token_type: 'Bearer',
|
|
2477
|
-
scope: scope,
|
|
2478
|
-
expires_at: new Date(+new Date() + +new Date()),
|
|
2479
|
-
expires_in: +new Date() + +new Date(),
|
|
2480
|
-
});
|
|
2481
|
-
}
|
|
2482
|
-
catch (error) {
|
|
2483
|
-
console.warn('accessKey error: ', error);
|
|
2484
|
-
}
|
|
2485
|
-
return [2];
|
|
2486
|
-
});
|
|
2487
|
-
});
|
|
2488
|
-
};
|
|
2489
|
-
Auth.prototype.formatPhone = function (phone) {
|
|
2490
|
-
if (!/\s+/.test(phone) && /^\+\d{1,3}\d+/.test(phone)) {
|
|
2491
|
-
return phone.replace(/^(\+\d{1,2})(\d+)$/, '$1 $2');
|
|
2492
|
-
}
|
|
2493
|
-
return /^\+\d{1,3}\s+/.test(phone) ? phone : "+86 ".concat(phone);
|
|
2494
|
-
};
|
|
2495
|
-
Auth.prototype.notifyListeners = function (event, session, info) {
|
|
2496
|
-
this.listeners.forEach(function (callbacks) {
|
|
2497
|
-
callbacks.forEach(function (callback) {
|
|
2498
|
-
try {
|
|
2499
|
-
callback(event, session, info);
|
|
2500
|
-
}
|
|
2501
|
-
catch (error) {
|
|
2502
|
-
console.error('Error in auth state change callback:', error);
|
|
2503
|
-
}
|
|
2504
|
-
});
|
|
2505
|
-
});
|
|
2506
|
-
return;
|
|
2507
|
-
};
|
|
2508
|
-
Auth.prototype.setupListeners = function () {
|
|
2509
|
-
var _this = this;
|
|
2510
|
-
var _a;
|
|
2511
|
-
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.on(EVENTS.AUTH_STATE_CHANGED, function (params) { return __awaiter(_this, void 0, void 0, function () {
|
|
2512
|
-
var event, info, session;
|
|
2513
|
-
var _a, _b;
|
|
2514
|
-
return __generator(this, function (_c) {
|
|
2515
|
-
switch (_c.label) {
|
|
2516
|
-
case 0:
|
|
2517
|
-
event = (_a = params === null || params === void 0 ? void 0 : params.data) === null || _a === void 0 ? void 0 : _a.event;
|
|
2518
|
-
info = (_b = params === null || params === void 0 ? void 0 : params.data) === null || _b === void 0 ? void 0 : _b.info;
|
|
2519
|
-
return [4, this.getSession()];
|
|
2520
|
-
case 1:
|
|
2521
|
-
session = (_c.sent()).data.session;
|
|
2522
|
-
this.notifyListeners(event, session, info);
|
|
2523
|
-
return [2];
|
|
2524
|
-
}
|
|
2525
|
-
});
|
|
2526
|
-
}); });
|
|
2527
|
-
};
|
|
2528
|
-
Auth.prototype.convertToUser = function (userInfo) {
|
|
2529
|
-
var _a, _b, _c, _d, _e, _f;
|
|
2530
|
-
if (!userInfo)
|
|
2531
|
-
return null;
|
|
2532
|
-
var email = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.email) || '';
|
|
2533
|
-
var phone = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.phone_number) || '';
|
|
2534
|
-
var userId = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.sub) || (userInfo === null || userInfo === void 0 ? void 0 : userInfo.uid) || '';
|
|
2535
|
-
return {
|
|
2536
|
-
id: userId,
|
|
2537
|
-
aud: 'authenticated',
|
|
2538
|
-
role: (_b = (_a = userInfo.groups) === null || _a === void 0 ? void 0 : _a.map) === null || _b === void 0 ? void 0 : _b.call(_a, function (group) { return (typeof group === 'string' ? group : group.id); }),
|
|
2539
|
-
email: email || '',
|
|
2540
|
-
email_confirmed_at: (userInfo === null || userInfo === void 0 ? void 0 : userInfo.email_verified) ? userInfo.created_at : userInfo.created_at,
|
|
2541
|
-
phone: phone,
|
|
2542
|
-
phone_confirmed_at: phone ? userInfo.created_at : undefined,
|
|
2543
|
-
confirmed_at: userInfo.created_at,
|
|
2544
|
-
last_sign_in_at: userInfo.last_sign_in_at,
|
|
2545
|
-
app_metadata: {
|
|
2546
|
-
provider: ((_c = userInfo.loginType) === null || _c === void 0 ? void 0 : _c.toLowerCase()) || 'cloudbase',
|
|
2547
|
-
providers: [((_d = userInfo.loginType) === null || _d === void 0 ? void 0 : _d.toLowerCase()) || 'cloudbase'],
|
|
2548
|
-
},
|
|
2549
|
-
user_metadata: {
|
|
2550
|
-
name: userInfo === null || userInfo === void 0 ? void 0 : userInfo.name,
|
|
2551
|
-
picture: userInfo === null || userInfo === void 0 ? void 0 : userInfo.picture,
|
|
2552
|
-
username: userInfo === null || userInfo === void 0 ? void 0 : userInfo.username,
|
|
2553
|
-
gender: userInfo === null || userInfo === void 0 ? void 0 : userInfo.gender,
|
|
2554
|
-
locale: userInfo === null || userInfo === void 0 ? void 0 : userInfo.locale,
|
|
2555
|
-
uid: userInfo.uid,
|
|
2556
|
-
nickName: userInfo.nickName || (userInfo === null || userInfo === void 0 ? void 0 : userInfo.name),
|
|
2557
|
-
avatarUrl: userInfo.avatarUrl || userInfo.picture,
|
|
2558
|
-
location: userInfo.location,
|
|
2559
|
-
hasPassword: (_e = userInfo.hasPassword) !== null && _e !== void 0 ? _e : (userInfo.password === 'SET'),
|
|
2560
|
-
open_id: userInfo === null || userInfo === void 0 ? void 0 : userInfo.open_id,
|
|
2561
|
-
},
|
|
2562
|
-
identities: ((_f = userInfo === null || userInfo === void 0 ? void 0 : userInfo.providers) === null || _f === void 0 ? void 0 : _f.map(function (p) { return ({
|
|
2563
|
-
id: p.id || '',
|
|
2564
|
-
identity_id: p.id || '',
|
|
2565
|
-
user_id: userId,
|
|
2566
|
-
identity_data: {
|
|
2567
|
-
provider_id: p.id,
|
|
2568
|
-
provider_user_id: p.provider_user_id,
|
|
2569
|
-
name: p.name,
|
|
2570
|
-
},
|
|
2571
|
-
provider: p.id || 'cloudbase',
|
|
2572
|
-
created_at: userInfo.created_at,
|
|
2573
|
-
updated_at: userInfo.updated_at,
|
|
2574
|
-
last_sign_in_at: userInfo.last_sign_in_at,
|
|
2575
|
-
}); })) || [],
|
|
2576
|
-
created_at: userInfo.created_at,
|
|
2577
|
-
updated_at: userInfo.updated_at,
|
|
2578
|
-
is_anonymous: userInfo.name === 'anonymous',
|
|
2579
|
-
};
|
|
2580
|
-
};
|
|
2581
|
-
Auth.prototype.validateParams = function (params, rules) {
|
|
2582
|
-
for (var _i = 0, _a = Object.entries(rules); _i < _a.length; _i++) {
|
|
2583
|
-
var _b = _a[_i], key = _b[0], rule = _b[1];
|
|
2584
|
-
if (rule.required && ((params === null || params === void 0 ? void 0 : params[key]) === undefined || (params === null || params === void 0 ? void 0 : params[key]) === null || (params === null || params === void 0 ? void 0 : params[key]) === '')) {
|
|
2585
|
-
throw new AuthError({ message: rule.message });
|
|
2586
|
-
}
|
|
2587
|
-
}
|
|
2588
|
-
};
|
|
2589
|
-
Auth.prototype.validateAtLeastOne = function (params, fieldGroups, message) {
|
|
2590
|
-
var hasValue = fieldGroups.some(function (group) { return group.some(function (field) { return (params === null || params === void 0 ? void 0 : params[field]) !== undefined && (params === null || params === void 0 ? void 0 : params[field]) !== null && (params === null || params === void 0 ? void 0 : params[field]) !== ''; }); });
|
|
2591
|
-
if (!hasValue) {
|
|
2592
|
-
throw new AuthError({ message: message });
|
|
2593
|
-
}
|
|
2594
|
-
};
|
|
2595
|
-
Auth.prototype.init = function () {
|
|
2596
|
-
var _a;
|
|
2597
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
2598
|
-
var credentials, error_43;
|
|
2599
|
-
return __generator(this, function (_b) {
|
|
2600
|
-
switch (_b.label) {
|
|
2601
|
-
case 0:
|
|
2602
|
-
_b.trys.push([0, 2, , 3]);
|
|
2603
|
-
return [4, this.oauthInstance.oauth2client.localCredentials.getCredentials()];
|
|
2604
|
-
case 1:
|
|
2605
|
-
credentials = _b.sent();
|
|
2606
|
-
if (credentials) {
|
|
2607
|
-
(_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.INITIAL_SESSION });
|
|
2608
|
-
}
|
|
2609
|
-
return [3, 3];
|
|
2610
|
-
case 2:
|
|
2611
|
-
error_43 = _b.sent();
|
|
2612
|
-
return [3, 3];
|
|
2613
|
-
case 3: return [2, { error: null }];
|
|
2614
|
-
}
|
|
2615
|
-
});
|
|
2616
|
-
});
|
|
2617
|
-
};
|
|
2618
|
-
__decorate([
|
|
2619
|
-
catchErrorsDecorator({
|
|
2620
|
-
title: '绑定手机号失败',
|
|
2621
|
-
messages: [
|
|
2622
|
-
'请确认以下各项:',
|
|
2623
|
-
' 1 - 调用 auth().bindPhoneNumber() 的语法或参数是否正确',
|
|
2624
|
-
' 2 - 当前环境是否开通了短信验证码登录',
|
|
2625
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2626
|
-
],
|
|
2627
|
-
}),
|
|
2628
|
-
__metadata("design:type", Function),
|
|
2629
|
-
__metadata("design:paramtypes", [Object]),
|
|
2630
|
-
__metadata("design:returntype", Promise)
|
|
2631
|
-
], Auth.prototype, "bindPhoneNumber", null);
|
|
2632
|
-
__decorate([
|
|
2633
|
-
catchErrorsDecorator({
|
|
2634
|
-
title: '解除三方绑定失败',
|
|
2635
|
-
messages: [
|
|
2636
|
-
'请确认以下各项:',
|
|
2637
|
-
' 1 - 调用 auth().unbindProvider() 的语法或参数是否正确',
|
|
2638
|
-
' 2 - 当前账户是否已经与此登录方式解绑',
|
|
2639
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2640
|
-
],
|
|
2641
|
-
}),
|
|
2642
|
-
__metadata("design:type", Function),
|
|
2643
|
-
__metadata("design:paramtypes", [Object]),
|
|
2644
|
-
__metadata("design:returntype", Promise)
|
|
2645
|
-
], Auth.prototype, "unbindProvider", null);
|
|
2646
|
-
__decorate([
|
|
2647
|
-
catchErrorsDecorator({
|
|
2648
|
-
title: '绑定邮箱地址失败',
|
|
2649
|
-
messages: [
|
|
2650
|
-
'请确认以下各项:',
|
|
2651
|
-
' 1 - 调用 auth().bindEmail() 的语法或参数是否正确',
|
|
2652
|
-
' 2 - 当前环境是否开通了邮箱密码登录',
|
|
2653
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2654
|
-
],
|
|
2655
|
-
}),
|
|
2656
|
-
__metadata("design:type", Function),
|
|
2657
|
-
__metadata("design:paramtypes", [Object]),
|
|
2658
|
-
__metadata("design:returntype", void 0)
|
|
2659
|
-
], Auth.prototype, "bindEmail", null);
|
|
2660
|
-
__decorate([
|
|
2661
|
-
catchErrorsDecorator({
|
|
2662
|
-
title: '验证码验证失败',
|
|
2663
|
-
messages: [
|
|
2664
|
-
'请确认以下各项:',
|
|
2665
|
-
' 1 - 调用 auth().verify() 的语法或参数是否正确',
|
|
2666
|
-
' 2 - 当前环境是否开通了手机验证码/邮箱登录',
|
|
2667
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2668
|
-
],
|
|
2669
|
-
}),
|
|
2670
|
-
__metadata("design:type", Function),
|
|
2671
|
-
__metadata("design:paramtypes", [Object]),
|
|
2672
|
-
__metadata("design:returntype", Promise)
|
|
2673
|
-
], Auth.prototype, "verify", null);
|
|
2674
|
-
__decorate([
|
|
2675
|
-
catchErrorsDecorator({
|
|
2676
|
-
title: '获取验证码失败',
|
|
2677
|
-
messages: [
|
|
2678
|
-
'请确认以下各项:',
|
|
2679
|
-
' 1 - 调用 auth().getVerification() 的语法或参数是否正确',
|
|
2680
|
-
' 2 - 当前环境是否开通了手机验证码/邮箱登录',
|
|
2681
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2682
|
-
],
|
|
2683
|
-
}),
|
|
2684
|
-
__metadata("design:type", Function),
|
|
2685
|
-
__metadata("design:paramtypes", [Object, Object]),
|
|
2686
|
-
__metadata("design:returntype", Promise)
|
|
2687
|
-
], Auth.prototype, "getVerification", null);
|
|
2688
|
-
__decorate([
|
|
2689
|
-
catchErrorsDecorator({
|
|
2690
|
-
title: '获取用户信息失败',
|
|
2691
|
-
messages: [
|
|
2692
|
-
'请确认以下各项:',
|
|
2693
|
-
' 1 - 调用 auth().getCurrentUser() 的语法或参数是否正确',
|
|
2694
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2695
|
-
],
|
|
2696
|
-
}),
|
|
2697
|
-
__metadata("design:type", Function),
|
|
2698
|
-
__metadata("design:paramtypes", [Object]),
|
|
2699
|
-
__metadata("design:returntype", Promise)
|
|
2700
|
-
], Auth.prototype, "getCurrentUser", null);
|
|
2701
|
-
__decorate([
|
|
2702
|
-
catchErrorsDecorator({
|
|
2703
|
-
title: '小程序匿名登录失败',
|
|
2704
|
-
messages: [
|
|
2705
|
-
'请确认以下各项:',
|
|
2706
|
-
' 1 - 当前环境是否开启了匿名登录',
|
|
2707
|
-
' 2 - 调用 auth().signInAnonymouslyInWx() 的语法或参数是否正确',
|
|
2708
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2709
|
-
],
|
|
2710
|
-
}),
|
|
2711
|
-
__metadata("design:type", Function),
|
|
2712
|
-
__metadata("design:paramtypes", [Object]),
|
|
2713
|
-
__metadata("design:returntype", Promise)
|
|
2714
|
-
], Auth.prototype, "signInAnonymouslyInWx", null);
|
|
2715
|
-
__decorate([
|
|
2716
|
-
catchErrorsDecorator({
|
|
2717
|
-
title: '小程序绑定OpenID失败',
|
|
2718
|
-
messages: [
|
|
2719
|
-
'请确认以下各项:',
|
|
2720
|
-
' 1 - 当前环境是否开启了小程序openId静默登录',
|
|
2721
|
-
' 2 - 调用 auth().bindOpenId() 的语法或参数是否正确',
|
|
2722
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2723
|
-
],
|
|
2724
|
-
}),
|
|
2725
|
-
__metadata("design:type", Function),
|
|
2726
|
-
__metadata("design:paramtypes", []),
|
|
2727
|
-
__metadata("design:returntype", Promise)
|
|
2728
|
-
], Auth.prototype, "bindOpenId", null);
|
|
2729
|
-
__decorate([
|
|
2730
|
-
catchErrorsDecorator({
|
|
2731
|
-
title: '小程序unionId静默登录失败',
|
|
2732
|
-
messages: [
|
|
2733
|
-
'请确认以下各项:',
|
|
2734
|
-
' 1 - 当前环境是否开启了小程序unionId静默登录',
|
|
2735
|
-
' 2 - 调用 auth().signInWithUnionId() 的语法或参数是否正确',
|
|
2736
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2737
|
-
],
|
|
2738
|
-
}),
|
|
2739
|
-
__metadata("design:type", Function),
|
|
2740
|
-
__metadata("design:paramtypes", []),
|
|
2741
|
-
__metadata("design:returntype", Promise)
|
|
2742
|
-
], Auth.prototype, "signInWithUnionId", null);
|
|
2743
|
-
__decorate([
|
|
2744
|
-
catchErrorsDecorator({
|
|
2745
|
-
title: '短信验证码登陆',
|
|
2746
|
-
messages: [
|
|
2747
|
-
'请确认以下各项:',
|
|
2748
|
-
' 1 - 当前环境是否开启了小程序短信验证码登陆',
|
|
2749
|
-
' 2 - 调用 auth().signInWithSms() 的语法或参数是否正确',
|
|
2750
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2751
|
-
],
|
|
2752
|
-
}),
|
|
2753
|
-
__metadata("design:type", Function),
|
|
2754
|
-
__metadata("design:paramtypes", [Object]),
|
|
2755
|
-
__metadata("design:returntype", Promise)
|
|
2756
|
-
], Auth.prototype, "signInWithSms", null);
|
|
2757
|
-
__decorate([
|
|
2758
|
-
catchErrorsDecorator({
|
|
2759
|
-
title: '邮箱验证码登陆',
|
|
2760
|
-
messages: [
|
|
2761
|
-
'请确认以下各项:',
|
|
2762
|
-
' 1 - 当前环境是否开启了邮箱登陆',
|
|
2763
|
-
' 2 - 调用 auth().signInWithEmail() 的语法或参数是否正确',
|
|
2764
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2765
|
-
],
|
|
2766
|
-
}),
|
|
2767
|
-
__metadata("design:type", Function),
|
|
2768
|
-
__metadata("design:paramtypes", [Object]),
|
|
2769
|
-
__metadata("design:returntype", Promise)
|
|
2770
|
-
], Auth.prototype, "signInWithEmail", null);
|
|
2771
|
-
__decorate([
|
|
2772
|
-
catchErrorsDecorator({
|
|
2773
|
-
title: '获取用户是否被占用失败',
|
|
2774
|
-
messages: [
|
|
2775
|
-
'请确认以下各项:',
|
|
2776
|
-
' 1 - 调用 auth().isUsernameRegistered() 的语法或参数是否正确',
|
|
2777
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2778
|
-
],
|
|
2779
|
-
}),
|
|
2780
|
-
__metadata("design:type", Function),
|
|
2781
|
-
__metadata("design:paramtypes", [String]),
|
|
2782
|
-
__metadata("design:returntype", Promise)
|
|
2783
|
-
], Auth.prototype, "isUsernameRegistered", null);
|
|
2784
|
-
__decorate([
|
|
2785
|
-
catchErrorsDecorator({
|
|
2786
|
-
title: '获取本地登录态失败',
|
|
2787
|
-
messages: [
|
|
2788
|
-
'请确认以下各项:',
|
|
2789
|
-
' 1 - 调用 auth().getLoginState() 的语法或参数是否正确',
|
|
2790
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2791
|
-
],
|
|
2792
|
-
}),
|
|
2793
|
-
__metadata("design:type", Function),
|
|
2794
|
-
__metadata("design:paramtypes", []),
|
|
2795
|
-
__metadata("design:returntype", Promise)
|
|
2796
|
-
], Auth.prototype, "getLoginState", null);
|
|
2797
|
-
__decorate([
|
|
2798
|
-
catchErrorsDecorator({
|
|
2799
|
-
title: '获取用户信息失败',
|
|
2800
|
-
messages: [
|
|
2801
|
-
'请确认以下各项:',
|
|
2802
|
-
' 1 - 是否已登录',
|
|
2803
|
-
' 2 - 调用 auth().getUserInfo() 的语法或参数是否正确',
|
|
2804
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2805
|
-
],
|
|
2806
|
-
}),
|
|
2807
|
-
__metadata("design:type", Function),
|
|
2808
|
-
__metadata("design:paramtypes", []),
|
|
2809
|
-
__metadata("design:returntype", Promise)
|
|
2810
|
-
], Auth.prototype, "getUserInfo", null);
|
|
2811
|
-
__decorate([
|
|
2812
|
-
catchErrorsDecorator({
|
|
2813
|
-
title: '获取微搭插件用户信息失败',
|
|
2814
|
-
messages: [
|
|
2815
|
-
'请确认以下各项:',
|
|
2816
|
-
' 1 - 是否已登录',
|
|
2817
|
-
' 2 - 调用 auth().getWedaUserInfo() 的语法或参数是否正确',
|
|
2818
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2819
|
-
],
|
|
2820
|
-
}),
|
|
2821
|
-
__metadata("design:type", Function),
|
|
2822
|
-
__metadata("design:paramtypes", []),
|
|
2823
|
-
__metadata("design:returntype", Promise)
|
|
2824
|
-
], Auth.prototype, "getWedaUserInfo", null);
|
|
2825
|
-
__decorate([
|
|
2826
|
-
catchErrorsDecorator({
|
|
2827
|
-
title: '绑定第三方登录方式失败',
|
|
2828
|
-
messages: [
|
|
2829
|
-
'请确认以下各项:',
|
|
2830
|
-
' 1 - 调用 auth().bindWithProvider() 的语法或参数是否正确',
|
|
2831
|
-
' 2 - 此账户是否已经绑定此第三方',
|
|
2832
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2833
|
-
],
|
|
2834
|
-
}),
|
|
2835
|
-
__metadata("design:type", Function),
|
|
2836
|
-
__metadata("design:paramtypes", [Object]),
|
|
2837
|
-
__metadata("design:returntype", Promise)
|
|
2838
|
-
], Auth.prototype, "bindWithProvider", null);
|
|
2839
|
-
__decorate([
|
|
2840
|
-
catchErrorsDecorator({
|
|
2841
|
-
title: '获取身份源类型',
|
|
2842
|
-
messages: [
|
|
2843
|
-
'请确认以下各项:',
|
|
2844
|
-
' 1 - 调用 auth().getProviderSubType() 的语法或参数是否正确',
|
|
2845
|
-
"\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
|
|
2846
|
-
],
|
|
2847
|
-
}),
|
|
2848
|
-
__metadata("design:type", Function),
|
|
2849
|
-
__metadata("design:paramtypes", []),
|
|
2850
|
-
__metadata("design:returntype", Promise)
|
|
2851
|
-
], Auth.prototype, "getProviderSubType", null);
|
|
2852
|
-
return Auth;
|
|
2853
|
-
}(AuthV1Compat));
|
|
2854
|
-
export function generateAuthInstance(config, options) {
|
|
2855
|
-
var _this = this;
|
|
2856
|
-
var _a, _b, _c, _d;
|
|
2857
|
-
var _e = config.region, region = _e === void 0 ? 'ap-shanghai' : _e, i18n = config.i18n, accessKey = config.accessKey, useWxCloud = config.useWxCloud;
|
|
2858
|
-
var platform = (options === null || options === void 0 ? void 0 : options.platform) || useDefaultAdapter.bind(options)();
|
|
2859
|
-
var runtime = platform.runtime, adapter = platform.adapter;
|
|
2860
|
-
var _f = options || {}, env = _f.env, clientId = _f.clientId, debug = _f.debug, cache = _f.cache, cloudbase = _f.app;
|
|
2861
|
-
var apiOrigin = (options || {}).apiOrigin;
|
|
2862
|
-
if (!apiOrigin) {
|
|
2863
|
-
apiOrigin = "https://".concat(env, ".").concat(region, ".tcb-api.tencentcloudapi.com");
|
|
2864
|
-
}
|
|
2865
|
-
var commonOpts = {
|
|
2866
|
-
env: env,
|
|
2867
|
-
clientId: clientId,
|
|
2868
|
-
i18n: i18n,
|
|
2869
|
-
accessKey: accessKey,
|
|
2870
|
-
useWxCloud: useWxCloud,
|
|
2871
|
-
eventBus: new CloudbaseEventEmitter(),
|
|
2872
|
-
};
|
|
2873
|
-
var oauthInstance = new CloudbaseOAuth(useAuthAdapter(__assign(__assign({}, commonOpts), { apiOrigin: apiOrigin, apiPath: (config === null || config === void 0 ? void 0 : config.apiPath) || AUTH_API_PREFIX, storage: config === null || config === void 0 ? void 0 : config.storage, baseRequest: config === null || config === void 0 ? void 0 : config.baseRequest, request: config === null || config === void 0 ? void 0 : config.request, anonymousSignInFunc: config === null || config === void 0 ? void 0 : config.anonymousSignInFunc, captchaOptions: config === null || config === void 0 ? void 0 : config.captchaOptions, wxCloud: config === null || config === void 0 ? void 0 : config.wxCloud, adapter: adapter, onCredentialsError: onCredentialsError(commonOpts.eventBus), headers: __assign({ 'X-SDK-Version': "@cloudbase/js-sdk/".concat(config.sdkVersion) }, (config.headers || {})), detectSessionInUrl: config.detectSessionInUrl, debug: debug, auth: (_b = (_a = options.app) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.auth })));
|
|
2874
|
-
var authInstance = new Auth(__assign(__assign({}, commonOpts), { region: region, persistence: config.persistence, debug: debug, cache: cache || new CloudbaseCache({
|
|
2875
|
-
persistence: config.persistence,
|
|
2876
|
-
keys: { userInfoKey: "user_info_".concat(env) },
|
|
2877
|
-
platformInfo: platform,
|
|
2878
|
-
}), runtime: runtime || 'web', _fromApp: cloudbase, oauthInstance: oauthInstance, auth: (_d = (_c = options.app) === null || _c === void 0 ? void 0 : _c.config) === null || _d === void 0 ? void 0 : _d.auth }));
|
|
2879
|
-
oauthInstance.initializeSession(function (data, error) { return __awaiter(_this, void 0, void 0, function () {
|
|
2880
|
-
return __generator(this, function (_a) {
|
|
2881
|
-
if (!data)
|
|
2882
|
-
return [2];
|
|
2883
|
-
if (data.type === OAUTH_TYPE.SIGN_IN) {
|
|
2884
|
-
if (error) {
|
|
2885
|
-
commonOpts.eventBus.fire(EVENTS.AUTH_STATE_CHANGED, {
|
|
2886
|
-
event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN,
|
|
2887
|
-
info: __assign(__assign({}, data), { error: error }),
|
|
2888
|
-
});
|
|
2889
|
-
}
|
|
2890
|
-
else if (data.user) {
|
|
2891
|
-
authInstance.createLoginState({}, { userInfo: data.user });
|
|
2892
|
-
}
|
|
2893
|
-
}
|
|
2894
|
-
else if (data.type === OAUTH_TYPE.BIND_IDENTITY) {
|
|
2895
|
-
commonOpts.eventBus.fire(EVENTS.AUTH_STATE_CHANGED, {
|
|
2896
|
-
event: AUTH_STATE_CHANGED_TYPE.BIND_IDENTITY,
|
|
2897
|
-
info: __assign(__assign({}, data), { error: error }),
|
|
2898
|
-
});
|
|
2899
|
-
}
|
|
2900
|
-
return [2];
|
|
2901
|
-
});
|
|
2902
|
-
}); });
|
|
2903
|
-
return { authInstance: authInstance, oauthInstance: oauthInstance };
|
|
2904
|
-
}
|
|
2905
|
-
var NAMESPACE = 'auth';
|
|
2906
|
-
function levenshteinDistance(a, b) {
|
|
2907
|
-
var matrix = [];
|
|
2908
|
-
for (var i = 0; i <= a.length; i++) {
|
|
2909
|
-
matrix[i] = [i];
|
|
2910
|
-
}
|
|
2911
|
-
for (var j = 0; j <= b.length; j++) {
|
|
2912
|
-
matrix[0][j] = j;
|
|
2913
|
-
}
|
|
2914
|
-
for (var i = 1; i <= a.length; i++) {
|
|
2915
|
-
for (var j = 1; j <= b.length; j++) {
|
|
2916
|
-
var cost = a[i - 1].toLowerCase() === b[j - 1].toLowerCase() ? 0 : 1;
|
|
2917
|
-
matrix[i][j] = Math.min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + cost);
|
|
2918
|
-
}
|
|
2919
|
-
}
|
|
2920
|
-
return matrix[a.length][b.length];
|
|
2921
|
-
}
|
|
2922
|
-
function findSimilarMethod(target, methods) {
|
|
2923
|
-
var bestMatch = null;
|
|
2924
|
-
var bestDistance = Infinity;
|
|
2925
|
-
for (var _i = 0, methods_1 = methods; _i < methods_1.length; _i++) {
|
|
2926
|
-
var method = methods_1[_i];
|
|
2927
|
-
if (method.startsWith('_') || method === 'constructor')
|
|
2928
|
-
continue;
|
|
2929
|
-
var distance = levenshteinDistance(target, method);
|
|
2930
|
-
if (distance < bestDistance) {
|
|
2931
|
-
bestDistance = distance;
|
|
2932
|
-
bestMatch = method;
|
|
2933
|
-
}
|
|
2934
|
-
}
|
|
2935
|
-
return bestMatch;
|
|
2936
|
-
}
|
|
2937
|
-
var component = {
|
|
2938
|
-
name: COMPONENT_NAME,
|
|
2939
|
-
namespace: NAMESPACE,
|
|
2940
|
-
entity: function (config) {
|
|
2941
|
-
var auth = function (config) {
|
|
2942
|
-
var _a;
|
|
2943
|
-
if (this.authInstance && !config) {
|
|
2944
|
-
return this.authInstance;
|
|
2945
|
-
}
|
|
2946
|
-
config = config || {
|
|
2947
|
-
region: '',
|
|
2948
|
-
persistence: 'local',
|
|
2949
|
-
apiPath: AUTH_API_PREFIX,
|
|
2950
|
-
};
|
|
2951
|
-
var adapter = this.platform.adapter;
|
|
2952
|
-
var newPersistence = config.persistence || adapter.primaryStorage;
|
|
2953
|
-
if (newPersistence && newPersistence !== this.config.persistence) {
|
|
2954
|
-
this.updateConfig({ persistence: newPersistence });
|
|
2955
|
-
}
|
|
2956
|
-
var _b = generateAuthInstance(__assign(__assign({ wxCloud: this.config.wxCloud, storage: this.config.storage }, config), { persistence: this.config.persistence, i18n: this.config.i18n, accessKey: this.config.accessKey, useWxCloud: this.config.useWxCloud, sdkVersion: this.version, detectSessionInUrl: (_a = this.config.auth) === null || _a === void 0 ? void 0 : _a.detectSessionInUrl }), {
|
|
2957
|
-
env: this.config.env,
|
|
2958
|
-
clientId: this.config.clientId,
|
|
2959
|
-
apiOrigin: this.request.getBaseEndPoint(this.config.endPointMode || 'CLOUD_API'),
|
|
2960
|
-
platform: this.platform,
|
|
2961
|
-
cache: this.cache,
|
|
2962
|
-
app: this,
|
|
2963
|
-
debug: this.config.debug,
|
|
2964
|
-
}), authInstance = _b.authInstance, oauthInstance = _b.oauthInstance;
|
|
2965
|
-
this.oauthInstance = oauthInstance;
|
|
2966
|
-
this.authInstance = authInstance;
|
|
2967
|
-
return this.authInstance;
|
|
2968
|
-
};
|
|
2969
|
-
var authProto = auth.call(this, config);
|
|
2970
|
-
Object.assign(auth, authProto);
|
|
2971
|
-
Object.setPrototypeOf(auth, Object.getPrototypeOf(authProto));
|
|
2972
|
-
var authWithHint = typeof Proxy !== 'undefined'
|
|
2973
|
-
? new Proxy(auth, {
|
|
2974
|
-
get: function (target, prop, receiver) {
|
|
2975
|
-
var value = Reflect.get(target, prop, receiver);
|
|
2976
|
-
if (value !== undefined || typeof prop !== 'string') {
|
|
2977
|
-
return value;
|
|
2978
|
-
}
|
|
2979
|
-
var allKeys = Object.getOwnPropertyNames(Object.getPrototypeOf(target))
|
|
2980
|
-
.concat(Object.keys(target))
|
|
2981
|
-
.filter(function (k) { return typeof target[k] === 'function'; });
|
|
2982
|
-
var suggestion = findSimilarMethod(prop, allKeys);
|
|
2983
|
-
if (suggestion) {
|
|
2984
|
-
console.warn("[CloudBase Auth] auth.".concat(prop, " is not a function. Did you mean: auth.").concat(suggestion, "() ?"));
|
|
2985
|
-
}
|
|
2986
|
-
return value;
|
|
2987
|
-
},
|
|
2988
|
-
})
|
|
2989
|
-
: auth;
|
|
2990
|
-
this[NAMESPACE] = authWithHint;
|
|
2991
|
-
return authWithHint;
|
|
2992
|
-
},
|
|
2993
|
-
};
|
|
2994
|
-
try {
|
|
2995
|
-
cloudbase.registerComponent(component);
|
|
2996
|
-
}
|
|
2997
|
-
catch (e) { }
|
|
2998
|
-
export { Auth, WeixinAuthProvider, CustomAuthProvider, AnonymousAuthProvider };
|
|
2999
|
-
export { AuthErrorCategory, AuthError } from '@cloudbase/oauth';
|
|
3000
|
-
export function registerAuth(app) {
|
|
3001
|
-
try {
|
|
3002
|
-
app.registerComponent(component);
|
|
3003
|
-
}
|
|
3004
|
-
catch (e) {
|
|
3005
|
-
console.warn(e);
|
|
3006
|
-
}
|
|
3007
|
-
}
|
|
3008
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLE9BQU8sRUFDTCxjQUFjLEVBQ2QsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixNQUFNLEVBQ04sdUJBQXVCLEVBQ3ZCLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGlCQUFpQixFQUNqQixVQUFVLEVBQ1YseUJBQXlCLEdBQzFCLE1BQU0sa0JBQWtCLENBQUE7QUFDekIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGNBQWMsRUFDZCxpQkFBaUIsR0FDbEIsTUFBTSxhQUFhLENBQUE7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUNyRyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLGlCQUFpQixHQUNsQixNQUFNLGFBQWEsQ0FBQTtBQUNwQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFrQzVDLElBQU0sU0FBUyxHQUFHLGNBQU0sT0FBQSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFoRSxDQUFnRSxDQUFBO0FBbUN4RixJQUFNLGNBQWMsR0FBRyxNQUFNLENBQUE7QUFrQjdCLElBQU0sa0JBQWtCLEdBQUcsVUFBQSxRQUFRLElBQUksT0FBQSxV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RixDQUFDLENBQUMsSUFBSSxDQUFBO1FBRVIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQTtRQUM5QixPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDO0NBQ0YsQ0FBQTtBQUVELElBQUk7SUFHRixTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7Q0FDdkM7QUFBQyxPQUFPLENBQUMsRUFBRSxHQUFFO0FBRWQsT0FBTyxFQUFZLElBQUksRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxDQUFBO0FBRXhGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUkvRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQTBDO0lBQ3JFLElBQUk7UUFDRixHQUFHLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7S0FDakM7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ2xvdWRiYXNlLCBJQ2xvdWRiYXNlQ29uZmlnLCBJQ2xvdWRiYXNlUGxhdGZvcm1JbmZvIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcydcbmltcG9ydCB0eXBlIHsgSUNsb3VkYmFzZUNhY2hlIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9jYWNoZSdcbmltcG9ydCB0eXBlIHsgSUNsb3VkYmFzZVJlcXVlc3QgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3JlcXVlc3QnXG5pbXBvcnQgdHlwZSB7IElDbG91ZGJhc2VBdXRoQ29uZmlnLCBJVXNlciwgSUxvZ2luU3RhdGUgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2F1dGgnXG5pbXBvcnQgdHlwZSB7IElDbG91ZGJhc2VDb21wb25lbnQgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2NvbXBvbmVudCdcbmltcG9ydCB0eXBlIHsgQXV0aE9wdGlvbnMsIENyZWRlbnRpYWxzIH0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbmltcG9ydCB7XG4gIENsb3VkYmFzZU9BdXRoLFxuICBBVVRIX0FQSV9QUkVGSVgsXG4gIExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRSxcbiAgRVZFTlRTLFxuICBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRSxcbiAgT0FVVEhfVFlQRSxcbiAgd2VBcHBKd3REZWNvZGVBbGwsXG4gIEF1dGhFcnJvcixcbiAgQXV0aEVycm9yQ2F0ZWdvcnksXG4gIGF1dGhNb2RlbHMsXG4gIERFRkFVTFRfTk9ERV9BQ0NFU1NfU0NPUEUsXG59IGZyb20gJ0BjbG91ZGJhc2Uvb2F1dGgnXG5pbXBvcnQgeyB1c2VBdXRoQWRhcHRlciB9IGZyb20gJy4vYWRhcHRlcidcbmltcG9ydCB7XG4gIHByaW50V2FybixcbiAgdGhyb3dFcnJvcixcbiAgRVJST1JTLFxuICBDT01NVU5JVFlfU0lURV9VUkwsXG4gIGNhdGNoRXJyb3JzRGVjb3JhdG9yLFxuICBDbG91ZGJhc2VFdmVudEVtaXR0ZXIsXG4gIENsb3VkYmFzZUNhY2hlLFxuICBhZGFwdGVyRm9yV3hNcCxcbiAgdXNlRGVmYXVsdEFkYXB0ZXIsXG59IGZyb20gJy4vdXRpbGl0aWVzJ1xuaW1wb3J0IHsgc2F2ZVRvQnJvd3NlclNlc3Npb24sIGdldEJyb3dzZXJTZXNzaW9uLCByZW1vdmVCcm93c2VyU2Vzc2lvbiwgYWRkVXJsU2VhcmNoIH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7XG4gIEF1dGhWMUNvbXBhdCxcbiAgV2VpeGluQXV0aFByb3ZpZGVyLFxuICBDdXN0b21BdXRoUHJvdmlkZXIsXG4gIEFub255bW91c0F1dGhQcm92aWRlcixcbiAgYXBwbHlVc2VyVjFDb21wYXQsXG59IGZyb20gJy4vdjEtY29tcGF0J1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcbmltcG9ydCB7XG4gIENvbW1vblJlcyxcbiAgRGVsZXRlTWVSZXEsXG4gIEdldENsYWltc1JlcyxcbiAgR2V0VXNlcklkZW50aXRpZXNSZXMsXG4gIEdldFVzZXJSZXMsXG4gIExpbmtJZGVudGl0eVJlcSxcbiAgTGlua0lkZW50aXR5UmVzLFxuICBPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrLFxuICBSZWF1dGhlbnRpY2F0ZVJlcyxcbiAgUmVzZW5kUmVxLFxuICBSZXNlbmRSZXMsXG4gIFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcyxcbiAgUmVzZXRQYXNzd29yZEZvck9sZFJlcSxcbiAgU2V0U2Vzc2lvblJlcSxcbiAgU2lnbkluQW5vbnltb3VzbHlSZXEsXG4gIFNpZ25Jbk9BdXRoUmVzLFxuICBTaWduSW5SZXMsXG4gIFNpZ25JbldpdGhJZFRva2VuUmVxLFxuICBTaWduSW5XaXRoT0F1dGhSZXEsXG4gIFNpZ25JbldpdGhPdHBSZXEsXG4gIFNpZ25JbldpdGhPdHBSZXMsXG4gIFNpZ25JbldpdGhQYXNzd29yZFJlcSxcbiAgU2lnblVwUmVzLFxuICBVbmxpbmtJZGVudGl0eVJlcSxcbiAgVXBkYXRlVXNlckF0dHJpYnV0ZXMsXG4gIFVwZGF0ZVVzZXJSZXEsXG4gIFVwZGF0ZVVzZXJXaXRoVmVyaWZpY2F0aW9uUmVzLFxuICBWZXJpZnlPQXV0aFJlcSxcbiAgVmVyaWZ5T0F1dGhSZXMsXG4gIFZlcmlmeU90cFJlcSxcbn0gZnJvbSAnLi90eXBlJ1xuXG5jb25zdCBpc0Jyb3dzZXIgPSAoKSA9PiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG5cbmV4cG9ydCB0eXBlIHtcbiAgU2lnbkluUmVzLFxuICBHZXRVc2VyUmVzLFxuICBDb21tb25SZXMsXG4gIFNpZ25JbldpdGhPdHBSZXMsXG4gIFNpZ25Jbk9BdXRoUmVzLFxuICBHZXRDbGFpbXNSZXMsXG4gIFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcyxcbiAgR2V0VXNlcklkZW50aXRpZXNSZXMsXG4gIExpbmtJZGVudGl0eVJlcyxcbiAgUmVhdXRoZW50aWNhdGVSZXMsXG4gIFJlc2VuZFJlcyxcbiAgVXBkYXRlVXNlcldpdGhWZXJpZmljYXRpb25SZXMsXG4gIE9uQXV0aFN0YXRlQ2hhbmdlQ2FsbGJhY2ssXG4gIFNpZ25JbldpdGhQYXNzd29yZFJlcSxcbiAgU2lnbkluV2l0aElkVG9rZW5SZXEsXG4gIFNpZ25JbldpdGhPQXV0aFJlcSxcbiAgVmVyaWZ5T0F1dGhSZXEsXG4gIFZlcmlmeU90cFJlcSxcbiAgTGlua0lkZW50aXR5UmVxLFxuICBVbmxpbmtJZGVudGl0eVJlcSxcbiAgVXBkYXRlVXNlclJlcSxcbiAgU2lnbkluV2l0aE90cFJlcSxcbiAgUmVzZXRQYXNzd29yZEZvck9sZFJlcSxcbiAgUmVzZW5kUmVxLFxuICBTZXRTZXNzaW9uUmVxLFxuICBEZWxldGVNZVJlcSxcbiAgU2lnblVwUmVzLFxufSBmcm9tICcuL3R5cGUnXG5cbmRlY2xhcmUgY29uc3QgY2xvdWRiYXNlOiBJQ2xvdWRiYXNlXG5kZWNsYXJlIGNvbnN0IHd4OiBhbnlcblxuY29uc3QgQ09NUE9ORU5UX05BTUUgPSAnYXV0aCdcblxuaW50ZXJmYWNlIFVzZXJJbmZvIHtcbiAgdWlkPzogc3RyaW5nXG4gIGdlbmRlcj86IHN0cmluZ1xuICBwaWN0dXJlPzogc3RyaW5nXG4gIGVtYWlsPzogc3RyaW5nXG4gIGVtYWlsX3ZlcmlmaWVkPzogYm9vbGVhblxuICBwaG9uZV9udW1iZXI/OiBzdHJpbmdcbiAgdXNlcm5hbWU/OiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBiaXJ0aGRhdGU/OiBzdHJpbmdcbiAgem9uZWluZm8/OiBzdHJpbmdcbiAgbG9jYWxlPzogc3RyaW5nXG4gIHN1Yj86IHN0cmluZ1xuICBjcmVhdGVkX2Zyb20/OiBzdHJpbmdcbn1cblxuY29uc3Qgb25DcmVkZW50aWFsc0Vycm9yID0gZXZlbnRCdXMgPT4gKHBhcmFtcykgPT4ge1xuICBldmVudEJ1cy5maXJlKEVWRU5UUy5MT0dJTl9TVEFURV9DSEFOR0VELCB7IC4uLnBhcmFtcywgZXZlbnRUeXBlOiBMT0dJTl9TVEFURV9DSEFOR0VEX1RZUEUuQ1JFREVOVElBTFNfRVJST1IgfSlcbn1cblxuaW50ZXJmYWNlIElVc2VyT3B0aW9ucyB7XG4gIGNhY2hlOiBJQ2xvdWRiYXNlQ2FjaGVcbiAgb2F1dGhJbnN0YW5jZTogQ2xvdWRiYXNlT0F1dGhcbn1cblxuZXhwb3J0IGNsYXNzIFVzZXIgaW1wbGVtZW50cyBJVXNlciB7XG4gIHB1YmxpYyB1aWQ/OiBzdHJpbmdcbiAgcHVibGljIGdlbmRlcj86IHN0cmluZ1xuICBwdWJsaWMgcGljdHVyZT86IHN0cmluZ1xuICBwdWJsaWMgZW1haWw/OiBzdHJpbmdcbiAgcHVibGljIGVtYWlsVmVyaWZpZWQ/OiBib29sZWFuXG4gIHB1YmxpYyBwaG9uZU51bWJlcj86IHN0cmluZ1xuICBwdWJsaWMgdXNlcm5hbWU/OiBzdHJpbmcgLy8g55So5oi35ZCN56ew77yM6ZW/5bqmIDUtMjQg5L2N77yM5pSv5oyB5a2X56ym5Lit6Iux5paH44CB5pWw5a2X44CB54m55q6K5a2X56ym77yI5LuF5pSv5oyBXy3vvInvvIzkuI3mlK/mjIHkuK3mlodcbiAgcHVibGljIG5hbWU/OiBzdHJpbmdcbiAgcHVibGljIHByb3ZpZGVycz86IHtcbiAgICBpZD86IHN0cmluZ1xuICAgIHByb3ZpZGVyVXNlcklkPzogc3RyaW5nXG4gICAgbmFtZT86IHN0cmluZ1xuICB9W11cbiAgcHVibGljIGJpcnRoZGF0ZT86IHN0cmluZ1xuICBwdWJsaWMgem9uZWluZm8/OiBzdHJpbmdcbiAgcHVibGljIGxvY2FsZT86IHN0cmluZ1xuICBwdWJsaWMgc3ViPzogc3RyaW5nXG4gIHB1YmxpYyBjcmVhdGVkRnJvbT86IHN0cmluZ1xuICBwdWJsaWMgb3Blbl9pZD86IHN0cmluZ1xuXG4gIHByaXZhdGUgY2FjaGU6IElDbG91ZGJhc2VDYWNoZVxuICBwcml2YXRlIG9hdXRoSW5zdGFuY2U6IENsb3VkYmFzZU9BdXRoIC8vIENsb3VkYmFzZU9BdXRoIOexu+Wei1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyT3B0aW9ucykge1xuICAgIGNvbnN0IHsgY2FjaGUsIG9hdXRoSW5zdGFuY2UgfSA9IG9wdGlvbnNcbiAgICB0aGlzLmNhY2hlID0gY2FjaGVcbiAgICB0aGlzLm9hdXRoSW5zdGFuY2UgPSBvYXV0aEluc3RhbmNlXG5cbiAgICB0aGlzLnNldFVzZXJJbmZvKClcbiAgfVxuICAvKipcbiAgICog6I635Y+W5pys5Zyw55So5oi35L+h5oGvLeWQjOatpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoZWNrTG9jYWxJbmZvKCkge1xuICAgIHRoaXMudWlkID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCd1aWQnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmdlbmRlciA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnZ2VuZGVyJykgYXMgc3RyaW5nXG4gICAgdGhpcy5waWN0dXJlID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdwaWN0dXJlJykgYXMgc3RyaW5nXG4gICAgdGhpcy5lbWFpbCA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnZW1haWwnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2VtYWlsX3ZlcmlmaWVkJykgYXMgYm9vbGVhblxuICAgIHRoaXMucGhvbmVOdW1iZXIgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3Bob25lX251bWJlcicpIGFzIHN0cmluZ1xuICAgIHRoaXMudXNlcm5hbWUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3VzZXJuYW1lJykgYXMgc3RyaW5nXG4gICAgdGhpcy5uYW1lID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCduYW1lJykgYXMgc3RyaW5nXG4gICAgdGhpcy5iaXJ0aGRhdGUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2JpcnRoZGF0ZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuem9uZWluZm8gPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3pvbmVpbmZvJykgYXMgc3RyaW5nXG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2xvY2FsZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuc3ViID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdzdWInKSBhcyBzdHJpbmdcbiAgICB0aGlzLmNyZWF0ZWRGcm9tID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdjcmVhdGVkX2Zyb20nKSBhcyBzdHJpbmdcbiAgICB0aGlzLnByb3ZpZGVycyA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygncHJvdmlkZXJzJykgYXMgYW55XG4gIH1cbiAgLyoqXG4gICAqIOiOt+WPluacrOWcsOeUqOaIt+S/oeaBry3lvILmraVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja0xvY2FsSW5mb0FzeW5jKCkge1xuICAgIHRoaXMudWlkID0gYXdhaXQgdGhpcy5nZXRMb2NhbFVzZXJJbmZvQXN5bmMoJ3VpZCcpXG4gICAgdGhpcy5nZW5kZXIgPSBhd2FpdCB0aGlzLmdldExvY2FsVXNlckluZm9Bc3luYygnZ2VuZGVyJylcbiAgICB0aGlzLnBpY3R1cmUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3BpY3R1cmUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmVtYWlsID0gYXdhaXQgdGhpcy5nZXRMb2NhbFVzZXJJbmZvQXN5bmMoJ2VtYWlsJylcbiAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2VtYWlsX3ZlcmlmaWVkJykgYXMgYm9vbGVhblxuICAgIHRoaXMucGhvbmVOdW1iZXIgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3Bob25lX251bWJlcicpIGFzIHN0cmluZ1xuICAgIHRoaXMudXNlcm5hbWUgPSBhd2FpdCB0aGlzLmdldExvY2FsVXNlckluZm9Bc3luYygndXNlcm5hbWUnKVxuICAgIHRoaXMubmFtZSA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnbmFtZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuYmlydGhkYXRlID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdiaXJ0aGRhdGUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLnpvbmVpbmZvID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCd6b25laW5mbycpIGFzIHN0cmluZ1xuICAgIHRoaXMubG9jYWxlID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdsb2NhbGUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLnN1YiA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnc3ViJykgYXMgc3RyaW5nXG4gICAgdGhpcy5jcmVhdGVkRnJvbSA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnY3JlYXRlZF9mcm9tJykgYXMgc3RyaW5nXG4gICAgdGhpcy5wcm92aWRlcnMgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3Byb3ZpZGVycycpIGFzIGFueVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOeUqOaIt+S/oeaBr1xuICAgKiBAcGFyYW0gdXNlckluZm9cbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfmm7TmlrDnlKjmiLfkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggVXNlci51cGRhdGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOeUqOaIt+S/oeaBr+S4reaYr+WQpuWMheWQq+mdnuazleWAvCcsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgdXBkYXRlKHVzZXJJbmZvOiBhdXRoTW9kZWxzLlVzZXJQcm9maWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gY29uc3QgeyBuYW1lLCBnZW5kZXIsIGF2YXRhclVybCwgcHJvdmluY2UsIGNvdW50cnksIGNpdHkgfSA9IHVzZXJJbmZvXG4gICAgY29uc3QgbmV3VXNlckluZm8gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zZXRVc2VyUHJvZmlsZSh7IC4uLnVzZXJJbmZvIH0pXG5cbiAgICB0aGlzLnNldExvY2FsVXNlckluZm8obmV3VXNlckluZm8pXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVXNlckJhc2ljSW5mbyhwYXJhbXM6IGF1dGhNb2RlbHMuTW9kaWZ5VXNlckJhc2ljSW5mb1JlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS51cGRhdGVVc2VyQmFzaWNJbmZvKHsgLi4ucGFyYW1zIH0pXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKClcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDlr4bnoIFcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkXG4gICAqIEBwYXJhbSBvbGRQYXNzd29yZFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+abtOaWsOWvhueggeWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBVc2VyLnVwZGF0ZVBhc3N3b3JkKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDMgLSDmlrDlr4bnoIHkuK3mmK/lkKbljIXlkKvpnZ7ms5XlrZfnrKYnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIHVwZGF0ZVBhc3N3b3JkKG5ld1Bhc3N3b3JkOiBzdHJpbmcsIG9sZFBhc3N3b3JkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudXBkYXRlUGFzc3dvcmRCeU9sZCh7XG4gICAgICBvbGRfcGFzc3dvcmQ6IG9sZFBhc3N3b3JkLFxuICAgICAgbmV3X3Bhc3N3b3JkOiBuZXdQYXNzd29yZCxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOeUqOaIt+WQjVxuICAgKiBAcGFyYW0gdXNlcm5hbWVcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfmm7TmlrDnlKjmiLflkI3lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggVXNlci51cGRhdGVVc2VybmFtZSgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN546v5aKD5piv5ZCm5byA6YCa5LqG55So5oi35ZCN5a+G56CB55m75b2VJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyB1cGRhdGVVc2VybmFtZSh1c2VybmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93RXJyb3IoRVJST1JTLklOVkFMSURfUEFSQU1TLCAndXNlcm5hbWUgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlKHtcbiAgICAgIHVzZXJuYW1lLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICog5Yi35paw5pys5Zyw55So5oi35L+h5oGv44CC5b2T55So5oi35Zyo5YW25LuW5a6i5oi356uv5pu05paw55So5oi35L+h5oGv5LmL5ZCO77yM5Y+v5Lul6LCD55So5q2k5o6l5Y+j5ZCM5q2l5pu05paw5LmL5ZCO55qE5L+h5oGv44CCXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn5Yi35paw5pys5Zyw55So5oi35L+h5oGv5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIFVzZXIucmVmcmVzaCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgcmVmcmVzaChwYXJhbXM/OiB7IHZlcnNpb24/OiBzdHJpbmc7IHF1ZXJ5PzogYW55IH0pOiBQcm9taXNlPGF1dGhNb2RlbHMuVXNlckluZm8+IHtcbiAgICBjb25zdCBuZXdVc2VySW5mbyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFVzZXJJbmZvKHBhcmFtcylcbiAgICBpZiAoKG5ld1VzZXJJbmZvIGFzIGFueSkuY29kZSA9PT0gJ0lOVkFMSURfQUNDRVNTX1RPS0VOJykge1xuICAgICAgdGhpcy5zZXRMb2NhbFVzZXJJbmZvKHt9KVxuICAgICAgdGhyb3cgbmV3VXNlckluZm9cbiAgICB9XG4gICAgdGhpcy5zZXRMb2NhbFVzZXJJbmZvKG5ld1VzZXJJbmZvKVxuICAgIHJldHVybiBuZXdVc2VySW5mb1xuICB9XG5cbiAgcHVibGljIGdldExvY2FsVXNlckluZm8oa2V5Pzogc3RyaW5nKTogc3RyaW5nIHwgYm9vbGVhbiB8IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHsgdXNlckluZm9LZXkgfSA9IHRoaXMuY2FjaGUua2V5c1xuICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5jYWNoZS5nZXRTdG9yZSh1c2VySW5mb0tleSlcblxuICAgIGlmICgha2V5KSByZXR1cm4gdXNlckluZm8gfHwge31cblxuICAgIHJldHVybiB1c2VySW5mb1trZXldXG4gIH1cblxuICBwdWJsaWMgc2V0TG9jYWxVc2VySW5mbyh1c2VySW5mbzogYW55KSB7XG4gICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgdGhpcy5jYWNoZS5zZXRTdG9yZSh1c2VySW5mb0tleSwgdXNlckluZm8pXG4gICAgdGhpcy5zZXRVc2VySW5mbygpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldExvY2FsVXNlckluZm9Bc3luYyhrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgY29uc3QgdXNlckluZm8gPSBhd2FpdCB0aGlzLmNhY2hlLmdldFN0b3JlQXN5bmModXNlckluZm9LZXkpXG4gICAgcmV0dXJuIHVzZXJJbmZvW2tleV1cbiAgfVxuXG4gIHByaXZhdGUgc2V0VXNlckluZm8oKSB7XG4gICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgY29uc3QgdXNlckluZm8gPSB0aGlzLmNhY2hlLmdldFN0b3JlKHVzZXJJbmZvS2V5KVxuICAgIDtbXG4gICAgICAndWlkJyxcbiAgICAgICdlbWFpbCcsXG4gICAgICAnbmFtZScsXG4gICAgICAnZ2VuZGVyJyxcbiAgICAgICdwaWN0dXJlJyxcbiAgICAgICdlbWFpbF92ZXJpZmllZCcsXG4gICAgICAncGhvbmVfbnVtYmVyJyxcbiAgICAgICdiaXJ0aGRhdGUnLFxuICAgICAgJ3pvbmVpbmZvJyxcbiAgICAgICdsb2NhbGUnLFxuICAgICAgJ3N1YicsXG4gICAgICAnY3JlYXRlZF9mcm9tJyxcbiAgICAgICdwcm92aWRlcnMnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgICdjcmVhdGVkX2F0JyxcbiAgICAgICdvcGVuX2lkJyxcbiAgICBdLmZvckVhY2goKGluZm9LZXkpID0+IHtcbiAgICAgIHRoaXNbaW5mb0tleV0gPSB1c2VySW5mb1tpbmZvS2V5XVxuICAgIH0pXG4gIH1cbn1cblxuLy8g5bqU55SoIHYxIOWFvOWuueaWueazleWIsCBVc2VyIOexu1xuYXBwbHlVc2VyVjFDb21wYXQoVXNlcilcblxuaW50ZXJmYWNlIElMb2dpblN0YXRlT3B0aW9ucyBleHRlbmRzIElVc2VyT3B0aW9ucyB7XG4gIGVudklkOiBzdHJpbmdcbn1cbmV4cG9ydCBjbGFzcyBMb2dpblN0YXRlIGltcGxlbWVudHMgSUxvZ2luU3RhdGUge1xuICBwdWJsaWMgdXNlcjogVXNlclxuICBwdWJsaWMgb2F1dGhMb2dpblN0YXRlOiBhbnlcblxuICBwcml2YXRlIG9hdXRoSW5zdGFuY2U6IENsb3VkYmFzZU9BdXRoXG4gIHByaXZhdGUgY2FjaGU6IElDbG91ZGJhc2VDYWNoZVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElMb2dpblN0YXRlT3B0aW9ucykge1xuICAgIGNvbnN0IHsgZW52SWQsIGNhY2hlLCBvYXV0aEluc3RhbmNlIH0gPSBvcHRpb25zXG4gICAgaWYgKCFlbnZJZCkge1xuICAgICAgdGhyb3dFcnJvcihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICdlbnZJZCBpcyBub3QgZGVmaW5lZCcpXG4gICAgfVxuICAgIHRoaXMuY2FjaGUgPSBjYWNoZVxuICAgIHRoaXMub2F1dGhJbnN0YW5jZSA9IG9hdXRoSW5zdGFuY2VcblxuICAgIHRoaXMudXNlciA9IG5ldyBVc2VyKHtcbiAgICAgIGNhY2hlOiB0aGlzLmNhY2hlLFxuICAgICAgb2F1dGhJbnN0YW5jZSxcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIGNoZWNrTG9jYWxTdGF0ZSgpIHtcbiAgICB0aGlzLm9hdXRoTG9naW5TdGF0ZSA9IHRoaXMub2F1dGhJbnN0YW5jZT8uYXV0aEFwaS5oYXNMb2dpblN0YXRlU3luYygpXG4gICAgdGhpcy51c2VyLmNoZWNrTG9jYWxJbmZvKClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjaGVja0xvY2FsU3RhdGVBc3luYygpIHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2U/LmF1dGhBcGkuZ2V0TG9naW5TdGF0ZSgpXG4gICAgYXdhaXQgdGhpcy51c2VyLmNoZWNrTG9jYWxJbmZvQXN5bmMoKVxuICB9XG59XG5cbmludGVyZmFjZSBJQXV0aENvbmZpZyBleHRlbmRzIElDbG91ZGJhc2VBdXRoQ29uZmlnIHtcbiAgY2FjaGU6IElDbG91ZGJhc2VDYWNoZVxuICByZXF1ZXN0PzogSUNsb3VkYmFzZVJlcXVlc3RcbiAgcnVudGltZT86IHN0cmluZ1xufVxuXG5jbGFzcyBBdXRoIGV4dGVuZHMgQXV0aFYxQ29tcGF0IHtcbiAgcmVhZG9ubHkgY29uZmlnOiBJQXV0aENvbmZpZ1xuICBvYXV0aEluc3RhbmNlOiBDbG91ZGJhc2VPQXV0aFxuICByZWFkb25seSBjYWNoZTogSUNsb3VkYmFzZUNhY2hlXG4gIHByaXZhdGUgbGlzdGVuZXJzOiBNYXA8c3RyaW5nLCBTZXQ8T25BdXRoU3RhdGVDaGFuZ2VDYWxsYmFjaz4+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgaGFzTGlzdGVuZXJTZXRVcCA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBJQXV0aENvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ1xuICAgIHRoaXMub2F1dGhJbnN0YW5jZSA9IGNvbmZpZy5vYXV0aEluc3RhbmNlXG4gICAgdGhpcy5jYWNoZSA9IGNvbmZpZy5jYWNoZVxuICAgIHRoaXMuaW5pdCgpXG4gICAgdGhpcy5zZXRBY2Nlc3NLZXkoKVxuICB9XG5cbiAgLy8gPT09PT09PT09PSBuZXcgYXV0aCBhcGkgbWV0aG9kcyBtZXJnZWQgYmVsb3cgPT09PT09PT09PVxuXG4gIC8qKlxuICAgKiDljL/lkI3nmbvlvZXjgILml6DpnIDnlKjmiLfms6jlhozljbPlj6/kvb/nlKjlupTnlKjlip/og73jgIJcbiAgICpcbiAgICogKirliY3nva7mnaHku7YqKu+8mumcgOimgeWcqOS6keW8gOWPkeaOp+WItuWPsOW8gOWQr+OAjOWMv+WQjeeZu+W9leOAjeOAglxuICAgKlxuICAgKiAqKumHjeimgSoq77ya5Yy/5ZCN55m75b2V5b+F6aG75Zyo5L2/55SoIHdhdGNoKCkg562J5a6e5pe25pWw5o2u5bqT5Yqf6IO95LmL5YmN5a6M5oiQ77yMXG4gICAqIOWQpuWImSBXZWJTb2NrZXQg6L+e5o6l5Lya5Zug57y65bCR6K6k6K+B5L+h5oGv6ICM5aSx6LSl44CCXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbmFub255bW91c2x5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgYXV0aC5zaWduSW5Bbm9ueW1vdXNseSgpO1xuICAgKiBpZiAoIWVycm9yKSB7XG4gICAqICAgY29uc29sZS5sb2coJ+eUqOaIt0lEOicsIGRhdGEudXNlci5pZCwgJ+aYr+WQpuWMv+WQjTonLCBkYXRhLnVzZXIuaXNfYW5vbnltb3VzKTtcbiAgICogICAvLyDnjrDlnKjlj6/ku6Xkvb/nlKggd2F0Y2goKSDnrYnlrp7ml7blip/og71cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyDlj6/pgInlj4LmlbBcbiAgICogQHJldHVybnMg55m75b2V57uT5p6c77yM5oiQ5Yqf5pe2IGRhdGEg5YyF5ZCrIHVzZXIg5ZKMIHNlc3Npb25cbiAgICovXG4gIGFzeW5jIHNpZ25JbkFub255bW91c2x5KHBhcmFtczogU2lnbkluQW5vbnltb3VzbHlSZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5Bbm9ueW1vdXNseShwYXJhbXMpXG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLihsb2dpblN0YXRlIGFzIGFueSksIGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgYXV0aEVycm9yID0gbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdzaWduSW5Bbm9ueW1vdXNseScgfSlcbiAgICAgIC8vIOWMv+WQjeeZu+W9leWksei0peaXtuaPkOS+m+aYjuehruaMh+W8lVxuICAgICAgaWYgKGF1dGhFcnJvci5jYXRlZ29yeSA9PT0gQXV0aEVycm9yQ2F0ZWdvcnkuUFJPVklERVJfTk9UX0VOQUJMRUQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihhdXRoRXJyb3IuaGVscE1lc3NhZ2UpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDbG91ZEJhc2UgQXV0aF0g5o+Q56S677ya5Yy/5ZCN55m75b2V6ZyA6KaB5Zyo5o6n5Yi25Y+w5byA5ZCv44CM5Yy/5ZCN55m75b2V44CN44CCXFxuJ1xuICAgICAgICAgICsgJyAg5aaC5p6c5oKo6ZyA6KaB5L2/55So55So5oi35ZCN5a+G56CB55m75b2V77yM6K+35pS555SoIGF1dGguc2lnbkluV2l0aFBhc3N3b3JkKHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0p44CCXFxuJ1xuICAgICAgICAgICsgJyAg5LiN6KaB5Zyo5Yy/5ZCN55m75b2V5aSx6LSl5ZCO6Ieq5Yqo5Zue6YCA5Yiw5a+G56CB55m75b2V77yM6L+Z5Lik56eN5pa55byP55qE5L2/55So5Zy65pmv5LiN5ZCM44CCJywpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtDbG91ZEJhc2UgQXV0aF0gc2lnbkluQW5vbnltb3VzbHkg5aSx6LSlIFske2F1dGhFcnJvci5jYXRlZ29yeX1dOiAke2F1dGhFcnJvci5tZXNzYWdlfWApXG4gICAgICAgIGlmIChhdXRoRXJyb3IubG9naW5NZXRob2RIaW50KSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGF1dGhFcnJvci5sb2dpbk1ldGhvZEhpbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogYXV0aEVycm9yIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ251cFxuICAgKiBTaWduIHVwIGEgbmV3IHVzZXIgd2l0aCBlbWFpbCBvciBwaG9uZSB1c2luZyBhIG9uZS10aW1lIHBhc3N3b3JkIChPVFApLiBJZiB0aGUgYWNjb3VudCBub3QgZXhpc3QsIGEgbmV3IGFjY291bnQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnblVwUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnblVwKHBhcmFtczogYXV0aE1vZGVscy5TaWduVXBSZXF1ZXN0ICYgeyBwaG9uZT86IHN0cmluZyB9KTogUHJvbWlzZTxTaWduVXBSZXM+IHtcbiAgICBpZiAocGFyYW1zLnBob25lX251bWJlciB8fCBwYXJhbXMudmVyaWZpY2F0aW9uX2NvZGUgfHwgcGFyYW1zLnZlcmlmaWNhdGlvbl90b2tlbiB8fCBwYXJhbXMucHJvdmlkZXJfdG9rZW4pIHtcbiAgICAgIGlmIChwYXJhbXMucGhvbmVfbnVtYmVyKSB7XG4gICAgICAgIHBhcmFtcy5waG9uZV9udW1iZXIgPSB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZV9udW1iZXIpXG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduVXAocGFyYW1zKVxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpIGFzIGFueVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yaZW1haWzmiJZwaG9uZeW/heWhq+WFtuS4gFxuICAgICAgdGhpcy52YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zLCBbWydlbWFpbCddLCBbJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbihwYXJhbXMuZW1haWwgPyB7IGVtYWlsOiBwYXJhbXMuZW1haWwgfSA6IHsgcGhvbmVfbnVtYmVyOiB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSkgfSwpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB2ZXJpZnlPdHA6IGFzeW5jICh7IHRva2VuLCBtZXNzYWdlSWQgPSB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCB9KTogUHJvbWlzZTxTaWduSW5SZXM+ID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIOesrOS4ieatpe+8muW+heeUqOaIt+i+k+WFpeWujOmqjOivgeeggeS5i+WQju+8jOmqjOivgeefreS/oemqjOivgeeggVxuICAgICAgICAgICAgICBjb25zdCB2ZXJpZmljYXRpb25Ub2tlblJlcyA9IGF3YWl0IHRoaXMudmVyaWZ5KHtcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25faWQ6IG1lc3NhZ2VJZCB8fCB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogdG9rZW4sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgLy8g56ys5Zub5q2l77ya5rOo5YaM5bm255m75b2V5oiW55u05o6l55m75b2VXG4gICAgICAgICAgICAgIC8vIOWmguaenOeUqOaIt+W3sue7j+WtmOWcqO+8jOebtOaOpeeZu+W9lVxuICAgICAgICAgICAgICBpZiAodmVyaWZpY2F0aW9uSW5mby5pc191c2VyKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zaWduSW4oe1xuICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6IHBhcmFtcy5lbWFpbCB8fCB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSksXG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fdG9rZW46IHZlcmlmaWNhdGlvblRva2VuUmVzLnZlcmlmaWNhdGlvbl90b2tlbixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIOWmguaenOeUqOaIt+S4jeWtmOWcqO+8jOazqOWGjOeUqOaIt1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcmFtcykpXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGEuZW1haWxcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YS5waG9uZVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnblVwKHtcbiAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAuLi4ocGFyYW1zLmVtYWlsID8geyBlbWFpbDogcGFyYW1zLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0pLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiB2ZXJpZmljYXRpb25Ub2tlblJlcy52ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogdG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdzaWduVXAnIH0pIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3NpZ25VcCcgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbm91dFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhdXRoLnNpZ25PdXQoKTtcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgc2lnbk91dChwYXJhbXM/OiBhdXRoTW9kZWxzLlNpZ25vdXRSZXF1ZXN0LCk6IFByb21pc2U8YXV0aE1vZGVscy5TaWdub3V0UmVzcG9uc2UgJiB7IGRhdGE6IE9iamVjdDsgZXJyb3I6IEF1dGhFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlckluZm9LZXkgfSA9IHRoaXMuY2FjaGUua2V5c1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbk91dChwYXJhbXMpXG4gICAgICBhd2FpdCB0aGlzLmNhY2hlLnJlbW92ZVN0b3JlQXN5bmModXNlckluZm9LZXkpXG4gICAgICB0aGlzLnNldEFjY2Vzc0tleSgpXG5cbiAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5MT0dJTl9TVEFURV9DSEFOR0VELCB7IGV2ZW50VHlwZTogTE9HSU5fU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05fT1VUIH0pXG5cbiAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05FRF9PVVQgfSlcblxuICAgICAgLy8gcmVz6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLnJlcywgZGF0YToge30sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3NpZ25PdXQnIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLW9uYXV0aHN0YXRlY2hhbmdlXG4gICAqIFJlY2VpdmUgYSBub3RpZmljYXRpb24gZXZlcnkgdGltZSBhbiBhdXRoIGV2ZW50IGhhcHBlbnMuXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyBQcm9taXNlPHsgZGF0YTogeyBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB9LCBlcnJvcjogRXJyb3IgfCBudWxsIH0+XG4gICAqL1xuICBvbkF1dGhTdGF0ZUNoYW5nZShjYWxsYmFjazogT25BdXRoU3RhdGVDaGFuZ2VDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5oYXNMaXN0ZW5lclNldFVwKSB7XG4gICAgICB0aGlzLnNldHVwTGlzdGVuZXJzKClcbiAgICAgIHRoaXMuaGFzTGlzdGVuZXJTZXRVcCA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpXG5cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLnNldChpZCwgbmV3IFNldCgpKVxuICAgIH1cblxuICAgIHRoaXMubGlzdGVuZXJzLmdldChpZCkhLmFkZChjYWxsYmFjaylcblxuICAgIC8vIOi/lOWbniBTdWJzY3JpcHRpb24g5a+56LGhXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0ge1xuICAgICAgaWQsXG4gICAgICBjYWxsYmFjayxcbiAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMubGlzdGVuZXJzLmdldChpZClcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spXG4gICAgICAgICAgaWYgKGNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUoaWQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiB7IHN1YnNjcmlwdGlvbiB9LFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aHBhc3N3b3JkXG4gICAqIExvZyBpbiBhbiBleGlzdGluZyB1c2VyIHdpdGggYW4gZW1haWwgYW5kIHBhc3N3b3JkIG9yIHBob25lIGFuZCBwYXNzd29yZCBvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoUGFzc3dvcmQocGFyYW1zOiBTaWduSW5XaXRoUGFzc3dvcmRSZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJp1c2VybmFtZS9lbWFpbC9waG9uZeS4iemAieS4gO+8jHBhc3N3b3Jk5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlQXRMZWFzdE9uZShcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBbWyd1c2VybmFtZSddLCBbJ2VtYWlsJ10sIFsncGhvbmUnXV0sXG4gICAgICAgICdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciB1c2VybmFtZSwgZW1haWwsIG9yIHBob25lJyxcbiAgICAgIClcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnNpZ25Jbih7XG4gICAgICAgIHVzZXJuYW1lOiBwYXJhbXMudXNlcm5hbWUgfHwgcGFyYW1zLmVtYWlsIHx8IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzd29yZCxcbiAgICAgICAgLi4uKHBhcmFtcy5pc19lbmNyeXB0ID8geyBpc0VuY3J5cHQ6IHRydWUsIHZlcnNpb246ICd2MicgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgYXV0aEVycm9yID0gbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdzaWduSW5XaXRoUGFzc3dvcmQnIH0pXG4gICAgICAvLyDmoLnmja7plJnor6/liIbnsbvovpPlh7rlr7nlupTnmoTlj6/mk43kvZzmgKfmjIflvJVcbiAgICAgIGlmIChhdXRoRXJyb3IuY2F0ZWdvcnkgPT09IEF1dGhFcnJvckNhdGVnb3J5LlBST1ZJREVSX05PVF9FTkFCTEVEKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYXV0aEVycm9yLmhlbHBNZXNzYWdlKVxuICAgICAgfSBlbHNlIGlmIChhdXRoRXJyb3IuY2F0ZWdvcnkgPT09IEF1dGhFcnJvckNhdGVnb3J5LklOVkFMSURfQ1JFREVOVElBTFMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGF1dGhFcnJvci5oZWxwTWVzc2FnZSlcbiAgICAgIH0gZWxzZSBpZiAoYXV0aEVycm9yLmNhdGVnb3J5ID09PSBBdXRoRXJyb3JDYXRlZ29yeS5VU0VSX05PVF9GT1VORCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYXV0aEVycm9yLmhlbHBNZXNzYWdlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbQ2xvdWRCYXNlIEF1dGhdIHNpZ25JbldpdGhQYXNzd29yZCDlpLHotKUgWyR7YXV0aEVycm9yLmNhdGVnb3J5fV06ICR7YXV0aEVycm9yLm1lc3NhZ2V9YClcbiAgICAgIH1cbiAgICAgIGlmIChhdXRoRXJyb3IubG9naW5NZXRob2RIaW50KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhhdXRoRXJyb3IubG9naW5NZXRob2RIaW50KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBhdXRoRXJyb3IgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aGlkdG9rZW5cbiAgICog56ys5LiJ5pa55bmz5Y+w55m75b2V44CC5aaC5p6c55So5oi35LiN5a2Y5Zyo77yM5Lya5qC55o2u5LqR5byA5Y+R5bmz5Y+wLeeZu+W9leaWueW8j+S4reWvueW6lOi6q+S7vea6kOeahOeZu+W9leaooeW8j+mFjee9ru+8jOWIpOaWreaYr+WQpuiHquWKqOazqOWGjFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aElkVG9rZW4ocGFyYW1zOiBTaWduSW5XaXRoSWRUb2tlblJlcSk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mnRva2Vu5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICB0b2tlbjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Rva2VuIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5zaWduSW5XaXRoUHJvdmlkZXIoe1xuICAgICAgICBwcm92aWRlcl90b2tlbjogcGFyYW1zLnRva2VuLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAnc2lnbkluV2l0aElkVG9rZW4nIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbndpdGhvdHBcbiAgICogTG9nIGluIGEgdXNlciB1c2luZyBhIG9uZS10aW1lIHBhc3N3b3JkIChPVFApLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluV2l0aE90cFJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhPdHAocGFyYW1zOiBTaWduSW5XaXRoT3RwUmVxKTogUHJvbWlzZTxTaWduSW5XaXRoT3RwUmVzPiB7XG4gICAgaWYgKCFwYXJhbXMub3B0aW9ucz8uZW1haWxSZWRpcmVjdFRvICYmIChwYXJhbXMub3B0aW9ucz8uc2hvdWxkQ3JlYXRlVXNlciA9PT0gdW5kZWZpbmVkIHx8ICEhcGFyYW1zLm9wdGlvbnM/LnNob3VsZENyZWF0ZVVzZXIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVXAoe1xuICAgICAgICBlbWFpbDogcGFyYW1zLmVtYWlsLFxuICAgICAgICBwaG9uZTogcGFyYW1zLnBob25lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yaZW1haWzmiJZwaG9uZeW/heWhq+WFtuS4gFxuICAgICAgdGhpcy52YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zLCBbWydlbWFpbCddLCBbJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih7XG4gICAgICAgIGVtYWlsX3JlZGlyZWN0X3RvOiBwYXJhbXMub3B0aW9ucz8uZW1haWxSZWRpcmVjdFRvLFxuICAgICAgICAuLi4ocGFyYW1zLmVtYWlsID8geyBlbWFpbDogcGFyYW1zLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0pLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHVzZXI6IG51bGwsXG4gICAgICAgICAgc2Vzc2lvbjogbnVsbCxcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB2ZXJpZnlPdHA6IGFzeW5jICh7IHRva2VuLCBtZXNzYWdlSWQgPSB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCB9KTogUHJvbWlzZTxTaWduSW5SZXM+ID0+IHRoaXMudmVyaWZ5T3RwKHtcbiAgICAgICAgICAgIGVtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgICAgICAgICBwaG9uZTogcGFyYW1zLnBob25lLFxuICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAnc2lnbkluV2l0aE90cCcgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoKHpqoznrKzkuInmlrnlubPlj7DmjojmnYPnmbvlvZXlm57osINcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHZlcmlmeU9BdXRoKHBhcmFtcz86IFZlcmlmeU9BdXRoUmVxKTogUHJvbWlzZTxWZXJpZnlPQXV0aFJlcz4ge1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWbnuiwg+iHsyBwcm92aWRlcl9yZWRpcmVjdF91cmkg5Zyw5Z2A77yIdXJsIHF1ZXJ55Lit5pC65bimIOaOiOadg2NvZGXvvIxzdGF0ZeetieWPguaVsO+8ie+8jOatpOaXtuajgOafpSBzdGF0ZSDmmK/lkKbnrKblkIjpooTmnJ/vvIjlpoIg6Ieq5bex6K6+572u55qEIHd4X29wZW4pXG4gICAgICBjb25zdCBjb2RlID0gcGFyYW1zPy5jb2RlIHx8IHV0aWxzLmdldFF1ZXJ5KCdjb2RlJylcbiAgICAgIGNvbnN0IHN0YXRlID0gcGFyYW1zPy5zdGF0ZSB8fCB1dGlscy5nZXRRdWVyeSgnc3RhdGUnKVxuXG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpjb2Rl5ZKMc3RhdGXlv4XloatcbiAgICAgIGlmICghY29kZSkge1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnQ29kZSBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6ICdTdGF0ZSBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWNoZURhdGEgPSBnZXRCcm93c2VyU2Vzc2lvbihzdGF0ZSlcbiAgICAgIGRhdGEudHlwZSA9IGNhY2hlRGF0YT8udHlwZVxuXG4gICAgICBjb25zdCBwcm92aWRlciA9IHBhcmFtcz8ucHJvdmlkZXIgfHwgY2FjaGVEYXRhPy5wcm92aWRlciB8fCB1dGlscy5nZXRRdWVyeSgncHJvdmlkZXInKVxuXG4gICAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogJ1Byb3ZpZGVyIGlzIHJlcXVpcmVkJyB9KSB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YXRl56ym5ZCI6aKE5pyf77yM5YiZ6I635Y+W6K+l5LiJ5pa55bmz5Y+wdG9rZW5cbiAgICAgIGNvbnN0IHsgcHJvdmlkZXJfdG9rZW46IHRva2VuIH0gPSBhd2FpdCB0aGlzLmdyYW50UHJvdmlkZXJUb2tlbih7XG4gICAgICAgIHByb3ZpZGVyX2lkOiBwcm92aWRlcixcbiAgICAgICAgcHJvdmlkZXJfcmVkaXJlY3RfdXJpOiBsb2NhdGlvbi5vcmlnaW4gKyBsb2NhdGlvbi5wYXRobmFtZSwgLy8g5oyH5a6a5LiJ5pa55bmz5Y+w6Lez5Zue55qEIHVybCDlnLDlnYBcbiAgICAgICAgcHJvdmlkZXJfY29kZTogY29kZSwgLy8g56ys5LiJ5pa55bmz5Y+w6Lez6L2s5Zue6aG16Z2i5pe277yMdXJsIHBhcmFtIOS4reaQuuW4pueahCBjb2RlIOWPguaVsFxuICAgICAgfSlcblxuICAgICAgbGV0IHJlczogVmVyaWZ5T0F1dGhSZXNcblxuICAgICAgaWYgKGNhY2hlRGF0YS50eXBlID09PSBPQVVUSF9UWVBFLkJJTkRfSURFTlRJVFkpIHtcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudG9CaW5kSWRlbnRpdHkoeyBwcm92aWRlcl90b2tlbjogdG9rZW4sIHByb3ZpZGVyLCBmaXJlRXZlbnQ6IHRydWUgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOmAmui/hyBwcm92aWRlcl90b2tlbiDku4XnmbvlvZXmiJbnmbvlvZXlubbms6jlhozvvIjkuI7kupHlvIDlj5HlubPlj7At55m75b2V5pa55byPLei6q+S7vea6kOeZu+W9leaooeW8j+mFjee9ruacieWFs++8iVxuICAgICAgICByZXMgPSBhd2FpdCB0aGlzLnNpZ25JbldpdGhJZFRva2VuKHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgfSlcbiAgICAgICAgcmVzLmRhdGEgPSB7IC4uLmRhdGEsIC4uLnJlcy5kYXRhIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jYWxTZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uPy5zZWFyY2gpXG4gICAgICBsb2NhbFNlYXJjaC5kZWxldGUoJ2NvZGUnKVxuICAgICAgbG9jYWxTZWFyY2guZGVsZXRlKCdzdGF0ZScpXG4gICAgICByZXMuZGF0YS5yZWRpcmVjdFVybCA9IGFkZFVybFNlYXJjaChcbiAgICAgICAgY2FjaGVEYXRhPy5zZWFyY2ggPT09IHVuZGVmaW5lZCA/IGA/JHtsb2NhbFNlYXJjaC50b1N0cmluZygpfWAgOiBjYWNoZURhdGE/LnNlYXJjaCxcbiAgICAgICAgY2FjaGVEYXRhPy5oYXNoIHx8IGxvY2F0aW9uLmhhc2gsXG4gICAgICApXG4gICAgICByZW1vdmVCcm93c2VyU2Vzc2lvbihzdGF0ZSlcblxuICAgICAgcmV0dXJuIHJlc1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhLCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICd2ZXJpZnlPQXV0aCcgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aG9hdXRoXG4gICAqIOeUn+aIkOesrOS4ieaWueW5s+WPsOaOiOadgyBVcmkg77yI5aaC5b6u5L+h5LqM57u056CB5omr56CB5o6I5p2D572R6aG177yJXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5PQXV0aFJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhPQXV0aChwYXJhbXM6IFNpZ25JbldpdGhPQXV0aFJlcSk6IFByb21pc2U8U2lnbkluT0F1dGhSZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yacHJvdmlkZXLlv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHByb3ZpZGVyOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUHJvdmlkZXIgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBocmVmID0gcGFyYW1zLm9wdGlvbnM/LnJlZGlyZWN0VG8gfHwgbG9jYXRpb24uaHJlZlxuXG4gICAgICBjb25zdCB1cmxPYmplY3QgPSBuZXcgVVJMKGhyZWYpXG5cbiAgICAgIGNvbnN0IHByb3ZpZGVyX3JlZGlyZWN0X3VyaSA9IHVybE9iamVjdC5vcmlnaW4gKyB1cmxPYmplY3QucGF0aG5hbWVcblxuICAgICAgY29uc3Qgc3RhdGUgPSBwYXJhbXMub3B0aW9ucz8uc3RhdGUgfHwgYHByZC0ke3BhcmFtcy5wcm92aWRlcn0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KVxuICAgICAgICAuc2xpY2UoMil9YFxuXG4gICAgICBjb25zdCB7IHVyaSB9ID0gYXdhaXQgdGhpcy5nZW5Qcm92aWRlclJlZGlyZWN0VXJpKHtcbiAgICAgICAgcHJvdmlkZXJfaWQ6IHBhcmFtcy5wcm92aWRlcixcbiAgICAgICAgcHJvdmlkZXJfcmVkaXJlY3RfdXJpLFxuICAgICAgICBzdGF0ZSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIOWvuSBVUkwg6L+b6KGM6Kej56CBXG4gICAgICBjb25zdCBkZWNvZGVkVXJpID0gZGVjb2RlVVJJQ29tcG9uZW50KHVyaSlcblxuICAgICAgLy8g5ZCI5bm26aKd5aSW55qE5p+l6K+i5Y+C5pWwXG4gICAgICBsZXQgZmluYWxVcmkgPSBkZWNvZGVkVXJpXG5cbiAgICAgIGlmIChwYXJhbXMub3B0aW9ucz8ucXVlcnlQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChkZWNvZGVkVXJpKVxuICAgICAgICBPYmplY3QuZW50cmllcyhwYXJhbXMub3B0aW9ucy5xdWVyeVBhcmFtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICAgICAgZmluYWxVcmkgPSB1cmwudG9TdHJpbmcoKVxuICAgICAgfVxuXG4gICAgICBzYXZlVG9Ccm93c2VyU2Vzc2lvbihzdGF0ZSwge1xuICAgICAgICBwcm92aWRlcjogcGFyYW1zLnByb3ZpZGVyLFxuICAgICAgICBzZWFyY2g6IHVybE9iamVjdC5zZWFyY2gsXG4gICAgICAgIGhhc2g6IHVybE9iamVjdC5oYXNoLFxuICAgICAgICB0eXBlOiBwYXJhbXMub3B0aW9ucz8udHlwZSB8fCBPQVVUSF9UWVBFLlNJR05fSU4sXG4gICAgICB9KVxuXG4gICAgICBpZiAoaXNCcm93c2VyKCkgJiYgIXBhcmFtcy5vcHRpb25zPy5za2lwQnJvd3NlclJlZGlyZWN0KSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZmluYWxVcmkpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXJsOiBmaW5hbFVyaSwgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdzaWduSW5XaXRoT0F1dGgnIH0pIH1cbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZ2V0Y2xhaW1zXG4gIGFzeW5jIGdldENsYWltcygpOiBQcm9taXNlPEdldENsYWltc1Jlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFjY2Vzc1Rva2VuIH0gPSBhd2FpdCB0aGlzLmdldEFjY2Vzc1Rva2VuKClcbiAgICAgIGNvbnN0IHBhcnNlZFRva2VuID0gd2VBcHBKd3REZWNvZGVBbGwoYWNjZXNzVG9rZW4pXG4gICAgICByZXR1cm4geyBkYXRhOiBwYXJzZWRUb2tlbiwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAnZ2V0Q2xhaW1zJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1yZXNldHBhc3N3b3JkZm9yZW1haWxcbiAgICog6YCa6L+HIGVtYWlsIOaIluaJi+acuuWPt+mHjee9ruWvhueggVxuICAgKiBAcGFyYW0gZW1haWxPclBob25lIOmCrueuseaIluaJi+acuuWPt1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcz5cbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRGb3JFbWFpbChcbiAgICBlbWFpbE9yUGhvbmU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyByZWRpcmVjdFRvPzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8UmVzZXRQYXNzd29yZEZvckVtYWlsUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWlsT3JQaG9uZeW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhcbiAgICAgICAgeyBlbWFpbE9yUGhvbmUgfSxcbiAgICAgICAge1xuICAgICAgICAgIGVtYWlsT3JQaG9uZTogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ0VtYWlsIG9yIHBob25lIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICBjb25zdCB7IHJlZGlyZWN0VG8gfSA9IG9wdGlvbnMgfHwge31cblxuICAgICAgLy8g5Yik5pat5piv6YKu566x6L+Y5piv5omL5py65Y+3XG4gICAgICBjb25zdCBpc0VtYWlsID0gZW1haWxPclBob25lLmluY2x1ZGVzKCdAJylcbiAgICAgIGxldCB2ZXJpZmljYXRpb25QYXJhbXM6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lX251bWJlcj86IHN0cmluZyB9XG5cbiAgICAgIGlmIChpc0VtYWlsKSB7XG4gICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgZW1haWw6IGVtYWlsT3JQaG9uZSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDmraPop4TljJbmiYvmnLrlj7dcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkUGhvbmUgPSB0aGlzLmZvcm1hdFBob25lKGVtYWlsT3JQaG9uZSlcbiAgICAgICAgdmVyaWZpY2F0aW9uUGFyYW1zID0geyBwaG9uZV9udW1iZXI6IGZvcm1hdHRlZFBob25lIH1cbiAgICAgIH1cblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih2ZXJpZmljYXRpb25QYXJhbXMpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB1cGRhdGVVc2VyOiBhc3luYyAoYXR0cmlidXRlczogVXBkYXRlVXNlckF0dHJpYnV0ZXMpOiBQcm9taXNlPFNpZ25JblJlcz4gPT4ge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICAgIG5vbmNlOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnTm9uY2UgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g56ys5LiJ5q2l77ya5b6F55So5oi36L6T5YWl5a6M6aqM6K+B56CB5LmL5ZCO77yM6aqM6K+B6aqM6K+B56CBXG4gICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblRva2VuUmVzID0gYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9pZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IGF0dHJpYnV0ZXMubm9uY2UsXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucmVzZXRQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgZW1haWw6IGlzRW1haWwgPyBlbWFpbE9yUGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGhvbmVfbnVtYmVyOiAhaXNFbWFpbCA/IGVtYWlsT3JQaG9uZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBuZXdfcGFzc3dvcmQ6IGF0dHJpYnV0ZXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiB2ZXJpZmljYXRpb25Ub2tlblJlcy52ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5QQVNTV09SRF9SRUNPVkVSWSxcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNpZ25JbldpdGhQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgZW1haWw6IGlzRW1haWwgPyBlbWFpbE9yUGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGhvbmU6ICFpc0VtYWlsID8gZW1haWxPclBob25lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBhdHRyaWJ1dGVzLnBhc3N3b3JkLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIGlmIChyZWRpcmVjdFRvICYmIGlzQnJvd3NlcigpKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihyZWRpcmVjdFRvKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3Jlc2V0UGFzc3dvcmRGb3JFbWFpbCcgfSkgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAncmVzZXRQYXNzd29yZEZvckVtYWlsJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/h+aXp+WvhueggemHjee9ruWvhueggVxuICAgKiBAcGFyYW0gbmV3X3Bhc3N3b3JkXG4gICAqIEBwYXJhbSBvbGRfcGFzc3dvcmRcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRGb3JPbGQocGFyYW1zOiBSZXNldFBhc3N3b3JkRm9yT2xkUmVxKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnVwZGF0ZVBhc3N3b3JkQnlPbGQoe1xuICAgICAgICBvbGRfcGFzc3dvcmQ6IHBhcmFtcy5vbGRfcGFzc3dvcmQsXG4gICAgICAgIG5ld19wYXNzd29yZDogcGFyYW1zLm5ld19wYXNzd29yZCxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAncmVzZXRQYXNzd29yZEZvck9sZCcgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtdmVyaWZ5b3RwXG4gICAqIExvZyBpbiBhIHVzZXIgZ2l2ZW4gYSBVc2VyIHN1cHBsaWVkIE9UUCBhbmQgdmVyaWZpY2F0aW9uSWQgcmVjZWl2ZWQgdGhyb3VnaCBtb2JpbGUgb3IgZW1haWwuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyB2ZXJpZnlPdHAocGFyYW1zOiBWZXJpZnlPdHBSZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHBhcmFtc1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yadG9rZW7lkox2ZXJpZmljYXRpb25JbmZv5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICB0b2tlbjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Rva2VuIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICBtZXNzYWdlSWQ6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdtZXNzYWdlSWQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBpZiAoWydwaG9uZV9jaGFuZ2UnLCAnZW1haWxfY2hhbmdlJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgIHZlcmlmaWNhdGlvbl9pZDogcGFyYW1zLm1lc3NhZ2VJZCxcbiAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogcGFyYW1zLnRva2VuLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICAgIHZlcmlmaWNhdGlvbkluZm86IHsgdmVyaWZpY2F0aW9uX2lkOiBwYXJhbXMubWVzc2FnZUlkLCBpc191c2VyOiB0cnVlIH0sXG4gICAgICAgICAgdmVyaWZpY2F0aW9uQ29kZTogcGFyYW1zLnRva2VuLFxuICAgICAgICAgIHVzZXJuYW1lOiBwYXJhbXMuZW1haWwgfHwgdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIHx8ICcnLFxuICAgICAgICAgIGxvZ2luVHlwZTogcGFyYW1zLmVtYWlsID8gJ2VtYWlsJyA6ICdwaG9uZScsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAndmVyaWZ5T3RwJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1nZXRTZXNzaW9uXG4gICAqIFJldHVybnMgdGhlIHNlc3Npb24sIHJlZnJlc2hpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIGdldFNlc3Npb24oKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5nZXRDcmVkZW50aWFscygpXG5cbiAgICAgIGlmICghY3JlZGVudGlhbHMgfHwgY3JlZGVudGlhbHMuc2NvcGUgPT09ICdhY2Nlc3NLZXknKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHsgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogbnVsbCB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyB1c2VyIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKGZhbHNlKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHNlc3Npb246IHsgLi4uY3JlZGVudGlhbHMsIHVzZXIgfSwgdXNlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdnZXRTZXNzaW9uJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1yZWZyZXNoc2Vzc2lvblxuICAgKiDml6Dorrrov4fmnJ/nirbmgIHlpoLkvZXvvIzpg73ov5Tlm57kuIDkuKrmlrDnmoTkvJror51cbiAgICogQHBhcmFtIHJlZnJlc2hfdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyByZWZyZXNoU2Vzc2lvbihyZWZyZXNoX3Rva2VuPzogc3RyaW5nKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5sb2NhbENyZWRlbnRpYWxzLmdldENyZWRlbnRpYWxzKClcbiAgICAgIGNyZWRlbnRpYWxzLnJlZnJlc2hfdG9rZW4gPSByZWZyZXNoX3Rva2VuIHx8IGNyZWRlbnRpYWxzLnJlZnJlc2hfdG9rZW5cbiAgICAgIGNvbnN0IG5ld1Rva2VucyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQucmVmcmVzaFRva2VuKGNyZWRlbnRpYWxzKVxuICAgICAgY29uc3QgeyBkYXRhOiB7IHVzZXIgfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoZmFsc2UpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciwgc2Vzc2lvbjogeyAuLi5uZXdUb2tlbnMsIHVzZXIgfSB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdyZWZyZXNoU2Vzc2lvbicgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZ2V0dXNlclxuICAgKiDlpoLmnpzlrZjlnKjnjrDmnInkvJror53vvIzliJnojrflj5blvZPliY3nlKjmiLfor6bnu4bkv6Hmga9cbiAgICogQHJldHVybnMgUHJvbWlzZTxHZXRVc2VyUmVzPlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcihpc1JlZnJlc2ggPSB0cnVlKTogUHJvbWlzZTxHZXRVc2VyUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNvbnZlcnRUb1VzZXIoYXdhaXQgdGhpcy5nZXRDdXJyZW50VXNlcihpc1JlZnJlc2gpKVxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ2dldFVzZXInIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Yi35paw55So5oi35L+h5oGvXG4gICAqIEByZXR1cm5zIFByb21pc2U8Q29tbW9uUmVzPlxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaFVzZXIoKTogUHJvbWlzZTxDb21tb25SZXM+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jdXJyZW50VXNlci5yZWZyZXNoKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAncmVmcmVzaFVzZXInIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXVwZGF0ZXVzZXJcbiAgICog5pu05paw55So5oi35L+h5oGvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxHZXRVc2VyUmVzIHwgVXBkYXRlVXNlcldpdGhWZXJpZmljYXRpb25SZXM+XG4gICAqL1xuICBhc3luYyB1cGRhdGVVc2VyKHBhcmFtczogVXBkYXRlVXNlclJlcSk6IFByb21pc2U8R2V0VXNlclJlcyB8IFVwZGF0ZVVzZXJXaXRoVmVyaWZpY2F0aW9uUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8muiHs+WwkeacieS4gOS4quabtOaWsOWtl+auteiiq+aPkOS+m1xuICAgICAgY29uc3QgaGFzVmFsdWUgPSBPYmplY3Qua2V5cyhwYXJhbXMpLnNvbWUoa2V5ID0+IHBhcmFtc1trZXldICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zW2tleV0gIT09IG51bGwgJiYgcGFyYW1zW2tleV0gIT09ICcnLClcbiAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6ICdBdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBwcm92aWRlZCBmb3IgdXBkYXRlJyB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGVtYWlsLCBwaG9uZSwgLi4ucmVzdFBhcmFtcyB9ID0gcGFyYW1zXG5cbiAgICAgIC8vIOajgOafpeaYr+WQpumcgOimgeabtOaWsCBlbWFpbCDmiJYgcGhvbmVcbiAgICAgIGNvbnN0IG5lZWRzRW1haWxWZXJpZmljYXRpb24gPSBlbWFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICBjb25zdCBuZWVkc1Bob25lVmVyaWZpY2F0aW9uID0gcGhvbmUgIT09IHVuZGVmaW5lZFxuXG4gICAgICBsZXQgZXh0cmFSZXMgPSB7fVxuXG4gICAgICBpZiAobmVlZHNFbWFpbFZlcmlmaWNhdGlvbiB8fCBuZWVkc1Bob25lVmVyaWZpY2F0aW9uKSB7XG4gICAgICAgIC8vIOmcgOimgeWPkemAgemqjOivgeeggVxuICAgICAgICBsZXQgdmVyaWZpY2F0aW9uUGFyYW1zOiB7IGVtYWlsPzogc3RyaW5nOyBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfVxuICAgICAgICBsZXQgdmVyaWZpY2F0aW9uVHlwZTogJ2VtYWlsX2NoYW5nZScgfCAncGhvbmVfY2hhbmdlJ1xuXG4gICAgICAgIGlmIChuZWVkc0VtYWlsVmVyaWZpY2F0aW9uKSB7XG4gICAgICAgICAgdmVyaWZpY2F0aW9uUGFyYW1zID0geyBlbWFpbDogcGFyYW1zLmVtYWlsIH1cbiAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlID0gJ2VtYWlsX2NoYW5nZSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDmraPop4TljJbmiYvmnLrlj7dcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRQaG9uZSA9IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKVxuICAgICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgcGhvbmVfbnVtYmVyOiBmb3JtYXR0ZWRQaG9uZSB9XG4gICAgICAgICAgdmVyaWZpY2F0aW9uVHlwZSA9ICdwaG9uZV9jaGFuZ2UnXG4gICAgICAgIH1cblxuICAgICAgICAvLyDlj5HpgIHpqozor4HnoIFcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uSW5mbyA9IGF3YWl0IHRoaXMuZ2V0VmVyaWZpY2F0aW9uKHZlcmlmaWNhdGlvblBhcmFtcylcblxuICAgICAgICBPYmplY3Qua2V5cyhyZXN0UGFyYW1zKS5sZW5ndGggPiAwICYmIChhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8ocmVzdFBhcmFtcykpXG5cbiAgICAgICAgZXh0cmFSZXMgPSB7XG4gICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICB2ZXJpZnlPdHA6IGFzeW5jICh2ZXJpZnlQYXJhbXM6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lPzogc3RyaW5nOyB0b2tlbjogc3RyaW5nIH0pOiBQcm9taXNlPEdldFVzZXJSZXM+ID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICh2ZXJpZnlQYXJhbXMuZW1haWwgJiYgcGFyYW1zLmVtYWlsID09PSB2ZXJpZnlQYXJhbXMuZW1haWwpIHtcbiAgICAgICAgICAgICAgICAvLyDpqozor4HnoIHpqozor4FcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeU90cCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZW1haWxfY2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgICAgICAgICAgICAgICB0b2tlbjogdmVyaWZ5UGFyYW1zLnRva2VuLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyh7IGVtYWlsOiBwYXJhbXMuZW1haWwgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJpZnlQYXJhbXMucGhvbmUgJiYgcGFyYW1zLnBob25lID09PSB2ZXJpZnlQYXJhbXMucGhvbmUpIHtcbiAgICAgICAgICAgICAgICAvLyDpqozor4HnoIHpqozor4FcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeU90cCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAncGhvbmVfY2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIHBob25lOiBwYXJhbXMucGhvbmUsXG4gICAgICAgICAgICAgICAgICB0b2tlbjogdmVyaWZ5UGFyYW1zLnRva2VuLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyh7IHBob25lOiB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSkgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeU90cCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiB2ZXJpZmljYXRpb25UeXBlLFxuICAgICAgICAgICAgICAgICAgZW1haWw6IG5lZWRzRW1haWxWZXJpZmljYXRpb24gPyBwYXJhbXMuZW1haWwgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBwaG9uZTogIW5lZWRzRW1haWxWZXJpZmljYXRpb24gPyBwYXJhbXMucGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB0b2tlbjogdmVyaWZ5UGFyYW1zLnRva2VuLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC8vIOmqjOivgeaIkOWKn+WQjuabtOaWsOeUqOaIt+S/oeaBr1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyhwYXJhbXMpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZGF0YTogeyB1c2VyIH0sXG4gICAgICAgICAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoZmFsc2UpXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlVTRVJfVVBEQVRFRCB9KVxuXG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAndXBkYXRlVXNlcicgfSkgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOS4jemcgOimgemqjOivge+8jOebtOaOpeabtOaWsFxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8ocGFyYW1zKVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7IHVzZXIgfSxcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoZmFsc2UpXG4gICAgICB0aGlzLmNvbmZpZy5ldmVudEJ1cz8uZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5VU0VSX1VQREFURUQgfSlcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyLCAuLi5leHRyYVJlcyB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICd1cGRhdGVVc2VyJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1nZXR1c2VyaWRlbnRpdGllc1xuICAgKiDojrflj5bmiYDmnInouqvku73mupBcbiAgICogQHJldHVybnMgUHJvbWlzZTxHZXRVc2VySWRlbnRpdGllc1Jlcz5cbiAgICovXG4gIGFzeW5jIGdldFVzZXJJZGVudGl0aWVzKCk6IFByb21pc2U8R2V0VXNlcklkZW50aXRpZXNSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0UHJvdmlkZXJzKClcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGlkZW50aXRpZXM6IHByb3ZpZGVycz8uZGF0YT8uZmlsdGVyKHYgPT4gISF2LmJpbmQpIGFzIHVua25vd24gYXMgR2V0VXNlcklkZW50aXRpZXNSZXNbJ2RhdGEnXVsnaWRlbnRpdGllcyddLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ2dldFVzZXJJZGVudGl0aWVzJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1saW5raWRlbnRpdHlcbiAgICog57uR5a6a6Lqr5Lu95rqQ5Yiw5b2T5YmN55So5oi3XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxMaW5rSWRlbnRpdHlSZXM+XG4gICAqL1xuICBhc3luYyBsaW5rSWRlbnRpdHkocGFyYW1zOiBMaW5rSWRlbnRpdHlSZXEpOiBQcm9taXNlPExpbmtJZGVudGl0eVJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpwcm92aWRlcuW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgcHJvdmlkZXI6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdQcm92aWRlciBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMuc2lnbkluV2l0aE9BdXRoKHtcbiAgICAgICAgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlcixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHR5cGU6IE9BVVRIX1RZUEUuQklORF9JREVOVElUWSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdsaW5rSWRlbnRpdHknIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXVubGlua2lkZW50aXR5XG4gICAqIOino+e7kei6q+S7vea6kFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8Q29tbW9uUmVzPlxuICAgKi9cbiAgYXN5bmMgdW5saW5rSWRlbnRpdHkocGFyYW1zOiBVbmxpbmtJZGVudGl0eVJlcSk6IFByb21pc2U8Q29tbW9uUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mnByb3ZpZGVy5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICBwcm92aWRlcjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Byb3ZpZGVyIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudW5iaW5kUHJvdmlkZXIoeyBwcm92aWRlcl9pZDogcGFyYW1zLnByb3ZpZGVyIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICd1bmxpbmtJZGVudGl0eScgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtcmVhdXRoZW50aWNhdGlvblxuICAgKiDph43mlrDorqTor4FcbiAgICogQHJldHVybnMgUHJvbWlzZTxSZWF1dGhlbnRpY2F0ZVJlcz5cbiAgICovXG4gIGFzeW5jIHJlYXV0aGVudGljYXRlKCk6IFByb21pc2U8UmVhdXRoZW50aWNhdGVSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7IHVzZXIgfSxcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoZmFsc2UpXG5cbiAgICAgIHRoaXMudmFsaWRhdGVBdExlYXN0T25lKHVzZXIsIFtbJ2VtYWlsJywgJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcbiAgICAgIGNvbnN0IHVzZXJJbmZvID0gdXNlci5lbWFpbCA/IHsgZW1haWw6IHVzZXIuZW1haWwgfSA6IHsgcGhvbmVfbnVtYmVyOiB0aGlzLmZvcm1hdFBob25lKHVzZXIucGhvbmUpIH1cblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih1c2VySW5mbylcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIC8vIOesrOS6jOatpe+8muetieW+heeUqOaIt+i+k+WFpemqjOivgeegge+8iOmAmui/hyBQcm9taXNlIOWMheijheeUqOaIt+i+k+WFpeS6i+S7tu+8iVxuICAgICAgICAgIHVwZGF0ZVVzZXI6IGFzeW5jIChhdHRyaWJ1dGVzOiBVcGRhdGVVc2VyQXR0cmlidXRlcyk6IFByb21pc2U8U2lnbkluUmVzPiA9PiB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgICAgbm9uY2U6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdOb25jZSBpcyByZXF1aXJlZCcgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIC8vIOesrOS4ieatpe+8muW+heeUqOaIt+i+k+WFpeWujOmqjOivgeeggeS5i+WQju+8jOmqjOivgemqjOivgeeggVxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblRva2VuUmVzID0gYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiBhdHRyaWJ1dGVzLm5vbmNlLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAvLyDnrKzlm5vmraXvvJrojrflj5Ygc3Vkb190b2tlblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1ZG9SZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zdWRvKHtcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl90b2tlbjogdmVyaWZpY2F0aW9uVG9rZW5SZXMudmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zZXRQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgICBuZXdfcGFzc3dvcmQ6IGF0dHJpYnV0ZXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICBzdWRvX3Rva2VuOiBzdWRvUmVzLnN1ZG9fdG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhVc2VybmFtZSh7XG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uQ29kZTogYXR0cmlidXRlcy5ub25jZSxcbiAgICAgICAgICAgICAgICAgIC4uLnVzZXJJbmZvLFxuICAgICAgICAgICAgICAgICAgbG9naW5UeXBlOiB1c2VySW5mby5lbWFpbCA/ICdlbWFpbCcgOiAncGhvbmUnLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3JlYXV0aGVudGljYXRlJyB9KSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdyZWF1dGhlbnRpY2F0ZScgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtcmVzZW5kXG4gICAqIOmHjeaWsOWPkemAgemqjOivgeeggVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8UmVzZW5kUmVzPlxuICAgKi9cbiAgYXN5bmMgcmVzZW5kKHBhcmFtczogUmVzZW5kUmVxKTogUHJvbWlzZTxSZXNlbmRSZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yaZW1haWzmiJZwaG9uZeW/heWhq+WFtuS4gFxuICAgICAgdGhpcy52YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zLCBbWydlbWFpbCddLCBbJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcblxuICAgICAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnR5cGUgPT09ICdzaWdudXAnID8gJ0FOWScgOiAnVVNFUidcbiAgICAgIGNvbnN0IGRhdGE6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lX251bWJlcj86IHN0cmluZzsgdGFyZ2V0OiAnVVNFUicgfCAnQU5ZJyB9ID0geyB0YXJnZXQgfVxuICAgICAgaWYgKCdlbWFpbCcgaW4gcGFyYW1zKSB7XG4gICAgICAgIGRhdGEuZW1haWwgPSBwYXJhbXMuZW1haWxcbiAgICAgIH1cblxuICAgICAgaWYgKCdwaG9uZScgaW4gcGFyYW1zKSB7XG4gICAgICAgIGRhdGEucGhvbmVfbnVtYmVyID0gdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpXG4gICAgICB9XG5cbiAgICAgIC8vIOmHjeaWsOWPkemAgemqjOivgeeggVxuICAgICAgY29uc3QgeyB2ZXJpZmljYXRpb25faWQ6IHZlcmlmaWNhdGlvbklkIH0gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRWZXJpZmljYXRpb24oZGF0YSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogeyBtZXNzYWdlSWQ6IHZlcmlmaWNhdGlvbklkIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHt9LFxuICAgICAgICBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdyZXNlbmQnIH0pLFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2V0c2Vzc2lvblxuICAgKiDkvb/nlKhhY2Nlc3NfdG9rZW7lkoxyZWZyZXNoX3Rva2Vu5p2l6K6+572u5Lya6K+dXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzZXRTZXNzaW9uKHBhcmFtczogU2V0U2Vzc2lvblJlcSk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIGFjY2Vzc190b2tlbjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ0FjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCcgfSxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1JlZnJlc2ggdG9rZW4gaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LnJlZnJlc2hUb2tlbihwYXJhbXMsIHsgdGhyb3dFcnJvcjogdHJ1ZSB9KVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05FRF9JTiB9KVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdzZXRTZXNzaW9uJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLWV4Y2hhbmdlY29kZWZvcnNlc3Npb25cbiAgYXN5bmMgZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbigpIHtcbiAgICAvL1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOW9k+WJjeeUqOaIt1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBkZWxldGVVc2VyKHBhcmFtczogRGVsZXRlTWVSZXEpOiBQcm9taXNlPENvbW1vblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICBwYXNzd29yZDogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgY29uc3QgeyBzdWRvX3Rva2VuIH0gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zdWRvKHBhcmFtcylcblxuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZGVsZXRlTWUoeyBzdWRvX3Rva2VuIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdkZWxldGVVc2VyJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOi3s+i9rOezu+e7n+m7mOiupOeZu+W9lemhtVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhdXRoTW9kZWxzLlRvRGVmYXVsdExvZ2luUGFnZT59XG4gICAqIEBtZW1iZXJvZiBBdXRoXG4gICAqL1xuICBhc3luYyB0b0RlZmF1bHRMb2dpblBhZ2UocGFyYW1zOiBhdXRoTW9kZWxzLlRvRGVmYXVsdExvZ2luUGFnZSA9IHt9KTogUHJvbWlzZTxDb21tb25SZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnVmVyc2lvbiA9IHBhcmFtcy5jb25maWdfdmVyc2lvbiB8fCAnZW52J1xuICAgICAgY29uc3QgcXVlcnkgPSBPYmplY3Qua2V5cyhwYXJhbXMucXVlcnkgfHwge30pXG4gICAgICAgIC5tYXAoa2V5ID0+IGAke2tleX09JHtwYXJhbXMucXVlcnlba2V5XX1gKVxuICAgICAgICAuam9pbignJicpXG5cbiAgICAgIGlmIChhZGFwdGVyRm9yV3hNcC5pc01hdGNoKCkpIHtcbiAgICAgICAgd3gubmF2aWdhdGVUbyh7IHVybDogYC9wYWNrYWdlcy8kd2Rfc3lzdGVtL3BhZ2VzL2xvZ2luL2luZGV4JHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVkaXJlY3RVcmkgPSBwYXJhbXMucmVkaXJlY3RfdXJpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmXG4gICAgICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwocmVkaXJlY3RVcmkpXG4gICAgICAgIGNvbnN0IGxvZ2luUGFnZSA9IGAke3VybE9iai5vcmlnaW59L19fYXV0aC8/YXBwX2lkPSR7cGFyYW1zLmFwcF9pZCB8fCAnJ30mZW52X2lkPSR7dGhpcy5jb25maWcuZW52fSZjbGllbnRfaWQ9JHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5jbGllbnRJZCB8fCB0aGlzLmNvbmZpZy5lbnZcbiAgICAgICAgfSZjb25maWdfdmVyc2lvbj0ke2NvbmZpZ1ZlcnNpb259JnJlZGlyZWN0X3VyaT0ke2VuY29kZVVSSUNvbXBvbmVudChyZWRpcmVjdFVyaSl9JHtxdWVyeSA/IGAmJHtxdWVyeX1gIDogJyd9YFxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGxvZ2luUGFnZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3RvRGVmYXVsdExvZ2luUGFnZScgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDoh6rlrprkuYnnmbvlvZVcbiAgICogQHBhcmFtIGdldFRpY2tGbiAoKSA9PiBQcm9taXNlPHN0cmluZz4sIOiOt+WPluiHquWumuS5ieeZu+W9lSB0aWNrZXQg55qE5Ye95pWwXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoQ3VzdG9tVGlja2V0KGdldFRpY2tGbj86IGF1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZuKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICBpZiAoZ2V0VGlja0ZuKSB7XG4gICAgICB0aGlzLnNldEN1c3RvbVNpZ25GdW5jKGdldFRpY2tGbilcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aEN1c3RvbVRpY2tldCgpXG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLihsb2dpblN0YXRlIGFzIGFueSksIGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3NpZ25JbldpdGhDdXN0b21UaWNrZXQnIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5bCP56iL5bqPb3Blbklk6Z2Z6buY55m75b2VXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoT3BlbklkKHsgdXNlV3hDbG91ZCA9IHRydWUgfSA9IHt9KTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICBpZiAoIWFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3d4IGFwaSB1bmRlZmluZWQnKVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuXG4gICAgY29uc3QgbWFpbkZ1bmMgPSBhc3luYyAoY29kZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogYXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICAgICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4oXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICBwcm92aWRlcl9jb2RlOiBjb2RlLFxuICAgICAgICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ29wZW5faWQnLFxuICAgICAgICAgICAgICBhcHBpZDogd3hJbmZvPy5hcHBJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VXeENsb3VkLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKChyZXN1bHQgYXMgYW55KT8uZXJyb3JfY29kZSB8fCAhcmVzdWx0LnByb3ZpZGVyX3Rva2VuKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBjcmVkZW50aWFscyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbldpdGhQcm92aWRlcihcbiAgICAgICAgICB7IHByb3ZpZGVyX3Rva2VuOiByZXN1bHQucHJvdmlkZXJfdG9rZW4gfSxcbiAgICAgICAgICB1c2VXeENsb3VkLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKChjcmVkZW50aWFscyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgICAgdGhyb3cgY3JlZGVudGlhbHNcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQuc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHMgYXMgQ3JlZGVudGlhbHMpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3gubG9naW4oe1xuICAgICAgICAgIHN1Y2Nlc3M6IGFzeW5jIChyZXM6IHsgY29kZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IG1haW5GdW5jKHJlcy5jb2RlKVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmYWlsOiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHJlcz8uZXJyTXNnKVxuICAgICAgICAgICAgOyhlcnJvciBhcyBhbnkpLmNvZGUgPSByZXM/LmVycm5vXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIC8vIGxvZ2luU3RhdGXov5Tlm57mmK/kuLrkuoblhbzlrrl2MueJiOacrFxuICAgICAgcmV0dXJuIHsgLi4uKGxvZ2luU3RhdGUgYXMgYW55KSwgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAnc2lnbkluV2l0aE9wZW5JZCcgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlsI/nqIvluo/miYvmnLrlj7fmjojmnYPnmbvlvZVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhQaG9uZUF1dGgoeyBwaG9uZUNvZGUgPSAnJywgdXNlV3hDbG91ZCA9IGZhbHNlIH0pOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnd3ggYXBpIHVuZGVmaW5lZCcgfSkgfVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuICAgIGNvbnN0IHByb3ZpZGVySW5mbyA9IHtcbiAgICAgIHByb3ZpZGVyX3BhcmFtczogeyBwcm92aWRlcl9jb2RlX3R5cGU6ICdwaG9uZScsIGNvZGU6IHBob25lQ29kZSwgYXBwaWQ6IHd4SW5mby5hcHBJZCB9LFxuICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mby5hcHBJZCxcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHd4LmxvZ2luKClcbiAgICA7KHByb3ZpZGVySW5mbyBhcyBhbnkpLnByb3ZpZGVyX2NvZGUgPSBjb2RlXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvdmlkZXJUb2tlbiA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdyYW50UHJvdmlkZXJUb2tlbihwcm92aWRlckluZm8sIHVzZVd4Q2xvdWQpXG4gICAgICBpZiAocHJvdmlkZXJUb2tlbi5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHByb3ZpZGVyVG9rZW5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2lnbkluUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKHtcbiAgICAgICAgcHJvdmlkZXJfdG9rZW46IHByb3ZpZGVyVG9rZW4ucHJvdmlkZXJfdG9rZW4sXG4gICAgICB9LCB1c2VXeENsb3VkKVxuXG4gICAgICBpZiAoKHNpZ25JblJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHNpZ25JblJlc1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAnc2lnbkluV2l0aFBob25lQXV0aCcgfSkgfVxuICAgIH1cblxuICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuXG4gICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgLy8gbG9naW5TdGF0Zei/lOWbnuaYr+S4uuS6huWFvOWuuXYy54mI5pysXG4gICAgcmV0dXJuIHsgLi4uKGxvZ2luU3RhdGUgYXMgYW55KSwgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICB9XG5cbiAgLyoqXG4gICAqIOe7keWumuaJi+acuuWPt1xuICAgKiBAcGFyYW0gcGhvbmVOdW1iZXJcbiAgICogQHBhcmFtIHBob25lQ29kZVxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+e7keWumuaJi+acuuWPt+Wksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuYmluZFBob25lTnVtYmVyKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3njq/looPmmK/lkKblvIDpgJrkuobnn63kv6Hpqozor4HnoIHnmbvlvZUnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGJpbmRQaG9uZU51bWJlcihwYXJhbXM6IGF1dGhNb2RlbHMuQmluZFBob25lUmVxdWVzdCkge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5lZGl0Q29udGFjdChwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICog6Kej57uR5LiJ5pa557uR5a6aXG4gICAqIEBwYXJhbSBsb2dpblR5cGVcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfop6PpmaTkuInmlrnnu5HlrprlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLnVuYmluZFByb3ZpZGVyKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3otKbmiLfmmK/lkKblt7Lnu4/kuI7mraTnmbvlvZXmlrnlvI/op6Pnu5EnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHVuYmluZFByb3ZpZGVyKHBhcmFtczogYXV0aE1vZGVscy5VbmJpbmRQcm92aWRlclJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudW5iaW5kUHJvdmlkZXIocGFyYW1zKVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOmCrueuseWcsOWdgFxuICAgKiBAcGFyYW0gZW1haWxcbiAgICogQHBhcmFtIHN1ZG9fdG9rZW5cbiAgICogQHBhcmFtIHZlcmlmaWNhdGlvbl90b2tlblxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+e7keWumumCrueuseWcsOWdgOWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuYmluZEVtYWlsKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3njq/looPmmK/lkKblvIDpgJrkuobpgq7nrrHlr4bnoIHnmbvlvZUnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGJpbmRFbWFpbChwYXJhbXM6IGF1dGhNb2RlbHMuQmluZEVtYWlsUmVxdWVzdCkge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5lZGl0Q29udGFjdChwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICogdmVyaWZ5XG4gICAqIEBwYXJhbSB7YXV0aE1vZGVscy5WZXJpZnlSZXF1ZXN0fSBwYXJhbXNcbiAgICogQHJldHVybnMge1Byb21pc2U8YXV0aE1vZGVscy5WZXJpZnlSZXNwb25zZT59XG4gICAqIEBtZW1iZXJvZiBVc2VyXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6aqM6K+B56CB6aqM6K+B5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS52ZXJpZnkoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOmAmuS6huaJi+acuumqjOivgeeggS/pgq7nrrHnmbvlvZUnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHZlcmlmeShwYXJhbXM6IGF1dGhNb2RlbHMuVmVyaWZ5UmVxdWVzdCk6IFByb21pc2U8YXV0aE1vZGVscy5WZXJpZnlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS52ZXJpZnkocGFyYW1zKVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumqjOivgeeggVxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuR2V0VmVyaWZpY2F0aW9uUmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGF1dGhNb2RlbHMuR2V0VmVyaWZpY2F0aW9uUmVzcG9uc2U+fVxuICAgKiBAbWVtYmVyb2YgVXNlclxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+iOt+WPlumqjOivgeeggeWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuZ2V0VmVyaWZpY2F0aW9uKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3njq/looPmmK/lkKblvIDpgJrkuobmiYvmnLrpqozor4HnoIEv6YKu566x55m75b2VJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBnZXRWZXJpZmljYXRpb24oXG4gICAgcGFyYW1zOiBhdXRoTW9kZWxzLkdldFZlcmlmaWNhdGlvblJlcXVlc3QsXG4gICAgb3B0aW9ucz86IHsgd2l0aENhcHRjaGE6IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxhdXRoTW9kZWxzLkdldFZlcmlmaWNhdGlvblJlc3BvbnNlPiB7XG4gICAgaWYgKHBhcmFtcy5waG9uZV9udW1iZXIpIHtcbiAgICAgIHBhcmFtcy5waG9uZV9udW1iZXIgPSB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZV9udW1iZXIpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRWZXJpZmljYXRpb24ocGFyYW1zLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeeZu+W9leeahOeUqOaIt+S/oeaBry3lkIzmraVcbiAgICovXG4gIGdldCBjdXJyZW50VXNlcigpIHtcbiAgICBpZiAodGhpcy5jYWNoZS5tb2RlID09PSAnYXN5bmMnKSB7XG4gICAgICAvLyBhc3luYyBzdG9yYWdl55qE5bmz5Y+w6LCD55So5q2kQVBJ5o+Q56S6XG4gICAgICBwcmludFdhcm4oXG4gICAgICAgIEVSUk9SUy5JTlZBTElEX09QRVJBVElPTixcbiAgICAgICAgJ2N1cnJlbnQgcGxhdGZvcm1cXCdzIHN0b3JhZ2UgaXMgYXN5bmNocm9ub3VzLCBwbGVhc2UgdXNlIGdldEN1cnJlbnRVc2VyIGluc3RlYWQnLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IHRoaXMuaGFzTG9naW5TdGF0ZSgpXG5cbiAgICBpZiAobG9naW5TdGF0ZSkge1xuICAgICAgcmV0dXJuIGxvZ2luU3RhdGUudXNlciB8fCBudWxsXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5YmN55m75b2V55qE55So5oi35L+h5oGvLeW8guatpVxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+iOt+WPlueUqOaIt+S/oeaBr+Wksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuZ2V0Q3VycmVudFVzZXIoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKGlzUmVmcmVzaCA9IHRydWUpOiBQcm9taXNlPChhdXRoTW9kZWxzLlVzZXJJbmZvICYgUGFydGlhbDxVc2VyPikgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc1JlZnJlc2gpIHtcbiAgICAgICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TG9naW5TdGF0ZSgpXG4gICAgICAgIGlmIChsb2dpblN0YXRlKSB7XG4gICAgICAgICAgLy8g5q+P5qyh6YO95Y+R6K+35rGC6I635Y+W5pyA5paw55So5oi35L+h5oGv77yM5LiN6LWw57yT5a2YXG4gICAgICAgICAgYXdhaXQgbG9naW5TdGF0ZS51c2VyLnJlZnJlc2goKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vXG4gICAgfVxuXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TG9naW5TdGF0ZSgpXG4gICAgaWYgKGxvZ2luU3RhdGUpIHtcbiAgICAgIGNvbnN0IHVzZXJJbmZvID0gbG9naW5TdGF0ZS51c2VyLmdldExvY2FsVXNlckluZm8oKSBhcyBhdXRoTW9kZWxzLlVzZXJJbmZvXG4gICAgICBhd2FpdCBsb2dpblN0YXRlLnVzZXIuY2hlY2tMb2NhbEluZm9Bc3luYygpXG4gICAgICByZXR1cm4geyAuLi5sb2dpblN0YXRlLnVzZXIsIC4uLnVzZXJJbmZvIH0gYXMgdW5rbm93biBhcyBhdXRoTW9kZWxzLlVzZXJJbmZvICYgUGFydGlhbDxVc2VyPlxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIOWMv+WQjeeZu+W9lVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICflsI/nqIvluo/ljL/lkI3nmbvlvZXlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuobljL/lkI3nmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnbkluQW5vbnltb3VzbHlJbld4KCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBzaWduSW5Bbm9ueW1vdXNseUluV3goe1xuICAgIHVzZVd4Q2xvdWQsXG4gIH06IHtcbiAgICB1c2VXeENsb3VkPzogYm9vbGVhblxuICB9ID0ge30pOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgICBpZiAoIWFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3d4IGFwaSB1bmRlZmluZWQnKVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuXG4gICAgY29uc3QgbWFpbkZ1bmMgPSBhc3luYyAoY29kZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogYXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICAgICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4oXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICBwcm92aWRlcl9jb2RlOiBjb2RlLFxuICAgICAgICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ29wZW5faWQnLFxuICAgICAgICAgICAgICBhcHBpZDogd3hJbmZvPy5hcHBJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VXeENsb3VkLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKChyZXN1bHQgYXMgYW55KT8uZXJyb3JfY29kZSB8fCAhcmVzdWx0LnByb3ZpZGVyX3Rva2VuKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBjcmVkZW50aWFscyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbkFub255bW91c2x5KFxuICAgICAgICAgIHsgcHJvdmlkZXJfdG9rZW46IHJlc3VsdC5wcm92aWRlcl90b2tlbiB9LFxuICAgICAgICAgIHVzZVd4Q2xvdWQsXG4gICAgICAgIClcblxuICAgICAgICBpZiAoKGNyZWRlbnRpYWxzIGFzIGFueSk/LmVycm9yX2NvZGUpIHtcbiAgICAgICAgICB0aHJvdyBjcmVkZW50aWFsc1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHd4LmxvZ2luKHtcbiAgICAgICAgc3VjY2VzczogYXN5bmMgKHJlczogeyBjb2RlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtYWluRnVuYyhyZXMuY29kZSlcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IocmVzPy5lcnJNc2cpXG4gICAgICAgICAgOyhlcnJvciBhcyBhbnkpLmNvZGUgPSByZXM/LmVycm5vXG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSh1bmRlZmluZWQsIHsgYXN5bmNSZWZyZXNoVXNlcjogdHJ1ZSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j+e7keWumk9wZW5JRFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICflsI/nqIvluo/nu5HlrppPcGVuSUTlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuoblsI/nqIvluo9vcGVuSWTpnZnpu5jnmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuYmluZE9wZW5JZCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgYmluZE9wZW5JZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3d4IGFwaSB1bmRlZmluZWQnKVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuXG4gICAgY29uc3QgbWFpbkZ1bmMgPSBhc3luYyAoY29kZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogYXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4oe1xuICAgICAgICAgIHByb3ZpZGVyX2lkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgIHByb3ZpZGVyX2NvZGU6IGNvZGUsXG4gICAgICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gICAgICAgICAgICBwcm92aWRlcl9jb2RlX3R5cGU6ICdvcGVuX2lkJyxcbiAgICAgICAgICAgIGFwcGlkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKChyZXN1bHQgYXMgYW55KT8uZXJyb3JfY29kZSB8fCAhcmVzdWx0LnByb3ZpZGVyX3Rva2VuKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5iaW5kV2l0aFByb3ZpZGVyKHsgcHJvdmlkZXJfdG9rZW46IHJlc3VsdC5wcm92aWRlcl90b2tlbiB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB3eC5sb2dpbih7XG4gICAgICAgIHN1Y2Nlc3M6IGFzeW5jIChyZXM6IHsgY29kZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgbWFpbkZ1bmMocmVzLmNvZGUpXG4gICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGZhaWw6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHJlcz8uZXJyTXNnKVxuICAgICAgICAgIDsoZXJyb3IgYXMgYW55KS5jb2RlID0gcmVzPy5lcnJub1xuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVyblxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j3VuaW9uSWTpnZnpu5jnmbvlvZVcbiAgICogQHJldHVybnMge1Byb21pc2U8TG9naW5TdGF0ZT59XG4gICAqIEBtZW1iZXJvZiBBdXRoXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn5bCP56iL5bqPdW5pb25JZOmdmem7mOeZu+W9leWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huWwj+eoi+W6j3VuaW9uSWTpnZnpu5jnmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnbkluV2l0aFVuaW9uSWQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHNpZ25JbldpdGhVbmlvbklkKCk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICB0aHJvdyBFcnJvcignd3ggYXBpIHVuZGVmaW5lZCcpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHd4SW5mbyA9IHd4LmdldEFjY291bnRJbmZvU3luYygpLm1pbmlQcm9ncmFtXG4gICAgICAgIHd4LmxvZ2luKHtcbiAgICAgICAgICBzdWNjZXNzOiBhc3luYyAocmVzOiB7IGNvZGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm92aWRlcklkID0gd3hJbmZvPy5hcHBJZFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKHtcbiAgICAgICAgICAgICAgICBwcm92aWRlcl9jb2RlOiByZXMuY29kZSxcbiAgICAgICAgICAgICAgICBwcm92aWRlcl9pZDogcHJvdmlkZXJJZCxcbiAgICAgICAgICAgICAgICBwcm92aWRlcl9wYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ3VuaW9uX2lkJyxcbiAgICAgICAgICAgICAgICAgIGFwcGlkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgY29uc3QgeyBwcm92aWRlcl90b2tlbjogcHJvdmlkZXJUb2tlbiB9ID0gcmVzdWx0XG5cbiAgICAgICAgICAgICAgaWYgKCFwcm92aWRlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHNpZ25JblJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbldpdGhQcm92aWRlcih7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJfaWQ6IHByb3ZpZGVySWQsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJfdG9rZW46IHByb3ZpZGVyVG9rZW4sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgaWYgKChzaWduSW5SZXMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChzaWduSW5SZXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihyZXM/LmVyck1zZylcbiAgICAgICAgICAgIDsoZXJyb3IgYXMgYW55KS5jb2RlID0gcmVzPy5lcnJub1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j+efreS/oemqjOivgeeggeeZu+mZhlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnn63kv6Hpqozor4HnoIHnmbvpmYYnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuoblsI/nqIvluo/nn63kv6Hpqozor4HnoIHnmbvpmYYnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnbkluV2l0aFNtcygpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFNtcyh7XG4gICAgdmVyaWZpY2F0aW9uSW5mbyA9IHsgdmVyaWZpY2F0aW9uX2lkOiAnJywgaXNfdXNlcjogZmFsc2UgfSxcbiAgICB2ZXJpZmljYXRpb25Db2RlID0gJycsXG4gICAgcGhvbmVOdW0gPSAnJyxcbiAgICBiaW5kSW5mbyA9IHVuZGVmaW5lZCxcbiAgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgICBiaW5kSW5mbyxcbiAgICAgICAgdXNlcm5hbWU6IHBob25lTnVtLFxuICAgICAgICBsb2dpblR5cGU6ICdzbXMnLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YKu566x6aqM6K+B56CB55m76ZmGXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+mCrueusemqjOivgeeggeeZu+mZhicsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6humCrueuseeZu+mZhicsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoRW1haWwoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHNpZ25JbldpdGhFbWFpbCh7XG4gICAgdmVyaWZpY2F0aW9uSW5mbyA9IHsgdmVyaWZpY2F0aW9uX2lkOiAnJywgaXNfdXNlcjogZmFsc2UgfSxcbiAgICB2ZXJpZmljYXRpb25Db2RlID0gJycsXG4gICAgYmluZEluZm8gPSB1bmRlZmluZWQsXG4gICAgZW1haWwgPSAnJyxcbiAgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgICBiaW5kSW5mbyxcbiAgICAgICAgdXNlcm5hbWU6IGVtYWlsLFxuICAgICAgICBsb2dpblR5cGU6ICdlbWFpbCcsXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7ojrflj5boh6rlrprkuYnnmbvlvZUgdGlja2V0IOWHveaVsFxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZufSBnZXRUaWNrRm5cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIHB1YmxpYyBzZXRDdXN0b21TaWduRnVuYyhnZXRUaWNrRm46IGF1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZuKTogdm9pZCB7XG4gICAgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2V0Q3VzdG9tU2lnbkZ1bmMoZ2V0VGlja0ZuKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgLy8gQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgLy8gICB0aXRsZTogJ+iHquWumuS5ieeZu+W9leWksei0pScsXG4gIC8vICAgbWVzc2FnZXM6IFtcbiAgLy8gICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAvLyAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huiHquWumuS5ieeZu+W9lScsXG4gIC8vICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoQ3VzdG9tVGlja2V0KCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgLy8gICAgICcgIDMgLSB0aWNrZXQg5piv5ZCm5b2S5bGe5LqO5b2T5YmN546v5aKDJyxcbiAgLy8gICAgICcgIDQgLSDliJvlu7ogdGlja2V0IOeahOiHquWumuS5ieeZu+W9leengemSpeaYr+WQpui/h+acnycsXG4gIC8vICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgLy8gICBdLFxuICAvLyB9KVxuICAvLyBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aEN1c3RvbVRpY2tldCgpOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgLy8gICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoQ3VzdG9tVGlja2V0KClcbiAgLy8gICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgLy8gfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuU2lnbkluUmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNpZ25JbihwYXJhbXM6IGF1dGhNb2RlbHMuU2lnbkluUmVxdWVzdCk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbihwYXJhbXMpXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZShwYXJhbXMpXG4gIH1cblxuICAvLyAvKipcbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIHthdXRoTW9kZWxzLlNpZ25VcFJlcXVlc3R9IHBhcmFtc1xuICAvLyAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgLy8gICogQG1lbWJlcm9mIEF1dGhcbiAgLy8gICovXG4gIC8vIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gIC8vICAgdGl0bGU6ICfms6jlhozlpLHotKUnLFxuICAvLyAgIG1lc3NhZ2VzOiBbXG4gIC8vICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgLy8gICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuobmjIflrprnmbvlvZXmlrnlvI8nLFxuICAvLyAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnblVwKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgLy8gICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAvLyAgIF0sXG4gIC8vIH0pXG4gIC8vIHB1YmxpYyBhc3luYyBzaWduVXAocGFyYW1zOiBhdXRoTW9kZWxzLlNpZ25VcFJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAvLyAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25VcChwYXJhbXMpXG4gIC8vICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIC8vIH1cblxuICAvKipcbiAgICog6K6+572u5a+G56CBXG4gICAqIEBwYXJhbSB7YXV0aE1vZGVscy5TZXRQYXNzd29yZFJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRQYXNzd29yZChwYXJhbXM6IGF1dGhNb2RlbHMuU2V0UGFzc3dvcmRSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNldFBhc3N3b3JkKHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiDmo4DmtYvnlKjmiLflkI3mmK/lkKblt7Lnu4/ljaDnlKhcbiAgICogQHBhcmFtIHVzZXJuYW1lXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W55So5oi35piv5ZCm6KKr5Y2g55So5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS5pc1VzZXJuYW1lUmVnaXN0ZXJlZCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgaXNVc2VybmFtZVJlZ2lzdGVyZWQodXNlcm5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0eXBlb2YgdXNlcm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ3VzZXJuYW1lIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgZXhpc3QgfSA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmNoZWNrSWZVc2VyRXhpc3QoeyB1c2VybmFtZSB9KVxuICAgIHJldHVybiBleGlzdFxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluacrOWcsOeZu+W9leaAgS3lkIzmraVcbiAgICovXG4gIHB1YmxpYyBoYXNMb2dpblN0YXRlKCk6IExvZ2luU3RhdGUgfCBudWxsIHtcbiAgICBpZiAodGhpcy5jYWNoZS5tb2RlID09PSAnYXN5bmMnKSB7XG4gICAgICAvLyBhc3luYyBzdG9yYWdl55qE5bmz5Y+w6LCD55So5q2kQVBJ5o+Q56S6XG4gICAgICBwcmludFdhcm4oXG4gICAgICAgIEVSUk9SUy5JTlZBTElEX09QRVJBVElPTixcbiAgICAgICAgJ2N1cnJlbnQgcGxhdGZvcm1cXCdzIHN0b3JhZ2UgaXMgYXN5bmNocm9ub3VzLCBwbGVhc2UgdXNlIGdldExvZ2luU3RhdGUgaW5zdGVhZCcsXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvYXV0aExvZ2luU3RhdGUgPSB0aGlzLm9hdXRoSW5zdGFuY2U/LmF1dGhBcGkuaGFzTG9naW5TdGF0ZVN5bmMoKVxuICAgIGlmIChvYXV0aExvZ2luU3RhdGUpIHtcbiAgICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBuZXcgTG9naW5TdGF0ZSh7XG4gICAgICAgIGVudklkOiB0aGlzLmNvbmZpZy5lbnYsXG4gICAgICAgIGNhY2hlOiB0aGlzLmNhY2hlLFxuICAgICAgICBvYXV0aEluc3RhbmNlOiB0aGlzLm9hdXRoSW5zdGFuY2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIGxvZ2luU3RhdGVcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmnKzlnLDnmbvlvZXmgIEt5byC5q2lXG4gICAqIOatpEFQSeS4uuWFvOWuueW8guatpXN0b3JhZ2XnmoTlubPlj7BcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfojrflj5bmnKzlnLDnmbvlvZXmgIHlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmdldExvZ2luU3RhdGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldExvZ2luU3RhdGUoKSB7XG4gICAgbGV0IG9hdXRoTG9naW5TdGF0ZSA9IG51bGxcblxuICAgIHRyeSB7XG4gICAgICBvYXV0aExvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRMb2dpblN0YXRlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAob2F1dGhMb2dpblN0YXRlKSB7XG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gbmV3IExvZ2luU3RhdGUoe1xuICAgICAgICBlbnZJZDogdGhpcy5jb25maWcuZW52LFxuICAgICAgICBjYWNoZTogdGhpcy5jYWNoZSxcbiAgICAgICAgb2F1dGhJbnN0YW5jZTogdGhpcy5vYXV0aEluc3RhbmNlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiBsb2dpblN0YXRlXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCDkvb/nlKggZ2V0Q3VycmVudFVzZXIg5Luj5pu/77yM5Zug5Li65LiObm9kZS1zZGvmlrnms5XlkI3lhrLnqoFcbiAgICogQHJldHVybnNcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfojrflj5bnlKjmiLfkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDmmK/lkKblt7LnmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuZ2V0VXNlckluZm8oKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldFVzZXJJbmZvKCk6IFByb21pc2U8KGF1dGhNb2RlbHMuVXNlckluZm8gJiBQYXJ0aWFsPFVzZXI+KSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50VXNlcigpXG4gIH1cblxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W5b6u5pCt5o+S5Lu255So5oi35L+h5oGv5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g5piv5ZCm5bey55m75b2VJyxcbiAgICAgICcgIDIgLSDosIPnlKggYXV0aCgpLmdldFdlZGFVc2VySW5mbygpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgZ2V0V2VkYVVzZXJJbmZvKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFdlZGFVc2VySW5mbygpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVXNlckJhc2ljSW5mbyhwYXJhbXM6IGF1dGhNb2RlbHMuTW9kaWZ5VXNlckJhc2ljSW5mb1JlcXVlc3QpIHtcbiAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5nZXRMb2dpblN0YXRlKClcbiAgICBpZiAobG9naW5TdGF0ZSkge1xuICAgICAgYXdhaXQgKGxvZ2luU3RhdGUudXNlciBhcyBVc2VyKS51cGRhdGVVc2VyQmFzaWNJbmZvKHBhcmFtcylcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKipcbiAgICogZ2V0QXV0aEhlYWRlciDlhbzlrrnlpITnkIZcbiAgICog6L+U5Zue56m65a+56LGhXG4gICAqL1xuICBwdWJsaWMgZ2V0QXV0aEhlYWRlcigpOiB7fSB7XG4gICAgY29uc29sZS5lcnJvcignQXV0aC5nZXRBdXRoSGVhZGVyIEFQSSDlt7Llup/lvIMnKVxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIOS4uuW3suaciei0puaIt+e7keesrOS4ieaWuei0puaIt1xuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuQmluZFdpdGhQcm92aWRlclJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnu5HlrprnrKzkuInmlrnnmbvlvZXmlrnlvI/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmJpbmRXaXRoUHJvdmlkZXIoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOatpOi0puaIt+aYr+WQpuW3sue7j+e7keWumuatpOesrOS4ieaWuScsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgYmluZFdpdGhQcm92aWRlcihwYXJhbXM6IGF1dGhNb2RlbHMuQmluZFdpdGhQcm92aWRlclJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuYmluZFdpdGhQcm92aWRlcihwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICog5p+l6K+i55So5oi3XG4gICAqIEBwYXJhbSB7YXV0aE1vZGVscy5RdWVyeVVzZXJQcm9maWxlUmVxdWVzdH0gYXBwZW5kZWRfcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGF1dGhNb2RlbHMuVXNlclByb2ZpbGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHF1ZXJ5VXNlcihxdWVyeU9iajogYXV0aE1vZGVscy5RdWVyeVVzZXJQcm9maWxlUmVxdWVzdCk6IFByb21pc2U8YXV0aE1vZGVscy5RdWVyeVVzZXJQcm9maWxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucXVlcnlVc2VyUHJvZmlsZShxdWVyeU9iailcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBY2Nlc3NUb2tlbigpIHtcbiAgICBjb25zdCBvYXV0aEFjY2Vzc1Rva2VuUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5nZXRBY2Nlc3NUb2tlbigpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2Vzc1Rva2VuOiBvYXV0aEFjY2Vzc1Rva2VuUmVzLFxuICAgICAgZW52OiB0aGlzLmNvbmZpZy5lbnYsXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdyYW50UHJvdmlkZXJUb2tlbihwYXJhbXM6IGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVxdWVzdCwpOiBQcm9taXNlPGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwYXRjaFByb3ZpZGVyVG9rZW4ocGFyYW1zOiBhdXRoTW9kZWxzLlBhdGNoUHJvdmlkZXJUb2tlblJlcXVlc3QsKTogUHJvbWlzZTxhdXRoTW9kZWxzLlBhdGNoUHJvdmlkZXJUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnBhdGNoUHJvdmlkZXJUb2tlbihwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFByb3ZpZGVyKHBhcmFtczogYXV0aE1vZGVscy5TaWduSW5XaXRoUHJvdmlkZXJSZXF1ZXN0KTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKHBhcmFtcylcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoV2VjaGF0KHBhcmFtczogYW55ID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoV2VjaGF0KHBhcmFtcylcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBncmFudFRva2VuKHBhcmFtczogYXV0aE1vZGVscy5HcmFudFRva2VuUmVxdWVzdCk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdyYW50VG9rZW4ocGFyYW1zKVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlblByb3ZpZGVyUmVkaXJlY3RVcmkocGFyYW1zOiBhdXRoTW9kZWxzLkdlblByb3ZpZGVyUmVkaXJlY3RVcmlSZXF1ZXN0LCk6IFByb21pc2U8YXV0aE1vZGVscy5HZW5Qcm92aWRlclJlZGlyZWN0VXJpUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2VuUHJvdmlkZXJSZWRpcmVjdFVyaShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzZXRQYXNzd29yZChwYXJhbXM6IGF1dGhNb2RlbHMuUmVzZXRQYXNzd29yZFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucmVzZXRQYXNzd29yZChwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGV2aWNlQXV0aG9yaXplKHBhcmFtczogYXV0aE1vZGVscy5EZXZpY2VBdXRob3JpemVSZXF1ZXN0KTogUHJvbWlzZTxhdXRoTW9kZWxzLkRldmljZUF1dGhvcml6ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmRldmljZUF1dGhvcml6ZShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3VkbyhwYXJhbXM6IGF1dGhNb2RlbHMuU3Vkb1JlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuU3Vkb1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnN1ZG8ocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlbGV0ZU1lKHBhcmFtczogYXV0aE1vZGVscy5XaXRoU3Vkb1JlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuVXNlclByb2ZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZGVsZXRlTWUocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFByb3ZpZGVycygpOiBQcm9taXNlPGF1dGhNb2RlbHMuUHJvdmlkZXJzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0UHJvdmlkZXJzKClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2dpblNjb3BlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmxvZ2luU2NvcGUoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvZ2luR3JvdXBzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkubG9naW5Hcm91cHMoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIG9uTG9naW5TdGF0ZUNoYW5nZWQoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5jb25maWcuZXZlbnRCdXM/Lm9uKEVWRU5UUy5MT0dJTl9TVEFURV9DSEFOR0VELCBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgICAvLyBnZXRMb2dpblN0YXRl5Lya6YeN5aSN6Kem5Y+RZ2V0Q3JlZGVudGlhbHPvvIzlr7zoh7Tmrbvlvqrnjq/vvIzmiYDku6VnZXRDcmVkZW50aWFsc+WHuumUmeS4jeWGjeWHuuWPkWdldExvZ2luU3RhdGVcbiAgICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBwYXJhbXM/LmRhdGE/LmV2ZW50VHlwZSAhPT0gTE9HSU5fU1RBVEVfQ0hBTkdFRF9UWVBFLkNSRURFTlRJQUxTX0VSUk9SID8gYXdhaXQgdGhpcy5nZXRMb2dpblN0YXRlKCkgOiB7fVxuICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCB7IC4uLnBhcmFtcywgLi4ubG9naW5TdGF0ZSB9KVxuICAgIH0pXG4gICAgLy8g56uL5Yi75omn6KGM5LiA5qyh5Zue6LCDXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TG9naW5TdGF0ZSgpXG4gICAgY2FsbGJhY2suY2FsbCh0aGlzLCBsb2dpblN0YXRlKVxuICB9XG5cbiAgLyoqXG4gICAqIOW8uuWItuWIt+aWsHRva2VuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWZyZXNoVG9rZW5Gb3JjZShwYXJhbXM6IHsgdmVyc2lvbj86IHN0cmluZyB9KTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5yZWZyZXNoVG9rZW5Gb3JjZShwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6Lqr5Lu95L+h5oGvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q3JlZGVudGlhbHMoKTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRDcmVkZW50aWFscygpXG4gIH1cbiAgLyoqXG4gICAqIOWGmeWFpei6q+S7veS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscykge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQuc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHMpXG4gIH1cblxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W6Lqr5Lu95rqQ57G75Z6LJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS5nZXRQcm92aWRlclN1YlR5cGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldFByb3ZpZGVyU3ViVHlwZSgpOiBQcm9taXNlPGF1dGhNb2RlbHMuUHJvdmlkZXJTdWJUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFByb3ZpZGVyU3ViVHlwZSgpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ2FwdGNoYURhdGEocGFyYW1zOiB7IHN0YXRlOiBzdHJpbmc7IHJlZGlyZWN0X3VyaT86IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmNyZWF0ZUNhcHRjaGFEYXRhKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnlDYXB0Y2hhRGF0YShwYXJhbXM6IHsgdG9rZW46IHN0cmluZzsga2V5OiBzdHJpbmcgfSkge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS52ZXJpZnlDYXB0Y2hhRGF0YShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TWluaVByb2dyYW1RckNvZGUocGFyYW1zOiBhdXRoTW9kZWxzLkdldE1pbmlQcm9ncmFtUXJDb2RlUmVxdWVzdCwpOiBQcm9taXNlPGF1dGhNb2RlbHMuR2V0TWluaVByb2dyYW1RckNvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRNaW5pUHJvZ3JhbUNvZGUocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldE1pbmlQcm9ncmFtUXJDb2RlU3RhdHVzKHBhcmFtczogYXV0aE1vZGVscy5HZXRNaW5pUHJvZ3JhbVFyQ29kZVN0YXR1c1JlcXVlc3QsKTogUHJvbWlzZTxhdXRoTW9kZWxzLkdldE1pbmlQcm9ncmFtUXJDb2RlU3RhdHVzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0TWluaVByb2dyYW1RckNvZGVTdGF0dXMocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIG1vZGlmeVBhc3N3b3JkKHBhcmFtczogYXV0aE1vZGVscy5Nb2RpZnlVc2VyQmFzaWNJbmZvUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5tb2RpZnlQYXNzd29yZChwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbW9kaWZ5UGFzc3dvcmRXaXRob3V0TG9naW4ocGFyYW1zOiBhdXRoTW9kZWxzLk1vZGlmeVBhc3N3b3JkV2l0aG91dExvZ2luUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5tb2RpZnlQYXNzd29yZFdpdGhvdXRMb2dpbihwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlckJlaGF2aW9yTG9nKHBhcmFtczogYXV0aE1vZGVscy5HZXRVc2VyQmVoYXZpb3JMb2cpOiBQcm9taXNlPGF1dGhNb2RlbHMuR2V0VXNlckJlaGF2aW9yTG9nUmVzPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFVzZXJCZWhhdmlvckxvZyhwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICogc21zL2VtYWlsIOmqjOivgeeggeeZu+W9lS/ms6jlhozvvIzpgLvovpHkuIDoh7TmlLbmlZtcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgIHZlcmlmaWNhdGlvbkluZm8gPSB7IHZlcmlmaWNhdGlvbl9pZDogJycsIGlzX3VzZXI6IGZhbHNlIH0sXG4gICAgdmVyaWZpY2F0aW9uQ29kZSA9ICcnLFxuICAgIHVzZXJuYW1lOiByYXdVc2VybmFtZSA9ICcnLFxuICAgIGJpbmRJbmZvID0gdW5kZWZpbmVkLFxuICAgIGxvZ2luVHlwZSA9ICcnLFxuICB9OiB7XG4gICAgdmVyaWZpY2F0aW9uSW5mbz86IGF1dGhNb2RlbHMuR2V0VmVyaWZpY2F0aW9uUmVzcG9uc2VcbiAgICB2ZXJpZmljYXRpb25Db2RlPzogc3RyaW5nXG4gICAgdXNlcm5hbWU/OiBzdHJpbmdcbiAgICBiaW5kSW5mbz86IGFueVxuICAgIGxvZ2luVHlwZT86IHN0cmluZ1xuICB9KTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIOmqjOivgemqjOivgeeggVxuICAgICAgY29uc3QgdmVyaWZ5UmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudmVyaWZ5KHtcbiAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHZlcmlmaWNhdGlvbkNvZGUsXG4gICAgICB9KVxuXG4gICAgICBpZiAoKHZlcmlmeVJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHZlcmlmeVJlc1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICBjb25zdCB7IHZlcmlmaWNhdGlvbl90b2tlbiB9ID0gdmVyaWZ5UmVzXG5cbiAgICAgIC8vIOaJi+acuueZu+W9leWPguaVsFxuICAgICAgbGV0IHVzZXJuYW1lID0gdGhpcy5mb3JtYXRQaG9uZShyYXdVc2VybmFtZSlcbiAgICAgIGxldCBzaWduVXBQYXJhbTogYW55ID0geyBwaG9uZV9udW1iZXI6IHVzZXJuYW1lIH1cblxuICAgICAgLy8g6YKu566x55m75b2V5Y+C5pWwXG4gICAgICBpZiAobG9naW5UeXBlID09PSAnZW1haWwnKSB7XG4gICAgICAgIHVzZXJuYW1lID0gcmF3VXNlcm5hbWVcbiAgICAgICAgc2lnblVwUGFyYW0gPSB7IGVtYWlsOiB1c2VybmFtZSB9XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIOagueaNruaYr+WQpuW3sue7j+aYr+eUqOaIt++8jOWIhuWIq+i1sOeZu+W9leaIluazqOWGjOmAu+i+kVxuICAgICAgaWYgKHZlcmlmaWNhdGlvbkluZm8uaXNfdXNlcikge1xuICAgICAgICAvLyDnp4HmnInljJbnjq/looPmiJbogIXoh6rlrprkuYnlupTnlKjotbB2MeeJiOacrOeahOiAgemAu+i+kVxuICAgICAgICBjb25zdCBzaWduSW5SZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW4oe1xuICAgICAgICAgIHVzZXJuYW1lLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbl90b2tlbixcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoKHNpZ25JblJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgICAgdGhyb3cgc2lnbkluUmVzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmluZEluZm8pIHtcbiAgICAgICAgICBjb25zdCBiaW5kUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuYmluZFdpdGhQcm92aWRlcih7XG4gICAgICAgICAgICBwcm92aWRlcl90b2tlbjogKGJpbmRJbmZvIGFzIGFueSk/LnByb3ZpZGVyVG9rZW4sXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICgoYmluZFJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBiaW5kUmVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDoh6rlrprkuYnlupTnlKjotbBzaWduVXDpgLvovpFcbiAgICAgICAgY29uc3Qgc2lnblVwUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnblVwKHtcbiAgICAgICAgICAuLi5zaWduVXBQYXJhbSxcbiAgICAgICAgICB2ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgcHJvdmlkZXJfdG9rZW46IChiaW5kSW5mbyBhcyBhbnkpPy5wcm92aWRlcklkLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICgoc2lnblVwUmVzIGFzIGFueSk/LmVycm9yX2NvZGUpIHtcbiAgICAgICAgICB0aHJvdyBzaWduVXBSZXNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVMb2dpblN0YXRlKFxuICAgIHBhcmFtcz86IHsgdmVyc2lvbj86IHN0cmluZzsgcXVlcnk/OiBhbnkgfSxcbiAgICBvcHRpb25zPzogeyBhc3luY1JlZnJlc2hVc2VyPzogYm9vbGVhbjsgdXNlckluZm8/OiBhbnkgfSxcbiAgKTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IG5ldyBMb2dpblN0YXRlKHtcbiAgICAgIGVudklkOiB0aGlzLmNvbmZpZy5lbnYsXG4gICAgICBjYWNoZTogdGhpcy5jYWNoZSxcbiAgICAgIG9hdXRoSW5zdGFuY2U6IHRoaXMub2F1dGhJbnN0YW5jZSxcbiAgICB9KVxuXG4gICAgYXdhaXQgbG9naW5TdGF0ZS5jaGVja0xvY2FsU3RhdGVBc3luYygpXG5cbiAgICBpZiAob3B0aW9ucz8udXNlckluZm8pIHtcbiAgICAgIGxvZ2luU3RhdGUudXNlci5zZXRMb2NhbFVzZXJJbmZvKG9wdGlvbnMudXNlckluZm8pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zPy5hc3luY1JlZnJlc2hVc2VyKSB7XG4gICAgICAgIGxvZ2luU3RhdGUudXNlci5yZWZyZXNoKHBhcmFtcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGxvZ2luU3RhdGUudXNlci5yZWZyZXNoKHBhcmFtcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZy5ldmVudEJ1cz8uZmlyZShFVkVOVFMuTE9HSU5fU1RBVEVfQ0hBTkdFRCwgeyBldmVudFR5cGU6IExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdOX0lOIH0pXG5cbiAgICB0aGlzLmNvbmZpZy5ldmVudEJ1cz8uZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdORURfSU4gfSlcbiAgICByZXR1cm4gbG9naW5TdGF0ZVxuICB9XG5cbiAgYXN5bmMgc2V0QWNjZXNzS2V5KCkge1xuICAgIGxldCBhY2Nlc3NUb2tlbiA9ICcnXG4gICAgbGV0IHNjb3BlID0gJydcbiAgICBpZiAodGhpcy5jb25maWcuYWNjZXNzS2V5KSB7XG4gICAgICBhY2Nlc3NUb2tlbiA9IHRoaXMuY29uZmlnLmFjY2Vzc0tleVxuICAgICAgc2NvcGUgPSAnYWNjZXNzS2V5J1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcuYXV0aD8uc2VjcmV0SWQgJiYgdGhpcy5jb25maWcuYXV0aD8uc2VjcmV0S2V5KSB7XG4gICAgICBhY2Nlc3NUb2tlbiA9ICcnXG4gICAgICBzY29wZSA9IERFRkFVTFRfTk9ERV9BQ0NFU1NfU0NPUEVcbiAgICB9XG5cbiAgICBpZiAoIXNjb3BlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5zZXRBY2Nlc3NLZXlDcmVkZW50aWFscyh7XG4gICAgICAgIGFjY2Vzc190b2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgIHRva2VuX3R5cGU6ICdCZWFyZXInLFxuICAgICAgICBzY29wZSxcbiAgICAgICAgZXhwaXJlc19hdDogbmV3IERhdGUoK25ldyBEYXRlKCkgKyArbmV3IERhdGUoKSksXG4gICAgICAgIGV4cGlyZXNfaW46ICtuZXcgRGF0ZSgpICsgK25ldyBEYXRlKCksXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2FjY2Vzc0tleSBlcnJvcjogJywgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZvcm1hdFBob25lKHBob25lOiBzdHJpbmcpIHtcbiAgICBpZiAoIS9cXHMrLy50ZXN0KHBob25lKSAmJiAvXlxcK1xcZHsxLDN9XFxkKy8udGVzdChwaG9uZSkpIHtcbiAgICAgIHJldHVybiBwaG9uZS5yZXBsYWNlKC9eKFxcK1xcZHsxLDJ9KShcXGQrKSQvLCAnJDEgJDInKVxuICAgIH1cbiAgICByZXR1cm4gL15cXCtcXGR7MSwzfVxccysvLnRlc3QocGhvbmUpID8gcGhvbmUgOiBgKzg2ICR7cGhvbmV9YFxuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIHNlc3Npb24sIGluZm8pOiBPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrIHtcbiAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKChjYWxsYmFja3MpID0+IHtcbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LCBzZXNzaW9uLCBpbmZvKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGF1dGggc3RhdGUgY2hhbmdlIGNhbGxiYWNrOicsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgcmV0dXJuXG4gIH1cblxuICBwcml2YXRlIHNldHVwTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5vbihFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHBhcmFtcz8uZGF0YT8uZXZlbnRcbiAgICAgIGNvbnN0IGluZm8gPSBwYXJhbXM/LmRhdGE/LmluZm9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YTogeyBzZXNzaW9uIH0sXG4gICAgICB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIHNlc3Npb24sIGluZm8pXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvVXNlcih1c2VySW5mbzogYXV0aE1vZGVscy5Vc2VySW5mbyAmIFBhcnRpYWw8VXNlcj4pIHtcbiAgICBpZiAoIXVzZXJJbmZvKSByZXR1cm4gbnVsbFxuXG4gICAgLy8g5LyY5YWI5L2/55SoIHVzZXJJbmZvIOS4reeahOaVsOaNru+8iFYzIEFQSe+8iVxuICAgIGNvbnN0IGVtYWlsID0gdXNlckluZm8/LmVtYWlsIHx8ICcnXG4gICAgY29uc3QgcGhvbmUgPSB1c2VySW5mbz8ucGhvbmVfbnVtYmVyIHx8ICcnXG4gICAgY29uc3QgdXNlcklkID0gdXNlckluZm8/LnN1YiB8fCB1c2VySW5mbz8udWlkIHx8ICcnXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgIGF1ZDogJ2F1dGhlbnRpY2F0ZWQnLFxuICAgICAgcm9sZTogdXNlckluZm8uZ3JvdXBzPy5tYXA/Lihncm91cCA9PiAodHlwZW9mIGdyb3VwID09PSAnc3RyaW5nJyA/IGdyb3VwIDogZ3JvdXAuaWQpKSxcbiAgICAgIGVtYWlsOiBlbWFpbCB8fCAnJyxcbiAgICAgIGVtYWlsX2NvbmZpcm1lZF9hdDogdXNlckluZm8/LmVtYWlsX3ZlcmlmaWVkID8gdXNlckluZm8uY3JlYXRlZF9hdCA6IHVzZXJJbmZvLmNyZWF0ZWRfYXQsXG4gICAgICBwaG9uZSxcbiAgICAgIHBob25lX2NvbmZpcm1lZF9hdDogcGhvbmUgPyB1c2VySW5mby5jcmVhdGVkX2F0IDogdW5kZWZpbmVkLFxuICAgICAgY29uZmlybWVkX2F0OiB1c2VySW5mby5jcmVhdGVkX2F0LFxuICAgICAgbGFzdF9zaWduX2luX2F0OiAodXNlckluZm8gYXMgYW55KS5sYXN0X3NpZ25faW5fYXQsXG4gICAgICBhcHBfbWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6IHVzZXJJbmZvLmxvZ2luVHlwZT8udG9Mb3dlckNhc2UoKSB8fCAnY2xvdWRiYXNlJyxcbiAgICAgICAgcHJvdmlkZXJzOiBbdXNlckluZm8ubG9naW5UeXBlPy50b0xvd2VyQ2FzZSgpIHx8ICdjbG91ZGJhc2UnXSxcbiAgICAgIH0sXG4gICAgICB1c2VyX21ldGFkYXRhOiB7XG4gICAgICAgIC8vIFYzIEFQSSDnlKjmiLfkv6Hmga9cbiAgICAgICAgbmFtZTogdXNlckluZm8/Lm5hbWUsXG4gICAgICAgIHBpY3R1cmU6IHVzZXJJbmZvPy5waWN0dXJlLFxuICAgICAgICB1c2VybmFtZTogdXNlckluZm8/LnVzZXJuYW1lLCAvLyDnlKjmiLflkI3np7DvvIzplb/luqYgNS0yNCDkvY3vvIzmlK/mjIHlrZfnrKbkuK3oi7HmlofjgIHmlbDlrZfjgIHnibnmrorlrZfnrKbvvIjku4XmlK/mjIFfLe+8ie+8jOS4jeaUr+aMgeS4reaWh1xuICAgICAgICBnZW5kZXI6IHVzZXJJbmZvPy5nZW5kZXIsXG4gICAgICAgIGxvY2FsZTogdXNlckluZm8/LmxvY2FsZSxcbiAgICAgICAgLy8gVjIgQVBJIOWFvOWuue+8iOS9v+eUqCBhbnkg6YG/5YWN57G75Z6L6ZSZ6K+v77yJXG4gICAgICAgIHVpZDogdXNlckluZm8udWlkLFxuICAgICAgICBuaWNrTmFtZTogdXNlckluZm8ubmlja05hbWUgfHwgdXNlckluZm8/Lm5hbWUsXG4gICAgICAgIGF2YXRhclVybDogdXNlckluZm8uYXZhdGFyVXJsIHx8IHVzZXJJbmZvLnBpY3R1cmUsXG4gICAgICAgIGxvY2F0aW9uOiB1c2VySW5mby5sb2NhdGlvbixcbiAgICAgICAgaGFzUGFzc3dvcmQ6IHVzZXJJbmZvLmhhc1Bhc3N3b3JkID8/ICgodXNlckluZm8gYXMgYW55KS5wYXNzd29yZCA9PT0gJ1NFVCcpLFxuICAgICAgICBvcGVuX2lkOiB1c2VySW5mbz8ub3Blbl9pZCxcbiAgICAgIH0sXG4gICAgICBpZGVudGl0aWVzOlxuICAgICAgICB1c2VySW5mbz8ucHJvdmlkZXJzPy5tYXAocCA9PiAoe1xuICAgICAgICAgIGlkOiBwLmlkIHx8ICcnLFxuICAgICAgICAgIGlkZW50aXR5X2lkOiBwLmlkIHx8ICcnLFxuICAgICAgICAgIHVzZXJfaWQ6IHVzZXJJZCxcbiAgICAgICAgICBpZGVudGl0eV9kYXRhOiB7XG4gICAgICAgICAgICBwcm92aWRlcl9pZDogcC5pZCxcbiAgICAgICAgICAgIHByb3ZpZGVyX3VzZXJfaWQ6IHAucHJvdmlkZXJfdXNlcl9pZCxcbiAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3ZpZGVyOiBwLmlkIHx8ICdjbG91ZGJhc2UnLFxuICAgICAgICAgIGNyZWF0ZWRfYXQ6IHVzZXJJbmZvLmNyZWF0ZWRfYXQsXG4gICAgICAgICAgdXBkYXRlZF9hdDogdXNlckluZm8udXBkYXRlZF9hdCxcbiAgICAgICAgICBsYXN0X3NpZ25faW5fYXQ6ICh1c2VySW5mbyBhcyBhbnkpLmxhc3Rfc2lnbl9pbl9hdCxcbiAgICAgICAgfSkpIHx8IFtdLFxuICAgICAgY3JlYXRlZF9hdDogdXNlckluZm8uY3JlYXRlZF9hdCxcbiAgICAgIHVwZGF0ZWRfYXQ6IHVzZXJJbmZvLnVwZGF0ZWRfYXQsXG4gICAgICBpc19hbm9ueW1vdXM6IHVzZXJJbmZvLm5hbWUgPT09ICdhbm9ueW1vdXMnLFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlj4LmlbDmoKHpqozovoXliqnmlrnms5VcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbXMocGFyYW1zOiBhbnksIHJ1bGVzOiB7IFtrZXk6IHN0cmluZ106IHsgcmVxdWlyZWQ/OiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmcgfSB9KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBba2V5LCBydWxlXSBvZiBPYmplY3QuZW50cmllcyhydWxlcykpIHtcbiAgICAgIGlmIChydWxlLnJlcXVpcmVkICYmIChwYXJhbXM/LltrZXldID09PSB1bmRlZmluZWQgfHwgcGFyYW1zPy5ba2V5XSA9PT0gbnVsbCB8fCBwYXJhbXM/LltrZXldID09PSAnJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6IHJ1bGUubWVzc2FnZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoKHpqozlv4Xloavlj4LmlbDnu4TvvIjoh7PlsJHmnInkuIDkuKrlj4LmlbDlv4XpobvmnInlgLzvvIlcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVBdExlYXN0T25lKHBhcmFtczogYW55LCBmaWVsZEdyb3Vwczogc3RyaW5nW11bXSwgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaGFzVmFsdWUgPSBmaWVsZEdyb3Vwcy5zb21lKGdyb3VwID0+IGdyb3VwLnNvbWUoZmllbGQgPT4gcGFyYW1zPy5bZmllbGRdICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zPy5bZmllbGRdICE9PSBudWxsICYmIHBhcmFtcz8uW2ZpZWxkXSAhPT0gJycpLClcblxuICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlIH0pXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8eyBlcnJvcjogRXJyb3IgfCBudWxsIH0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5sb2NhbENyZWRlbnRpYWxzLmdldENyZWRlbnRpYWxzKClcbiAgICAgIGlmIChjcmVkZW50aWFscykge1xuICAgICAgICB0aGlzLmNvbmZpZy5ldmVudEJ1cz8uZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5JTklUSUFMX1NFU1NJT04gfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JlIGVycm9ycyB3aGVuIGNoZWNraW5nIGZvciBleGlzdGluZyBjcmVkZW50aWFsc1xuICAgIH1cblxuICAgIHJldHVybiB7IGVycm9yOiBudWxsIH1cbiAgfVxufVxuXG50eXBlIFRJbml0QXV0aE9wdGlvbnMgPSBQaWNrPFxuSUNsb3VkYmFzZUF1dGhDb25maWcsXG4ncmVnaW9uJyB8ICdwZXJzaXN0ZW5jZScgfCAnaTE4bicgfCAnYWNjZXNzS2V5JyB8ICd1c2VXeENsb3VkJyB8ICdhdXRoJ1xuPiAmXG5QYXJ0aWFsPEF1dGhPcHRpb25zPiAmIHtcbiAgZGV0ZWN0U2Vzc2lvbkluVXJsPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBdXRoSW5zdGFuY2UoXG4gIGNvbmZpZzogVEluaXRBdXRoT3B0aW9ucyAmIHsgc2RrVmVyc2lvbj86IHN0cmluZyB9LFxuICBvcHRpb25zPzoge1xuICAgIGNsaWVudElkOiBJQ2xvdWRiYXNlQ29uZmlnWydjbGllbnRJZCddXG4gICAgZW52OiBJQ2xvdWRiYXNlQ29uZmlnWydlbnYnXVxuICAgIGFwaU9yaWdpbjogc3RyaW5nXG4gICAgY2FjaGU/OiBJQ2xvdWRiYXNlQ2FjaGVcbiAgICBwbGF0Zm9ybT86IElDbG91ZGJhc2VbJ3BsYXRmb3JtJ11cbiAgICBhcHA/OiBJQ2xvdWRiYXNlXG4gICAgZGVidWc/OiBJQ2xvdWRiYXNlQXV0aENvbmZpZ1snZGVidWcnXVxuICAgIGRldGVjdFNlc3Npb25JblVybD86IElDbG91ZGJhc2VBdXRoQ29uZmlnWydkZXRlY3RTZXNzaW9uSW5VcmwnXVxuICB9LFxuKSB7XG4gIGNvbnN0IHsgcmVnaW9uID0gJ2FwLXNoYW5naGFpJywgaTE4biwgYWNjZXNzS2V5LCB1c2VXeENsb3VkIH0gPSBjb25maWdcbiAgY29uc3QgcGxhdGZvcm0gPSBvcHRpb25zPy5wbGF0Zm9ybSB8fCAodXNlRGVmYXVsdEFkYXB0ZXIuYmluZChvcHRpb25zKSgpIGFzIElDbG91ZGJhc2VQbGF0Zm9ybUluZm8pXG4gIGNvbnN0IHsgcnVudGltZSwgYWRhcHRlciB9ID0gcGxhdGZvcm1cblxuICBjb25zdCB7IGVudiwgY2xpZW50SWQsIGRlYnVnLCBjYWNoZSwgYXBwOiBjbG91ZGJhc2UgfSA9IG9wdGlvbnMgfHwge31cbiAgbGV0IHsgYXBpT3JpZ2luIH0gPSBvcHRpb25zIHx8IHt9XG4gIGlmICghYXBpT3JpZ2luKSB7XG4gICAgYXBpT3JpZ2luID0gYGh0dHBzOi8vJHtlbnZ9LiR7cmVnaW9ufS50Y2ItYXBpLnRlbmNlbnRjbG91ZGFwaS5jb21gXG4gIH1cblxuICBjb25zdCBjb21tb25PcHRzID0ge1xuICAgIGVudixcbiAgICBjbGllbnRJZCxcbiAgICBpMThuLFxuICAgIGFjY2Vzc0tleSxcbiAgICB1c2VXeENsb3VkLFxuICAgIGV2ZW50QnVzOiBuZXcgQ2xvdWRiYXNlRXZlbnRFbWl0dGVyKCksXG4gIH1cblxuICBjb25zdCBvYXV0aEluc3RhbmNlID0gbmV3IENsb3VkYmFzZU9BdXRoKHVzZUF1dGhBZGFwdGVyKHtcbiAgICAuLi5jb21tb25PcHRzLFxuICAgIGFwaU9yaWdpbixcbiAgICBhcGlQYXRoOiBjb25maWc/LmFwaVBhdGggfHwgQVVUSF9BUElfUFJFRklYLFxuICAgIC8vIEB0b2RvIOS7peS4i+acgOWlvei1sGFkYXB0b3LlpITnkIbvvIznm67liY1vYXV0aOaooeWdl+ayoeaMiWFkYXB0b3LmjqXlj6Porr7orqFcbiAgICBzdG9yYWdlOiBjb25maWc/LnN0b3JhZ2UsXG4gICAgYmFzZVJlcXVlc3Q6IGNvbmZpZz8uYmFzZVJlcXVlc3QsXG4gICAgcmVxdWVzdDogY29uZmlnPy5yZXF1ZXN0LFxuICAgIGFub255bW91c1NpZ25JbkZ1bmM6IGNvbmZpZz8uYW5vbnltb3VzU2lnbkluRnVuYyxcbiAgICBjYXB0Y2hhT3B0aW9uczogY29uZmlnPy5jYXB0Y2hhT3B0aW9ucyxcbiAgICB3eENsb3VkOiBjb25maWc/Lnd4Q2xvdWQsXG4gICAgYWRhcHRlcixcbiAgICBvbkNyZWRlbnRpYWxzRXJyb3I6IG9uQ3JlZGVudGlhbHNFcnJvcihjb21tb25PcHRzLmV2ZW50QnVzKSxcbiAgICBoZWFkZXJzOiB7ICdYLVNESy1WZXJzaW9uJzogYEBjbG91ZGJhc2UvanMtc2RrLyR7Y29uZmlnLnNka1ZlcnNpb259YCwgLi4uKGNvbmZpZy5oZWFkZXJzIHx8IHt9KSB9LFxuICAgIGRldGVjdFNlc3Npb25JblVybDogY29uZmlnLmRldGVjdFNlc3Npb25JblVybCxcbiAgICBkZWJ1ZyxcbiAgICBhdXRoOiBvcHRpb25zLmFwcD8uY29uZmlnPy5hdXRoLFxuICB9KSwpXG5cbiAgY29uc3QgYXV0aEluc3RhbmNlID0gbmV3IEF1dGgoe1xuICAgIC4uLmNvbW1vbk9wdHMsXG4gICAgcmVnaW9uLFxuICAgIHBlcnNpc3RlbmNlOiBjb25maWcucGVyc2lzdGVuY2UsXG4gICAgZGVidWcsXG4gICAgY2FjaGU6XG4gICAgICBjYWNoZSB8fCBuZXcgQ2xvdWRiYXNlQ2FjaGUoe1xuICAgICAgICBwZXJzaXN0ZW5jZTogY29uZmlnLnBlcnNpc3RlbmNlLFxuICAgICAgICBrZXlzOiB7IHVzZXJJbmZvS2V5OiBgdXNlcl9pbmZvXyR7ZW52fWAgfSxcbiAgICAgICAgcGxhdGZvcm1JbmZvOiBwbGF0Zm9ybSxcbiAgICAgIH0pLFxuICAgIHJ1bnRpbWU6IHJ1bnRpbWUgfHwgJ3dlYicsXG4gICAgX2Zyb21BcHA6IGNsb3VkYmFzZSxcbiAgICBvYXV0aEluc3RhbmNlLFxuICAgIGF1dGg6IG9wdGlvbnMuYXBwPy5jb25maWc/LmF1dGgsXG4gIH0pXG5cbiAgLy8gSW5pdGlhbGl6ZSBzZXNzaW9uIHdpdGggdXNlciBpbmZvIGNhbGxiYWNrXG4gIC8vIFRoaXMgaGFuZGxlcyBPQXV0aCBjYWxsYmFjayBVUkwgZGV0ZWN0aW9uIGFuZCBjcmVhdGVzIGxvZ2luIHN0YXRlIGF0b21pY2FsbHlcbiAgb2F1dGhJbnN0YW5jZS5pbml0aWFsaXplU2Vzc2lvbihhc3luYyAoZGF0YSwgZXJyb3IpID0+IHtcbiAgICBpZiAoIWRhdGEpIHJldHVyblxuXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gT0FVVEhfVFlQRS5TSUdOX0lOKSB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29tbW9uT3B0cy5ldmVudEJ1cy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHtcbiAgICAgICAgICBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuU0lHTkVEX0lOLFxuICAgICAgICAgIGluZm86IHsgLi4uZGF0YSwgZXJyb3IgfSxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS51c2VyKSB7XG4gICAgICAgIC8vIOS9v+eUqOW3suiOt+WPlueahCB1c2VyIOS/oeaBr+WIm+W7uiBMb2dpblN0YXRl77yM5aSN55SoIGNyZWF0ZUxvZ2luU3RhdGUg6YC76L6RXG4gICAgICAgIC8vIOS9hui3s+i/hyByZWZyZXNoKCkg6YG/5YWN5YaN5qyh6K+35rGCIEFQSSDlr7zoh7TmrbvplIFcbiAgICAgICAgYXV0aEluc3RhbmNlLmNyZWF0ZUxvZ2luU3RhdGUoe30sIHsgdXNlckluZm86IGRhdGEudXNlciB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSBPQVVUSF9UWVBFLkJJTkRfSURFTlRJVFkpIHtcbiAgICAgIGNvbW1vbk9wdHMuZXZlbnRCdXMuZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7XG4gICAgICAgIGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5CSU5EX0lERU5USVRZLFxuICAgICAgICBpbmZvOiB7IC4uLmRhdGEsIGVycm9yIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4geyBhdXRoSW5zdGFuY2UsIG9hdXRoSW5zdGFuY2UgfVxufVxuXG5jb25zdCBOQU1FU1BBQ0UgPSAnYXV0aCdcblxuLyoqXG4gKiDorqHnrpfkuKTkuKrlrZfnrKbkuLLkuYvpl7TnmoTnvJbovpHot53nprvvvIhMZXZlbnNodGVpbiBkaXN0YW5jZe+8iVxuICog55So5LqO5Zyo55So5oi36LCD55So5LiN5a2Y5Zyo55qEIEF1dGgg5pa55rOV5pe277yM5o6o6I2Q5pyA55u45Ly855qE5pa55rOV5ZCNXG4gKi9cbmZ1bmN0aW9uIGxldmVuc2h0ZWluRGlzdGFuY2UoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBtYXRyaXg6IG51bWJlcltdW10gPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8PSBhLmxlbmd0aDsgaSsrKSB7XG4gICAgbWF0cml4W2ldID0gW2ldXG4gIH1cbiAgZm9yIChsZXQgaiA9IDA7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIG1hdHJpeFswXVtqXSA9IGpcbiAgfVxuICBmb3IgKGxldCBpID0gMTsgaSA8PSBhLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDE7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgY29zdCA9IGFbaSAtIDFdLnRvTG93ZXJDYXNlKCkgPT09IGJbaiAtIDFdLnRvTG93ZXJDYXNlKCkgPyAwIDogMVxuICAgICAgbWF0cml4W2ldW2pdID0gTWF0aC5taW4oXG4gICAgICAgIG1hdHJpeFtpIC0gMV1bal0gKyAxLFxuICAgICAgICBtYXRyaXhbaV1baiAtIDFdICsgMSxcbiAgICAgICAgbWF0cml4W2kgLSAxXVtqIC0gMV0gKyBjb3N0LFxuICAgICAgKVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0cml4W2EubGVuZ3RoXVtiLmxlbmd0aF1cbn1cblxuLyoqXG4gKiDlnKjmlrnms5XliJfooajkuK3mn6Xmib7kuI7nm67moIflkI3np7DmnIDnm7jkvLznmoTmlrnms5VcbiAqIEByZXR1cm5zIOacgOebuOS8vOeahOaWueazleWQje+8jOWmguaenOayoeaciei2s+Wkn+ebuOS8vOeahOWImei/lOWbniBudWxsXG4gKi9cbmZ1bmN0aW9uIGZpbmRTaW1pbGFyTWV0aG9kKHRhcmdldDogc3RyaW5nLCBtZXRob2RzOiBzdHJpbmdbXSk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgYmVzdE1hdGNoOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHlcblxuICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgLy8g6Lez6L+H56eB5pyJ5pa55rOV5ZKM5p6E6YCg5Ye95pWwXG4gICAgaWYgKG1ldGhvZC5zdGFydHNXaXRoKCdfJykgfHwgbWV0aG9kID09PSAnY29uc3RydWN0b3InKSBjb250aW51ZVxuICAgIGNvbnN0IGRpc3RhbmNlID0gbGV2ZW5zaHRlaW5EaXN0YW5jZSh0YXJnZXQsIG1ldGhvZClcbiAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICBiZXN0TWF0Y2ggPSBtZXRob2RcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJlc3RNYXRjaFxufVxuXG5jb25zdCBjb21wb25lbnQ6IElDbG91ZGJhc2VDb21wb25lbnQgPSB7XG4gIG5hbWU6IENPTVBPTkVOVF9OQU1FLFxuICBuYW1lc3BhY2U6IE5BTUVTUEFDRSxcbiAgZW50aXR5KGNvbmZpZz86IFRJbml0QXV0aE9wdGlvbnMpIHtcbiAgICBjb25zdCBhdXRoID0gZnVuY3Rpb24gKGNvbmZpZz86IFRJbml0QXV0aE9wdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmF1dGhJbnN0YW5jZSAmJiAhY29uZmlnKSB7XG4gICAgICAgIC8vIHByaW50V2FybihFUlJPUlMuSU5WQUxJRF9PUEVSQVRJT04sICdldmVyeSBjbG91ZGJhc2UgaW5zdGFuY2Ugc2hvdWxkIGhhcyBvbmx5IG9uZSBhdXRoIG9iamVjdCcpXG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhJbnN0YW5jZVxuICAgICAgfVxuXG4gICAgICBjb25maWcgPSBjb25maWcgfHwge1xuICAgICAgICByZWdpb246ICcnLFxuICAgICAgICBwZXJzaXN0ZW5jZTogJ2xvY2FsJyxcbiAgICAgICAgYXBpUGF0aDogQVVUSF9BUElfUFJFRklYLFxuICAgICAgfVxuICAgICAgY29uc3QgeyBhZGFwdGVyIH0gPSB0aGlzLnBsYXRmb3JtXG4gICAgICAvLyDlpoLkuI3mmI7noa7mjIflrppwZXJzaXN0ZW5jZeWImeS8mOWFiOWPluWQhOW5s+WPsGFkYXB0ZXLpppbpgInvvIzlhbbmrKFsb2NhbFN0b3JhZ2VcbiAgICAgIGNvbnN0IG5ld1BlcnNpc3RlbmNlID0gY29uZmlnLnBlcnNpc3RlbmNlIHx8IGFkYXB0ZXIucHJpbWFyeVN0b3JhZ2VcbiAgICAgIGlmIChuZXdQZXJzaXN0ZW5jZSAmJiBuZXdQZXJzaXN0ZW5jZSAhPT0gdGhpcy5jb25maWcucGVyc2lzdGVuY2UpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDb25maWcoeyBwZXJzaXN0ZW5jZTogbmV3UGVyc2lzdGVuY2UgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBhdXRoSW5zdGFuY2UsIG9hdXRoSW5zdGFuY2UgfSA9IGdlbmVyYXRlQXV0aEluc3RhbmNlKFxuICAgICAgICB7XG4gICAgICAgICAgd3hDbG91ZDogdGhpcy5jb25maWcud3hDbG91ZCxcbiAgICAgICAgICBzdG9yYWdlOiB0aGlzLmNvbmZpZy5zdG9yYWdlLFxuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBwZXJzaXN0ZW5jZTogdGhpcy5jb25maWcucGVyc2lzdGVuY2UsXG4gICAgICAgICAgaTE4bjogdGhpcy5jb25maWcuaTE4bixcbiAgICAgICAgICBhY2Nlc3NLZXk6IHRoaXMuY29uZmlnLmFjY2Vzc0tleSxcbiAgICAgICAgICB1c2VXeENsb3VkOiB0aGlzLmNvbmZpZy51c2VXeENsb3VkLFxuICAgICAgICAgIHNka1ZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICBkZXRlY3RTZXNzaW9uSW5Vcmw6IHRoaXMuY29uZmlnLmF1dGg/LmRldGVjdFNlc3Npb25JblVybCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGVudjogdGhpcy5jb25maWcuZW52LFxuICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNvbmZpZy5jbGllbnRJZCxcbiAgICAgICAgICBhcGlPcmlnaW46IHRoaXMucmVxdWVzdC5nZXRCYXNlRW5kUG9pbnQodGhpcy5jb25maWcuZW5kUG9pbnRNb2RlIHx8ICdDTE9VRF9BUEknKSxcbiAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICBjYWNoZTogdGhpcy5jYWNoZSxcbiAgICAgICAgICBhcHA6IHRoaXMsXG4gICAgICAgICAgZGVidWc6IHRoaXMuY29uZmlnLmRlYnVnLFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICB0aGlzLm9hdXRoSW5zdGFuY2UgPSBvYXV0aEluc3RhbmNlXG5cbiAgICAgIHRoaXMuYXV0aEluc3RhbmNlID0gYXV0aEluc3RhbmNlXG5cbiAgICAgIHJldHVybiB0aGlzLmF1dGhJbnN0YW5jZVxuICAgIH1cblxuICAgIGNvbnN0IGF1dGhQcm90byA9IGF1dGguY2FsbCh0aGlzLCBjb25maWcpXG4gICAgT2JqZWN0LmFzc2lnbihhdXRoLCBhdXRoUHJvdG8pXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGF1dGgsIE9iamVjdC5nZXRQcm90b3R5cGVPZihhdXRoUHJvdG8pKVxuXG4gICAgLy8g5YyF6KOFIFByb3h577yM5b2T55So5oi36LCD55So5LiN5a2Y5Zyo55qE5pa55rOV5pe25o+Q5L6bIFwiRGlkIHlvdSBtZWFuP1wiIOaPkOekulxuICAgIGNvbnN0IGF1dGhXaXRoSGludCA9IHR5cGVvZiBQcm94eSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgID8gbmV3IFByb3h5KGF1dGgsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgdHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g5p+l5om+5pyA55u45Ly855qE5pa55rOV5ZCNXG4gICAgICAgICAgY29uc3QgYWxsS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpKVxuICAgICAgICAgICAgLmNvbmNhdChPYmplY3Qua2V5cyh0YXJnZXQpKVxuICAgICAgICAgICAgLmZpbHRlcihrID0+IHR5cGVvZiB0YXJnZXRba10gPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGZpbmRTaW1pbGFyTWV0aG9kKHByb3AsIGFsbEtleXMpXG4gICAgICAgICAgaWYgKHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW0Nsb3VkQmFzZSBBdXRoXSBhdXRoLiR7cHJvcH0gaXMgbm90IGEgZnVuY3Rpb24uIERpZCB5b3UgbWVhbjogYXV0aC4ke3N1Z2dlc3Rpb259KCkgP2ApXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIDogYXV0aFxuXG4gICAgdGhpc1tOQU1FU1BBQ0VdID0gYXV0aFdpdGhIaW50XG4gICAgcmV0dXJuIGF1dGhXaXRoSGludFxuICB9LFxufVxuXG50cnkge1xuICAvLyDlsJ3or5Xoh6rliqjms6jlhozoh7PlhajlsYDlj5jph49jbG91ZGJhc2VcbiAgLy8g5q2k6KGM5Li65Y+q5Zyo5rWP6KeI5Zmo546v5aKD5LiL5pyJ5pWIXG4gIGNsb3VkYmFzZS5yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQpXG59IGNhdGNoIChlKSB7fVxuXG5leHBvcnQgeyBVc2VySW5mbywgQXV0aCwgV2VpeGluQXV0aFByb3ZpZGVyLCBDdXN0b21BdXRoUHJvdmlkZXIsIEFub255bW91c0F1dGhQcm92aWRlciB9XG4vLyDlr7zlh7rplJnor6/liIbnsbvmnprkuL7lkowgQXV0aEVycm9y77yM5pa55L6/5byA5Y+R6ICF6L+b6KGM6ZSZ6K+v5YiG57G75aSE55CGXG5leHBvcnQgeyBBdXRoRXJyb3JDYXRlZ29yeSwgQXV0aEVycm9yIH0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbi8qKlxuICogQGFwaSDmiYvliqjms6jlhozoh7NjbG91ZGJhc2UgYXBwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckF1dGgoYXBwOiBQaWNrPElDbG91ZGJhc2UsICdyZWdpc3RlckNvbXBvbmVudCc+KSB7XG4gIHRyeSB7XG4gICAgYXBwLnJlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybihlKVxuICB9XG59XG4iXX0=
|