lean4monaco 1.0.45 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -0
- package/dist/JuliaMono-Regular.ttf +0 -0
- package/dist/css/custom.css +7 -1
- package/dist/infowebview.d.ts +4 -5
- package/dist/infowebview.js +5 -5
- package/dist/lean4-infoview/esm-shims/react-dom.d.ts +5 -0
- package/dist/lean4-infoview/esm-shims/react-jsx-runtime.d.ts +5 -0
- package/dist/lean4-infoview/esm-shims/react.d.ts +5 -0
- package/dist/{vscode-lean4/vscode-lean4/dist/lean4-infoview → lean4-infoview}/index.css +8 -213
- package/dist/lean4-infoview/index.d.ts +16 -0
- package/dist/lean4-infoview/index.development.js +37312 -0
- package/dist/lean4-infoview/index.production.min.js +1528 -0
- package/dist/lean4-infoview/infoview/collapsing.d.ts +12 -0
- package/dist/lean4-infoview/infoview/contexts.d.ts +10 -0
- package/dist/lean4-infoview/infoview/errors.d.ts +14 -0
- package/dist/lean4-infoview/infoview/goalLocation.d.ts +61 -0
- package/dist/lean4-infoview/infoview/goals.d.ts +46 -0
- package/dist/lean4-infoview/infoview/info.d.ts +18 -0
- package/dist/lean4-infoview/infoview/infos.d.ts +2 -0
- package/dist/lean4-infoview/infoview/interactiveCode.d.ts +19 -0
- package/dist/lean4-infoview/infoview/main.d.ts +13 -0
- package/dist/lean4-infoview/infoview/messages.d.ts +19 -0
- package/dist/lean4-infoview/infoview/rpcSessions.d.ts +11 -0
- package/dist/lean4-infoview/infoview/tooltips.d.ts +32 -0
- package/dist/lean4-infoview/infoview/traceExplorer.d.ts +11 -0
- package/dist/lean4-infoview/infoview/userWidget.d.ts +39 -0
- package/dist/{vscode-lean4/lean4-infoview/src → lean4-infoview}/infoview/util.d.ts +8 -5
- package/dist/lean4-infoview/loader.d.ts +20 -0
- package/dist/lean4-infoview/loader.development.js +1006 -0
- package/dist/lean4-infoview/loader.production.min.js +1 -0
- package/dist/lean4-infoview/react-dom.development.js +30537 -0
- package/dist/lean4-infoview/react-dom.production.min.js +21 -0
- package/dist/lean4-infoview/react-jsx-runtime.development.js +1362 -0
- package/dist/lean4-infoview/react-jsx-runtime.production.min.js +1 -0
- package/dist/lean4-infoview/react.development.js +2823 -0
- package/dist/lean4-infoview/react.production.min.js +1 -0
- package/dist/leanmonaco.d.ts +4 -4
- package/dist/leanmonaco.js +10 -9
- package/dist/monaco-lean4/vscode-lean4/package.json +944 -0
- package/dist/monaco-lean4/vscode-lean4/src/abbreviation/AbbreviationFeature.d.ts +9 -0
- package/dist/monaco-lean4/vscode-lean4/src/abbreviation/AbbreviationFeature.js +20 -0
- package/dist/monaco-lean4/vscode-lean4/src/abbreviation/AbbreviationHoverProvider.d.ts +12 -0
- package/dist/monaco-lean4/vscode-lean4/src/abbreviation/AbbreviationHoverProvider.js +40 -0
- package/dist/monaco-lean4/vscode-lean4/src/abbreviation/AbbreviationRewriterFeature.d.ts +20 -0
- package/dist/monaco-lean4/vscode-lean4/src/abbreviation/AbbreviationRewriterFeature.js +79 -0
- package/dist/monaco-lean4/vscode-lean4/src/abbreviation/VSCodeAbbreviationConfig.d.ts +13 -0
- package/dist/monaco-lean4/vscode-lean4/src/abbreviation/VSCodeAbbreviationConfig.js +29 -0
- package/dist/monaco-lean4/vscode-lean4/src/abbreviation/VSCodeAbbreviationRewriter.d.ts +28 -0
- package/dist/monaco-lean4/vscode-lean4/src/abbreviation/VSCodeAbbreviationRewriter.js +124 -0
- package/dist/monaco-lean4/vscode-lean4/src/config.d.ts +33 -0
- package/dist/monaco-lean4/vscode-lean4/src/config.js +119 -0
- package/dist/monaco-lean4/vscode-lean4/src/diagnostics/setupNotifs.d.ts +27 -0
- package/dist/monaco-lean4/vscode-lean4/src/diagnostics/setupNotifs.js +133 -0
- package/dist/monaco-lean4/vscode-lean4/src/infoview.d.ts +69 -0
- package/dist/monaco-lean4/vscode-lean4/src/infoview.js +711 -0
- package/dist/monaco-lean4/vscode-lean4/src/leanclient.d.ts +67 -0
- package/dist/monaco-lean4/vscode-lean4/src/leanclient.js +443 -0
- package/dist/monaco-lean4/vscode-lean4/src/rpc.d.ts +16 -0
- package/dist/monaco-lean4/vscode-lean4/src/rpc.js +102 -0
- package/dist/monaco-lean4/vscode-lean4/src/taskgutter.d.ts +11 -0
- package/dist/monaco-lean4/vscode-lean4/src/taskgutter.js +130 -0
- package/dist/{vscode-lean4/vscode-lean4/src/utils/batchBasics.d.ts → monaco-lean4/vscode-lean4/src/utils/batch.d.ts} +8 -11
- package/dist/monaco-lean4/vscode-lean4/src/utils/batch.js +203 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/clientProvider.d.ts +41 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/clientProvider.js +205 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/converters.d.ts +16 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/converters.js +129 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/elan.d.ts +3 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/elan.js +4 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/envPath.d.ts +21 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/envPath.js +53 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/exturi.d.ts +35 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/exturi.js +136 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/fsHelper.d.ts +17 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/fsHelper.js +36 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/leanInstaller.d.ts +37 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/leanInstaller.js +210 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/logger.d.ts +7 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/logger.js +20 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/notifs.d.ts +24 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/notifs.js +110 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/projectInfo.d.ts +9 -0
- package/dist/monaco-lean4/vscode-lean4/src/utils/projectInfo.js +125 -0
- package/dist/monacoleanclient.d.ts +1 -2
- package/dist/monacoleanclient.js +3 -3
- package/dist/preconditions.d.ts +2 -2
- package/dist/vscode-lean4/lean4-infoview/package.json +25 -23
- package/dist/vscode-lean4/lean4-infoview/tsconfig.json +6 -2
- package/dist/vscode-lean4/lean4-infoview-api/package.json +1 -1
- package/dist/vscode-lean4/lean4-unicode-input/package.json +1 -1
- package/dist/vscode-lean4/lean4-unicode-input/src/abbreviations.json +12 -12
- package/dist/vscode-lean4/lean4-unicode-input-component/package.json +2 -2
- package/dist/vscode-lean4/package-lock.json +6129 -3245
- package/dist/vscode-lean4/vscode-lean4/language-configuration.json +1 -1
- package/dist/vscode-lean4/vscode-lean4/loogleview/static/index.css +19 -16
- package/dist/vscode-lean4/vscode-lean4/package.json +638 -18
- package/dist/vscode-lean4/vscode-lean4/src/abbreviation/AbbreviationFeature.d.ts +2 -2
- package/dist/vscode-lean4/vscode-lean4/src/abbreviation/AbbreviationFeature.js +2 -2
- package/dist/vscode-lean4/vscode-lean4/src/abbreviation/AbbreviationRewriterFeature.d.ts +2 -3
- package/dist/vscode-lean4/vscode-lean4/src/abbreviation/AbbreviationRewriterFeature.js +3 -5
- package/dist/vscode-lean4/vscode-lean4/src/abbreviation/VSCodeAbbreviationRewriter.d.ts +1 -2
- package/dist/vscode-lean4/vscode-lean4/src/abbreviation/VSCodeAbbreviationRewriter.js +4 -8
- package/dist/vscode-lean4/vscode-lean4/src/config.d.ts +14 -1
- package/dist/vscode-lean4/vscode-lean4/src/config.js +56 -5
- package/dist/vscode-lean4/vscode-lean4/src/diagnostics/setupDiagnoser.d.ts +36 -5
- package/dist/vscode-lean4/vscode-lean4/src/diagnostics/setupDiagnoser.js +59 -23
- package/dist/vscode-lean4/vscode-lean4/src/diagnostics/setupDiagnostics.d.ts +22 -17
- package/dist/vscode-lean4/vscode-lean4/src/diagnostics/setupDiagnostics.js +182 -119
- package/dist/vscode-lean4/vscode-lean4/src/diagnostics/setupNotifs.d.ts +33 -20
- package/dist/vscode-lean4/vscode-lean4/src/diagnostics/setupNotifs.js +235 -89
- package/dist/vscode-lean4/vscode-lean4/src/infoview.d.ts +15 -17
- package/dist/vscode-lean4/vscode-lean4/src/infoview.js +218 -103
- package/dist/vscode-lean4/vscode-lean4/src/leanclient.d.ts +12 -7
- package/dist/vscode-lean4/vscode-lean4/src/leanclient.js +187 -64
- package/dist/vscode-lean4/vscode-lean4/src/taskgutter.d.ts +35 -3
- package/dist/vscode-lean4/vscode-lean4/src/taskgutter.js +533 -93
- package/dist/vscode-lean4/vscode-lean4/src/utils/batch.d.ts +12 -4
- package/dist/vscode-lean4/vscode-lean4/src/utils/batch.js +78 -72
- package/dist/vscode-lean4/vscode-lean4/src/utils/clientProvider.d.ts +9 -9
- package/dist/vscode-lean4/vscode-lean4/src/utils/clientProvider.js +121 -77
- package/dist/vscode-lean4/vscode-lean4/src/utils/converters.d.ts +15 -0
- package/dist/vscode-lean4/vscode-lean4/src/utils/converters.js +9 -0
- package/dist/vscode-lean4/vscode-lean4/src/utils/elan.d.ts +179 -1
- package/dist/vscode-lean4/vscode-lean4/src/utils/elan.js +422 -3
- package/dist/vscode-lean4/vscode-lean4/src/utils/exturi.d.ts +3 -1
- package/dist/vscode-lean4/vscode-lean4/src/utils/exturi.js +11 -11
- package/dist/vscode-lean4/vscode-lean4/src/utils/internalErrors.d.ts +2 -0
- package/dist/vscode-lean4/vscode-lean4/src/utils/internalErrors.js +35 -0
- package/dist/vscode-lean4/vscode-lean4/src/utils/leanCmdRunner.js +1 -1
- package/dist/vscode-lean4/vscode-lean4/src/utils/leanInstaller.d.ts +41 -12
- package/dist/vscode-lean4/vscode-lean4/src/utils/leanInstaller.js +245 -128
- package/dist/vscode-lean4/vscode-lean4/src/utils/notifs.d.ts +27 -22
- package/dist/vscode-lean4/vscode-lean4/src/utils/notifs.js +177 -82
- package/dist/vscode-lean4/vscode-lean4/src/utils/projectInfo.d.ts +11 -4
- package/dist/vscode-lean4/vscode-lean4/src/utils/projectInfo.js +18 -16
- package/dist/vscode-lean4/vscode-lean4/src/utils/semverRegex.d.ts +1 -0
- package/dist/vscode-lean4/vscode-lean4/src/utils/semverRegex.js +2 -0
- package/dist/vscode-lean4/vscode-lean4/tsconfig.json +2 -1
- package/dist/vscode-lean4/vscode-lean4/webview/tsconfig.json +3 -1
- package/dist/vscode.css +7 -0
- package/package.json +7 -3
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/vscode-lean4/lean4-infoview/dist/index.css +0 -4366
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/_iconCloud/keywords.transforms.json +0 -83
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/_iconCloud/keywords.variables.json +0 -47
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/_iconCloud/manifest.json +0 -36
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/_iconCloud/manifest.transforms.json +0 -368
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/_iconCloud/manifest.variables.json +0 -149
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/dist/codicon.css +0 -571
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/dist/codicon.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/dist/codicon.ttf +0 -0
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/package.json +0 -34
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/account.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/activate-breakpoints.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/add.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/archive.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-both.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-circle-down.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-circle-left.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-circle-right.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-circle-up.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-down.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-left.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-right.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-small-down.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-small-left.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-small-right.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-small-up.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-swap.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/arrow-up.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/azure-devops.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/azure.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/beaker-stop.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/beaker.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/bell-dot.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/bell-slash-dot.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/bell-slash.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/bell.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/blank.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/bold.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/book.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/bookmark.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/bracket-dot.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/bracket-error.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/briefcase.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/broadcast.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/browser.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/bug.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/calendar.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/call-incoming.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/call-outgoing.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/case-sensitive.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/check-all.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/check.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/checklist.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/chevron-down.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/chevron-left.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/chevron-right.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/chevron-up.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/chrome-close.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/chrome-maximize.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/chrome-minimize.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/chrome-restore.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/circle-filled.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/circle-large-filled.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/circle-large-outline.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/circle-outline.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/circle-slash.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/circle-small-filled.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/circle-small.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/circuit-board.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/clear-all.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/clippy.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/close-all.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/close.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/cloud-download.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/cloud-upload.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/cloud.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/code.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/collapse-all.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/color-mode.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/combine.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/comment-discussion.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/comment-unresolved.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/comment.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/compass-active.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/compass-dot.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/compass.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/copy.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/credit-card.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/dash.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/dashboard.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/database.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-all.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-alt-small.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-alt.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-breakpoint-conditional-unverified.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-breakpoint-conditional.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-breakpoint-data-unverified.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-breakpoint-data.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-breakpoint-function-unverified.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-breakpoint-function.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-breakpoint-log-unverified.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-breakpoint-log.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-breakpoint-unsupported.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-console.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-continue-small.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-continue.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-coverage.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-disconnect.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-line-by-line.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-pause.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-rerun.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-restart-frame.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-restart.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-reverse-continue.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-stackframe-active.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-stackframe.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-start.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-step-back.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-step-into.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-step-out.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-step-over.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug-stop.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/debug.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/desktop-download.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/device-camera-video.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/device-camera.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/device-mobile.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/diff-added.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/diff-ignored.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/diff-modified.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/diff-removed.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/diff-renamed.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/diff.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/discard.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/edit.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/editor-layout.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/ellipsis.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/empty-window.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/error-small.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/error.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/exclude.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/expand-all.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/export.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/extensions.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/eye-closed.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/eye.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/feedback.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/file-binary.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/file-code.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/file-media.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/file-pdf.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/file-submodule.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/file-symlink-directory.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/file-symlink-file.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/file-zip.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/file.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/files.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/filter-filled.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/filter.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/flame.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/fold-down.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/fold-up.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/fold.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/folder-active.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/folder-library.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/folder-opened.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/folder.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/gear.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/gift.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/gist-secret.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/gist.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/git-commit.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/git-compare.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/git-merge.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/git-pull-request-closed.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/git-pull-request-create.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/git-pull-request-draft.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/git-pull-request-go-to-changes.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/git-pull-request-new-changes.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/git-pull-request.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/github-action.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/github-alt.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/github-inverted.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/github.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/globe.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/go-to-file.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/grabber.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/graph-left.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/graph-line.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/graph-scatter.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/graph.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/gripper.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/group-by-ref-type.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/heart-filled.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/heart.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/history.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/home.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/horizontal-rule.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/hubot.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/inbox.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/indent.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/info.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/inspect.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/issue-draft.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/issue-reopened.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/issues.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/italic.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/jersey.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/json.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/kebab-vertical.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/key.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/law.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layers-active.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layers-dot.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layers.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-activitybar-left.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-activitybar-right.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-centered.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-menubar.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-panel-center.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-panel-justify.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-panel-left.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-panel-off.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-panel-right.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-panel.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-sidebar-left-off.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-sidebar-left.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-sidebar-right-off.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-sidebar-right.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout-statusbar.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/layout.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/library.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/lightbulb-autofix.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/lightbulb.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/link-external.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/link.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/list-filter.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/list-flat.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/list-ordered.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/list-selection.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/list-tree.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/list-unordered.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/live-share.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/loading.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/location.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/lock-small.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/lock.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/magnet.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/mail-read.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/mail.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/map-filled.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/map.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/markdown.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/megaphone.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/mention.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/menu.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/merge.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/milestone.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/mirror.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/mortar-board.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/move.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/multiple-windows.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/mute.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/new-file.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/new-folder.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/newline.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/no-newline.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/note.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/notebook-template.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/notebook.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/octoface.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/open-preview.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/organization.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/output.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/package.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/paintcan.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/pass-filled.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/pass.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/person-add.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/person.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/pie-chart.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/pin.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/pinned-dirty.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/pinned.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/play-circle.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/play.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/plug.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/preserve-case.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/preview.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/primitive-square.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/project.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/pulse.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/question.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/quote.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/radio-tower.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/reactions.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/record-keys.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/record-small.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/record.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/redo.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/references.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/refresh.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/regex.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/remote-explorer.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/remote.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/remove.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/replace-all.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/replace.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/reply.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/repo-clone.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/repo-force-push.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/repo-forked.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/repo-pull.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/repo-push.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/repo.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/report.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/request-changes.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/rocket.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/root-folder-opened.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/root-folder.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/rss.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/ruby.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/run-above.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/run-all.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/run-below.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/run-errors.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/save-all.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/save-as.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/save.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/screen-full.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/screen-normal.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/search-stop.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/search.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/server-environment.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/server-process.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/server.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/settings-gear.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/settings.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/shield.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/sign-in.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/sign-out.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/smiley.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/sort-precedence.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/source-control.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/split-horizontal.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/split-vertical.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/squirrel.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/star-empty.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/star-full.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/star-half.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/stop-circle.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-array.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-boolean.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-class.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-color.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-constant.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-enum-member.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-enum.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-event.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-field.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-file.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-interface.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-key.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-keyword.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-method.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-misc.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-namespace.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-numeric.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-operator.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-parameter.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-property.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-ruler.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-snippet.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-string.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-structure.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/symbol-variable.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/sync-ignored.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/sync.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/table.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/tag.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/target.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/tasklist.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/telescope.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/terminal-bash.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/terminal-cmd.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/terminal-debian.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/terminal-linux.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/terminal-powershell.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/terminal-tmux.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/terminal-ubuntu.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/terminal.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/text-size.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/three-bars.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/thumbsdown.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/thumbsup.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/tools.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/trash.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/triangle-down.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/triangle-left.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/triangle-right.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/triangle-up.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/twitter.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/type-hierarchy-sub.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/type-hierarchy-super.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/type-hierarchy.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/unfold.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/ungroup-by-ref-type.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/unlock.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/unmute.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/unverified.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/variable-group.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/verified-filled.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/verified.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/versions.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/vm-active.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/vm-connect.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/vm-outline.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/vm-running.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/vm.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/wand.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/warning.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/watch.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/whitespace.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/whole-word.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/window.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/word-wrap.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/workspace-trusted.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/workspace-unknown.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/workspace-untrusted.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/zoom-in.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/icons/zoom-out.svg +0 -1
- package/dist/vscode-lean4/lean4-infoview/node_modules/@vscode/codicons/src/template/mapping.json +0 -514
- package/dist/vscode-lean4/lean4-infoview/src/infoview/contexts.d.ts +0 -46
- package/dist/vscode-lean4/lean4-infoview/src/infoview/contexts.js +0 -44
- package/dist/vscode-lean4/lean4-infoview/src/infoview/editorConnection.js +0 -41
- package/dist/vscode-lean4/lean4-infoview/src/infoview/event.js +0 -57
- package/dist/vscode-lean4/lean4-infoview/src/infoview/serverVersion.js +0 -25
- package/dist/vscode-lean4/lean4-infoview/src/infoview/util.js +0 -336
- package/dist/vscode-lean4/lean4-unicode-input/dist/abbreviations.json +0 -1829
- package/dist/vscode-lean4/vscode-lean4/dist/lean4-infoview/codicon.ttf +0 -0
- package/dist/vscode-lean4/vscode-lean4/dist/loogleview/static/codicons/codicon.css +0 -571
- package/dist/vscode-lean4/vscode-lean4/dist/loogleview/static/codicons/codicon.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/dist/loogleview/static/codicons/codicon.ttf +0 -0
- package/dist/vscode-lean4/vscode-lean4/dist/loogleview/static/index.css +0 -97
- package/dist/vscode-lean4/vscode-lean4/dist/moogleview/static/codicons/codicon.css +0 -571
- package/dist/vscode-lean4/vscode-lean4/dist/moogleview/static/codicons/codicon.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/dist/moogleview/static/codicons/codicon.ttf +0 -0
- package/dist/vscode-lean4/vscode-lean4/dist/moogleview/static/index.css +0 -198
- package/dist/vscode-lean4/vscode-lean4/node_modules/@types/node/package.json +0 -220
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/_iconCloud/keywords.transforms.json +0 -83
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/_iconCloud/keywords.variables.json +0 -47
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/_iconCloud/manifest.json +0 -36
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/_iconCloud/manifest.transforms.json +0 -368
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/_iconCloud/manifest.variables.json +0 -149
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/dist/codicon.css +0 -629
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/dist/codicon.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/dist/codicon.ttf +0 -0
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/package.json +0 -35
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/account.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/activate-breakpoints.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/add.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/archive.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-both.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-circle-down.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-circle-left.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-circle-right.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-circle-up.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-down.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-left.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-right.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-small-down.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-small-left.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-small-right.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-small-up.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-swap.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/arrow-up.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/azure-devops.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/azure.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/beaker-stop.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/beaker.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/bell-dot.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/bell-slash-dot.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/bell-slash.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/bell.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/blank.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/bold.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/book.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/bookmark.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/bracket-dot.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/bracket-error.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/briefcase.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/broadcast.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/browser.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/bug.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/calendar.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/call-incoming.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/call-outgoing.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/case-sensitive.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/check-all.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/check.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/checklist.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/chevron-down.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/chevron-left.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/chevron-right.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/chevron-up.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/chip.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/chrome-close.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/chrome-maximize.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/chrome-minimize.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/chrome-restore.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/circle-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/circle-large-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/circle-large.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/circle-slash.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/circle-small-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/circle-small.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/circle.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/circuit-board.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/clear-all.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/clippy.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/close-all.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/close.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/cloud-download.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/cloud-upload.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/cloud.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/code-oss.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/code.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/coffee.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/collapse-all.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/color-mode.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/combine.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/comment-discussion.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/comment-draft.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/comment-unresolved.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/comment.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/compass-active.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/compass-dot.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/compass.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/copilot.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/copy.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/coverage.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/credit-card.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/dash.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/dashboard.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/database.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-all.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-alt-small.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-alt.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-breakpoint-conditional-unverified.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-breakpoint-conditional.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-breakpoint-data-unverified.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-breakpoint-data.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-breakpoint-function-unverified.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-breakpoint-function.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-breakpoint-log-unverified.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-breakpoint-log.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-breakpoint-unsupported.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-console.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-continue-small.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-continue.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-coverage.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-disconnect.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-line-by-line.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-pause.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-rerun.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-restart-frame.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-restart.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-reverse-continue.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-stackframe-active.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-stackframe.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-start.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-step-back.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-step-into.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-step-out.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-step-over.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug-stop.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/debug.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/desktop-download.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/device-camera-video.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/device-camera.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/device-mobile.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/diff-added.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/diff-ignored.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/diff-modified.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/diff-multiple.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/diff-removed.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/diff-renamed.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/diff-single.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/diff.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/discard.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/edit.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/editor-layout.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/ellipsis.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/empty-window.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/error-small.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/error.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/exclude.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/expand-all.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/export.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/extensions.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/eye-closed.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/eye.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/feedback.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/file-binary.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/file-code.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/file-media.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/file-pdf.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/file-submodule.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/file-symlink-directory.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/file-symlink-file.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/file-zip.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/file.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/files.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/filter-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/filter.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/flame.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/fold-down.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/fold-up.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/fold.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/folder-active.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/folder-library.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/folder-opened.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/folder.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/game.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/gear.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/gift.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/gist-secret.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/gist.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-commit.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-compare.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-fetch.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-merge.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-pull-request-closed.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-pull-request-create.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-pull-request-draft.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-pull-request-go-to-changes.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-pull-request-new-changes.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-pull-request.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-stash-apply.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-stash-pop.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/git-stash.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/github-action.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/github-alt.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/github-inverted.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/github-project.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/github.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/globe.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/go-to-file.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/go-to-search.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/grabber.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/graph-left.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/graph-line.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/graph-scatter.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/graph.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/gripper.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/group-by-ref-type.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/heart-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/heart.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/history.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/home.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/horizontal-rule.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/hubot.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/inbox.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/indent.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/info.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/insert.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/inspect.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/issue-draft.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/issue-reopened.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/issues.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/italic.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/jersey.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/json.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/kebab-vertical.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/key.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/law.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layers-active.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layers-dot.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layers.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-activitybar-left.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-activitybar-right.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-centered.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-menubar.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-panel-center.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-panel-justify.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-panel-left.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-panel-off.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-panel-right.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-panel.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-sidebar-left-off.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-sidebar-left.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-sidebar-right-off.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-sidebar-right.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout-statusbar.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/layout.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/library.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/lightbulb-autofix.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/lightbulb-sparkle.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/lightbulb.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/link-external.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/link.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/list-filter.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/list-flat.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/list-ordered.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/list-selection.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/list-tree.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/list-unordered.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/live-share.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/loading.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/location.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/lock-small.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/lock.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/magnet.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/mail-read.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/mail.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/map-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/map-vertical-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/map-vertical.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/map.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/markdown.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/megaphone.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/mention.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/menu.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/merge.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/mic-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/mic.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/milestone.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/mirror.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/mortar-board.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/move.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/multiple-windows.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/music.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/mute.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/new-file.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/new-folder.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/newline.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/no-newline.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/note.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/notebook-template.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/notebook.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/octoface.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/open-preview.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/organization.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/output.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/package.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/paintcan.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/pass-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/pass.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/percentage.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/person-add.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/person.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/piano.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/pie-chart.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/pin.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/pinned-dirty.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/pinned.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/play-circle.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/play.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/plug.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/preserve-case.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/preview.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/primitive-square.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/project.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/pulse.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/question.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/quote.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/radio-tower.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/reactions.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/record-keys.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/record-small.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/record.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/redo.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/references.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/refresh.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/regex.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/remote-explorer.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/remote.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/remove.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/replace-all.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/replace.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/reply.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/repo-clone.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/repo-fetch.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/repo-force-push.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/repo-forked.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/repo-pull.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/repo-push.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/repo.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/report.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/request-changes.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/robot.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/rocket.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/root-folder-opened.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/root-folder.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/rss.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/ruby.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/run-above.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/run-all-coverage.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/run-all.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/run-below.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/run-coverage.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/run-errors.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/save-all.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/save-as.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/save.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/screen-full.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/screen-normal.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/search-fuzzy.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/search-stop.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/search.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/send.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/server-environment.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/server-process.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/server.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/settings-gear.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/settings.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/share.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/shield.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/sign-in.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/sign-out.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/smiley.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/snake.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/sort-precedence.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/source-control.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/sparkle-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/sparkle.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/split-horizontal.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/split-vertical.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/squirrel.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/star-empty.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/star-full.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/star-half.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/stop-circle.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/surround-with.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-array.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-boolean.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-class.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-color.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-constant.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-enum-member.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-enum.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-event.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-field.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-file.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-interface.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-key.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-keyword.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-method.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-misc.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-namespace.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-numeric.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-operator.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-parameter.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-property.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-ruler.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-snippet.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-string.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-structure.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/symbol-variable.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/sync-ignored.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/sync.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/table.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/tag.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/target.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/tasklist.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/telescope.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/terminal-bash.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/terminal-cmd.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/terminal-debian.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/terminal-linux.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/terminal-powershell.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/terminal-tmux.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/terminal-ubuntu.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/terminal.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/text-size.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/three-bars.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/thumbsdown-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/thumbsdown.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/thumbsup-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/thumbsup.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/tools.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/trash.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/triangle-down.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/triangle-left.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/triangle-right.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/triangle-up.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/twitter.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/type-hierarchy-sub.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/type-hierarchy-super.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/type-hierarchy.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/unfold.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/ungroup-by-ref-type.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/unlock.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/unmute.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/unverified.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/variable-group.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/verified-filled.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/verified.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/versions.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/vm-active.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/vm-connect.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/vm-outline.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/vm-running.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/vm.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/vr.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/vscode-insiders.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/vscode.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/wand.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/warning.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/watch.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/whitespace.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/whole-word.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/window.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/word-wrap.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/workspace-trusted.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/workspace-unknown.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/workspace-untrusted.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/zoom-in.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/icons/zoom-out.svg +0 -1
- package/dist/vscode-lean4/vscode-lean4/node_modules/@vscode/codicons/src/template/mapping.json +0 -571
- package/dist/vscode-lean4/vscode-lean4/node_modules/brace-expansion/package.json +0 -46
- package/dist/vscode-lean4/vscode-lean4/node_modules/glob/dist/commonjs/package.json +0 -3
- package/dist/vscode-lean4/vscode-lean4/node_modules/glob/dist/esm/package.json +0 -3
- package/dist/vscode-lean4/vscode-lean4/node_modules/glob/package.json +0 -99
- package/dist/vscode-lean4/vscode-lean4/node_modules/jackspeak/dist/commonjs/package.json +0 -3
- package/dist/vscode-lean4/vscode-lean4/node_modules/jackspeak/dist/esm/package.json +0 -3
- package/dist/vscode-lean4/vscode-lean4/node_modules/jackspeak/package.json +0 -94
- package/dist/vscode-lean4/vscode-lean4/node_modules/lru-cache/dist/commonjs/package.json +0 -3
- package/dist/vscode-lean4/vscode-lean4/node_modules/lru-cache/dist/esm/package.json +0 -3
- package/dist/vscode-lean4/vscode-lean4/node_modules/lru-cache/package.json +0 -115
- package/dist/vscode-lean4/vscode-lean4/node_modules/minimatch/dist/commonjs/package.json +0 -3
- package/dist/vscode-lean4/vscode-lean4/node_modules/minimatch/dist/esm/package.json +0 -3
- package/dist/vscode-lean4/vscode-lean4/node_modules/minimatch/package.json +0 -82
- package/dist/vscode-lean4/vscode-lean4/node_modules/path-scurry/dist/commonjs/package.json +0 -3
- package/dist/vscode-lean4/vscode-lean4/node_modules/path-scurry/dist/esm/package.json +0 -3
- package/dist/vscode-lean4/vscode-lean4/node_modules/path-scurry/package.json +0 -88
- package/dist/vscode-lean4/vscode-lean4/node_modules/undici-types/package.json +0 -55
- package/dist/vscode-lean4/vscode-lean4/node_modules/vscode-jsonrpc/package.json +0 -45
- package/dist/vscode-lean4/vscode-lean4/node_modules/vscode-languageclient/node_modules/minimatch/package.json +0 -35
- package/dist/vscode-lean4/vscode-lean4/node_modules/vscode-languageclient/package.json +0 -50
- package/dist/vscode-lean4/vscode-lean4/node_modules/vscode-languageserver-protocol/metaModel.schema.json +0 -783
- package/dist/vscode-lean4/vscode-lean4/node_modules/vscode-languageserver-protocol/package.json +0 -45
- package/dist/vscode-lean4/vscode-lean4/node_modules/vscode-languageserver-types/package.json +0 -32
- package/dist/vscode-lean4/vscode-lean4/src/leanclientsetup.d.ts +0 -3
- package/dist/vscode-lean4/vscode-lean4/src/leanclientsetup.js +0 -58
- package/dist/vscode-lean4/vscode-lean4/src/utils/batchBasics.js +0 -48
- package/dist/vscode-lean4/vscode-lean4/src/utils/batchTypes.d.ts +0 -14
- package/dist/vscode-lean4/vscode-lean4/src/utils/batchTypes.js +0 -22
- /package/dist/{vscode-lean4/lean4-infoview/dist → lean4-infoview}/codicon.ttf +0 -0
- /package/dist/{vscode-lean4/lean4-infoview/src → lean4-infoview}/infoview/editorConnection.d.ts +0 -0
- /package/dist/{vscode-lean4/lean4-infoview/src → lean4-infoview}/infoview/event.d.ts +0 -0
- /package/dist/{vscode-lean4/lean4-infoview/src → lean4-infoview}/infoview/serverVersion.d.ts +0 -0
|
@@ -0,0 +1,2823 @@
|
|
|
1
|
+
function _mergeNamespaces(n, m) {
|
|
2
|
+
m.forEach(function (e) {
|
|
3
|
+
e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {
|
|
4
|
+
if (k !== 'default' && !(k in n)) {
|
|
5
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
6
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () { return e[k]; }
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
return Object.freeze(n);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function getDefaultExportFromCjs (x) {
|
|
17
|
+
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var reactExports = {};
|
|
21
|
+
var react = {
|
|
22
|
+
get exports(){ return reactExports; },
|
|
23
|
+
set exports(v){ reactExports = v; },
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
var react_developmentExports = {};
|
|
27
|
+
var react_development = {
|
|
28
|
+
get exports(){ return react_developmentExports; },
|
|
29
|
+
set exports(v){ react_developmentExports = v; },
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @license React
|
|
34
|
+
* react.development.js
|
|
35
|
+
*
|
|
36
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
37
|
+
*
|
|
38
|
+
* This source code is licensed under the MIT license found in the
|
|
39
|
+
* LICENSE file in the root directory of this source tree.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
(function (module, exports) {
|
|
43
|
+
|
|
44
|
+
{
|
|
45
|
+
(function() {
|
|
46
|
+
|
|
47
|
+
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
|
|
48
|
+
if (
|
|
49
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
|
|
50
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
|
|
51
|
+
'function'
|
|
52
|
+
) {
|
|
53
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
|
|
54
|
+
}
|
|
55
|
+
var ReactVersion = '18.2.0';
|
|
56
|
+
|
|
57
|
+
// ATTENTION
|
|
58
|
+
// When adding new symbols to this file,
|
|
59
|
+
// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
|
|
60
|
+
// The Symbol used to tag the ReactElement-like types.
|
|
61
|
+
var REACT_ELEMENT_TYPE = Symbol.for('react.element');
|
|
62
|
+
var REACT_PORTAL_TYPE = Symbol.for('react.portal');
|
|
63
|
+
var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');
|
|
64
|
+
var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');
|
|
65
|
+
var REACT_PROFILER_TYPE = Symbol.for('react.profiler');
|
|
66
|
+
var REACT_PROVIDER_TYPE = Symbol.for('react.provider');
|
|
67
|
+
var REACT_CONTEXT_TYPE = Symbol.for('react.context');
|
|
68
|
+
var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');
|
|
69
|
+
var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');
|
|
70
|
+
var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');
|
|
71
|
+
var REACT_MEMO_TYPE = Symbol.for('react.memo');
|
|
72
|
+
var REACT_LAZY_TYPE = Symbol.for('react.lazy');
|
|
73
|
+
var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');
|
|
74
|
+
var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
|
|
75
|
+
var FAUX_ITERATOR_SYMBOL = '@@iterator';
|
|
76
|
+
function getIteratorFn(maybeIterable) {
|
|
77
|
+
if (maybeIterable === null || typeof maybeIterable !== 'object') {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
|
|
82
|
+
|
|
83
|
+
if (typeof maybeIterator === 'function') {
|
|
84
|
+
return maybeIterator;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Keeps track of the current dispatcher.
|
|
92
|
+
*/
|
|
93
|
+
var ReactCurrentDispatcher = {
|
|
94
|
+
/**
|
|
95
|
+
* @internal
|
|
96
|
+
* @type {ReactComponent}
|
|
97
|
+
*/
|
|
98
|
+
current: null
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Keeps track of the current batch's configuration such as how long an update
|
|
103
|
+
* should suspend for if it needs to.
|
|
104
|
+
*/
|
|
105
|
+
var ReactCurrentBatchConfig = {
|
|
106
|
+
transition: null
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
var ReactCurrentActQueue = {
|
|
110
|
+
current: null,
|
|
111
|
+
// Used to reproduce behavior of `batchedUpdates` in legacy mode.
|
|
112
|
+
isBatchingLegacy: false,
|
|
113
|
+
didScheduleLegacyUpdate: false
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Keeps track of the current owner.
|
|
118
|
+
*
|
|
119
|
+
* The current owner is the component who should own any components that are
|
|
120
|
+
* currently being constructed.
|
|
121
|
+
*/
|
|
122
|
+
var ReactCurrentOwner = {
|
|
123
|
+
/**
|
|
124
|
+
* @internal
|
|
125
|
+
* @type {ReactComponent}
|
|
126
|
+
*/
|
|
127
|
+
current: null
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
var ReactDebugCurrentFrame = {};
|
|
131
|
+
var currentExtraStackFrame = null;
|
|
132
|
+
function setExtraStackFrame(stack) {
|
|
133
|
+
{
|
|
134
|
+
currentExtraStackFrame = stack;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
{
|
|
139
|
+
ReactDebugCurrentFrame.setExtraStackFrame = function (stack) {
|
|
140
|
+
{
|
|
141
|
+
currentExtraStackFrame = stack;
|
|
142
|
+
}
|
|
143
|
+
}; // Stack implementation injected by the current renderer.
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
ReactDebugCurrentFrame.getCurrentStack = null;
|
|
147
|
+
|
|
148
|
+
ReactDebugCurrentFrame.getStackAddendum = function () {
|
|
149
|
+
var stack = ''; // Add an extra top frame while an element is being validated
|
|
150
|
+
|
|
151
|
+
if (currentExtraStackFrame) {
|
|
152
|
+
stack += currentExtraStackFrame;
|
|
153
|
+
} // Delegate to the injected renderer-specific implementation
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
var impl = ReactDebugCurrentFrame.getCurrentStack;
|
|
157
|
+
|
|
158
|
+
if (impl) {
|
|
159
|
+
stack += impl() || '';
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return stack;
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// -----------------------------------------------------------------------------
|
|
167
|
+
|
|
168
|
+
var enableScopeAPI = false; // Experimental Create Event Handle API.
|
|
169
|
+
var enableCacheElement = false;
|
|
170
|
+
var enableTransitionTracing = false; // No known bugs, but needs performance testing
|
|
171
|
+
|
|
172
|
+
var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber
|
|
173
|
+
// stuff. Intended to enable React core members to more easily debug scheduling
|
|
174
|
+
// issues in DEV builds.
|
|
175
|
+
|
|
176
|
+
var enableDebugTracing = false; // Track which Fiber(s) schedule render work.
|
|
177
|
+
|
|
178
|
+
var ReactSharedInternals = {
|
|
179
|
+
ReactCurrentDispatcher: ReactCurrentDispatcher,
|
|
180
|
+
ReactCurrentBatchConfig: ReactCurrentBatchConfig,
|
|
181
|
+
ReactCurrentOwner: ReactCurrentOwner
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
{
|
|
185
|
+
ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame;
|
|
186
|
+
ReactSharedInternals.ReactCurrentActQueue = ReactCurrentActQueue;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// by calls to these methods by a Babel plugin.
|
|
190
|
+
//
|
|
191
|
+
// In PROD (or in packages without access to React internals),
|
|
192
|
+
// they are left as they are instead.
|
|
193
|
+
|
|
194
|
+
function warn(format) {
|
|
195
|
+
{
|
|
196
|
+
{
|
|
197
|
+
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
198
|
+
args[_key - 1] = arguments[_key];
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
printWarning('warn', format, args);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function error(format) {
|
|
206
|
+
{
|
|
207
|
+
{
|
|
208
|
+
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
209
|
+
args[_key2 - 1] = arguments[_key2];
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
printWarning('error', format, args);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function printWarning(level, format, args) {
|
|
218
|
+
// When changing this logic, you might want to also
|
|
219
|
+
// update consoleWithStackDev.www.js as well.
|
|
220
|
+
{
|
|
221
|
+
var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
|
|
222
|
+
var stack = ReactDebugCurrentFrame.getStackAddendum();
|
|
223
|
+
|
|
224
|
+
if (stack !== '') {
|
|
225
|
+
format += '%s';
|
|
226
|
+
args = args.concat([stack]);
|
|
227
|
+
} // eslint-disable-next-line react-internal/safe-string-coercion
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
var argsWithFormat = args.map(function (item) {
|
|
231
|
+
return String(item);
|
|
232
|
+
}); // Careful: RN currently depends on this prefix
|
|
233
|
+
|
|
234
|
+
argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
|
|
235
|
+
// breaks IE9: https://github.com/facebook/react/issues/13610
|
|
236
|
+
// eslint-disable-next-line react-internal/no-production-logging
|
|
237
|
+
|
|
238
|
+
Function.prototype.apply.call(console[level], console, argsWithFormat);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
var didWarnStateUpdateForUnmountedComponent = {};
|
|
243
|
+
|
|
244
|
+
function warnNoop(publicInstance, callerName) {
|
|
245
|
+
{
|
|
246
|
+
var _constructor = publicInstance.constructor;
|
|
247
|
+
var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass';
|
|
248
|
+
var warningKey = componentName + "." + callerName;
|
|
249
|
+
|
|
250
|
+
if (didWarnStateUpdateForUnmountedComponent[warningKey]) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName);
|
|
255
|
+
|
|
256
|
+
didWarnStateUpdateForUnmountedComponent[warningKey] = true;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* This is the abstract API for an update queue.
|
|
261
|
+
*/
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
var ReactNoopUpdateQueue = {
|
|
265
|
+
/**
|
|
266
|
+
* Checks whether or not this composite component is mounted.
|
|
267
|
+
* @param {ReactClass} publicInstance The instance we want to test.
|
|
268
|
+
* @return {boolean} True if mounted, false otherwise.
|
|
269
|
+
* @protected
|
|
270
|
+
* @final
|
|
271
|
+
*/
|
|
272
|
+
isMounted: function (publicInstance) {
|
|
273
|
+
return false;
|
|
274
|
+
},
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Forces an update. This should only be invoked when it is known with
|
|
278
|
+
* certainty that we are **not** in a DOM transaction.
|
|
279
|
+
*
|
|
280
|
+
* You may want to call this when you know that some deeper aspect of the
|
|
281
|
+
* component's state has changed but `setState` was not called.
|
|
282
|
+
*
|
|
283
|
+
* This will not invoke `shouldComponentUpdate`, but it will invoke
|
|
284
|
+
* `componentWillUpdate` and `componentDidUpdate`.
|
|
285
|
+
*
|
|
286
|
+
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
287
|
+
* @param {?function} callback Called after component is updated.
|
|
288
|
+
* @param {?string} callerName name of the calling function in the public API.
|
|
289
|
+
* @internal
|
|
290
|
+
*/
|
|
291
|
+
enqueueForceUpdate: function (publicInstance, callback, callerName) {
|
|
292
|
+
warnNoop(publicInstance, 'forceUpdate');
|
|
293
|
+
},
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Replaces all of the state. Always use this or `setState` to mutate state.
|
|
297
|
+
* You should treat `this.state` as immutable.
|
|
298
|
+
*
|
|
299
|
+
* There is no guarantee that `this.state` will be immediately updated, so
|
|
300
|
+
* accessing `this.state` after calling this method may return the old value.
|
|
301
|
+
*
|
|
302
|
+
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
303
|
+
* @param {object} completeState Next state.
|
|
304
|
+
* @param {?function} callback Called after component is updated.
|
|
305
|
+
* @param {?string} callerName name of the calling function in the public API.
|
|
306
|
+
* @internal
|
|
307
|
+
*/
|
|
308
|
+
enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {
|
|
309
|
+
warnNoop(publicInstance, 'replaceState');
|
|
310
|
+
},
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Sets a subset of the state. This only exists because _pendingState is
|
|
314
|
+
* internal. This provides a merging strategy that is not available to deep
|
|
315
|
+
* properties which is confusing. TODO: Expose pendingState or don't use it
|
|
316
|
+
* during the merge.
|
|
317
|
+
*
|
|
318
|
+
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
319
|
+
* @param {object} partialState Next partial state to be merged with state.
|
|
320
|
+
* @param {?function} callback Called after component is updated.
|
|
321
|
+
* @param {?string} Name of the calling function in the public API.
|
|
322
|
+
* @internal
|
|
323
|
+
*/
|
|
324
|
+
enqueueSetState: function (publicInstance, partialState, callback, callerName) {
|
|
325
|
+
warnNoop(publicInstance, 'setState');
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
var assign = Object.assign;
|
|
330
|
+
|
|
331
|
+
var emptyObject = {};
|
|
332
|
+
|
|
333
|
+
{
|
|
334
|
+
Object.freeze(emptyObject);
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Base class helpers for the updating state of a component.
|
|
338
|
+
*/
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
function Component(props, context, updater) {
|
|
342
|
+
this.props = props;
|
|
343
|
+
this.context = context; // If a component has string refs, we will assign a different object later.
|
|
344
|
+
|
|
345
|
+
this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the
|
|
346
|
+
// renderer.
|
|
347
|
+
|
|
348
|
+
this.updater = updater || ReactNoopUpdateQueue;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
Component.prototype.isReactComponent = {};
|
|
352
|
+
/**
|
|
353
|
+
* Sets a subset of the state. Always use this to mutate
|
|
354
|
+
* state. You should treat `this.state` as immutable.
|
|
355
|
+
*
|
|
356
|
+
* There is no guarantee that `this.state` will be immediately updated, so
|
|
357
|
+
* accessing `this.state` after calling this method may return the old value.
|
|
358
|
+
*
|
|
359
|
+
* There is no guarantee that calls to `setState` will run synchronously,
|
|
360
|
+
* as they may eventually be batched together. You can provide an optional
|
|
361
|
+
* callback that will be executed when the call to setState is actually
|
|
362
|
+
* completed.
|
|
363
|
+
*
|
|
364
|
+
* When a function is provided to setState, it will be called at some point in
|
|
365
|
+
* the future (not synchronously). It will be called with the up to date
|
|
366
|
+
* component arguments (state, props, context). These values can be different
|
|
367
|
+
* from this.* because your function may be called after receiveProps but before
|
|
368
|
+
* shouldComponentUpdate, and this new state, props, and context will not yet be
|
|
369
|
+
* assigned to this.
|
|
370
|
+
*
|
|
371
|
+
* @param {object|function} partialState Next partial state or function to
|
|
372
|
+
* produce next partial state to be merged with current state.
|
|
373
|
+
* @param {?function} callback Called after state is updated.
|
|
374
|
+
* @final
|
|
375
|
+
* @protected
|
|
376
|
+
*/
|
|
377
|
+
|
|
378
|
+
Component.prototype.setState = function (partialState, callback) {
|
|
379
|
+
if (typeof partialState !== 'object' && typeof partialState !== 'function' && partialState != null) {
|
|
380
|
+
throw new Error('setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.');
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
this.updater.enqueueSetState(this, partialState, callback, 'setState');
|
|
384
|
+
};
|
|
385
|
+
/**
|
|
386
|
+
* Forces an update. This should only be invoked when it is known with
|
|
387
|
+
* certainty that we are **not** in a DOM transaction.
|
|
388
|
+
*
|
|
389
|
+
* You may want to call this when you know that some deeper aspect of the
|
|
390
|
+
* component's state has changed but `setState` was not called.
|
|
391
|
+
*
|
|
392
|
+
* This will not invoke `shouldComponentUpdate`, but it will invoke
|
|
393
|
+
* `componentWillUpdate` and `componentDidUpdate`.
|
|
394
|
+
*
|
|
395
|
+
* @param {?function} callback Called after update is complete.
|
|
396
|
+
* @final
|
|
397
|
+
* @protected
|
|
398
|
+
*/
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
Component.prototype.forceUpdate = function (callback) {
|
|
402
|
+
this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');
|
|
403
|
+
};
|
|
404
|
+
/**
|
|
405
|
+
* Deprecated APIs. These APIs used to exist on classic React classes but since
|
|
406
|
+
* we would like to deprecate them, we're not going to move them over to this
|
|
407
|
+
* modern base class. Instead, we define a getter that warns if it's accessed.
|
|
408
|
+
*/
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
{
|
|
412
|
+
var deprecatedAPIs = {
|
|
413
|
+
isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],
|
|
414
|
+
replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
var defineDeprecationWarning = function (methodName, info) {
|
|
418
|
+
Object.defineProperty(Component.prototype, methodName, {
|
|
419
|
+
get: function () {
|
|
420
|
+
warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);
|
|
421
|
+
|
|
422
|
+
return undefined;
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
};
|
|
426
|
+
|
|
427
|
+
for (var fnName in deprecatedAPIs) {
|
|
428
|
+
if (deprecatedAPIs.hasOwnProperty(fnName)) {
|
|
429
|
+
defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
function ComponentDummy() {}
|
|
435
|
+
|
|
436
|
+
ComponentDummy.prototype = Component.prototype;
|
|
437
|
+
/**
|
|
438
|
+
* Convenience component with default shallow equality check for sCU.
|
|
439
|
+
*/
|
|
440
|
+
|
|
441
|
+
function PureComponent(props, context, updater) {
|
|
442
|
+
this.props = props;
|
|
443
|
+
this.context = context; // If a component has string refs, we will assign a different object later.
|
|
444
|
+
|
|
445
|
+
this.refs = emptyObject;
|
|
446
|
+
this.updater = updater || ReactNoopUpdateQueue;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
var pureComponentPrototype = PureComponent.prototype = new ComponentDummy();
|
|
450
|
+
pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods.
|
|
451
|
+
|
|
452
|
+
assign(pureComponentPrototype, Component.prototype);
|
|
453
|
+
pureComponentPrototype.isPureReactComponent = true;
|
|
454
|
+
|
|
455
|
+
// an immutable object with a single mutable value
|
|
456
|
+
function createRef() {
|
|
457
|
+
var refObject = {
|
|
458
|
+
current: null
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
{
|
|
462
|
+
Object.seal(refObject);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
return refObject;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare
|
|
469
|
+
|
|
470
|
+
function isArray(a) {
|
|
471
|
+
return isArrayImpl(a);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/*
|
|
475
|
+
* The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol
|
|
476
|
+
* and Temporal.* types. See https://github.com/facebook/react/pull/22064.
|
|
477
|
+
*
|
|
478
|
+
* The functions in this module will throw an easier-to-understand,
|
|
479
|
+
* easier-to-debug exception with a clear errors message message explaining the
|
|
480
|
+
* problem. (Instead of a confusing exception thrown inside the implementation
|
|
481
|
+
* of the `value` object).
|
|
482
|
+
*/
|
|
483
|
+
// $FlowFixMe only called in DEV, so void return is not possible.
|
|
484
|
+
function typeName(value) {
|
|
485
|
+
{
|
|
486
|
+
// toStringTag is needed for namespaced types like Temporal.Instant
|
|
487
|
+
var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;
|
|
488
|
+
var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';
|
|
489
|
+
return type;
|
|
490
|
+
}
|
|
491
|
+
} // $FlowFixMe only called in DEV, so void return is not possible.
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
function willCoercionThrow(value) {
|
|
495
|
+
{
|
|
496
|
+
try {
|
|
497
|
+
testStringCoercion(value);
|
|
498
|
+
return false;
|
|
499
|
+
} catch (e) {
|
|
500
|
+
return true;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
function testStringCoercion(value) {
|
|
506
|
+
// If you ended up here by following an exception call stack, here's what's
|
|
507
|
+
// happened: you supplied an object or symbol value to React (as a prop, key,
|
|
508
|
+
// DOM attribute, CSS property, string ref, etc.) and when React tried to
|
|
509
|
+
// coerce it to a string using `'' + value`, an exception was thrown.
|
|
510
|
+
//
|
|
511
|
+
// The most common types that will cause this exception are `Symbol` instances
|
|
512
|
+
// and Temporal objects like `Temporal.Instant`. But any object that has a
|
|
513
|
+
// `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this
|
|
514
|
+
// exception. (Library authors do this to prevent users from using built-in
|
|
515
|
+
// numeric operators like `+` or comparison operators like `>=` because custom
|
|
516
|
+
// methods are needed to perform accurate arithmetic or comparison.)
|
|
517
|
+
//
|
|
518
|
+
// To fix the problem, coerce this object or symbol value to a string before
|
|
519
|
+
// passing it to React. The most reliable way is usually `String(value)`.
|
|
520
|
+
//
|
|
521
|
+
// To find which value is throwing, check the browser or debugger console.
|
|
522
|
+
// Before this exception was thrown, there should be `console.error` output
|
|
523
|
+
// that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the
|
|
524
|
+
// problem and how that type was used: key, atrribute, input value prop, etc.
|
|
525
|
+
// In most cases, this console output also shows the component and its
|
|
526
|
+
// ancestor components where the exception happened.
|
|
527
|
+
//
|
|
528
|
+
// eslint-disable-next-line react-internal/safe-string-coercion
|
|
529
|
+
return '' + value;
|
|
530
|
+
}
|
|
531
|
+
function checkKeyStringCoercion(value) {
|
|
532
|
+
{
|
|
533
|
+
if (willCoercionThrow(value)) {
|
|
534
|
+
error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
|
|
535
|
+
|
|
536
|
+
return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
function getWrappedName(outerType, innerType, wrapperName) {
|
|
542
|
+
var displayName = outerType.displayName;
|
|
543
|
+
|
|
544
|
+
if (displayName) {
|
|
545
|
+
return displayName;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
var functionName = innerType.displayName || innerType.name || '';
|
|
549
|
+
return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName;
|
|
550
|
+
} // Keep in sync with react-reconciler/getComponentNameFromFiber
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
function getContextName(type) {
|
|
554
|
+
return type.displayName || 'Context';
|
|
555
|
+
} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
function getComponentNameFromType(type) {
|
|
559
|
+
if (type == null) {
|
|
560
|
+
// Host root, text node or just invalid type.
|
|
561
|
+
return null;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
{
|
|
565
|
+
if (typeof type.tag === 'number') {
|
|
566
|
+
error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
if (typeof type === 'function') {
|
|
571
|
+
return type.displayName || type.name || null;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
if (typeof type === 'string') {
|
|
575
|
+
return type;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
switch (type) {
|
|
579
|
+
case REACT_FRAGMENT_TYPE:
|
|
580
|
+
return 'Fragment';
|
|
581
|
+
|
|
582
|
+
case REACT_PORTAL_TYPE:
|
|
583
|
+
return 'Portal';
|
|
584
|
+
|
|
585
|
+
case REACT_PROFILER_TYPE:
|
|
586
|
+
return 'Profiler';
|
|
587
|
+
|
|
588
|
+
case REACT_STRICT_MODE_TYPE:
|
|
589
|
+
return 'StrictMode';
|
|
590
|
+
|
|
591
|
+
case REACT_SUSPENSE_TYPE:
|
|
592
|
+
return 'Suspense';
|
|
593
|
+
|
|
594
|
+
case REACT_SUSPENSE_LIST_TYPE:
|
|
595
|
+
return 'SuspenseList';
|
|
596
|
+
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
if (typeof type === 'object') {
|
|
600
|
+
switch (type.$$typeof) {
|
|
601
|
+
case REACT_CONTEXT_TYPE:
|
|
602
|
+
var context = type;
|
|
603
|
+
return getContextName(context) + '.Consumer';
|
|
604
|
+
|
|
605
|
+
case REACT_PROVIDER_TYPE:
|
|
606
|
+
var provider = type;
|
|
607
|
+
return getContextName(provider._context) + '.Provider';
|
|
608
|
+
|
|
609
|
+
case REACT_FORWARD_REF_TYPE:
|
|
610
|
+
return getWrappedName(type, type.render, 'ForwardRef');
|
|
611
|
+
|
|
612
|
+
case REACT_MEMO_TYPE:
|
|
613
|
+
var outerName = type.displayName || null;
|
|
614
|
+
|
|
615
|
+
if (outerName !== null) {
|
|
616
|
+
return outerName;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
return getComponentNameFromType(type.type) || 'Memo';
|
|
620
|
+
|
|
621
|
+
case REACT_LAZY_TYPE:
|
|
622
|
+
{
|
|
623
|
+
var lazyComponent = type;
|
|
624
|
+
var payload = lazyComponent._payload;
|
|
625
|
+
var init = lazyComponent._init;
|
|
626
|
+
|
|
627
|
+
try {
|
|
628
|
+
return getComponentNameFromType(init(payload));
|
|
629
|
+
} catch (x) {
|
|
630
|
+
return null;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
// eslint-disable-next-line no-fallthrough
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
return null;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
642
|
+
|
|
643
|
+
var RESERVED_PROPS = {
|
|
644
|
+
key: true,
|
|
645
|
+
ref: true,
|
|
646
|
+
__self: true,
|
|
647
|
+
__source: true
|
|
648
|
+
};
|
|
649
|
+
var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;
|
|
650
|
+
|
|
651
|
+
{
|
|
652
|
+
didWarnAboutStringRefs = {};
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
function hasValidRef(config) {
|
|
656
|
+
{
|
|
657
|
+
if (hasOwnProperty.call(config, 'ref')) {
|
|
658
|
+
var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;
|
|
659
|
+
|
|
660
|
+
if (getter && getter.isReactWarning) {
|
|
661
|
+
return false;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
return config.ref !== undefined;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
function hasValidKey(config) {
|
|
670
|
+
{
|
|
671
|
+
if (hasOwnProperty.call(config, 'key')) {
|
|
672
|
+
var getter = Object.getOwnPropertyDescriptor(config, 'key').get;
|
|
673
|
+
|
|
674
|
+
if (getter && getter.isReactWarning) {
|
|
675
|
+
return false;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
return config.key !== undefined;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
function defineKeyPropWarningGetter(props, displayName) {
|
|
684
|
+
var warnAboutAccessingKey = function () {
|
|
685
|
+
{
|
|
686
|
+
if (!specialPropKeyWarningShown) {
|
|
687
|
+
specialPropKeyWarningShown = true;
|
|
688
|
+
|
|
689
|
+
error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
};
|
|
693
|
+
|
|
694
|
+
warnAboutAccessingKey.isReactWarning = true;
|
|
695
|
+
Object.defineProperty(props, 'key', {
|
|
696
|
+
get: warnAboutAccessingKey,
|
|
697
|
+
configurable: true
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
function defineRefPropWarningGetter(props, displayName) {
|
|
702
|
+
var warnAboutAccessingRef = function () {
|
|
703
|
+
{
|
|
704
|
+
if (!specialPropRefWarningShown) {
|
|
705
|
+
specialPropRefWarningShown = true;
|
|
706
|
+
|
|
707
|
+
error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
};
|
|
711
|
+
|
|
712
|
+
warnAboutAccessingRef.isReactWarning = true;
|
|
713
|
+
Object.defineProperty(props, 'ref', {
|
|
714
|
+
get: warnAboutAccessingRef,
|
|
715
|
+
configurable: true
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
function warnIfStringRefCannotBeAutoConverted(config) {
|
|
720
|
+
{
|
|
721
|
+
if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {
|
|
722
|
+
var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);
|
|
723
|
+
|
|
724
|
+
if (!didWarnAboutStringRefs[componentName]) {
|
|
725
|
+
error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref);
|
|
726
|
+
|
|
727
|
+
didWarnAboutStringRefs[componentName] = true;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
/**
|
|
733
|
+
* Factory method to create a new React element. This no longer adheres to
|
|
734
|
+
* the class pattern, so do not use new to call it. Also, instanceof check
|
|
735
|
+
* will not work. Instead test $$typeof field against Symbol.for('react.element') to check
|
|
736
|
+
* if something is a React Element.
|
|
737
|
+
*
|
|
738
|
+
* @param {*} type
|
|
739
|
+
* @param {*} props
|
|
740
|
+
* @param {*} key
|
|
741
|
+
* @param {string|object} ref
|
|
742
|
+
* @param {*} owner
|
|
743
|
+
* @param {*} self A *temporary* helper to detect places where `this` is
|
|
744
|
+
* different from the `owner` when React.createElement is called, so that we
|
|
745
|
+
* can warn. We want to get rid of owner and replace string `ref`s with arrow
|
|
746
|
+
* functions, and as long as `this` and owner are the same, there will be no
|
|
747
|
+
* change in behavior.
|
|
748
|
+
* @param {*} source An annotation object (added by a transpiler or otherwise)
|
|
749
|
+
* indicating filename, line number, and/or other information.
|
|
750
|
+
* @internal
|
|
751
|
+
*/
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
var ReactElement = function (type, key, ref, self, source, owner, props) {
|
|
755
|
+
var element = {
|
|
756
|
+
// This tag allows us to uniquely identify this as a React Element
|
|
757
|
+
$$typeof: REACT_ELEMENT_TYPE,
|
|
758
|
+
// Built-in properties that belong on the element
|
|
759
|
+
type: type,
|
|
760
|
+
key: key,
|
|
761
|
+
ref: ref,
|
|
762
|
+
props: props,
|
|
763
|
+
// Record the component responsible for creating this element.
|
|
764
|
+
_owner: owner
|
|
765
|
+
};
|
|
766
|
+
|
|
767
|
+
{
|
|
768
|
+
// The validation flag is currently mutative. We put it on
|
|
769
|
+
// an external backing store so that we can freeze the whole object.
|
|
770
|
+
// This can be replaced with a WeakMap once they are implemented in
|
|
771
|
+
// commonly used development environments.
|
|
772
|
+
element._store = {}; // To make comparing ReactElements easier for testing purposes, we make
|
|
773
|
+
// the validation flag non-enumerable (where possible, which should
|
|
774
|
+
// include every environment we run tests in), so the test framework
|
|
775
|
+
// ignores it.
|
|
776
|
+
|
|
777
|
+
Object.defineProperty(element._store, 'validated', {
|
|
778
|
+
configurable: false,
|
|
779
|
+
enumerable: false,
|
|
780
|
+
writable: true,
|
|
781
|
+
value: false
|
|
782
|
+
}); // self and source are DEV only properties.
|
|
783
|
+
|
|
784
|
+
Object.defineProperty(element, '_self', {
|
|
785
|
+
configurable: false,
|
|
786
|
+
enumerable: false,
|
|
787
|
+
writable: false,
|
|
788
|
+
value: self
|
|
789
|
+
}); // Two elements created in two different places should be considered
|
|
790
|
+
// equal for testing purposes and therefore we hide it from enumeration.
|
|
791
|
+
|
|
792
|
+
Object.defineProperty(element, '_source', {
|
|
793
|
+
configurable: false,
|
|
794
|
+
enumerable: false,
|
|
795
|
+
writable: false,
|
|
796
|
+
value: source
|
|
797
|
+
});
|
|
798
|
+
|
|
799
|
+
if (Object.freeze) {
|
|
800
|
+
Object.freeze(element.props);
|
|
801
|
+
Object.freeze(element);
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
return element;
|
|
806
|
+
};
|
|
807
|
+
/**
|
|
808
|
+
* Create and return a new ReactElement of the given type.
|
|
809
|
+
* See https://reactjs.org/docs/react-api.html#createelement
|
|
810
|
+
*/
|
|
811
|
+
|
|
812
|
+
function createElement(type, config, children) {
|
|
813
|
+
var propName; // Reserved names are extracted
|
|
814
|
+
|
|
815
|
+
var props = {};
|
|
816
|
+
var key = null;
|
|
817
|
+
var ref = null;
|
|
818
|
+
var self = null;
|
|
819
|
+
var source = null;
|
|
820
|
+
|
|
821
|
+
if (config != null) {
|
|
822
|
+
if (hasValidRef(config)) {
|
|
823
|
+
ref = config.ref;
|
|
824
|
+
|
|
825
|
+
{
|
|
826
|
+
warnIfStringRefCannotBeAutoConverted(config);
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
if (hasValidKey(config)) {
|
|
831
|
+
{
|
|
832
|
+
checkKeyStringCoercion(config.key);
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
key = '' + config.key;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
self = config.__self === undefined ? null : config.__self;
|
|
839
|
+
source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object
|
|
840
|
+
|
|
841
|
+
for (propName in config) {
|
|
842
|
+
if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
|
|
843
|
+
props[propName] = config[propName];
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
} // Children can be more than one argument, and those are transferred onto
|
|
847
|
+
// the newly allocated props object.
|
|
848
|
+
|
|
849
|
+
|
|
850
|
+
var childrenLength = arguments.length - 2;
|
|
851
|
+
|
|
852
|
+
if (childrenLength === 1) {
|
|
853
|
+
props.children = children;
|
|
854
|
+
} else if (childrenLength > 1) {
|
|
855
|
+
var childArray = Array(childrenLength);
|
|
856
|
+
|
|
857
|
+
for (var i = 0; i < childrenLength; i++) {
|
|
858
|
+
childArray[i] = arguments[i + 2];
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
{
|
|
862
|
+
if (Object.freeze) {
|
|
863
|
+
Object.freeze(childArray);
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
props.children = childArray;
|
|
868
|
+
} // Resolve default props
|
|
869
|
+
|
|
870
|
+
|
|
871
|
+
if (type && type.defaultProps) {
|
|
872
|
+
var defaultProps = type.defaultProps;
|
|
873
|
+
|
|
874
|
+
for (propName in defaultProps) {
|
|
875
|
+
if (props[propName] === undefined) {
|
|
876
|
+
props[propName] = defaultProps[propName];
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
{
|
|
882
|
+
if (key || ref) {
|
|
883
|
+
var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;
|
|
884
|
+
|
|
885
|
+
if (key) {
|
|
886
|
+
defineKeyPropWarningGetter(props, displayName);
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
if (ref) {
|
|
890
|
+
defineRefPropWarningGetter(props, displayName);
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
|
|
896
|
+
}
|
|
897
|
+
function cloneAndReplaceKey(oldElement, newKey) {
|
|
898
|
+
var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
|
|
899
|
+
return newElement;
|
|
900
|
+
}
|
|
901
|
+
/**
|
|
902
|
+
* Clone and return a new ReactElement using element as the starting point.
|
|
903
|
+
* See https://reactjs.org/docs/react-api.html#cloneelement
|
|
904
|
+
*/
|
|
905
|
+
|
|
906
|
+
function cloneElement(element, config, children) {
|
|
907
|
+
if (element === null || element === undefined) {
|
|
908
|
+
throw new Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + ".");
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
var propName; // Original props are copied
|
|
912
|
+
|
|
913
|
+
var props = assign({}, element.props); // Reserved names are extracted
|
|
914
|
+
|
|
915
|
+
var key = element.key;
|
|
916
|
+
var ref = element.ref; // Self is preserved since the owner is preserved.
|
|
917
|
+
|
|
918
|
+
var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a
|
|
919
|
+
// transpiler, and the original source is probably a better indicator of the
|
|
920
|
+
// true owner.
|
|
921
|
+
|
|
922
|
+
var source = element._source; // Owner will be preserved, unless ref is overridden
|
|
923
|
+
|
|
924
|
+
var owner = element._owner;
|
|
925
|
+
|
|
926
|
+
if (config != null) {
|
|
927
|
+
if (hasValidRef(config)) {
|
|
928
|
+
// Silently steal the ref from the parent.
|
|
929
|
+
ref = config.ref;
|
|
930
|
+
owner = ReactCurrentOwner.current;
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
if (hasValidKey(config)) {
|
|
934
|
+
{
|
|
935
|
+
checkKeyStringCoercion(config.key);
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
key = '' + config.key;
|
|
939
|
+
} // Remaining properties override existing props
|
|
940
|
+
|
|
941
|
+
|
|
942
|
+
var defaultProps;
|
|
943
|
+
|
|
944
|
+
if (element.type && element.type.defaultProps) {
|
|
945
|
+
defaultProps = element.type.defaultProps;
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
for (propName in config) {
|
|
949
|
+
if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
|
|
950
|
+
if (config[propName] === undefined && defaultProps !== undefined) {
|
|
951
|
+
// Resolve default props
|
|
952
|
+
props[propName] = defaultProps[propName];
|
|
953
|
+
} else {
|
|
954
|
+
props[propName] = config[propName];
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
} // Children can be more than one argument, and those are transferred onto
|
|
959
|
+
// the newly allocated props object.
|
|
960
|
+
|
|
961
|
+
|
|
962
|
+
var childrenLength = arguments.length - 2;
|
|
963
|
+
|
|
964
|
+
if (childrenLength === 1) {
|
|
965
|
+
props.children = children;
|
|
966
|
+
} else if (childrenLength > 1) {
|
|
967
|
+
var childArray = Array(childrenLength);
|
|
968
|
+
|
|
969
|
+
for (var i = 0; i < childrenLength; i++) {
|
|
970
|
+
childArray[i] = arguments[i + 2];
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
props.children = childArray;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
return ReactElement(element.type, key, ref, self, source, owner, props);
|
|
977
|
+
}
|
|
978
|
+
/**
|
|
979
|
+
* Verifies the object is a ReactElement.
|
|
980
|
+
* See https://reactjs.org/docs/react-api.html#isvalidelement
|
|
981
|
+
* @param {?object} object
|
|
982
|
+
* @return {boolean} True if `object` is a ReactElement.
|
|
983
|
+
* @final
|
|
984
|
+
*/
|
|
985
|
+
|
|
986
|
+
function isValidElement(object) {
|
|
987
|
+
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
var SEPARATOR = '.';
|
|
991
|
+
var SUBSEPARATOR = ':';
|
|
992
|
+
/**
|
|
993
|
+
* Escape and wrap key so it is safe to use as a reactid
|
|
994
|
+
*
|
|
995
|
+
* @param {string} key to be escaped.
|
|
996
|
+
* @return {string} the escaped key.
|
|
997
|
+
*/
|
|
998
|
+
|
|
999
|
+
function escape(key) {
|
|
1000
|
+
var escapeRegex = /[=:]/g;
|
|
1001
|
+
var escaperLookup = {
|
|
1002
|
+
'=': '=0',
|
|
1003
|
+
':': '=2'
|
|
1004
|
+
};
|
|
1005
|
+
var escapedString = key.replace(escapeRegex, function (match) {
|
|
1006
|
+
return escaperLookup[match];
|
|
1007
|
+
});
|
|
1008
|
+
return '$' + escapedString;
|
|
1009
|
+
}
|
|
1010
|
+
/**
|
|
1011
|
+
* TODO: Test that a single child and an array with one item have the same key
|
|
1012
|
+
* pattern.
|
|
1013
|
+
*/
|
|
1014
|
+
|
|
1015
|
+
|
|
1016
|
+
var didWarnAboutMaps = false;
|
|
1017
|
+
var userProvidedKeyEscapeRegex = /\/+/g;
|
|
1018
|
+
|
|
1019
|
+
function escapeUserProvidedKey(text) {
|
|
1020
|
+
return text.replace(userProvidedKeyEscapeRegex, '$&/');
|
|
1021
|
+
}
|
|
1022
|
+
/**
|
|
1023
|
+
* Generate a key string that identifies a element within a set.
|
|
1024
|
+
*
|
|
1025
|
+
* @param {*} element A element that could contain a manual key.
|
|
1026
|
+
* @param {number} index Index that is used if a manual key is not provided.
|
|
1027
|
+
* @return {string}
|
|
1028
|
+
*/
|
|
1029
|
+
|
|
1030
|
+
|
|
1031
|
+
function getElementKey(element, index) {
|
|
1032
|
+
// Do some typechecking here since we call this blindly. We want to ensure
|
|
1033
|
+
// that we don't block potential future ES APIs.
|
|
1034
|
+
if (typeof element === 'object' && element !== null && element.key != null) {
|
|
1035
|
+
// Explicit key
|
|
1036
|
+
{
|
|
1037
|
+
checkKeyStringCoercion(element.key);
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
return escape('' + element.key);
|
|
1041
|
+
} // Implicit key determined by the index in the set
|
|
1042
|
+
|
|
1043
|
+
|
|
1044
|
+
return index.toString(36);
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {
|
|
1048
|
+
var type = typeof children;
|
|
1049
|
+
|
|
1050
|
+
if (type === 'undefined' || type === 'boolean') {
|
|
1051
|
+
// All of the above are perceived as null.
|
|
1052
|
+
children = null;
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
var invokeCallback = false;
|
|
1056
|
+
|
|
1057
|
+
if (children === null) {
|
|
1058
|
+
invokeCallback = true;
|
|
1059
|
+
} else {
|
|
1060
|
+
switch (type) {
|
|
1061
|
+
case 'string':
|
|
1062
|
+
case 'number':
|
|
1063
|
+
invokeCallback = true;
|
|
1064
|
+
break;
|
|
1065
|
+
|
|
1066
|
+
case 'object':
|
|
1067
|
+
switch (children.$$typeof) {
|
|
1068
|
+
case REACT_ELEMENT_TYPE:
|
|
1069
|
+
case REACT_PORTAL_TYPE:
|
|
1070
|
+
invokeCallback = true;
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
if (invokeCallback) {
|
|
1077
|
+
var _child = children;
|
|
1078
|
+
var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array
|
|
1079
|
+
// so that it's consistent if the number of children grows:
|
|
1080
|
+
|
|
1081
|
+
var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar;
|
|
1082
|
+
|
|
1083
|
+
if (isArray(mappedChild)) {
|
|
1084
|
+
var escapedChildKey = '';
|
|
1085
|
+
|
|
1086
|
+
if (childKey != null) {
|
|
1087
|
+
escapedChildKey = escapeUserProvidedKey(childKey) + '/';
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) {
|
|
1091
|
+
return c;
|
|
1092
|
+
});
|
|
1093
|
+
} else if (mappedChild != null) {
|
|
1094
|
+
if (isValidElement(mappedChild)) {
|
|
1095
|
+
{
|
|
1096
|
+
// The `if` statement here prevents auto-disabling of the safe
|
|
1097
|
+
// coercion ESLint rule, so we must manually disable it below.
|
|
1098
|
+
// $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key
|
|
1099
|
+
if (mappedChild.key && (!_child || _child.key !== mappedChild.key)) {
|
|
1100
|
+
checkKeyStringCoercion(mappedChild.key);
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as
|
|
1105
|
+
// traverseAllChildren used to do for objects as children
|
|
1106
|
+
escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key
|
|
1107
|
+
mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number
|
|
1108
|
+
// eslint-disable-next-line react-internal/safe-string-coercion
|
|
1109
|
+
escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey);
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
array.push(mappedChild);
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
return 1;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
var child;
|
|
1119
|
+
var nextName;
|
|
1120
|
+
var subtreeCount = 0; // Count of children found in the current subtree.
|
|
1121
|
+
|
|
1122
|
+
var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;
|
|
1123
|
+
|
|
1124
|
+
if (isArray(children)) {
|
|
1125
|
+
for (var i = 0; i < children.length; i++) {
|
|
1126
|
+
child = children[i];
|
|
1127
|
+
nextName = nextNamePrefix + getElementKey(child, i);
|
|
1128
|
+
subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback);
|
|
1129
|
+
}
|
|
1130
|
+
} else {
|
|
1131
|
+
var iteratorFn = getIteratorFn(children);
|
|
1132
|
+
|
|
1133
|
+
if (typeof iteratorFn === 'function') {
|
|
1134
|
+
var iterableChildren = children;
|
|
1135
|
+
|
|
1136
|
+
{
|
|
1137
|
+
// Warn about using Maps as children
|
|
1138
|
+
if (iteratorFn === iterableChildren.entries) {
|
|
1139
|
+
if (!didWarnAboutMaps) {
|
|
1140
|
+
warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.');
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
didWarnAboutMaps = true;
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
var iterator = iteratorFn.call(iterableChildren);
|
|
1148
|
+
var step;
|
|
1149
|
+
var ii = 0;
|
|
1150
|
+
|
|
1151
|
+
while (!(step = iterator.next()).done) {
|
|
1152
|
+
child = step.value;
|
|
1153
|
+
nextName = nextNamePrefix + getElementKey(child, ii++);
|
|
1154
|
+
subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback);
|
|
1155
|
+
}
|
|
1156
|
+
} else if (type === 'object') {
|
|
1157
|
+
// eslint-disable-next-line react-internal/safe-string-coercion
|
|
1158
|
+
var childrenString = String(children);
|
|
1159
|
+
throw new Error("Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + "). " + 'If you meant to render a collection of children, use an array ' + 'instead.');
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
return subtreeCount;
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
/**
|
|
1167
|
+
* Maps children that are typically specified as `props.children`.
|
|
1168
|
+
*
|
|
1169
|
+
* See https://reactjs.org/docs/react-api.html#reactchildrenmap
|
|
1170
|
+
*
|
|
1171
|
+
* The provided mapFunction(child, index) will be called for each
|
|
1172
|
+
* leaf child.
|
|
1173
|
+
*
|
|
1174
|
+
* @param {?*} children Children tree container.
|
|
1175
|
+
* @param {function(*, int)} func The map function.
|
|
1176
|
+
* @param {*} context Context for mapFunction.
|
|
1177
|
+
* @return {object} Object containing the ordered map of results.
|
|
1178
|
+
*/
|
|
1179
|
+
function mapChildren(children, func, context) {
|
|
1180
|
+
if (children == null) {
|
|
1181
|
+
return children;
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
var result = [];
|
|
1185
|
+
var count = 0;
|
|
1186
|
+
mapIntoArray(children, result, '', '', function (child) {
|
|
1187
|
+
return func.call(context, child, count++);
|
|
1188
|
+
});
|
|
1189
|
+
return result;
|
|
1190
|
+
}
|
|
1191
|
+
/**
|
|
1192
|
+
* Count the number of children that are typically specified as
|
|
1193
|
+
* `props.children`.
|
|
1194
|
+
*
|
|
1195
|
+
* See https://reactjs.org/docs/react-api.html#reactchildrencount
|
|
1196
|
+
*
|
|
1197
|
+
* @param {?*} children Children tree container.
|
|
1198
|
+
* @return {number} The number of children.
|
|
1199
|
+
*/
|
|
1200
|
+
|
|
1201
|
+
|
|
1202
|
+
function countChildren(children) {
|
|
1203
|
+
var n = 0;
|
|
1204
|
+
mapChildren(children, function () {
|
|
1205
|
+
n++; // Don't return anything
|
|
1206
|
+
});
|
|
1207
|
+
return n;
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
/**
|
|
1211
|
+
* Iterates through children that are typically specified as `props.children`.
|
|
1212
|
+
*
|
|
1213
|
+
* See https://reactjs.org/docs/react-api.html#reactchildrenforeach
|
|
1214
|
+
*
|
|
1215
|
+
* The provided forEachFunc(child, index) will be called for each
|
|
1216
|
+
* leaf child.
|
|
1217
|
+
*
|
|
1218
|
+
* @param {?*} children Children tree container.
|
|
1219
|
+
* @param {function(*, int)} forEachFunc
|
|
1220
|
+
* @param {*} forEachContext Context for forEachContext.
|
|
1221
|
+
*/
|
|
1222
|
+
function forEachChildren(children, forEachFunc, forEachContext) {
|
|
1223
|
+
mapChildren(children, function () {
|
|
1224
|
+
forEachFunc.apply(this, arguments); // Don't return anything.
|
|
1225
|
+
}, forEachContext);
|
|
1226
|
+
}
|
|
1227
|
+
/**
|
|
1228
|
+
* Flatten a children object (typically specified as `props.children`) and
|
|
1229
|
+
* return an array with appropriately re-keyed children.
|
|
1230
|
+
*
|
|
1231
|
+
* See https://reactjs.org/docs/react-api.html#reactchildrentoarray
|
|
1232
|
+
*/
|
|
1233
|
+
|
|
1234
|
+
|
|
1235
|
+
function toArray(children) {
|
|
1236
|
+
return mapChildren(children, function (child) {
|
|
1237
|
+
return child;
|
|
1238
|
+
}) || [];
|
|
1239
|
+
}
|
|
1240
|
+
/**
|
|
1241
|
+
* Returns the first child in a collection of children and verifies that there
|
|
1242
|
+
* is only one child in the collection.
|
|
1243
|
+
*
|
|
1244
|
+
* See https://reactjs.org/docs/react-api.html#reactchildrenonly
|
|
1245
|
+
*
|
|
1246
|
+
* The current implementation of this function assumes that a single child gets
|
|
1247
|
+
* passed without a wrapper, but the purpose of this helper function is to
|
|
1248
|
+
* abstract away the particular structure of children.
|
|
1249
|
+
*
|
|
1250
|
+
* @param {?object} children Child collection structure.
|
|
1251
|
+
* @return {ReactElement} The first and only `ReactElement` contained in the
|
|
1252
|
+
* structure.
|
|
1253
|
+
*/
|
|
1254
|
+
|
|
1255
|
+
|
|
1256
|
+
function onlyChild(children) {
|
|
1257
|
+
if (!isValidElement(children)) {
|
|
1258
|
+
throw new Error('React.Children.only expected to receive a single React element child.');
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
return children;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
function createContext(defaultValue) {
|
|
1265
|
+
// TODO: Second argument used to be an optional `calculateChangedBits`
|
|
1266
|
+
// function. Warn to reserve for future use?
|
|
1267
|
+
var context = {
|
|
1268
|
+
$$typeof: REACT_CONTEXT_TYPE,
|
|
1269
|
+
// As a workaround to support multiple concurrent renderers, we categorize
|
|
1270
|
+
// some renderers as primary and others as secondary. We only expect
|
|
1271
|
+
// there to be two concurrent renderers at most: React Native (primary) and
|
|
1272
|
+
// Fabric (secondary); React DOM (primary) and React ART (secondary).
|
|
1273
|
+
// Secondary renderers store their context values on separate fields.
|
|
1274
|
+
_currentValue: defaultValue,
|
|
1275
|
+
_currentValue2: defaultValue,
|
|
1276
|
+
// Used to track how many concurrent renderers this context currently
|
|
1277
|
+
// supports within in a single renderer. Such as parallel server rendering.
|
|
1278
|
+
_threadCount: 0,
|
|
1279
|
+
// These are circular
|
|
1280
|
+
Provider: null,
|
|
1281
|
+
Consumer: null,
|
|
1282
|
+
// Add these to use same hidden class in VM as ServerContext
|
|
1283
|
+
_defaultValue: null,
|
|
1284
|
+
_globalName: null
|
|
1285
|
+
};
|
|
1286
|
+
context.Provider = {
|
|
1287
|
+
$$typeof: REACT_PROVIDER_TYPE,
|
|
1288
|
+
_context: context
|
|
1289
|
+
};
|
|
1290
|
+
var hasWarnedAboutUsingNestedContextConsumers = false;
|
|
1291
|
+
var hasWarnedAboutUsingConsumerProvider = false;
|
|
1292
|
+
var hasWarnedAboutDisplayNameOnConsumer = false;
|
|
1293
|
+
|
|
1294
|
+
{
|
|
1295
|
+
// A separate object, but proxies back to the original context object for
|
|
1296
|
+
// backwards compatibility. It has a different $$typeof, so we can properly
|
|
1297
|
+
// warn for the incorrect usage of Context as a Consumer.
|
|
1298
|
+
var Consumer = {
|
|
1299
|
+
$$typeof: REACT_CONTEXT_TYPE,
|
|
1300
|
+
_context: context
|
|
1301
|
+
}; // $FlowFixMe: Flow complains about not setting a value, which is intentional here
|
|
1302
|
+
|
|
1303
|
+
Object.defineProperties(Consumer, {
|
|
1304
|
+
Provider: {
|
|
1305
|
+
get: function () {
|
|
1306
|
+
if (!hasWarnedAboutUsingConsumerProvider) {
|
|
1307
|
+
hasWarnedAboutUsingConsumerProvider = true;
|
|
1308
|
+
|
|
1309
|
+
error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?');
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
return context.Provider;
|
|
1313
|
+
},
|
|
1314
|
+
set: function (_Provider) {
|
|
1315
|
+
context.Provider = _Provider;
|
|
1316
|
+
}
|
|
1317
|
+
},
|
|
1318
|
+
_currentValue: {
|
|
1319
|
+
get: function () {
|
|
1320
|
+
return context._currentValue;
|
|
1321
|
+
},
|
|
1322
|
+
set: function (_currentValue) {
|
|
1323
|
+
context._currentValue = _currentValue;
|
|
1324
|
+
}
|
|
1325
|
+
},
|
|
1326
|
+
_currentValue2: {
|
|
1327
|
+
get: function () {
|
|
1328
|
+
return context._currentValue2;
|
|
1329
|
+
},
|
|
1330
|
+
set: function (_currentValue2) {
|
|
1331
|
+
context._currentValue2 = _currentValue2;
|
|
1332
|
+
}
|
|
1333
|
+
},
|
|
1334
|
+
_threadCount: {
|
|
1335
|
+
get: function () {
|
|
1336
|
+
return context._threadCount;
|
|
1337
|
+
},
|
|
1338
|
+
set: function (_threadCount) {
|
|
1339
|
+
context._threadCount = _threadCount;
|
|
1340
|
+
}
|
|
1341
|
+
},
|
|
1342
|
+
Consumer: {
|
|
1343
|
+
get: function () {
|
|
1344
|
+
if (!hasWarnedAboutUsingNestedContextConsumers) {
|
|
1345
|
+
hasWarnedAboutUsingNestedContextConsumers = true;
|
|
1346
|
+
|
|
1347
|
+
error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
return context.Consumer;
|
|
1351
|
+
}
|
|
1352
|
+
},
|
|
1353
|
+
displayName: {
|
|
1354
|
+
get: function () {
|
|
1355
|
+
return context.displayName;
|
|
1356
|
+
},
|
|
1357
|
+
set: function (displayName) {
|
|
1358
|
+
if (!hasWarnedAboutDisplayNameOnConsumer) {
|
|
1359
|
+
warn('Setting `displayName` on Context.Consumer has no effect. ' + "You should set it directly on the context with Context.displayName = '%s'.", displayName);
|
|
1360
|
+
|
|
1361
|
+
hasWarnedAboutDisplayNameOnConsumer = true;
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
1365
|
+
}); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty
|
|
1366
|
+
|
|
1367
|
+
context.Consumer = Consumer;
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
{
|
|
1371
|
+
context._currentRenderer = null;
|
|
1372
|
+
context._currentRenderer2 = null;
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
return context;
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
var Uninitialized = -1;
|
|
1379
|
+
var Pending = 0;
|
|
1380
|
+
var Resolved = 1;
|
|
1381
|
+
var Rejected = 2;
|
|
1382
|
+
|
|
1383
|
+
function lazyInitializer(payload) {
|
|
1384
|
+
if (payload._status === Uninitialized) {
|
|
1385
|
+
var ctor = payload._result;
|
|
1386
|
+
var thenable = ctor(); // Transition to the next state.
|
|
1387
|
+
// This might throw either because it's missing or throws. If so, we treat it
|
|
1388
|
+
// as still uninitialized and try again next time. Which is the same as what
|
|
1389
|
+
// happens if the ctor or any wrappers processing the ctor throws. This might
|
|
1390
|
+
// end up fixing it if the resolution was a concurrency bug.
|
|
1391
|
+
|
|
1392
|
+
thenable.then(function (moduleObject) {
|
|
1393
|
+
if (payload._status === Pending || payload._status === Uninitialized) {
|
|
1394
|
+
// Transition to the next state.
|
|
1395
|
+
var resolved = payload;
|
|
1396
|
+
resolved._status = Resolved;
|
|
1397
|
+
resolved._result = moduleObject;
|
|
1398
|
+
}
|
|
1399
|
+
}, function (error) {
|
|
1400
|
+
if (payload._status === Pending || payload._status === Uninitialized) {
|
|
1401
|
+
// Transition to the next state.
|
|
1402
|
+
var rejected = payload;
|
|
1403
|
+
rejected._status = Rejected;
|
|
1404
|
+
rejected._result = error;
|
|
1405
|
+
}
|
|
1406
|
+
});
|
|
1407
|
+
|
|
1408
|
+
if (payload._status === Uninitialized) {
|
|
1409
|
+
// In case, we're still uninitialized, then we're waiting for the thenable
|
|
1410
|
+
// to resolve. Set it as pending in the meantime.
|
|
1411
|
+
var pending = payload;
|
|
1412
|
+
pending._status = Pending;
|
|
1413
|
+
pending._result = thenable;
|
|
1414
|
+
}
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
if (payload._status === Resolved) {
|
|
1418
|
+
var moduleObject = payload._result;
|
|
1419
|
+
|
|
1420
|
+
{
|
|
1421
|
+
if (moduleObject === undefined) {
|
|
1422
|
+
error('lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies.
|
|
1423
|
+
'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))\n\n" + 'Did you accidentally put curly braces around the import?', moduleObject);
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1427
|
+
{
|
|
1428
|
+
if (!('default' in moduleObject)) {
|
|
1429
|
+
error('lazy: Expected the result of a dynamic imp' + 'ort() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies.
|
|
1430
|
+
'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject);
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
return moduleObject.default;
|
|
1435
|
+
} else {
|
|
1436
|
+
throw payload._result;
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
function lazy(ctor) {
|
|
1441
|
+
var payload = {
|
|
1442
|
+
// We use these fields to store the result.
|
|
1443
|
+
_status: Uninitialized,
|
|
1444
|
+
_result: ctor
|
|
1445
|
+
};
|
|
1446
|
+
var lazyType = {
|
|
1447
|
+
$$typeof: REACT_LAZY_TYPE,
|
|
1448
|
+
_payload: payload,
|
|
1449
|
+
_init: lazyInitializer
|
|
1450
|
+
};
|
|
1451
|
+
|
|
1452
|
+
{
|
|
1453
|
+
// In production, this would just set it on the object.
|
|
1454
|
+
var defaultProps;
|
|
1455
|
+
var propTypes; // $FlowFixMe
|
|
1456
|
+
|
|
1457
|
+
Object.defineProperties(lazyType, {
|
|
1458
|
+
defaultProps: {
|
|
1459
|
+
configurable: true,
|
|
1460
|
+
get: function () {
|
|
1461
|
+
return defaultProps;
|
|
1462
|
+
},
|
|
1463
|
+
set: function (newDefaultProps) {
|
|
1464
|
+
error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');
|
|
1465
|
+
|
|
1466
|
+
defaultProps = newDefaultProps; // Match production behavior more closely:
|
|
1467
|
+
// $FlowFixMe
|
|
1468
|
+
|
|
1469
|
+
Object.defineProperty(lazyType, 'defaultProps', {
|
|
1470
|
+
enumerable: true
|
|
1471
|
+
});
|
|
1472
|
+
}
|
|
1473
|
+
},
|
|
1474
|
+
propTypes: {
|
|
1475
|
+
configurable: true,
|
|
1476
|
+
get: function () {
|
|
1477
|
+
return propTypes;
|
|
1478
|
+
},
|
|
1479
|
+
set: function (newPropTypes) {
|
|
1480
|
+
error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');
|
|
1481
|
+
|
|
1482
|
+
propTypes = newPropTypes; // Match production behavior more closely:
|
|
1483
|
+
// $FlowFixMe
|
|
1484
|
+
|
|
1485
|
+
Object.defineProperty(lazyType, 'propTypes', {
|
|
1486
|
+
enumerable: true
|
|
1487
|
+
});
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1490
|
+
});
|
|
1491
|
+
}
|
|
1492
|
+
|
|
1493
|
+
return lazyType;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
function forwardRef(render) {
|
|
1497
|
+
{
|
|
1498
|
+
if (render != null && render.$$typeof === REACT_MEMO_TYPE) {
|
|
1499
|
+
error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');
|
|
1500
|
+
} else if (typeof render !== 'function') {
|
|
1501
|
+
error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);
|
|
1502
|
+
} else {
|
|
1503
|
+
if (render.length !== 0 && render.length !== 2) {
|
|
1504
|
+
error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.');
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
if (render != null) {
|
|
1509
|
+
if (render.defaultProps != null || render.propTypes != null) {
|
|
1510
|
+
error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?');
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
var elementType = {
|
|
1516
|
+
$$typeof: REACT_FORWARD_REF_TYPE,
|
|
1517
|
+
render: render
|
|
1518
|
+
};
|
|
1519
|
+
|
|
1520
|
+
{
|
|
1521
|
+
var ownName;
|
|
1522
|
+
Object.defineProperty(elementType, 'displayName', {
|
|
1523
|
+
enumerable: false,
|
|
1524
|
+
configurable: true,
|
|
1525
|
+
get: function () {
|
|
1526
|
+
return ownName;
|
|
1527
|
+
},
|
|
1528
|
+
set: function (name) {
|
|
1529
|
+
ownName = name; // The inner component shouldn't inherit this display name in most cases,
|
|
1530
|
+
// because the component may be used elsewhere.
|
|
1531
|
+
// But it's nice for anonymous functions to inherit the name,
|
|
1532
|
+
// so that our component-stack generation logic will display their frames.
|
|
1533
|
+
// An anonymous function generally suggests a pattern like:
|
|
1534
|
+
// React.forwardRef((props, ref) => {...});
|
|
1535
|
+
// This kind of inner function is not used elsewhere so the side effect is okay.
|
|
1536
|
+
|
|
1537
|
+
if (!render.name && !render.displayName) {
|
|
1538
|
+
render.displayName = name;
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
});
|
|
1542
|
+
}
|
|
1543
|
+
|
|
1544
|
+
return elementType;
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
var REACT_MODULE_REFERENCE;
|
|
1548
|
+
|
|
1549
|
+
{
|
|
1550
|
+
REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
function isValidElementType(type) {
|
|
1554
|
+
if (typeof type === 'string' || typeof type === 'function') {
|
|
1555
|
+
return true;
|
|
1556
|
+
} // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).
|
|
1557
|
+
|
|
1558
|
+
|
|
1559
|
+
if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {
|
|
1560
|
+
return true;
|
|
1561
|
+
}
|
|
1562
|
+
|
|
1563
|
+
if (typeof type === 'object' && type !== null) {
|
|
1564
|
+
if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object
|
|
1565
|
+
// types supported by any Flight configuration anywhere since
|
|
1566
|
+
// we don't know which Flight build this will end up being used
|
|
1567
|
+
// with.
|
|
1568
|
+
type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {
|
|
1569
|
+
return true;
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
return false;
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
function memo(type, compare) {
|
|
1577
|
+
{
|
|
1578
|
+
if (!isValidElementType(type)) {
|
|
1579
|
+
error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type);
|
|
1580
|
+
}
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
var elementType = {
|
|
1584
|
+
$$typeof: REACT_MEMO_TYPE,
|
|
1585
|
+
type: type,
|
|
1586
|
+
compare: compare === undefined ? null : compare
|
|
1587
|
+
};
|
|
1588
|
+
|
|
1589
|
+
{
|
|
1590
|
+
var ownName;
|
|
1591
|
+
Object.defineProperty(elementType, 'displayName', {
|
|
1592
|
+
enumerable: false,
|
|
1593
|
+
configurable: true,
|
|
1594
|
+
get: function () {
|
|
1595
|
+
return ownName;
|
|
1596
|
+
},
|
|
1597
|
+
set: function (name) {
|
|
1598
|
+
ownName = name; // The inner component shouldn't inherit this display name in most cases,
|
|
1599
|
+
// because the component may be used elsewhere.
|
|
1600
|
+
// But it's nice for anonymous functions to inherit the name,
|
|
1601
|
+
// so that our component-stack generation logic will display their frames.
|
|
1602
|
+
// An anonymous function generally suggests a pattern like:
|
|
1603
|
+
// React.memo((props) => {...});
|
|
1604
|
+
// This kind of inner function is not used elsewhere so the side effect is okay.
|
|
1605
|
+
|
|
1606
|
+
if (!type.name && !type.displayName) {
|
|
1607
|
+
type.displayName = name;
|
|
1608
|
+
}
|
|
1609
|
+
}
|
|
1610
|
+
});
|
|
1611
|
+
}
|
|
1612
|
+
|
|
1613
|
+
return elementType;
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
function resolveDispatcher() {
|
|
1617
|
+
var dispatcher = ReactCurrentDispatcher.current;
|
|
1618
|
+
|
|
1619
|
+
{
|
|
1620
|
+
if (dispatcher === null) {
|
|
1621
|
+
error('Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' + ' one of the following reasons:\n' + '1. You might have mismatching versions of React and the renderer (such as React DOM)\n' + '2. You might be breaking the Rules of Hooks\n' + '3. You might have more than one copy of React in the same app\n' + 'See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.');
|
|
1622
|
+
}
|
|
1623
|
+
} // Will result in a null access error if accessed outside render phase. We
|
|
1624
|
+
// intentionally don't throw our own error because this is in a hot path.
|
|
1625
|
+
// Also helps ensure this is inlined.
|
|
1626
|
+
|
|
1627
|
+
|
|
1628
|
+
return dispatcher;
|
|
1629
|
+
}
|
|
1630
|
+
function useContext(Context) {
|
|
1631
|
+
var dispatcher = resolveDispatcher();
|
|
1632
|
+
|
|
1633
|
+
{
|
|
1634
|
+
// TODO: add a more generic warning for invalid values.
|
|
1635
|
+
if (Context._context !== undefined) {
|
|
1636
|
+
var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs
|
|
1637
|
+
// and nobody should be using this in existing code.
|
|
1638
|
+
|
|
1639
|
+
if (realContext.Consumer === Context) {
|
|
1640
|
+
error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?');
|
|
1641
|
+
} else if (realContext.Provider === Context) {
|
|
1642
|
+
error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?');
|
|
1643
|
+
}
|
|
1644
|
+
}
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
return dispatcher.useContext(Context);
|
|
1648
|
+
}
|
|
1649
|
+
function useState(initialState) {
|
|
1650
|
+
var dispatcher = resolveDispatcher();
|
|
1651
|
+
return dispatcher.useState(initialState);
|
|
1652
|
+
}
|
|
1653
|
+
function useReducer(reducer, initialArg, init) {
|
|
1654
|
+
var dispatcher = resolveDispatcher();
|
|
1655
|
+
return dispatcher.useReducer(reducer, initialArg, init);
|
|
1656
|
+
}
|
|
1657
|
+
function useRef(initialValue) {
|
|
1658
|
+
var dispatcher = resolveDispatcher();
|
|
1659
|
+
return dispatcher.useRef(initialValue);
|
|
1660
|
+
}
|
|
1661
|
+
function useEffect(create, deps) {
|
|
1662
|
+
var dispatcher = resolveDispatcher();
|
|
1663
|
+
return dispatcher.useEffect(create, deps);
|
|
1664
|
+
}
|
|
1665
|
+
function useInsertionEffect(create, deps) {
|
|
1666
|
+
var dispatcher = resolveDispatcher();
|
|
1667
|
+
return dispatcher.useInsertionEffect(create, deps);
|
|
1668
|
+
}
|
|
1669
|
+
function useLayoutEffect(create, deps) {
|
|
1670
|
+
var dispatcher = resolveDispatcher();
|
|
1671
|
+
return dispatcher.useLayoutEffect(create, deps);
|
|
1672
|
+
}
|
|
1673
|
+
function useCallback(callback, deps) {
|
|
1674
|
+
var dispatcher = resolveDispatcher();
|
|
1675
|
+
return dispatcher.useCallback(callback, deps);
|
|
1676
|
+
}
|
|
1677
|
+
function useMemo(create, deps) {
|
|
1678
|
+
var dispatcher = resolveDispatcher();
|
|
1679
|
+
return dispatcher.useMemo(create, deps);
|
|
1680
|
+
}
|
|
1681
|
+
function useImperativeHandle(ref, create, deps) {
|
|
1682
|
+
var dispatcher = resolveDispatcher();
|
|
1683
|
+
return dispatcher.useImperativeHandle(ref, create, deps);
|
|
1684
|
+
}
|
|
1685
|
+
function useDebugValue(value, formatterFn) {
|
|
1686
|
+
{
|
|
1687
|
+
var dispatcher = resolveDispatcher();
|
|
1688
|
+
return dispatcher.useDebugValue(value, formatterFn);
|
|
1689
|
+
}
|
|
1690
|
+
}
|
|
1691
|
+
function useTransition() {
|
|
1692
|
+
var dispatcher = resolveDispatcher();
|
|
1693
|
+
return dispatcher.useTransition();
|
|
1694
|
+
}
|
|
1695
|
+
function useDeferredValue(value) {
|
|
1696
|
+
var dispatcher = resolveDispatcher();
|
|
1697
|
+
return dispatcher.useDeferredValue(value);
|
|
1698
|
+
}
|
|
1699
|
+
function useId() {
|
|
1700
|
+
var dispatcher = resolveDispatcher();
|
|
1701
|
+
return dispatcher.useId();
|
|
1702
|
+
}
|
|
1703
|
+
function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
|
|
1704
|
+
var dispatcher = resolveDispatcher();
|
|
1705
|
+
return dispatcher.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
1706
|
+
}
|
|
1707
|
+
|
|
1708
|
+
// Helpers to patch console.logs to avoid logging during side-effect free
|
|
1709
|
+
// replaying on render function. This currently only patches the object
|
|
1710
|
+
// lazily which won't cover if the log function was extracted eagerly.
|
|
1711
|
+
// We could also eagerly patch the method.
|
|
1712
|
+
var disabledDepth = 0;
|
|
1713
|
+
var prevLog;
|
|
1714
|
+
var prevInfo;
|
|
1715
|
+
var prevWarn;
|
|
1716
|
+
var prevError;
|
|
1717
|
+
var prevGroup;
|
|
1718
|
+
var prevGroupCollapsed;
|
|
1719
|
+
var prevGroupEnd;
|
|
1720
|
+
|
|
1721
|
+
function disabledLog() {}
|
|
1722
|
+
|
|
1723
|
+
disabledLog.__reactDisabledLog = true;
|
|
1724
|
+
function disableLogs() {
|
|
1725
|
+
{
|
|
1726
|
+
if (disabledDepth === 0) {
|
|
1727
|
+
/* eslint-disable react-internal/no-production-logging */
|
|
1728
|
+
prevLog = console.log;
|
|
1729
|
+
prevInfo = console.info;
|
|
1730
|
+
prevWarn = console.warn;
|
|
1731
|
+
prevError = console.error;
|
|
1732
|
+
prevGroup = console.group;
|
|
1733
|
+
prevGroupCollapsed = console.groupCollapsed;
|
|
1734
|
+
prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099
|
|
1735
|
+
|
|
1736
|
+
var props = {
|
|
1737
|
+
configurable: true,
|
|
1738
|
+
enumerable: true,
|
|
1739
|
+
value: disabledLog,
|
|
1740
|
+
writable: true
|
|
1741
|
+
}; // $FlowFixMe Flow thinks console is immutable.
|
|
1742
|
+
|
|
1743
|
+
Object.defineProperties(console, {
|
|
1744
|
+
info: props,
|
|
1745
|
+
log: props,
|
|
1746
|
+
warn: props,
|
|
1747
|
+
error: props,
|
|
1748
|
+
group: props,
|
|
1749
|
+
groupCollapsed: props,
|
|
1750
|
+
groupEnd: props
|
|
1751
|
+
});
|
|
1752
|
+
/* eslint-enable react-internal/no-production-logging */
|
|
1753
|
+
}
|
|
1754
|
+
|
|
1755
|
+
disabledDepth++;
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
function reenableLogs() {
|
|
1759
|
+
{
|
|
1760
|
+
disabledDepth--;
|
|
1761
|
+
|
|
1762
|
+
if (disabledDepth === 0) {
|
|
1763
|
+
/* eslint-disable react-internal/no-production-logging */
|
|
1764
|
+
var props = {
|
|
1765
|
+
configurable: true,
|
|
1766
|
+
enumerable: true,
|
|
1767
|
+
writable: true
|
|
1768
|
+
}; // $FlowFixMe Flow thinks console is immutable.
|
|
1769
|
+
|
|
1770
|
+
Object.defineProperties(console, {
|
|
1771
|
+
log: assign({}, props, {
|
|
1772
|
+
value: prevLog
|
|
1773
|
+
}),
|
|
1774
|
+
info: assign({}, props, {
|
|
1775
|
+
value: prevInfo
|
|
1776
|
+
}),
|
|
1777
|
+
warn: assign({}, props, {
|
|
1778
|
+
value: prevWarn
|
|
1779
|
+
}),
|
|
1780
|
+
error: assign({}, props, {
|
|
1781
|
+
value: prevError
|
|
1782
|
+
}),
|
|
1783
|
+
group: assign({}, props, {
|
|
1784
|
+
value: prevGroup
|
|
1785
|
+
}),
|
|
1786
|
+
groupCollapsed: assign({}, props, {
|
|
1787
|
+
value: prevGroupCollapsed
|
|
1788
|
+
}),
|
|
1789
|
+
groupEnd: assign({}, props, {
|
|
1790
|
+
value: prevGroupEnd
|
|
1791
|
+
})
|
|
1792
|
+
});
|
|
1793
|
+
/* eslint-enable react-internal/no-production-logging */
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
if (disabledDepth < 0) {
|
|
1797
|
+
error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');
|
|
1798
|
+
}
|
|
1799
|
+
}
|
|
1800
|
+
}
|
|
1801
|
+
|
|
1802
|
+
var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher;
|
|
1803
|
+
var prefix;
|
|
1804
|
+
function describeBuiltInComponentFrame(name, source, ownerFn) {
|
|
1805
|
+
{
|
|
1806
|
+
if (prefix === undefined) {
|
|
1807
|
+
// Extract the VM specific prefix used by each line.
|
|
1808
|
+
try {
|
|
1809
|
+
throw Error();
|
|
1810
|
+
} catch (x) {
|
|
1811
|
+
var match = x.stack.trim().match(/\n( *(at )?)/);
|
|
1812
|
+
prefix = match && match[1] || '';
|
|
1813
|
+
}
|
|
1814
|
+
} // We use the prefix to ensure our stacks line up with native stack frames.
|
|
1815
|
+
|
|
1816
|
+
|
|
1817
|
+
return '\n' + prefix + name;
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
var reentry = false;
|
|
1821
|
+
var componentFrameCache;
|
|
1822
|
+
|
|
1823
|
+
{
|
|
1824
|
+
var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
|
|
1825
|
+
componentFrameCache = new PossiblyWeakMap();
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1828
|
+
function describeNativeComponentFrame(fn, construct) {
|
|
1829
|
+
// If something asked for a stack inside a fake render, it should get ignored.
|
|
1830
|
+
if ( !fn || reentry) {
|
|
1831
|
+
return '';
|
|
1832
|
+
}
|
|
1833
|
+
|
|
1834
|
+
{
|
|
1835
|
+
var frame = componentFrameCache.get(fn);
|
|
1836
|
+
|
|
1837
|
+
if (frame !== undefined) {
|
|
1838
|
+
return frame;
|
|
1839
|
+
}
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
var control;
|
|
1843
|
+
reentry = true;
|
|
1844
|
+
var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.
|
|
1845
|
+
|
|
1846
|
+
Error.prepareStackTrace = undefined;
|
|
1847
|
+
var previousDispatcher;
|
|
1848
|
+
|
|
1849
|
+
{
|
|
1850
|
+
previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function
|
|
1851
|
+
// for warnings.
|
|
1852
|
+
|
|
1853
|
+
ReactCurrentDispatcher$1.current = null;
|
|
1854
|
+
disableLogs();
|
|
1855
|
+
}
|
|
1856
|
+
|
|
1857
|
+
try {
|
|
1858
|
+
// This should throw.
|
|
1859
|
+
if (construct) {
|
|
1860
|
+
// Something should be setting the props in the constructor.
|
|
1861
|
+
var Fake = function () {
|
|
1862
|
+
throw Error();
|
|
1863
|
+
}; // $FlowFixMe
|
|
1864
|
+
|
|
1865
|
+
|
|
1866
|
+
Object.defineProperty(Fake.prototype, 'props', {
|
|
1867
|
+
set: function () {
|
|
1868
|
+
// We use a throwing setter instead of frozen or non-writable props
|
|
1869
|
+
// because that won't throw in a non-strict mode function.
|
|
1870
|
+
throw Error();
|
|
1871
|
+
}
|
|
1872
|
+
});
|
|
1873
|
+
|
|
1874
|
+
if (typeof Reflect === 'object' && Reflect.construct) {
|
|
1875
|
+
// We construct a different control for this case to include any extra
|
|
1876
|
+
// frames added by the construct call.
|
|
1877
|
+
try {
|
|
1878
|
+
Reflect.construct(Fake, []);
|
|
1879
|
+
} catch (x) {
|
|
1880
|
+
control = x;
|
|
1881
|
+
}
|
|
1882
|
+
|
|
1883
|
+
Reflect.construct(fn, [], Fake);
|
|
1884
|
+
} else {
|
|
1885
|
+
try {
|
|
1886
|
+
Fake.call();
|
|
1887
|
+
} catch (x) {
|
|
1888
|
+
control = x;
|
|
1889
|
+
}
|
|
1890
|
+
|
|
1891
|
+
fn.call(Fake.prototype);
|
|
1892
|
+
}
|
|
1893
|
+
} else {
|
|
1894
|
+
try {
|
|
1895
|
+
throw Error();
|
|
1896
|
+
} catch (x) {
|
|
1897
|
+
control = x;
|
|
1898
|
+
}
|
|
1899
|
+
|
|
1900
|
+
fn();
|
|
1901
|
+
}
|
|
1902
|
+
} catch (sample) {
|
|
1903
|
+
// This is inlined manually because closure doesn't do it for us.
|
|
1904
|
+
if (sample && control && typeof sample.stack === 'string') {
|
|
1905
|
+
// This extracts the first frame from the sample that isn't also in the control.
|
|
1906
|
+
// Skipping one frame that we assume is the frame that calls the two.
|
|
1907
|
+
var sampleLines = sample.stack.split('\n');
|
|
1908
|
+
var controlLines = control.stack.split('\n');
|
|
1909
|
+
var s = sampleLines.length - 1;
|
|
1910
|
+
var c = controlLines.length - 1;
|
|
1911
|
+
|
|
1912
|
+
while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {
|
|
1913
|
+
// We expect at least one stack frame to be shared.
|
|
1914
|
+
// Typically this will be the root most one. However, stack frames may be
|
|
1915
|
+
// cut off due to maximum stack limits. In this case, one maybe cut off
|
|
1916
|
+
// earlier than the other. We assume that the sample is longer or the same
|
|
1917
|
+
// and there for cut off earlier. So we should find the root most frame in
|
|
1918
|
+
// the sample somewhere in the control.
|
|
1919
|
+
c--;
|
|
1920
|
+
}
|
|
1921
|
+
|
|
1922
|
+
for (; s >= 1 && c >= 0; s--, c--) {
|
|
1923
|
+
// Next we find the first one that isn't the same which should be the
|
|
1924
|
+
// frame that called our sample function and the control.
|
|
1925
|
+
if (sampleLines[s] !== controlLines[c]) {
|
|
1926
|
+
// In V8, the first line is describing the message but other VMs don't.
|
|
1927
|
+
// If we're about to return the first line, and the control is also on the same
|
|
1928
|
+
// line, that's a pretty good indicator that our sample threw at same line as
|
|
1929
|
+
// the control. I.e. before we entered the sample frame. So we ignore this result.
|
|
1930
|
+
// This can happen if you passed a class to function component, or non-function.
|
|
1931
|
+
if (s !== 1 || c !== 1) {
|
|
1932
|
+
do {
|
|
1933
|
+
s--;
|
|
1934
|
+
c--; // We may still have similar intermediate frames from the construct call.
|
|
1935
|
+
// The next one that isn't the same should be our match though.
|
|
1936
|
+
|
|
1937
|
+
if (c < 0 || sampleLines[s] !== controlLines[c]) {
|
|
1938
|
+
// V8 adds a "new" prefix for native classes. Let's remove it to make it prettier.
|
|
1939
|
+
var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "<anonymous>"
|
|
1940
|
+
// but we have a user-provided "displayName"
|
|
1941
|
+
// splice it in to make the stack more readable.
|
|
1942
|
+
|
|
1943
|
+
|
|
1944
|
+
if (fn.displayName && _frame.includes('<anonymous>')) {
|
|
1945
|
+
_frame = _frame.replace('<anonymous>', fn.displayName);
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1948
|
+
{
|
|
1949
|
+
if (typeof fn === 'function') {
|
|
1950
|
+
componentFrameCache.set(fn, _frame);
|
|
1951
|
+
}
|
|
1952
|
+
} // Return the line we found.
|
|
1953
|
+
|
|
1954
|
+
|
|
1955
|
+
return _frame;
|
|
1956
|
+
}
|
|
1957
|
+
} while (s >= 1 && c >= 0);
|
|
1958
|
+
}
|
|
1959
|
+
|
|
1960
|
+
break;
|
|
1961
|
+
}
|
|
1962
|
+
}
|
|
1963
|
+
}
|
|
1964
|
+
} finally {
|
|
1965
|
+
reentry = false;
|
|
1966
|
+
|
|
1967
|
+
{
|
|
1968
|
+
ReactCurrentDispatcher$1.current = previousDispatcher;
|
|
1969
|
+
reenableLogs();
|
|
1970
|
+
}
|
|
1971
|
+
|
|
1972
|
+
Error.prepareStackTrace = previousPrepareStackTrace;
|
|
1973
|
+
} // Fallback to just using the name if we couldn't make it throw.
|
|
1974
|
+
|
|
1975
|
+
|
|
1976
|
+
var name = fn ? fn.displayName || fn.name : '';
|
|
1977
|
+
var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';
|
|
1978
|
+
|
|
1979
|
+
{
|
|
1980
|
+
if (typeof fn === 'function') {
|
|
1981
|
+
componentFrameCache.set(fn, syntheticFrame);
|
|
1982
|
+
}
|
|
1983
|
+
}
|
|
1984
|
+
|
|
1985
|
+
return syntheticFrame;
|
|
1986
|
+
}
|
|
1987
|
+
function describeFunctionComponentFrame(fn, source, ownerFn) {
|
|
1988
|
+
{
|
|
1989
|
+
return describeNativeComponentFrame(fn, false);
|
|
1990
|
+
}
|
|
1991
|
+
}
|
|
1992
|
+
|
|
1993
|
+
function shouldConstruct(Component) {
|
|
1994
|
+
var prototype = Component.prototype;
|
|
1995
|
+
return !!(prototype && prototype.isReactComponent);
|
|
1996
|
+
}
|
|
1997
|
+
|
|
1998
|
+
function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {
|
|
1999
|
+
|
|
2000
|
+
if (type == null) {
|
|
2001
|
+
return '';
|
|
2002
|
+
}
|
|
2003
|
+
|
|
2004
|
+
if (typeof type === 'function') {
|
|
2005
|
+
{
|
|
2006
|
+
return describeNativeComponentFrame(type, shouldConstruct(type));
|
|
2007
|
+
}
|
|
2008
|
+
}
|
|
2009
|
+
|
|
2010
|
+
if (typeof type === 'string') {
|
|
2011
|
+
return describeBuiltInComponentFrame(type);
|
|
2012
|
+
}
|
|
2013
|
+
|
|
2014
|
+
switch (type) {
|
|
2015
|
+
case REACT_SUSPENSE_TYPE:
|
|
2016
|
+
return describeBuiltInComponentFrame('Suspense');
|
|
2017
|
+
|
|
2018
|
+
case REACT_SUSPENSE_LIST_TYPE:
|
|
2019
|
+
return describeBuiltInComponentFrame('SuspenseList');
|
|
2020
|
+
}
|
|
2021
|
+
|
|
2022
|
+
if (typeof type === 'object') {
|
|
2023
|
+
switch (type.$$typeof) {
|
|
2024
|
+
case REACT_FORWARD_REF_TYPE:
|
|
2025
|
+
return describeFunctionComponentFrame(type.render);
|
|
2026
|
+
|
|
2027
|
+
case REACT_MEMO_TYPE:
|
|
2028
|
+
// Memo may contain any component type so we recursively resolve it.
|
|
2029
|
+
return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);
|
|
2030
|
+
|
|
2031
|
+
case REACT_LAZY_TYPE:
|
|
2032
|
+
{
|
|
2033
|
+
var lazyComponent = type;
|
|
2034
|
+
var payload = lazyComponent._payload;
|
|
2035
|
+
var init = lazyComponent._init;
|
|
2036
|
+
|
|
2037
|
+
try {
|
|
2038
|
+
// Lazy may contain any component type so we recursively resolve it.
|
|
2039
|
+
return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);
|
|
2040
|
+
} catch (x) {}
|
|
2041
|
+
}
|
|
2042
|
+
}
|
|
2043
|
+
}
|
|
2044
|
+
|
|
2045
|
+
return '';
|
|
2046
|
+
}
|
|
2047
|
+
|
|
2048
|
+
var loggedTypeFailures = {};
|
|
2049
|
+
var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
|
|
2050
|
+
|
|
2051
|
+
function setCurrentlyValidatingElement(element) {
|
|
2052
|
+
{
|
|
2053
|
+
if (element) {
|
|
2054
|
+
var owner = element._owner;
|
|
2055
|
+
var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
|
|
2056
|
+
ReactDebugCurrentFrame$1.setExtraStackFrame(stack);
|
|
2057
|
+
} else {
|
|
2058
|
+
ReactDebugCurrentFrame$1.setExtraStackFrame(null);
|
|
2059
|
+
}
|
|
2060
|
+
}
|
|
2061
|
+
}
|
|
2062
|
+
|
|
2063
|
+
function checkPropTypes(typeSpecs, values, location, componentName, element) {
|
|
2064
|
+
{
|
|
2065
|
+
// $FlowFixMe This is okay but Flow doesn't know it.
|
|
2066
|
+
var has = Function.call.bind(hasOwnProperty);
|
|
2067
|
+
|
|
2068
|
+
for (var typeSpecName in typeSpecs) {
|
|
2069
|
+
if (has(typeSpecs, typeSpecName)) {
|
|
2070
|
+
var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to
|
|
2071
|
+
// fail the render phase where it didn't fail before. So we log it.
|
|
2072
|
+
// After these have been cleaned up, we'll let them throw.
|
|
2073
|
+
|
|
2074
|
+
try {
|
|
2075
|
+
// This is intentionally an invariant that gets caught. It's the same
|
|
2076
|
+
// behavior as without this statement except with a better message.
|
|
2077
|
+
if (typeof typeSpecs[typeSpecName] !== 'function') {
|
|
2078
|
+
// eslint-disable-next-line react-internal/prod-error-codes
|
|
2079
|
+
var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');
|
|
2080
|
+
err.name = 'Invariant Violation';
|
|
2081
|
+
throw err;
|
|
2082
|
+
}
|
|
2083
|
+
|
|
2084
|
+
error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
|
|
2085
|
+
} catch (ex) {
|
|
2086
|
+
error$1 = ex;
|
|
2087
|
+
}
|
|
2088
|
+
|
|
2089
|
+
if (error$1 && !(error$1 instanceof Error)) {
|
|
2090
|
+
setCurrentlyValidatingElement(element);
|
|
2091
|
+
|
|
2092
|
+
error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);
|
|
2093
|
+
|
|
2094
|
+
setCurrentlyValidatingElement(null);
|
|
2095
|
+
}
|
|
2096
|
+
|
|
2097
|
+
if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
|
|
2098
|
+
// Only monitor this failure once because there tends to be a lot of the
|
|
2099
|
+
// same error.
|
|
2100
|
+
loggedTypeFailures[error$1.message] = true;
|
|
2101
|
+
setCurrentlyValidatingElement(element);
|
|
2102
|
+
|
|
2103
|
+
error('Failed %s type: %s', location, error$1.message);
|
|
2104
|
+
|
|
2105
|
+
setCurrentlyValidatingElement(null);
|
|
2106
|
+
}
|
|
2107
|
+
}
|
|
2108
|
+
}
|
|
2109
|
+
}
|
|
2110
|
+
}
|
|
2111
|
+
|
|
2112
|
+
function setCurrentlyValidatingElement$1(element) {
|
|
2113
|
+
{
|
|
2114
|
+
if (element) {
|
|
2115
|
+
var owner = element._owner;
|
|
2116
|
+
var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
|
|
2117
|
+
setExtraStackFrame(stack);
|
|
2118
|
+
} else {
|
|
2119
|
+
setExtraStackFrame(null);
|
|
2120
|
+
}
|
|
2121
|
+
}
|
|
2122
|
+
}
|
|
2123
|
+
|
|
2124
|
+
var propTypesMisspellWarningShown;
|
|
2125
|
+
|
|
2126
|
+
{
|
|
2127
|
+
propTypesMisspellWarningShown = false;
|
|
2128
|
+
}
|
|
2129
|
+
|
|
2130
|
+
function getDeclarationErrorAddendum() {
|
|
2131
|
+
if (ReactCurrentOwner.current) {
|
|
2132
|
+
var name = getComponentNameFromType(ReactCurrentOwner.current.type);
|
|
2133
|
+
|
|
2134
|
+
if (name) {
|
|
2135
|
+
return '\n\nCheck the render method of `' + name + '`.';
|
|
2136
|
+
}
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2139
|
+
return '';
|
|
2140
|
+
}
|
|
2141
|
+
|
|
2142
|
+
function getSourceInfoErrorAddendum(source) {
|
|
2143
|
+
if (source !== undefined) {
|
|
2144
|
+
var fileName = source.fileName.replace(/^.*[\\\/]/, '');
|
|
2145
|
+
var lineNumber = source.lineNumber;
|
|
2146
|
+
return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.';
|
|
2147
|
+
}
|
|
2148
|
+
|
|
2149
|
+
return '';
|
|
2150
|
+
}
|
|
2151
|
+
|
|
2152
|
+
function getSourceInfoErrorAddendumForProps(elementProps) {
|
|
2153
|
+
if (elementProps !== null && elementProps !== undefined) {
|
|
2154
|
+
return getSourceInfoErrorAddendum(elementProps.__source);
|
|
2155
|
+
}
|
|
2156
|
+
|
|
2157
|
+
return '';
|
|
2158
|
+
}
|
|
2159
|
+
/**
|
|
2160
|
+
* Warn if there's no key explicitly set on dynamic arrays of children or
|
|
2161
|
+
* object keys are not valid. This allows us to keep track of children between
|
|
2162
|
+
* updates.
|
|
2163
|
+
*/
|
|
2164
|
+
|
|
2165
|
+
|
|
2166
|
+
var ownerHasKeyUseWarning = {};
|
|
2167
|
+
|
|
2168
|
+
function getCurrentComponentErrorInfo(parentType) {
|
|
2169
|
+
var info = getDeclarationErrorAddendum();
|
|
2170
|
+
|
|
2171
|
+
if (!info) {
|
|
2172
|
+
var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;
|
|
2173
|
+
|
|
2174
|
+
if (parentName) {
|
|
2175
|
+
info = "\n\nCheck the top-level render call using <" + parentName + ">.";
|
|
2176
|
+
}
|
|
2177
|
+
}
|
|
2178
|
+
|
|
2179
|
+
return info;
|
|
2180
|
+
}
|
|
2181
|
+
/**
|
|
2182
|
+
* Warn if the element doesn't have an explicit key assigned to it.
|
|
2183
|
+
* This element is in an array. The array could grow and shrink or be
|
|
2184
|
+
* reordered. All children that haven't already been validated are required to
|
|
2185
|
+
* have a "key" property assigned to it. Error statuses are cached so a warning
|
|
2186
|
+
* will only be shown once.
|
|
2187
|
+
*
|
|
2188
|
+
* @internal
|
|
2189
|
+
* @param {ReactElement} element Element that requires a key.
|
|
2190
|
+
* @param {*} parentType element's parent's type.
|
|
2191
|
+
*/
|
|
2192
|
+
|
|
2193
|
+
|
|
2194
|
+
function validateExplicitKey(element, parentType) {
|
|
2195
|
+
if (!element._store || element._store.validated || element.key != null) {
|
|
2196
|
+
return;
|
|
2197
|
+
}
|
|
2198
|
+
|
|
2199
|
+
element._store.validated = true;
|
|
2200
|
+
var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);
|
|
2201
|
+
|
|
2202
|
+
if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
|
|
2203
|
+
return;
|
|
2204
|
+
}
|
|
2205
|
+
|
|
2206
|
+
ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a
|
|
2207
|
+
// property, it may be the creator of the child that's responsible for
|
|
2208
|
+
// assigning it a key.
|
|
2209
|
+
|
|
2210
|
+
var childOwner = '';
|
|
2211
|
+
|
|
2212
|
+
if (element && element._owner && element._owner !== ReactCurrentOwner.current) {
|
|
2213
|
+
// Give the component that originally created this child.
|
|
2214
|
+
childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + ".";
|
|
2215
|
+
}
|
|
2216
|
+
|
|
2217
|
+
{
|
|
2218
|
+
setCurrentlyValidatingElement$1(element);
|
|
2219
|
+
|
|
2220
|
+
error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);
|
|
2221
|
+
|
|
2222
|
+
setCurrentlyValidatingElement$1(null);
|
|
2223
|
+
}
|
|
2224
|
+
}
|
|
2225
|
+
/**
|
|
2226
|
+
* Ensure that every element either is passed in a static location, in an
|
|
2227
|
+
* array with an explicit keys property defined, or in an object literal
|
|
2228
|
+
* with valid key property.
|
|
2229
|
+
*
|
|
2230
|
+
* @internal
|
|
2231
|
+
* @param {ReactNode} node Statically passed child of any type.
|
|
2232
|
+
* @param {*} parentType node's parent's type.
|
|
2233
|
+
*/
|
|
2234
|
+
|
|
2235
|
+
|
|
2236
|
+
function validateChildKeys(node, parentType) {
|
|
2237
|
+
if (typeof node !== 'object') {
|
|
2238
|
+
return;
|
|
2239
|
+
}
|
|
2240
|
+
|
|
2241
|
+
if (isArray(node)) {
|
|
2242
|
+
for (var i = 0; i < node.length; i++) {
|
|
2243
|
+
var child = node[i];
|
|
2244
|
+
|
|
2245
|
+
if (isValidElement(child)) {
|
|
2246
|
+
validateExplicitKey(child, parentType);
|
|
2247
|
+
}
|
|
2248
|
+
}
|
|
2249
|
+
} else if (isValidElement(node)) {
|
|
2250
|
+
// This element was passed in a valid location.
|
|
2251
|
+
if (node._store) {
|
|
2252
|
+
node._store.validated = true;
|
|
2253
|
+
}
|
|
2254
|
+
} else if (node) {
|
|
2255
|
+
var iteratorFn = getIteratorFn(node);
|
|
2256
|
+
|
|
2257
|
+
if (typeof iteratorFn === 'function') {
|
|
2258
|
+
// Entry iterators used to provide implicit keys,
|
|
2259
|
+
// but now we print a separate warning for them later.
|
|
2260
|
+
if (iteratorFn !== node.entries) {
|
|
2261
|
+
var iterator = iteratorFn.call(node);
|
|
2262
|
+
var step;
|
|
2263
|
+
|
|
2264
|
+
while (!(step = iterator.next()).done) {
|
|
2265
|
+
if (isValidElement(step.value)) {
|
|
2266
|
+
validateExplicitKey(step.value, parentType);
|
|
2267
|
+
}
|
|
2268
|
+
}
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
}
|
|
2272
|
+
}
|
|
2273
|
+
/**
|
|
2274
|
+
* Given an element, validate that its props follow the propTypes definition,
|
|
2275
|
+
* provided by the type.
|
|
2276
|
+
*
|
|
2277
|
+
* @param {ReactElement} element
|
|
2278
|
+
*/
|
|
2279
|
+
|
|
2280
|
+
|
|
2281
|
+
function validatePropTypes(element) {
|
|
2282
|
+
{
|
|
2283
|
+
var type = element.type;
|
|
2284
|
+
|
|
2285
|
+
if (type === null || type === undefined || typeof type === 'string') {
|
|
2286
|
+
return;
|
|
2287
|
+
}
|
|
2288
|
+
|
|
2289
|
+
var propTypes;
|
|
2290
|
+
|
|
2291
|
+
if (typeof type === 'function') {
|
|
2292
|
+
propTypes = type.propTypes;
|
|
2293
|
+
} else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.
|
|
2294
|
+
// Inner props are checked in the reconciler.
|
|
2295
|
+
type.$$typeof === REACT_MEMO_TYPE)) {
|
|
2296
|
+
propTypes = type.propTypes;
|
|
2297
|
+
} else {
|
|
2298
|
+
return;
|
|
2299
|
+
}
|
|
2300
|
+
|
|
2301
|
+
if (propTypes) {
|
|
2302
|
+
// Intentionally inside to avoid triggering lazy initializers:
|
|
2303
|
+
var name = getComponentNameFromType(type);
|
|
2304
|
+
checkPropTypes(propTypes, element.props, 'prop', name, element);
|
|
2305
|
+
} else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {
|
|
2306
|
+
propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:
|
|
2307
|
+
|
|
2308
|
+
var _name = getComponentNameFromType(type);
|
|
2309
|
+
|
|
2310
|
+
error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {
|
|
2314
|
+
error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');
|
|
2315
|
+
}
|
|
2316
|
+
}
|
|
2317
|
+
}
|
|
2318
|
+
/**
|
|
2319
|
+
* Given a fragment, validate that it can only be provided with fragment props
|
|
2320
|
+
* @param {ReactElement} fragment
|
|
2321
|
+
*/
|
|
2322
|
+
|
|
2323
|
+
|
|
2324
|
+
function validateFragmentProps(fragment) {
|
|
2325
|
+
{
|
|
2326
|
+
var keys = Object.keys(fragment.props);
|
|
2327
|
+
|
|
2328
|
+
for (var i = 0; i < keys.length; i++) {
|
|
2329
|
+
var key = keys[i];
|
|
2330
|
+
|
|
2331
|
+
if (key !== 'children' && key !== 'key') {
|
|
2332
|
+
setCurrentlyValidatingElement$1(fragment);
|
|
2333
|
+
|
|
2334
|
+
error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);
|
|
2335
|
+
|
|
2336
|
+
setCurrentlyValidatingElement$1(null);
|
|
2337
|
+
break;
|
|
2338
|
+
}
|
|
2339
|
+
}
|
|
2340
|
+
|
|
2341
|
+
if (fragment.ref !== null) {
|
|
2342
|
+
setCurrentlyValidatingElement$1(fragment);
|
|
2343
|
+
|
|
2344
|
+
error('Invalid attribute `ref` supplied to `React.Fragment`.');
|
|
2345
|
+
|
|
2346
|
+
setCurrentlyValidatingElement$1(null);
|
|
2347
|
+
}
|
|
2348
|
+
}
|
|
2349
|
+
}
|
|
2350
|
+
function createElementWithValidation(type, props, children) {
|
|
2351
|
+
var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to
|
|
2352
|
+
// succeed and there will likely be errors in render.
|
|
2353
|
+
|
|
2354
|
+
if (!validType) {
|
|
2355
|
+
var info = '';
|
|
2356
|
+
|
|
2357
|
+
if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
|
|
2358
|
+
info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports.";
|
|
2359
|
+
}
|
|
2360
|
+
|
|
2361
|
+
var sourceInfo = getSourceInfoErrorAddendumForProps(props);
|
|
2362
|
+
|
|
2363
|
+
if (sourceInfo) {
|
|
2364
|
+
info += sourceInfo;
|
|
2365
|
+
} else {
|
|
2366
|
+
info += getDeclarationErrorAddendum();
|
|
2367
|
+
}
|
|
2368
|
+
|
|
2369
|
+
var typeString;
|
|
2370
|
+
|
|
2371
|
+
if (type === null) {
|
|
2372
|
+
typeString = 'null';
|
|
2373
|
+
} else if (isArray(type)) {
|
|
2374
|
+
typeString = 'array';
|
|
2375
|
+
} else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {
|
|
2376
|
+
typeString = "<" + (getComponentNameFromType(type.type) || 'Unknown') + " />";
|
|
2377
|
+
info = ' Did you accidentally export a JSX literal instead of a component?';
|
|
2378
|
+
} else {
|
|
2379
|
+
typeString = typeof type;
|
|
2380
|
+
}
|
|
2381
|
+
|
|
2382
|
+
{
|
|
2383
|
+
error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);
|
|
2384
|
+
}
|
|
2385
|
+
}
|
|
2386
|
+
|
|
2387
|
+
var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used.
|
|
2388
|
+
// TODO: Drop this when these are no longer allowed as the type argument.
|
|
2389
|
+
|
|
2390
|
+
if (element == null) {
|
|
2391
|
+
return element;
|
|
2392
|
+
} // Skip key warning if the type isn't valid since our key validation logic
|
|
2393
|
+
// doesn't expect a non-string/function type and can throw confusing errors.
|
|
2394
|
+
// We don't want exception behavior to differ between dev and prod.
|
|
2395
|
+
// (Rendering will throw with a helpful message and as soon as the type is
|
|
2396
|
+
// fixed, the key warnings will appear.)
|
|
2397
|
+
|
|
2398
|
+
|
|
2399
|
+
if (validType) {
|
|
2400
|
+
for (var i = 2; i < arguments.length; i++) {
|
|
2401
|
+
validateChildKeys(arguments[i], type);
|
|
2402
|
+
}
|
|
2403
|
+
}
|
|
2404
|
+
|
|
2405
|
+
if (type === REACT_FRAGMENT_TYPE) {
|
|
2406
|
+
validateFragmentProps(element);
|
|
2407
|
+
} else {
|
|
2408
|
+
validatePropTypes(element);
|
|
2409
|
+
}
|
|
2410
|
+
|
|
2411
|
+
return element;
|
|
2412
|
+
}
|
|
2413
|
+
var didWarnAboutDeprecatedCreateFactory = false;
|
|
2414
|
+
function createFactoryWithValidation(type) {
|
|
2415
|
+
var validatedFactory = createElementWithValidation.bind(null, type);
|
|
2416
|
+
validatedFactory.type = type;
|
|
2417
|
+
|
|
2418
|
+
{
|
|
2419
|
+
if (!didWarnAboutDeprecatedCreateFactory) {
|
|
2420
|
+
didWarnAboutDeprecatedCreateFactory = true;
|
|
2421
|
+
|
|
2422
|
+
warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.');
|
|
2423
|
+
} // Legacy hook: remove it
|
|
2424
|
+
|
|
2425
|
+
|
|
2426
|
+
Object.defineProperty(validatedFactory, 'type', {
|
|
2427
|
+
enumerable: false,
|
|
2428
|
+
get: function () {
|
|
2429
|
+
warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');
|
|
2430
|
+
|
|
2431
|
+
Object.defineProperty(this, 'type', {
|
|
2432
|
+
value: type
|
|
2433
|
+
});
|
|
2434
|
+
return type;
|
|
2435
|
+
}
|
|
2436
|
+
});
|
|
2437
|
+
}
|
|
2438
|
+
|
|
2439
|
+
return validatedFactory;
|
|
2440
|
+
}
|
|
2441
|
+
function cloneElementWithValidation(element, props, children) {
|
|
2442
|
+
var newElement = cloneElement.apply(this, arguments);
|
|
2443
|
+
|
|
2444
|
+
for (var i = 2; i < arguments.length; i++) {
|
|
2445
|
+
validateChildKeys(arguments[i], newElement.type);
|
|
2446
|
+
}
|
|
2447
|
+
|
|
2448
|
+
validatePropTypes(newElement);
|
|
2449
|
+
return newElement;
|
|
2450
|
+
}
|
|
2451
|
+
|
|
2452
|
+
function startTransition(scope, options) {
|
|
2453
|
+
var prevTransition = ReactCurrentBatchConfig.transition;
|
|
2454
|
+
ReactCurrentBatchConfig.transition = {};
|
|
2455
|
+
var currentTransition = ReactCurrentBatchConfig.transition;
|
|
2456
|
+
|
|
2457
|
+
{
|
|
2458
|
+
ReactCurrentBatchConfig.transition._updatedFibers = new Set();
|
|
2459
|
+
}
|
|
2460
|
+
|
|
2461
|
+
try {
|
|
2462
|
+
scope();
|
|
2463
|
+
} finally {
|
|
2464
|
+
ReactCurrentBatchConfig.transition = prevTransition;
|
|
2465
|
+
|
|
2466
|
+
{
|
|
2467
|
+
if (prevTransition === null && currentTransition._updatedFibers) {
|
|
2468
|
+
var updatedFibersCount = currentTransition._updatedFibers.size;
|
|
2469
|
+
|
|
2470
|
+
if (updatedFibersCount > 10) {
|
|
2471
|
+
warn('Detected a large number of updates inside startTransition. ' + 'If this is due to a subscription please re-write it to use React provided hooks. ' + 'Otherwise concurrent mode guarantees are off the table.');
|
|
2472
|
+
}
|
|
2473
|
+
|
|
2474
|
+
currentTransition._updatedFibers.clear();
|
|
2475
|
+
}
|
|
2476
|
+
}
|
|
2477
|
+
}
|
|
2478
|
+
}
|
|
2479
|
+
|
|
2480
|
+
var didWarnAboutMessageChannel = false;
|
|
2481
|
+
var enqueueTaskImpl = null;
|
|
2482
|
+
function enqueueTask(task) {
|
|
2483
|
+
if (enqueueTaskImpl === null) {
|
|
2484
|
+
try {
|
|
2485
|
+
// read require off the module object to get around the bundlers.
|
|
2486
|
+
// we don't want them to detect a require and bundle a Node polyfill.
|
|
2487
|
+
var requireString = ('require' + Math.random()).slice(0, 7);
|
|
2488
|
+
var nodeRequire = module && module[requireString]; // assuming we're in node, let's try to get node's
|
|
2489
|
+
// version of setImmediate, bypassing fake timers if any.
|
|
2490
|
+
|
|
2491
|
+
enqueueTaskImpl = nodeRequire.call(module, 'timers').setImmediate;
|
|
2492
|
+
} catch (_err) {
|
|
2493
|
+
// we're in a browser
|
|
2494
|
+
// we can't use regular timers because they may still be faked
|
|
2495
|
+
// so we try MessageChannel+postMessage instead
|
|
2496
|
+
enqueueTaskImpl = function (callback) {
|
|
2497
|
+
{
|
|
2498
|
+
if (didWarnAboutMessageChannel === false) {
|
|
2499
|
+
didWarnAboutMessageChannel = true;
|
|
2500
|
+
|
|
2501
|
+
if (typeof MessageChannel === 'undefined') {
|
|
2502
|
+
error('This browser does not have a MessageChannel implementation, ' + 'so enqueuing tasks via await act(async () => ...) will fail. ' + 'Please file an issue at https://github.com/facebook/react/issues ' + 'if you encounter this warning.');
|
|
2503
|
+
}
|
|
2504
|
+
}
|
|
2505
|
+
}
|
|
2506
|
+
|
|
2507
|
+
var channel = new MessageChannel();
|
|
2508
|
+
channel.port1.onmessage = callback;
|
|
2509
|
+
channel.port2.postMessage(undefined);
|
|
2510
|
+
};
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
|
|
2514
|
+
return enqueueTaskImpl(task);
|
|
2515
|
+
}
|
|
2516
|
+
|
|
2517
|
+
var actScopeDepth = 0;
|
|
2518
|
+
var didWarnNoAwaitAct = false;
|
|
2519
|
+
function act(callback) {
|
|
2520
|
+
{
|
|
2521
|
+
// `act` calls can be nested, so we track the depth. This represents the
|
|
2522
|
+
// number of `act` scopes on the stack.
|
|
2523
|
+
var prevActScopeDepth = actScopeDepth;
|
|
2524
|
+
actScopeDepth++;
|
|
2525
|
+
|
|
2526
|
+
if (ReactCurrentActQueue.current === null) {
|
|
2527
|
+
// This is the outermost `act` scope. Initialize the queue. The reconciler
|
|
2528
|
+
// will detect the queue and use it instead of Scheduler.
|
|
2529
|
+
ReactCurrentActQueue.current = [];
|
|
2530
|
+
}
|
|
2531
|
+
|
|
2532
|
+
var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy;
|
|
2533
|
+
var result;
|
|
2534
|
+
|
|
2535
|
+
try {
|
|
2536
|
+
// Used to reproduce behavior of `batchedUpdates` in legacy mode. Only
|
|
2537
|
+
// set to `true` while the given callback is executed, not for updates
|
|
2538
|
+
// triggered during an async event, because this is how the legacy
|
|
2539
|
+
// implementation of `act` behaved.
|
|
2540
|
+
ReactCurrentActQueue.isBatchingLegacy = true;
|
|
2541
|
+
result = callback(); // Replicate behavior of original `act` implementation in legacy mode,
|
|
2542
|
+
// which flushed updates immediately after the scope function exits, even
|
|
2543
|
+
// if it's an async function.
|
|
2544
|
+
|
|
2545
|
+
if (!prevIsBatchingLegacy && ReactCurrentActQueue.didScheduleLegacyUpdate) {
|
|
2546
|
+
var queue = ReactCurrentActQueue.current;
|
|
2547
|
+
|
|
2548
|
+
if (queue !== null) {
|
|
2549
|
+
ReactCurrentActQueue.didScheduleLegacyUpdate = false;
|
|
2550
|
+
flushActQueue(queue);
|
|
2551
|
+
}
|
|
2552
|
+
}
|
|
2553
|
+
} catch (error) {
|
|
2554
|
+
popActScope(prevActScopeDepth);
|
|
2555
|
+
throw error;
|
|
2556
|
+
} finally {
|
|
2557
|
+
ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy;
|
|
2558
|
+
}
|
|
2559
|
+
|
|
2560
|
+
if (result !== null && typeof result === 'object' && typeof result.then === 'function') {
|
|
2561
|
+
var thenableResult = result; // The callback is an async function (i.e. returned a promise). Wait
|
|
2562
|
+
// for it to resolve before exiting the current scope.
|
|
2563
|
+
|
|
2564
|
+
var wasAwaited = false;
|
|
2565
|
+
var thenable = {
|
|
2566
|
+
then: function (resolve, reject) {
|
|
2567
|
+
wasAwaited = true;
|
|
2568
|
+
thenableResult.then(function (returnValue) {
|
|
2569
|
+
popActScope(prevActScopeDepth);
|
|
2570
|
+
|
|
2571
|
+
if (actScopeDepth === 0) {
|
|
2572
|
+
// We've exited the outermost act scope. Recursively flush the
|
|
2573
|
+
// queue until there's no remaining work.
|
|
2574
|
+
recursivelyFlushAsyncActWork(returnValue, resolve, reject);
|
|
2575
|
+
} else {
|
|
2576
|
+
resolve(returnValue);
|
|
2577
|
+
}
|
|
2578
|
+
}, function (error) {
|
|
2579
|
+
// The callback threw an error.
|
|
2580
|
+
popActScope(prevActScopeDepth);
|
|
2581
|
+
reject(error);
|
|
2582
|
+
});
|
|
2583
|
+
}
|
|
2584
|
+
};
|
|
2585
|
+
|
|
2586
|
+
{
|
|
2587
|
+
if (!didWarnNoAwaitAct && typeof Promise !== 'undefined') {
|
|
2588
|
+
// eslint-disable-next-line no-undef
|
|
2589
|
+
Promise.resolve().then(function () {}).then(function () {
|
|
2590
|
+
if (!wasAwaited) {
|
|
2591
|
+
didWarnNoAwaitAct = true;
|
|
2592
|
+
|
|
2593
|
+
error('You called act(async () => ...) without await. ' + 'This could lead to unexpected testing behaviour, ' + 'interleaving multiple act calls and mixing their ' + 'scopes. ' + 'You should - await act(async () => ...);');
|
|
2594
|
+
}
|
|
2595
|
+
});
|
|
2596
|
+
}
|
|
2597
|
+
}
|
|
2598
|
+
|
|
2599
|
+
return thenable;
|
|
2600
|
+
} else {
|
|
2601
|
+
var returnValue = result; // The callback is not an async function. Exit the current scope
|
|
2602
|
+
// immediately, without awaiting.
|
|
2603
|
+
|
|
2604
|
+
popActScope(prevActScopeDepth);
|
|
2605
|
+
|
|
2606
|
+
if (actScopeDepth === 0) {
|
|
2607
|
+
// Exiting the outermost act scope. Flush the queue.
|
|
2608
|
+
var _queue = ReactCurrentActQueue.current;
|
|
2609
|
+
|
|
2610
|
+
if (_queue !== null) {
|
|
2611
|
+
flushActQueue(_queue);
|
|
2612
|
+
ReactCurrentActQueue.current = null;
|
|
2613
|
+
} // Return a thenable. If the user awaits it, we'll flush again in
|
|
2614
|
+
// case additional work was scheduled by a microtask.
|
|
2615
|
+
|
|
2616
|
+
|
|
2617
|
+
var _thenable = {
|
|
2618
|
+
then: function (resolve, reject) {
|
|
2619
|
+
// Confirm we haven't re-entered another `act` scope, in case
|
|
2620
|
+
// the user does something weird like await the thenable
|
|
2621
|
+
// multiple times.
|
|
2622
|
+
if (ReactCurrentActQueue.current === null) {
|
|
2623
|
+
// Recursively flush the queue until there's no remaining work.
|
|
2624
|
+
ReactCurrentActQueue.current = [];
|
|
2625
|
+
recursivelyFlushAsyncActWork(returnValue, resolve, reject);
|
|
2626
|
+
} else {
|
|
2627
|
+
resolve(returnValue);
|
|
2628
|
+
}
|
|
2629
|
+
}
|
|
2630
|
+
};
|
|
2631
|
+
return _thenable;
|
|
2632
|
+
} else {
|
|
2633
|
+
// Since we're inside a nested `act` scope, the returned thenable
|
|
2634
|
+
// immediately resolves. The outer scope will flush the queue.
|
|
2635
|
+
var _thenable2 = {
|
|
2636
|
+
then: function (resolve, reject) {
|
|
2637
|
+
resolve(returnValue);
|
|
2638
|
+
}
|
|
2639
|
+
};
|
|
2640
|
+
return _thenable2;
|
|
2641
|
+
}
|
|
2642
|
+
}
|
|
2643
|
+
}
|
|
2644
|
+
}
|
|
2645
|
+
|
|
2646
|
+
function popActScope(prevActScopeDepth) {
|
|
2647
|
+
{
|
|
2648
|
+
if (prevActScopeDepth !== actScopeDepth - 1) {
|
|
2649
|
+
error('You seem to have overlapping act() calls, this is not supported. ' + 'Be sure to await previous act() calls before making a new one. ');
|
|
2650
|
+
}
|
|
2651
|
+
|
|
2652
|
+
actScopeDepth = prevActScopeDepth;
|
|
2653
|
+
}
|
|
2654
|
+
}
|
|
2655
|
+
|
|
2656
|
+
function recursivelyFlushAsyncActWork(returnValue, resolve, reject) {
|
|
2657
|
+
{
|
|
2658
|
+
var queue = ReactCurrentActQueue.current;
|
|
2659
|
+
|
|
2660
|
+
if (queue !== null) {
|
|
2661
|
+
try {
|
|
2662
|
+
flushActQueue(queue);
|
|
2663
|
+
enqueueTask(function () {
|
|
2664
|
+
if (queue.length === 0) {
|
|
2665
|
+
// No additional work was scheduled. Finish.
|
|
2666
|
+
ReactCurrentActQueue.current = null;
|
|
2667
|
+
resolve(returnValue);
|
|
2668
|
+
} else {
|
|
2669
|
+
// Keep flushing work until there's none left.
|
|
2670
|
+
recursivelyFlushAsyncActWork(returnValue, resolve, reject);
|
|
2671
|
+
}
|
|
2672
|
+
});
|
|
2673
|
+
} catch (error) {
|
|
2674
|
+
reject(error);
|
|
2675
|
+
}
|
|
2676
|
+
} else {
|
|
2677
|
+
resolve(returnValue);
|
|
2678
|
+
}
|
|
2679
|
+
}
|
|
2680
|
+
}
|
|
2681
|
+
|
|
2682
|
+
var isFlushing = false;
|
|
2683
|
+
|
|
2684
|
+
function flushActQueue(queue) {
|
|
2685
|
+
{
|
|
2686
|
+
if (!isFlushing) {
|
|
2687
|
+
// Prevent re-entrance.
|
|
2688
|
+
isFlushing = true;
|
|
2689
|
+
var i = 0;
|
|
2690
|
+
|
|
2691
|
+
try {
|
|
2692
|
+
for (; i < queue.length; i++) {
|
|
2693
|
+
var callback = queue[i];
|
|
2694
|
+
|
|
2695
|
+
do {
|
|
2696
|
+
callback = callback(true);
|
|
2697
|
+
} while (callback !== null);
|
|
2698
|
+
}
|
|
2699
|
+
|
|
2700
|
+
queue.length = 0;
|
|
2701
|
+
} catch (error) {
|
|
2702
|
+
// If something throws, leave the remaining callbacks on the queue.
|
|
2703
|
+
queue = queue.slice(i + 1);
|
|
2704
|
+
throw error;
|
|
2705
|
+
} finally {
|
|
2706
|
+
isFlushing = false;
|
|
2707
|
+
}
|
|
2708
|
+
}
|
|
2709
|
+
}
|
|
2710
|
+
}
|
|
2711
|
+
|
|
2712
|
+
var createElement$1 = createElementWithValidation ;
|
|
2713
|
+
var cloneElement$1 = cloneElementWithValidation ;
|
|
2714
|
+
var createFactory = createFactoryWithValidation ;
|
|
2715
|
+
var Children = {
|
|
2716
|
+
map: mapChildren,
|
|
2717
|
+
forEach: forEachChildren,
|
|
2718
|
+
count: countChildren,
|
|
2719
|
+
toArray: toArray,
|
|
2720
|
+
only: onlyChild
|
|
2721
|
+
};
|
|
2722
|
+
|
|
2723
|
+
exports.Children = Children;
|
|
2724
|
+
exports.Component = Component;
|
|
2725
|
+
exports.Fragment = REACT_FRAGMENT_TYPE;
|
|
2726
|
+
exports.Profiler = REACT_PROFILER_TYPE;
|
|
2727
|
+
exports.PureComponent = PureComponent;
|
|
2728
|
+
exports.StrictMode = REACT_STRICT_MODE_TYPE;
|
|
2729
|
+
exports.Suspense = REACT_SUSPENSE_TYPE;
|
|
2730
|
+
exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals;
|
|
2731
|
+
exports.cloneElement = cloneElement$1;
|
|
2732
|
+
exports.createContext = createContext;
|
|
2733
|
+
exports.createElement = createElement$1;
|
|
2734
|
+
exports.createFactory = createFactory;
|
|
2735
|
+
exports.createRef = createRef;
|
|
2736
|
+
exports.forwardRef = forwardRef;
|
|
2737
|
+
exports.isValidElement = isValidElement;
|
|
2738
|
+
exports.lazy = lazy;
|
|
2739
|
+
exports.memo = memo;
|
|
2740
|
+
exports.startTransition = startTransition;
|
|
2741
|
+
exports.unstable_act = act;
|
|
2742
|
+
exports.useCallback = useCallback;
|
|
2743
|
+
exports.useContext = useContext;
|
|
2744
|
+
exports.useDebugValue = useDebugValue;
|
|
2745
|
+
exports.useDeferredValue = useDeferredValue;
|
|
2746
|
+
exports.useEffect = useEffect;
|
|
2747
|
+
exports.useId = useId;
|
|
2748
|
+
exports.useImperativeHandle = useImperativeHandle;
|
|
2749
|
+
exports.useInsertionEffect = useInsertionEffect;
|
|
2750
|
+
exports.useLayoutEffect = useLayoutEffect;
|
|
2751
|
+
exports.useMemo = useMemo;
|
|
2752
|
+
exports.useReducer = useReducer;
|
|
2753
|
+
exports.useRef = useRef;
|
|
2754
|
+
exports.useState = useState;
|
|
2755
|
+
exports.useSyncExternalStore = useSyncExternalStore;
|
|
2756
|
+
exports.useTransition = useTransition;
|
|
2757
|
+
exports.version = ReactVersion;
|
|
2758
|
+
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
|
|
2759
|
+
if (
|
|
2760
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
|
|
2761
|
+
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
|
|
2762
|
+
'function'
|
|
2763
|
+
) {
|
|
2764
|
+
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
|
|
2765
|
+
}
|
|
2766
|
+
|
|
2767
|
+
})();
|
|
2768
|
+
}
|
|
2769
|
+
} (react_development, react_developmentExports));
|
|
2770
|
+
|
|
2771
|
+
(function (module) {
|
|
2772
|
+
|
|
2773
|
+
{
|
|
2774
|
+
module.exports = react_developmentExports;
|
|
2775
|
+
}
|
|
2776
|
+
} (react));
|
|
2777
|
+
|
|
2778
|
+
var index = /*@__PURE__*/getDefaultExportFromCjs(reactExports);
|
|
2779
|
+
|
|
2780
|
+
var React = /*#__PURE__*/_mergeNamespaces({
|
|
2781
|
+
__proto__: null,
|
|
2782
|
+
default: index
|
|
2783
|
+
}, [reactExports]);
|
|
2784
|
+
|
|
2785
|
+
/** @module See `rollup.config.js` for what this file does. */
|
|
2786
|
+
|
|
2787
|
+
var Children = reactExports.Children;
|
|
2788
|
+
var Component = reactExports.Component;
|
|
2789
|
+
var Fragment = reactExports.Fragment;
|
|
2790
|
+
var Profiler = reactExports.Profiler;
|
|
2791
|
+
var PureComponent = reactExports.PureComponent;
|
|
2792
|
+
var StrictMode = reactExports.StrictMode;
|
|
2793
|
+
var Suspense = reactExports.Suspense;
|
|
2794
|
+
var __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = reactExports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
|
|
2795
|
+
var cloneElement = reactExports.cloneElement;
|
|
2796
|
+
var createContext = reactExports.createContext;
|
|
2797
|
+
var createElement = reactExports.createElement;
|
|
2798
|
+
var createFactory = reactExports.createFactory;
|
|
2799
|
+
var createRef = reactExports.createRef;
|
|
2800
|
+
var forwardRef = reactExports.forwardRef;
|
|
2801
|
+
var isValidElement = reactExports.isValidElement;
|
|
2802
|
+
var lazy = reactExports.lazy;
|
|
2803
|
+
var memo = reactExports.memo;
|
|
2804
|
+
var startTransition = reactExports.startTransition;
|
|
2805
|
+
var unstable_act = reactExports.unstable_act;
|
|
2806
|
+
var useCallback = reactExports.useCallback;
|
|
2807
|
+
var useContext = reactExports.useContext;
|
|
2808
|
+
var useDebugValue = reactExports.useDebugValue;
|
|
2809
|
+
var useDeferredValue = reactExports.useDeferredValue;
|
|
2810
|
+
var useEffect = reactExports.useEffect;
|
|
2811
|
+
var useId = reactExports.useId;
|
|
2812
|
+
var useImperativeHandle = reactExports.useImperativeHandle;
|
|
2813
|
+
var useInsertionEffect = reactExports.useInsertionEffect;
|
|
2814
|
+
var useLayoutEffect = reactExports.useLayoutEffect;
|
|
2815
|
+
var useMemo = reactExports.useMemo;
|
|
2816
|
+
var useReducer = reactExports.useReducer;
|
|
2817
|
+
var useRef = reactExports.useRef;
|
|
2818
|
+
var useState = reactExports.useState;
|
|
2819
|
+
var useSyncExternalStore = reactExports.useSyncExternalStore;
|
|
2820
|
+
var useTransition = reactExports.useTransition;
|
|
2821
|
+
var version = reactExports.version;
|
|
2822
|
+
export { Children, Component, Fragment, Profiler, PureComponent, StrictMode, Suspense, __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, cloneElement, createContext, createElement, createFactory, createRef, React as default, forwardRef, isValidElement, lazy, memo, startTransition, unstable_act, useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useId, useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore, useTransition, version };
|
|
2823
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QuZGV2ZWxvcG1lbnQuanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMiLCIuLi9zcmMvZXNtLXNoaW1zL3JlYWN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0VmVyc2lvbiA9ICcxOC4yLjAnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGRpc3BhdGNoZXIuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgYmF0Y2gncyBjb25maWd1cmF0aW9uIHN1Y2ggYXMgaG93IGxvbmcgYW4gdXBkYXRlXG4gKiBzaG91bGQgc3VzcGVuZCBmb3IgaWYgaXQgbmVlZHMgdG8uXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IHtcbiAgdHJhbnNpdGlvbjogbnVsbFxufTtcblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0ge1xuICBjdXJyZW50OiBudWxsLFxuICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLlxuICBpc0JhdGNoaW5nTGVnYWN5OiBmYWxzZSxcbiAgZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGU6IGZhbHNlXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG93bmVyLlxuICpcbiAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmVcbiAqIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZC5cbiAqL1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0ge307XG52YXIgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IG51bGw7XG5mdW5jdGlvbiBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spIHtcbiAge1xuICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgfVxufVxuXG57XG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lID0gZnVuY3Rpb24gKHN0YWNrKSB7XG4gICAge1xuICAgICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICAgIH1cbiAgfTsgLy8gU3RhY2sgaW1wbGVtZW50YXRpb24gaW5qZWN0ZWQgYnkgdGhlIGN1cnJlbnQgcmVuZGVyZXIuXG5cblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFjayA9ICcnOyAvLyBBZGQgYW4gZXh0cmEgdG9wIGZyYW1lIHdoaWxlIGFuIGVsZW1lbnQgaXMgYmVpbmcgdmFsaWRhdGVkXG5cbiAgICBpZiAoY3VycmVudEV4dHJhU3RhY2tGcmFtZSkge1xuICAgICAgc3RhY2sgKz0gY3VycmVudEV4dHJhU3RhY2tGcmFtZTtcbiAgICB9IC8vIERlbGVnYXRlIHRvIHRoZSBpbmplY3RlZCByZW5kZXJlci1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuXG5cbiAgICB2YXIgaW1wbCA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrO1xuXG4gICAgaWYgKGltcGwpIHtcbiAgICAgIHN0YWNrICs9IGltcGwoKSB8fCAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG52YXIgZW5hYmxlQ2FjaGVFbGVtZW50ID0gZmFsc2U7XG52YXIgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgPSBmYWxzZTsgLy8gTm8ga25vd24gYnVncywgYnV0IG5lZWRzIHBlcmZvcm1hbmNlIHRlc3RpbmdcblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7IC8vIFRyYWNrIHdoaWNoIEZpYmVyKHMpIHNjaGVkdWxlIHJlbmRlciB3b3JrLlxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyXG59O1xuXG57XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlO1xufVxuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICB2YXIgX2NvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnO1xuICAgIHZhciB3YXJuaW5nS2V5ID0gY29tcG9uZW50TmFtZSArIFwiLlwiICsgY2FsbGVyTmFtZTtcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlcnJvcihcIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuIFwiICsgJ1RoaXMgaXMgYSBuby1vcCwgYnV0IGl0IG1pZ2h0IGluZGljYXRlIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uICcgKyAnSW5zdGVhZCwgYXNzaWduIHRvIGB0aGlzLnN0YXRlYCBkaXJlY3RseSBvciBkZWZpbmUgYSBgc3RhdGUgPSB7fTtgICcgKyAnY2xhc3MgcHJvcGVydHkgd2l0aCB0aGUgZGVzaXJlZCBzdGF0ZSBpbiB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gdHJ1ZTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xuXG5cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbkNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnZnVuY3Rpb24nICYmIHBhcnRpYWxTdGF0ZSAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhICcgKyAnZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLicpO1xuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbmFzc2lnbihwdXJlQ29tcG9uZW50UHJvdG90eXBlLCBDb21wb25lbnQucHJvdG90eXBlKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biwgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgY29uZmlnLl9fc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gY29uZmlnLl9fc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjcmVhdGVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gIHZhciBwcm9wcyA9IHt9O1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG5cbiAgICAgIHtcbiAgICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIiArIGVsZW1lbnQgKyBcIi5cIik7XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuXG5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0ga2V5LnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcblxuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgZWxlbWVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IEEgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEtleShlbGVtZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJiBlbGVtZW50ICE9PSBudWxsICYmIGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICB7XG4gICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXNjYXBlKCcnICsgZWxlbWVudC5rZXkpO1xuICB9IC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG5cblxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgc3dpdGNoIChjaGlsZHJlbi4kJHR5cGVvZikge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgIHZhciBfY2hpbGQgPSBjaGlsZHJlbjtcbiAgICB2YXIgbWFwcGVkQ2hpbGQgPSBjYWxsYmFjayhfY2hpbGQpOyAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3M6XG5cbiAgICB2YXIgY2hpbGRLZXkgPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0RWxlbWVudEtleShfY2hpbGQsIDApIDogbmFtZVNvRmFyO1xuXG4gICAgaWYgKGlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgICB2YXIgZXNjYXBlZENoaWxkS2V5ID0gJyc7XG5cbiAgICAgIGlmIChjaGlsZEtleSAhPSBudWxsKSB7XG4gICAgICAgIGVzY2FwZWRDaGlsZEtleSA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShjaGlsZEtleSkgKyAnLyc7XG4gICAgICB9XG5cbiAgICAgIG1hcEludG9BcnJheShtYXBwZWRDaGlsZCwgYXJyYXksIGVzY2FwZWRDaGlsZEtleSwgJycsIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgYGlmYCBzdGF0ZW1lbnQgaGVyZSBwcmV2ZW50cyBhdXRvLWRpc2FibGluZyBvZiB0aGUgc2FmZVxuICAgICAgICAgIC8vIGNvZXJjaW9uIEVTTGludCBydWxlLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGRpc2FibGUgaXQgYmVsb3cuXG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgICAgaWYgKG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1hcHBlZENoaWxkLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAgICBlc2NhcGVkUHJlZml4ICsgKCAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgbWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkgPyAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIGV4aXN0aW5nIGVsZW1lbnQncyBrZXkgY2FuIGJlIGEgbnVtYmVyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoJycgKyBtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgICAgfVxuXG4gICAgICBhcnJheS5wdXNoKG1hcHBlZENoaWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cblxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGl0ZXJhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGl0ZXJhYmxlQ2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgICAgd2FybignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlQ2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaWkgPSAwO1xuXG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKSB7XG4gIC8vIFRPRE86IFNlY29uZCBhcmd1bWVudCB1c2VkIHRvIGJlIGFuIG9wdGlvbmFsIGBjYWxjdWxhdGVDaGFuZ2VkQml0c2BcbiAgLy8gZnVuY3Rpb24uIFdhcm4gdG8gcmVzZXJ2ZSBmb3IgZnV0dXJlIHVzZT9cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsLFxuICAgIC8vIEFkZCB0aGVzZSB0byB1c2Ugc2FtZSBoaWRkZW4gY2xhc3MgaW4gVk0gYXMgU2VydmVyQ29udGV4dFxuICAgIF9kZWZhdWx0VmFsdWU6IG51bGwsXG4gICAgX2dsb2JhbE5hbWU6IG51bGxcbiAgfTtcbiAgY29udGV4dC5Qcm92aWRlciA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfUFJPVklERVJfVFlQRSxcbiAgICBfY29udGV4dDogY29udGV4dFxuICB9O1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IGZhbHNlO1xuXG4gIHtcbiAgICAvLyBBIHNlcGFyYXRlIG9iamVjdCwgYnV0IHByb3hpZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBvYmplY3QgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5XG4gICAgLy8gd2FybiBmb3IgdGhlIGluY29ycmVjdCB1c2FnZSBvZiBDb250ZXh0IGFzIGEgQ29uc3VtZXIuXG4gICAgdmFyIENvbnN1bWVyID0ge1xuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0XG4gICAgfTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbm90IHNldHRpbmcgYSB2YWx1ZSwgd2hpY2ggaXMgaW50ZW50aW9uYWwgaGVyZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ29uc3VtZXIsIHtcbiAgICAgIFByb3ZpZGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Qcm92aWRlcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX1Byb3ZpZGVyKSB7XG4gICAgICAgICAgY29udGV4dC5Qcm92aWRlciA9IF9Qcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IF9jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlMjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlMjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZTIpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfdGhyZWFkQ291bnQ6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3RocmVhZENvdW50O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfdGhyZWFkQ291bnQpIHtcbiAgICAgICAgICBjb250ZXh0Ll90aHJlYWRDb3VudCA9IF90aHJlYWRDb3VudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIENvbnN1bWVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Db25zdW1lcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Db25zdW1lcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlOYW1lOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpc3BsYXlOYW1lO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIpIHtcbiAgICAgICAgICAgIHdhcm4oJ1NldHRpbmcgYGRpc3BsYXlOYW1lYCBvbiBDb250ZXh0LkNvbnN1bWVyIGhhcyBubyBlZmZlY3QuICcgKyBcIllvdSBzaG91bGQgc2V0IGl0IGRpcmVjdGx5IG9uIHRoZSBjb250ZXh0IHdpdGggQ29udGV4dC5kaXNwbGF5TmFtZSA9ICclcycuXCIsIGRpc3BsYXlOYW1lKTtcblxuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pOyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBtaXNzaW5nIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgZGVmaW5lUHJvcGVydHlcblxuICAgIGNvbnRleHQuQ29uc3VtZXIgPSBDb25zdW1lcjtcbiAgfVxuXG4gIHtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBudWxsO1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlcjIgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbnZhciBVbmluaXRpYWxpemVkID0gLTE7XG52YXIgUGVuZGluZyA9IDA7XG52YXIgUmVzb2x2ZWQgPSAxO1xudmFyIFJlamVjdGVkID0gMjtcblxuZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgIHZhciB0aGVuYWJsZSA9IGN0b3IoKTsgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAvLyBUaGlzIG1pZ2h0IHRocm93IGVpdGhlciBiZWNhdXNlIGl0J3MgbWlzc2luZyBvciB0aHJvd3MuIElmIHNvLCB3ZSB0cmVhdCBpdFxuICAgIC8vIGFzIHN0aWxsIHVuaW5pdGlhbGl6ZWQgYW5kIHRyeSBhZ2FpbiBuZXh0IHRpbWUuIFdoaWNoIGlzIHRoZSBzYW1lIGFzIHdoYXRcbiAgICAvLyBoYXBwZW5zIGlmIHRoZSBjdG9yIG9yIGFueSB3cmFwcGVycyBwcm9jZXNzaW5nIHRoZSBjdG9yIHRocm93cy4gVGhpcyBtaWdodFxuICAgIC8vIGVuZCB1cCBmaXhpbmcgaXQgaWYgdGhlIHJlc29sdXRpb24gd2FzIGEgY29uY3VycmVuY3kgYnVnLlxuXG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZXNvbHZlZC5fc3RhdHVzID0gUmVzb2x2ZWQ7XG4gICAgICAgIHJlc29sdmVkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3Q7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZWplY3RlZC5fc3RhdHVzID0gUmVqZWN0ZWQ7XG4gICAgICAgIHJlamVjdGVkLl9yZXN1bHQgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIC8vIEluIGNhc2UsIHdlJ3JlIHN0aWxsIHVuaW5pdGlhbGl6ZWQsIHRoZW4gd2UncmUgd2FpdGluZyBmb3IgdGhlIHRoZW5hYmxlXG4gICAgICAvLyB0byByZXNvbHZlLiBTZXQgaXQgYXMgcGVuZGluZyBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICB2YXIgcGVuZGluZyA9IHBheWxvYWQ7XG4gICAgICBwZW5kaW5nLl9zdGF0dXMgPSBQZW5kaW5nO1xuICAgICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUmVzb2x2ZWQpIHtcbiAgICB2YXIgbW9kdWxlT2JqZWN0ID0gcGF5bG9hZC5fcmVzdWx0O1xuXG4gICAge1xuICAgICAgaWYgKG1vZHVsZU9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXAnICsgJ29ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2NvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXAnICsgXCJvcnQoJy4vTXlDb21wb25lbnQnKSlcXG5cXG5cIiArICdEaWQgeW91IGFjY2lkZW50YWxseSBwdXQgY3VybHkgYnJhY2VzIGFyb3VuZCB0aGUgaW1wb3J0PycsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKCEoJ2RlZmF1bHQnIGluIG1vZHVsZU9iamVjdCkpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVPYmplY3QuZGVmYXVsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBwYXlsb2FkLl9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBwYXlsb2FkID0ge1xuICAgIC8vIFdlIHVzZSB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC5cbiAgICBfc3RhdHVzOiBVbmluaXRpYWxpemVkLFxuICAgIF9yZXN1bHQ6IGN0b3JcbiAgfTtcbiAgdmFyIGxhenlUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9MQVpZX1RZUEUsXG4gICAgX3BheWxvYWQ6IHBheWxvYWQsXG4gICAgX2luaXQ6IGxhenlJbml0aWFsaXplclxuICB9O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICB2YXIgcHJvcFR5cGVzOyAvLyAkRmxvd0ZpeE1lXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsYXp5VHlwZSwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9wcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3RGVmYXVsdFByb3BzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYGRlZmF1bHRQcm9wc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIGRlZmF1bHRQcm9wcyA9IG5ld0RlZmF1bHRQcm9wczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAnZGVmYXVsdFByb3BzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvcFR5cGVzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BUeXBlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJvcFR5cGVzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIHByb3BUeXBlcyA9IG5ld1Byb3BUeXBlczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAncHJvcFR5cGVzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbGF6eVR5cGU7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSZWYocmVuZGVyKSB7XG4gIHtcbiAgICBpZiAocmVuZGVyICE9IG51bGwgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCAnICsgJ2NvbXBvbmVudC4gSW5zdGVhZCBvZiBmb3J3YXJkUmVmKG1lbW8oLi4uKSksIHVzZSAnICsgJ21lbW8oZm9yd2FyZFJlZiguLi4pKS4nKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuJywgcmVuZGVyID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHJlbmRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZW5kZXIubGVuZ3RoICE9PSAwICYmIHJlbmRlci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBhY2NlcHQgZXhhY3RseSB0d28gcGFyYW1ldGVyczogcHJvcHMgYW5kIHJlZi4gJXMnLCByZW5kZXIubGVuZ3RoID09PSAxID8gJ0RpZCB5b3UgZm9yZ2V0IHRvIHVzZSB0aGUgcmVmIHBhcmFtZXRlcj8nIDogJ0FueSBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyICE9IG51bGwpIHtcbiAgICAgIGlmIChyZW5kZXIuZGVmYXVsdFByb3BzICE9IG51bGwgfHwgcmVuZGVyLnByb3BUeXBlcyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgZG8gbm90IHN1cHBvcnQgcHJvcFR5cGVzIG9yIGRlZmF1bHRQcm9wcy4gJyArICdEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIGEgUmVhY3QgY29tcG9uZW50PycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICByZW5kZXI6IHJlbmRlclxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXJlbmRlci5uYW1lICYmICFyZW5kZXIuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0Lm1lbW8oKHByb3BzKSA9PiB7Li4ufSk7XG4gICAgICAgIC8vIFRoaXMga2luZCBvZiBpbm5lciBmdW5jdGlvbiBpcyBub3QgdXNlZCBlbHNld2hlcmUgc28gdGhlIHNpZGUgZWZmZWN0IGlzIG9rYXkuXG5cbiAgICAgICAgaWYgKCF0eXBlLm5hbWUgJiYgIXR5cGUuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICB0eXBlLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7XG5cbiAge1xuICAgIGlmIChkaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvcicgKyAnIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4nICsgJzMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpO1xuICAgIH1cbiAgfSAvLyBXaWxsIHJlc3VsdCBpbiBhIG51bGwgYWNjZXNzIGVycm9yIGlmIGFjY2Vzc2VkIG91dHNpZGUgcmVuZGVyIHBoYXNlLiBXZVxuICAvLyBpbnRlbnRpb25hbGx5IGRvbid0IHRocm93IG91ciBvd24gZXJyb3IgYmVjYXVzZSB0aGlzIGlzIGluIGEgaG90IHBhdGguXG4gIC8vIEFsc28gaGVscHMgZW5zdXJlIHRoaXMgaXMgaW5saW5lZC5cblxuXG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuZnVuY3Rpb24gdXNlQ29udGV4dChDb250ZXh0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZWFsQ29udGV4dCA9IENvbnRleHQuX2NvbnRleHQ7IC8vIERvbid0IGRlZHVwbGljYXRlIGJlY2F1c2UgdGhpcyBsZWdpdGltYXRlbHkgY2F1c2VzIGJ1Z3NcbiAgICAgIC8vIGFuZCBub2JvZHkgc2hvdWxkIGJlIHVzaW5nIHRoaXMgaW4gZXhpc3RpbmcgY29kZS5cblxuICAgICAgaWYgKHJlYWxDb250ZXh0LkNvbnN1bWVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Db25zdW1lcikgaXMgbm90IHN1cHBvcnRlZCwgbWF5IGNhdXNlIGJ1Z3MsIGFuZCB3aWxsIGJlICcgKyAncmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9IGVsc2UgaWYgKHJlYWxDb250ZXh0LlByb3ZpZGVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Qcm92aWRlcikgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ29udGV4dChDb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59XG5mdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xufVxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VNZW1vKGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZU1lbW8oY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gIHtcbiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICB9XG59XG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVRyYW5zaXRpb24oKTtcbn1cbmZ1bmN0aW9uIHVzZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUlkKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUlkKCk7XG59XG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbn1cblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMoZWxlbWVudFByb3BzKSB7XG4gIGlmIChlbGVtZW50UHJvcHMgIT09IG51bGwgJiYgZWxlbWVudFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oZWxlbWVudFByb3BzLl9fc291cmNlKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG5cblxudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICBpZiAoIWluZm8pIHtcbiAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZm87XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IHRydWU7IC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG5cbiAgICAgIHZhciBfbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIF9uYW1lIHx8ICdVbmtub3duJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhdHlwZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGEgZnJhZ21lbnQsIHZhbGlkYXRlIHRoYXQgaXQgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2l0aCBmcmFnbWVudCBwcm9wc1xuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHtcbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKHByb3BzKTtcblxuICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNjb3BlLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSB7fTtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2NvcGUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gZmFsc2U7XG52YXIgZW5xdWV1ZVRhc2tJbXBsID0gbnVsbDtcbmZ1bmN0aW9uIGVucXVldWVUYXNrKHRhc2spIHtcbiAgaWYgKGVucXVldWVUYXNrSW1wbCA9PT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICAvLyByZWFkIHJlcXVpcmUgb2ZmIHRoZSBtb2R1bGUgb2JqZWN0IHRvIGdldCBhcm91bmQgdGhlIGJ1bmRsZXJzLlxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIGRldGVjdCBhIHJlcXVpcmUgYW5kIGJ1bmRsZSBhIE5vZGUgcG9seWZpbGwuXG4gICAgICB2YXIgcmVxdWlyZVN0cmluZyA9ICgncmVxdWlyZScgKyBNYXRoLnJhbmRvbSgpKS5zbGljZSgwLCA3KTtcbiAgICAgIHZhciBub2RlUmVxdWlyZSA9IG1vZHVsZSAmJiBtb2R1bGVbcmVxdWlyZVN0cmluZ107IC8vIGFzc3VtaW5nIHdlJ3JlIGluIG5vZGUsIGxldCdzIHRyeSB0byBnZXQgbm9kZSdzXG4gICAgICAvLyB2ZXJzaW9uIG9mIHNldEltbWVkaWF0ZSwgYnlwYXNzaW5nIGZha2UgdGltZXJzIGlmIGFueS5cblxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gbm9kZVJlcXVpcmUuY2FsbChtb2R1bGUsICd0aW1lcnMnKS5zZXRJbW1lZGlhdGU7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgLy8gd2UncmUgaW4gYSBicm93c2VyXG4gICAgICAvLyB3ZSBjYW4ndCB1c2UgcmVndWxhciB0aW1lcnMgYmVjYXVzZSB0aGV5IG1heSBzdGlsbCBiZSBmYWtlZFxuICAgICAgLy8gc28gd2UgdHJ5IE1lc3NhZ2VDaGFubmVsK3Bvc3RNZXNzYWdlIGluc3RlYWRcbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBlcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ2hhbm5lbCBpbXBsZW1lbnRhdGlvbiwgJyArICdzbyBlbnF1ZXVpbmcgdGFza3MgdmlhIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pIHdpbGwgZmFpbC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzICcgKyAnaWYgeW91IGVuY291bnRlciB0aGlzIHdhcm5pbmcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW5xdWV1ZVRhc2tJbXBsKHRhc2spO1xufVxuXG52YXIgYWN0U2NvcGVEZXB0aCA9IDA7XG52YXIgZGlkV2Fybk5vQXdhaXRBY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGFjdChjYWxsYmFjaykge1xuICB7XG4gICAgLy8gYGFjdGAgY2FsbHMgY2FuIGJlIG5lc3RlZCwgc28gd2UgdHJhY2sgdGhlIGRlcHRoLiBUaGlzIHJlcHJlc2VudHMgdGhlXG4gICAgLy8gbnVtYmVyIG9mIGBhY3RgIHNjb3BlcyBvbiB0aGUgc3RhY2suXG4gICAgdmFyIHByZXZBY3RTY29wZURlcHRoID0gYWN0U2NvcGVEZXB0aDtcbiAgICBhY3RTY29wZURlcHRoKys7XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgb3V0ZXJtb3N0IGBhY3RgIHNjb3BlLiBJbml0aWFsaXplIHRoZSBxdWV1ZS4gVGhlIHJlY29uY2lsZXJcbiAgICAgIC8vIHdpbGwgZGV0ZWN0IHRoZSBxdWV1ZSBhbmQgdXNlIGl0IGluc3RlYWQgb2YgU2NoZWR1bGVyLlxuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgIH1cblxuICAgIHZhciBwcmV2SXNCYXRjaGluZ0xlZ2FjeSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3k7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLiBPbmx5XG4gICAgICAvLyBzZXQgdG8gYHRydWVgIHdoaWxlIHRoZSBnaXZlbiBjYWxsYmFjayBpcyBleGVjdXRlZCwgbm90IGZvciB1cGRhdGVzXG4gICAgICAvLyB0cmlnZ2VyZWQgZHVyaW5nIGFuIGFzeW5jIGV2ZW50LCBiZWNhdXNlIHRoaXMgaXMgaG93IHRoZSBsZWdhY3lcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIGBhY3RgIGJlaGF2ZWQuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7IC8vIFJlcGxpY2F0ZSBiZWhhdmlvciBvZiBvcmlnaW5hbCBgYWN0YCBpbXBsZW1lbnRhdGlvbiBpbiBsZWdhY3kgbW9kZSxcbiAgICAgIC8vIHdoaWNoIGZsdXNoZWQgdXBkYXRlcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgc2NvcGUgZnVuY3Rpb24gZXhpdHMsIGV2ZW5cbiAgICAgIC8vIGlmIGl0J3MgYW4gYXN5bmMgZnVuY3Rpb24uXG5cbiAgICAgIGlmICghcHJldklzQmF0Y2hpbmdMZWdhY3kgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gcHJldklzQmF0Y2hpbmdMZWdhY3k7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0aGVuYWJsZVJlc3VsdCA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIGFuIGFzeW5jIGZ1bmN0aW9uIChpLmUuIHJldHVybmVkIGEgcHJvbWlzZSkuIFdhaXRcbiAgICAgIC8vIGZvciBpdCB0byByZXNvbHZlIGJlZm9yZSBleGl0aW5nIHRoZSBjdXJyZW50IHNjb3BlLlxuXG4gICAgICB2YXIgd2FzQXdhaXRlZCA9IGZhbHNlO1xuICAgICAgdmFyIHRoZW5hYmxlID0ge1xuICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgd2FzQXdhaXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhlbmFibGVSZXN1bHQudGhlbihmdW5jdGlvbiAocmV0dXJuVmFsdWUpIHtcbiAgICAgICAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgICAgICAgLy8gV2UndmUgZXhpdGVkIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBSZWN1cnNpdmVseSBmbHVzaCB0aGVcbiAgICAgICAgICAgICAgLy8gcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLlxuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAge1xuICAgICAgICBpZiAoIWRpZFdhcm5Ob0F3YWl0QWN0ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge30pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF3YXNBd2FpdGVkKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBlcnJvcignWW91IGNhbGxlZCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aXRob3V0IGF3YWl0LiAnICsgJ1RoaXMgY291bGQgbGVhZCB0byB1bmV4cGVjdGVkIHRlc3RpbmcgYmVoYXZpb3VyLCAnICsgJ2ludGVybGVhdmluZyBtdWx0aXBsZSBhY3QgY2FsbHMgYW5kIG1peGluZyB0aGVpciAnICsgJ3Njb3Blcy4gJyArICdZb3Ugc2hvdWxkIC0gYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLik7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWUgPSByZXN1bHQ7IC8vIFRoZSBjYWxsYmFjayBpcyBub3QgYW4gYXN5bmMgZnVuY3Rpb24uIEV4aXQgdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgIC8vIGltbWVkaWF0ZWx5LCB3aXRob3V0IGF3YWl0aW5nLlxuXG4gICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG5cbiAgICAgIGlmIChhY3RTY29wZURlcHRoID09PSAwKSB7XG4gICAgICAgIC8vIEV4aXRpbmcgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIEZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKF9xdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUoX3F1ZXVlKTtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSAvLyBSZXR1cm4gYSB0aGVuYWJsZS4gSWYgdGhlIHVzZXIgYXdhaXRzIGl0LCB3ZSdsbCBmbHVzaCBhZ2FpbiBpblxuICAgICAgICAvLyBjYXNlIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkIGJ5IGEgbWljcm90YXNrLlxuXG5cbiAgICAgICAgdmFyIF90aGVuYWJsZSA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAvLyBDb25maXJtIHdlIGhhdmVuJ3QgcmUtZW50ZXJlZCBhbm90aGVyIGBhY3RgIHNjb3BlLCBpbiBjYXNlXG4gICAgICAgICAgICAvLyB0aGUgdXNlciBkb2VzIHNvbWV0aGluZyB3ZWlyZCBsaWtlIGF3YWl0IHRoZSB0aGVuYWJsZVxuICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMuXG4gICAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbHVzaCB0aGUgcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luY2Ugd2UncmUgaW5zaWRlIGEgbmVzdGVkIGBhY3RgIHNjb3BlLCB0aGUgcmV0dXJuZWQgdGhlbmFibGVcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmVzb2x2ZXMuIFRoZSBvdXRlciBzY29wZSB3aWxsIGZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF90aGVuYWJsZTIgPSB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpIHtcbiAge1xuICAgIGlmIChwcmV2QWN0U2NvcGVEZXB0aCAhPT0gYWN0U2NvcGVEZXB0aCAtIDEpIHtcbiAgICAgIGVycm9yKCdZb3Ugc2VlbSB0byBoYXZlIG92ZXJsYXBwaW5nIGFjdCgpIGNhbGxzLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnQmUgc3VyZSB0byBhd2FpdCBwcmV2aW91cyBhY3QoKSBjYWxscyBiZWZvcmUgbWFraW5nIGEgbmV3IG9uZS4gJyk7XG4gICAgfVxuXG4gICAgYWN0U2NvcGVEZXB0aCA9IHByZXZBY3RTY29wZURlcHRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCkge1xuICB7XG4gICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIHdvcmsgd2FzIHNjaGVkdWxlZC4gRmluaXNoLlxuICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gS2VlcCBmbHVzaGluZyB3b3JrIHVudGlsIHRoZXJlJ3Mgbm9uZSBsZWZ0LlxuICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0ZsdXNoaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQWN0UXVldWUocXVldWUpIHtcbiAge1xuICAgIGlmICghaXNGbHVzaGluZykge1xuICAgICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICAgIHF1ZXVlID0gcXVldWUuc2xpY2UoaSArIDEpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG5leHBvcnRzLlN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBSZWFjdFNoYXJlZEludGVybmFscztcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeTtcbmV4cG9ydHMuY3JlYXRlUmVmID0gY3JlYXRlUmVmO1xuZXhwb3J0cy5mb3J3YXJkUmVmID0gZm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnQgPSBpc1ZhbGlkRWxlbWVudDtcbmV4cG9ydHMubGF6eSA9IGxhenk7XG5leHBvcnRzLm1lbW8gPSBtZW1vO1xuZXhwb3J0cy5zdGFydFRyYW5zaXRpb24gPSBzdGFydFRyYW5zaXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2FjdCA9IGFjdDtcbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSB1c2VDYWxsYmFjaztcbmV4cG9ydHMudXNlQ29udGV4dCA9IHVzZUNvbnRleHQ7XG5leHBvcnRzLnVzZURlYnVnVmFsdWUgPSB1c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VEZWZlcnJlZFZhbHVlID0gdXNlRGVmZXJyZWRWYWx1ZTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0O1xuZXhwb3J0cy51c2VJZCA9IHVzZUlkO1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gdXNlSW1wZXJhdGl2ZUhhbmRsZTtcbmV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0ID0gdXNlSW5zZXJ0aW9uRWZmZWN0O1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3QgPSB1c2VMYXlvdXRFZmZlY3Q7XG5leHBvcnRzLnVzZU1lbW8gPSB1c2VNZW1vO1xuZXhwb3J0cy51c2VSZWR1Y2VyID0gdXNlUmVkdWNlcjtcbmV4cG9ydHMudXNlUmVmID0gdXNlUmVmO1xuZXhwb3J0cy51c2VTdGF0ZSA9IHVzZVN0YXRlO1xuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlO1xuZXhwb3J0cy51c2VUcmFuc2l0aW9uID0gdXNlVHJhbnNpdGlvbjtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKiogQG1vZHVsZSBTZWUgYHJvbGx1cC5jb25maWcuanNgIGZvciB3aGF0IHRoaXMgZmlsZSBkb2VzLiAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGRlZmF1bHQgUmVhY3Q7XG4vLyBXZSBuZWVkIHRvIGV4cGxpY2l0bHkgbGlzdCBhbGwgdGhlIG5hbWVzIGJlY2F1c2UgJ3JlYWN0JyBpcyBhIENvbW1vbkpTIG1vZHVsZSBmb3Igd2hpY2hcbi8vIGBleHBvcnQgKiBmcm9tYCBkb2VzIG5vdCB3b3JrLlxuaW1wb3J0IHsgQ2hpbGRyZW4sIGNsb25lRWxlbWVudCwgQ29tcG9uZW50LCBjcmVhdGVDb250ZXh0LCBjcmVhdGVFbGVtZW50LCBjcmVhdGVGYWN0b3J5LCBjcmVhdGVSZWYsIGZvcndhcmRSZWYsIEZyYWdtZW50LCBpc1ZhbGlkRWxlbWVudCwgbGF6eSwgbWVtbywgUHJvZmlsZXIsIFB1cmVDb21wb25lbnQsIHN0YXJ0VHJhbnNpdGlvbiwgU3RyaWN0TW9kZSwgU3VzcGVuc2UsIFxuLy8gQHRzLWlnbm9yZVxudW5zdGFibGVfYWN0LCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRGVidWdWYWx1ZSwgdXNlRGVmZXJyZWRWYWx1ZSwgdXNlRWZmZWN0LCB1c2VJZCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlSW5zZXJ0aW9uRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZHVjZXIsIHVzZVJlZiwgdXNlU3RhdGUsIHVzZVN5bmNFeHRlcm5hbFN0b3JlLCB1c2VUcmFuc2l0aW9uLCB2ZXJzaW9uLCBcbi8vIEB0cy1pZ25vcmVcbl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELCB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB7IENoaWxkcmVuLCBDb21wb25lbnQsIEZyYWdtZW50LCBQcm9maWxlciwgUHVyZUNvbXBvbmVudCwgU3RyaWN0TW9kZSwgU3VzcGVuc2UsIF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELCBjbG9uZUVsZW1lbnQsIGNyZWF0ZUNvbnRleHQsIGNyZWF0ZUVsZW1lbnQsIGNyZWF0ZUZhY3RvcnksIGNyZWF0ZVJlZiwgZm9yd2FyZFJlZiwgaXNWYWxpZEVsZW1lbnQsIGxhenksIG1lbW8sIHN0YXJ0VHJhbnNpdGlvbiwgdW5zdGFibGVfYWN0LCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRGVidWdWYWx1ZSwgdXNlRGVmZXJyZWRWYWx1ZSwgdXNlRWZmZWN0LCB1c2VJZCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlSW5zZXJ0aW9uRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZHVjZXIsIHVzZVJlZiwgdXNlU3RhdGUsIHVzZVN5bmNFeHRlcm5hbFN0b3JlLCB1c2VUcmFuc2l0aW9uLCB2ZXJzaW9uLCB9O1xuIl0sIm5hbWVzIjpbInJlcXVpcmUkJDAiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdBO0NBQzJDO0FBQzNDLEdBQUUsQ0FBQyxXQUFXO0FBR2Q7QUFDQTtBQUNBLENBQUE7R0FDRSxPQUFPLDhCQUE4QixLQUFLLFdBQVc7R0FDckQsT0FBTyw4QkFBOEIsQ0FBQywyQkFBMkI7QUFDbkUsS0FBSSxVQUFVO0dBQ1o7R0FDQSw4QkFBOEIsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7RUFDekU7QUFDRCxXQUFVLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsSUFBSSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0NBQ3JELElBQUksaUJBQWlCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztDQUNuRCxJQUFJLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztDQUN2RCxJQUFJLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztDQUM3RCxJQUFJLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztDQUN2RCxJQUFJLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztDQUN2RCxJQUFJLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7Q0FDckQsSUFBSSxzQkFBc0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7Q0FDN0QsSUFBSSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Q0FDdkQsSUFBSSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7Q0FDakUsSUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztDQUMvQyxJQUFJLGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0NBQy9DLElBQUksb0JBQW9CLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pELENBQUEsSUFBSSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0NBQzVDLElBQUksb0JBQW9CLEdBQUcsWUFBWSxDQUFDO0NBQ3hDLFNBQVMsYUFBYSxDQUFDLGFBQWEsRUFBRTtHQUNwQyxJQUFJLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO0tBQy9ELE9BQU8sSUFBSSxDQUFDO0lBQ2I7QUFDSDtBQUNBLEdBQUUsSUFBSSxhQUFhLEdBQUcscUJBQXFCLElBQUksYUFBYSxDQUFDLHFCQUFxQixDQUFDLElBQUksYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDM0g7QUFDQSxHQUFFLElBQUksT0FBTyxhQUFhLEtBQUssVUFBVSxFQUFFO0tBQ3ZDLE9BQU8sYUFBYSxDQUFDO0lBQ3RCO0FBQ0g7R0FDRSxPQUFPLElBQUksQ0FBQztFQUNiO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFBLElBQUksc0JBQXNCLEdBQUc7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7R0FDRSxPQUFPLEVBQUUsSUFBSTtBQUNmLEVBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFBLElBQUksdUJBQXVCLEdBQUc7R0FDNUIsVUFBVSxFQUFFLElBQUk7QUFDbEIsRUFBQyxDQUFDO0FBQ0Y7QUFDQSxDQUFBLElBQUksb0JBQW9CLEdBQUc7R0FDekIsT0FBTyxFQUFFLElBQUk7QUFDZjtHQUNFLGdCQUFnQixFQUFFLEtBQUs7R0FDdkIsdUJBQXVCLEVBQUUsS0FBSztBQUNoQyxFQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsSUFBSSxpQkFBaUIsR0FBRztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtHQUNFLE9BQU8sRUFBRSxJQUFJO0FBQ2YsRUFBQyxDQUFDO0FBQ0Y7Q0FDQSxJQUFJLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztDQUNoQyxJQUFJLHNCQUFzQixHQUFHLElBQUksQ0FBQztDQUNsQyxTQUFTLGtCQUFrQixDQUFDLEtBQUssRUFBRTtHQUNqQztLQUNFLHNCQUFzQixHQUFHLEtBQUssQ0FBQztJQUNoQztFQUNGO0FBQ0Q7QUFDQSxDQUFBO0FBQ0EsR0FBRSxzQkFBc0IsQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLEtBQUssRUFBRTtLQUMzRDtPQUNFLHNCQUFzQixHQUFHLEtBQUssQ0FBQztNQUNoQztBQUNMLElBQUcsQ0FBQztBQUNKO0FBQ0E7QUFDQSxHQUFFLHNCQUFzQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDaEQ7QUFDQSxHQUFFLHNCQUFzQixDQUFDLGdCQUFnQixHQUFHLFlBQVk7QUFDeEQsS0FBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDbkI7S0FDSSxJQUFJLHNCQUFzQixFQUFFO09BQzFCLEtBQUssSUFBSSxzQkFBc0IsQ0FBQztNQUNqQztBQUNMO0FBQ0E7QUFDQSxLQUFJLElBQUksSUFBSSxHQUFHLHNCQUFzQixDQUFDLGVBQWUsQ0FBQztBQUN0RDtLQUNJLElBQUksSUFBSSxFQUFFO0FBQ2QsT0FBTSxLQUFLLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO01BQ3ZCO0FBQ0w7S0FDSSxPQUFPLEtBQUssQ0FBQztBQUNqQixJQUFHLENBQUM7RUFDSDtBQUNEO0FBQ0E7QUFDQTtDQUNBLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztDQUMzQixJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztDQUMvQixJQUFJLHVCQUF1QixHQUFHLEtBQUssQ0FBQztBQUNwQztDQUNBLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBQy9CO0FBQ0E7QUFDQTtDQUNBLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0FBQy9CO0FBQ0EsQ0FBQSxJQUFJLG9CQUFvQixHQUFHO0dBQ3pCLHNCQUFzQixFQUFFLHNCQUFzQjtHQUM5Qyx1QkFBdUIsRUFBRSx1QkFBdUI7R0FDaEQsaUJBQWlCLEVBQUUsaUJBQWlCO0FBQ3RDLEVBQUMsQ0FBQztBQUNGO0FBQ0EsQ0FBQTtBQUNBLEdBQUUsb0JBQW9CLENBQUMsc0JBQXNCLEdBQUcsc0JBQXNCLENBQUM7QUFDdkUsR0FBRSxvQkFBb0IsQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztFQUNsRTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUNBLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRTtHQUNwQjtLQUNFO0FBQ0osT0FBTSxLQUFLLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7U0FDMUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEM7QUFDUDtPQUNNLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO01BQ3BDO0lBQ0Y7RUFDRjtDQUNELFNBQVMsS0FBSyxDQUFDLE1BQU0sRUFBRTtHQUNyQjtLQUNFO0FBQ0osT0FBTSxLQUFLLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7U0FDakgsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEM7QUFDUDtPQUNNLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO01BQ3JDO0lBQ0Y7RUFDRjtBQUNEO0FBQ0EsQ0FBQSxTQUFTLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtBQUMzQztBQUNBO0dBQ0U7QUFDRixLQUFJLElBQUksc0JBQXNCLEdBQUcsb0JBQW9CLENBQUMsc0JBQXNCLENBQUM7QUFDN0UsS0FBSSxJQUFJLEtBQUssR0FBRyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0FBQzFEO0FBQ0EsS0FBSSxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUU7T0FDaEIsTUFBTSxJQUFJLElBQUksQ0FBQztPQUNmLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztNQUM3QjtBQUNMO0FBQ0E7S0FDSSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxFQUFFO0FBQ2xELE9BQU0sT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsTUFBSyxDQUFDLENBQUM7QUFDUDtLQUNJLGNBQWMsQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBLEtBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDeEU7RUFDRjtBQUNEO0NBQ0EsSUFBSSx1Q0FBdUMsR0FBRyxFQUFFLENBQUM7QUFDakQ7QUFDQSxDQUFBLFNBQVMsUUFBUSxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUU7R0FDNUM7QUFDRixLQUFJLElBQUksWUFBWSxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUM7QUFDbEQsS0FBSSxJQUFJLGFBQWEsR0FBRyxZQUFZLEtBQUssWUFBWSxDQUFDLFdBQVcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDO0tBQ3BHLElBQUksVUFBVSxHQUFHLGFBQWEsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDO0FBQ3REO0FBQ0EsS0FBSSxJQUFJLHVDQUF1QyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQzdELE9BQU0sT0FBTztNQUNSO0FBQ0w7QUFDQSxLQUFJLEtBQUssQ0FBQyx3REFBd0QsR0FBRyxvRUFBb0UsR0FBRyxxRUFBcUUsR0FBRyw0REFBNEQsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDN1M7QUFDQSxLQUFJLHVDQUF1QyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUM1RDtFQUNGO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsSUFBSSxvQkFBb0IsR0FBRztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUUsU0FBUyxFQUFFLFVBQVUsY0FBYyxFQUFFO0tBQ25DLE9BQU8sS0FBSyxDQUFDO0lBQ2Q7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtHQUNFLGtCQUFrQixFQUFFLFVBQVUsY0FBYyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFDdEUsS0FBSSxRQUFRLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pDO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtHQUNFLG1CQUFtQixFQUFFLFVBQVUsY0FBYyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO0FBQ3RGLEtBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMxQztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0dBQ0UsZUFBZSxFQUFFLFVBQVUsY0FBYyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO0FBQ2pGLEtBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0QztBQUNILEVBQUMsQ0FBQztBQUNGO0FBQ0EsQ0FBQSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQzNCO0NBQ0EsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQ3JCO0FBQ0EsQ0FBQTtBQUNBLEdBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztFQUM1QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFBLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQzVDLEdBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDckIsR0FBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUN6QjtBQUNBLEdBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7QUFDMUI7QUFDQTtBQUNBLEdBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksb0JBQW9CLENBQUM7RUFDaEQ7QUFDRDtBQUNBLENBQUEsU0FBUyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUNBLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVUsWUFBWSxFQUFFLFFBQVEsRUFBRTtBQUNqRSxHQUFFLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxJQUFJLE9BQU8sWUFBWSxLQUFLLFVBQVUsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO0tBQ2xHLE1BQU0sSUFBSSxLQUFLLENBQUMsbUVBQW1FLEdBQUcsc0RBQXNELENBQUMsQ0FBQztJQUMvSTtBQUNIO0FBQ0EsR0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN6RSxFQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxRQUFRLEVBQUU7QUFDdEQsR0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDakUsRUFBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFBO0dBQ0UsSUFBSSxjQUFjLEdBQUc7S0FDbkIsU0FBUyxFQUFFLENBQUMsV0FBVyxFQUFFLHVFQUF1RSxHQUFHLCtDQUErQyxDQUFDO0tBQ25KLFlBQVksRUFBRSxDQUFDLGNBQWMsRUFBRSxrREFBa0QsR0FBRyxpREFBaUQsQ0FBQztBQUMxSSxJQUFHLENBQUM7QUFDSjtBQUNBLEdBQUUsSUFBSSx3QkFBd0IsR0FBRyxVQUFVLFVBQVUsRUFBRSxJQUFJLEVBQUU7S0FDekQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRTtPQUNyRCxHQUFHLEVBQUUsWUFBWTtBQUN2QixTQUFRLElBQUksQ0FBQyw2REFBNkQsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUY7U0FDUSxPQUFPLFNBQVMsQ0FBQztRQUNsQjtBQUNQLE1BQUssQ0FBQyxDQUFDO0FBQ1AsSUFBRyxDQUFDO0FBQ0o7QUFDQSxHQUFFLEtBQUssSUFBSSxNQUFNLElBQUksY0FBYyxFQUFFO0FBQ3JDLEtBQUksSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFO09BQ3pDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztNQUMxRDtJQUNGO0VBQ0Y7QUFDRDtDQUNBLFNBQVMsY0FBYyxHQUFHLEVBQUU7QUFDNUI7QUFDQSxDQUFBLGNBQWMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUU7QUFDaEQsR0FBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNyQixHQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ3pCO0FBQ0EsR0FBRSxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztBQUMxQixHQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLG9CQUFvQixDQUFDO0VBQ2hEO0FBQ0Q7Q0FDQSxJQUFJLHNCQUFzQixHQUFHLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztBQUM1RSxDQUFBLHNCQUFzQixDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFDbkQ7QUFDQSxDQUFBLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDcEQsQ0FBQSxzQkFBc0IsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDbkQ7QUFDQTtBQUNBLENBQUEsU0FBUyxTQUFTLEdBQUc7R0FDbkIsSUFBSSxTQUFTLEdBQUc7S0FDZCxPQUFPLEVBQUUsSUFBSTtBQUNqQixJQUFHLENBQUM7QUFDSjtHQUNFO0FBQ0YsS0FBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hCO0FBQ0g7R0FDRSxPQUFPLFNBQVMsQ0FBQztFQUNsQjtBQUNEO0FBQ0EsQ0FBQSxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ2hDO0NBQ0EsU0FBUyxPQUFPLENBQUMsQ0FBQyxFQUFFO0FBQ3BCLEdBQUUsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDdkI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFO0dBQ3ZCO0FBQ0Y7S0FDSSxJQUFJLGNBQWMsR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUM1RSxLQUFJLElBQUksSUFBSSxHQUFHLGNBQWMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQztLQUM3RixPQUFPLElBQUksQ0FBQztJQUNiO0VBQ0Y7QUFDRDtBQUNBO0NBQ0EsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUU7R0FDaEM7QUFDRixLQUFJLElBQUk7QUFDUixPQUFNLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO09BQzFCLE9BQU8sS0FBSyxDQUFDO01BQ2QsQ0FBQyxPQUFPLENBQUMsRUFBRTtPQUNWLE9BQU8sSUFBSSxDQUFDO01BQ2I7SUFDRjtFQUNGO0FBQ0Q7Q0FDQSxTQUFTLGtCQUFrQixDQUFDLEtBQUssRUFBRTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7RUFDbkI7Q0FDRCxTQUFTLHNCQUFzQixDQUFDLEtBQUssRUFBRTtHQUNyQztBQUNGLEtBQUksSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtPQUM1QixLQUFLLENBQUMsNkNBQTZDLEdBQUcsc0VBQXNFLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcko7QUFDQSxPQUFNLE9BQU8sa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7TUFDbEM7SUFDRjtFQUNGO0FBQ0Q7QUFDQSxDQUFBLFNBQVMsY0FBYyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFO0FBQzNELEdBQUUsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQztBQUMxQztHQUNFLElBQUksV0FBVyxFQUFFO0tBQ2YsT0FBTyxXQUFXLENBQUM7SUFDcEI7QUFDSDtBQUNBLEdBQUUsSUFBSSxZQUFZLEdBQUcsU0FBUyxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUNuRSxHQUFFLE9BQU8sWUFBWSxLQUFLLEVBQUUsR0FBRyxXQUFXLEdBQUcsR0FBRyxHQUFHLFlBQVksR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDO0VBQ25GO0FBQ0Q7QUFDQTtDQUNBLFNBQVMsY0FBYyxDQUFDLElBQUksRUFBRTtBQUM5QixHQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUM7RUFDdEM7QUFDRDtBQUNBO0NBQ0EsU0FBUyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUU7QUFDeEMsR0FBRSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7QUFDcEI7S0FDSSxPQUFPLElBQUksQ0FBQztJQUNiO0FBQ0g7R0FDRTtBQUNGLEtBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO0FBQ3RDLE9BQU0sS0FBSyxDQUFDLCtEQUErRCxHQUFHLHNEQUFzRCxDQUFDLENBQUM7TUFDakk7SUFDRjtBQUNIO0FBQ0EsR0FBRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsRUFBRTtLQUM5QixPQUFPLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7SUFDOUM7QUFDSDtBQUNBLEdBQUUsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7S0FDNUIsT0FBTyxJQUFJLENBQUM7SUFDYjtBQUNIO0FBQ0EsR0FBRSxRQUFRLElBQUk7QUFDZCxLQUFJLEtBQUssbUJBQW1CO09BQ3RCLE9BQU8sVUFBVSxDQUFDO0FBQ3hCO0FBQ0EsS0FBSSxLQUFLLGlCQUFpQjtPQUNwQixPQUFPLFFBQVEsQ0FBQztBQUN0QjtBQUNBLEtBQUksS0FBSyxtQkFBbUI7T0FDdEIsT0FBTyxVQUFVLENBQUM7QUFDeEI7QUFDQSxLQUFJLEtBQUssc0JBQXNCO09BQ3pCLE9BQU8sWUFBWSxDQUFDO0FBQzFCO0FBQ0EsS0FBSSxLQUFLLG1CQUFtQjtPQUN0QixPQUFPLFVBQVUsQ0FBQztBQUN4QjtBQUNBLEtBQUksS0FBSyx3QkFBd0I7T0FDM0IsT0FBTyxjQUFjLENBQUM7QUFDNUI7SUFDRztBQUNIO0FBQ0EsR0FBRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtLQUM1QixRQUFRLElBQUksQ0FBQyxRQUFRO0FBQ3pCLE9BQU0sS0FBSyxrQkFBa0I7QUFDN0IsU0FBUSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFDM0IsU0FBUSxPQUFPLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDckQ7QUFDQSxPQUFNLEtBQUssbUJBQW1CO0FBQzlCLFNBQVEsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQ3BCLE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDL0Q7QUFDQSxPQUFNLEtBQUssc0JBQXNCO1NBQ3pCLE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQy9EO0FBQ0EsT0FBTSxLQUFLLGVBQWU7U0FDbEIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUM7QUFDakQ7QUFDQSxTQUFRLElBQUksU0FBUyxLQUFLLElBQUksRUFBRTtXQUN0QixPQUFPLFNBQVMsQ0FBQztVQUNsQjtBQUNUO1NBQ1EsT0FBTyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDO0FBQzdEO0FBQ0EsT0FBTSxLQUFLLGVBQWU7U0FDbEI7QUFDUixXQUFVLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztBQUNuQyxXQUFVLElBQUksT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7QUFDL0MsV0FBVSxJQUFJLElBQUksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO0FBQ3pDO0FBQ0EsV0FBVSxJQUFJO2FBQ0YsT0FBTyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNoRCxDQUFDLE9BQU8sQ0FBQyxFQUFFO2FBQ1YsT0FBTyxJQUFJLENBQUM7WUFDYjtVQUNGO0FBQ1Q7QUFDQTtNQUNLO0lBQ0Y7QUFDSDtHQUNFLE9BQU8sSUFBSSxDQUFDO0VBQ2I7QUFDRDtBQUNBLENBQUEsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7QUFDckQ7QUFDQSxDQUFBLElBQUksY0FBYyxHQUFHO0dBQ25CLEdBQUcsRUFBRSxJQUFJO0dBQ1QsR0FBRyxFQUFFLElBQUk7R0FDVCxNQUFNLEVBQUUsSUFBSTtHQUNaLFFBQVEsRUFBRSxJQUFJO0FBQ2hCLEVBQUMsQ0FBQztBQUNGLENBQUEsSUFBSSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFBRSxzQkFBc0IsQ0FBQztBQUNuRjtBQUNBLENBQUE7R0FDRSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7RUFDN0I7QUFDRDtDQUNBLFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBRTtHQUMzQjtLQUNFLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDNUMsT0FBTSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN0RTtBQUNBLE9BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRTtTQUNuQyxPQUFPLEtBQUssQ0FBQztRQUNkO01BQ0Y7SUFDRjtBQUNIO0FBQ0EsR0FBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDO0VBQ2pDO0FBQ0Q7Q0FDQSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUU7R0FDM0I7S0FDRSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQzVDLE9BQU0sSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDdEU7QUFDQSxPQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUU7U0FDbkMsT0FBTyxLQUFLLENBQUM7UUFDZDtNQUNGO0lBQ0Y7QUFDSDtBQUNBLEdBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQztFQUNqQztBQUNEO0FBQ0EsQ0FBQSxTQUFTLDBCQUEwQixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUU7R0FDdEQsSUFBSSxxQkFBcUIsR0FBRyxZQUFZO0tBQ3RDO09BQ0UsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1NBQy9CLDBCQUEwQixHQUFHLElBQUksQ0FBQztBQUMxQztBQUNBLFNBQVEsS0FBSyxDQUFDLDJEQUEyRCxHQUFHLGdFQUFnRSxHQUFHLHNFQUFzRSxHQUFHLGdEQUFnRCxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2hSO01BQ0Y7QUFDTCxJQUFHLENBQUM7QUFDSjtBQUNBLEdBQUUscUJBQXFCLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUM5QyxHQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtLQUNsQyxHQUFHLEVBQUUscUJBQXFCO0tBQzFCLFlBQVksRUFBRSxJQUFJO0FBQ3RCLElBQUcsQ0FBQyxDQUFDO0VBQ0o7QUFDRDtBQUNBLENBQUEsU0FBUywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFO0dBQ3RELElBQUkscUJBQXFCLEdBQUcsWUFBWTtLQUN0QztPQUNFLElBQUksQ0FBQywwQkFBMEIsRUFBRTtTQUMvQiwwQkFBMEIsR0FBRyxJQUFJLENBQUM7QUFDMUM7QUFDQSxTQUFRLEtBQUssQ0FBQywyREFBMkQsR0FBRyxnRUFBZ0UsR0FBRyxzRUFBc0UsR0FBRyxnREFBZ0QsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNoUjtNQUNGO0FBQ0wsSUFBRyxDQUFDO0FBQ0o7QUFDQSxHQUFFLHFCQUFxQixDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDOUMsR0FBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7S0FDbEMsR0FBRyxFQUFFLHFCQUFxQjtLQUMxQixZQUFZLEVBQUUsSUFBSTtBQUN0QixJQUFHLENBQUMsQ0FBQztFQUNKO0FBQ0Q7Q0FDQSxTQUFTLG9DQUFvQyxDQUFDLE1BQU0sRUFBRTtHQUNwRDtLQUNFLElBQUksT0FBTyxNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7T0FDekksSUFBSSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25GO0FBQ0EsT0FBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLEVBQUU7U0FDMUMsS0FBSyxDQUFDLCtDQUErQyxHQUFHLHFFQUFxRSxHQUFHLG9FQUFvRSxHQUFHLGlGQUFpRixHQUFHLDJDQUEyQyxHQUFHLGlEQUFpRCxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL1o7QUFDQSxTQUFRLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM5QztNQUNGO0lBQ0Y7RUFDRjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQSxJQUFJLFlBQVksR0FBRyxVQUFVLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtHQUN2RSxJQUFJLE9BQU8sR0FBRztBQUNoQjtLQUNJLFFBQVEsRUFBRSxrQkFBa0I7QUFDaEM7S0FDSSxJQUFJLEVBQUUsSUFBSTtLQUNWLEdBQUcsRUFBRSxHQUFHO0tBQ1IsR0FBRyxFQUFFLEdBQUc7S0FDUixLQUFLLEVBQUUsS0FBSztBQUNoQjtLQUNJLE1BQU0sRUFBRSxLQUFLO0FBQ2pCLElBQUcsQ0FBQztBQUNKO0dBQ0U7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7S0FDSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFO09BQ2pELFlBQVksRUFBRSxLQUFLO09BQ25CLFVBQVUsRUFBRSxLQUFLO09BQ2pCLFFBQVEsRUFBRSxJQUFJO09BQ2QsS0FBSyxFQUFFLEtBQUs7QUFDbEIsTUFBSyxDQUFDLENBQUM7QUFDUDtBQUNBLEtBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFO09BQ3RDLFlBQVksRUFBRSxLQUFLO09BQ25CLFVBQVUsRUFBRSxLQUFLO09BQ2pCLFFBQVEsRUFBRSxLQUFLO09BQ2YsS0FBSyxFQUFFLElBQUk7QUFDakIsTUFBSyxDQUFDLENBQUM7QUFDUDtBQUNBO0FBQ0EsS0FBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUU7T0FDeEMsWUFBWSxFQUFFLEtBQUs7T0FDbkIsVUFBVSxFQUFFLEtBQUs7T0FDakIsUUFBUSxFQUFFLEtBQUs7T0FDZixLQUFLLEVBQUUsTUFBTTtBQUNuQixNQUFLLENBQUMsQ0FBQztBQUNQO0FBQ0EsS0FBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7T0FDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsT0FBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO01BQ3hCO0lBQ0Y7QUFDSDtHQUNFLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLEVBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFBLFNBQVMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0dBQzdDLElBQUksUUFBUSxDQUFDO0FBQ2Y7QUFDQSxHQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNqQixHQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztBQUNqQixHQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztBQUNqQixHQUFFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztBQUNsQixHQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztBQUNwQjtBQUNBLEdBQUUsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3RCLEtBQUksSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDN0IsT0FBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUN2QjtPQUNNO0FBQ04sU0FBUSxvQ0FBb0MsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QztNQUNGO0FBQ0w7QUFDQSxLQUFJLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFO09BQ3ZCO0FBQ04sU0FBUSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEM7QUFDUDtBQUNBLE9BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO01BQ3ZCO0FBQ0w7QUFDQSxLQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUM5RCxLQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUNwRTtBQUNBLEtBQUksS0FBSyxRQUFRLElBQUksTUFBTSxFQUFFO0FBQzdCLE9BQU0sSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUU7U0FDckYsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQztNQUNGO0lBQ0Y7QUFDSDtBQUNBO0FBQ0E7R0FDRSxJQUFJLGNBQWMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUM1QztBQUNBLEdBQUUsSUFBSSxjQUFjLEtBQUssQ0FBQyxFQUFFO0FBQzVCLEtBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDOUIsSUFBRyxNQUFNLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtBQUNqQyxLQUFJLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUMzQztBQUNBLEtBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRTtPQUN2QyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUNsQztBQUNMO0tBQ0k7QUFDSixPQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUN6QixTQUFRLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0I7TUFDRjtBQUNMO0FBQ0EsS0FBSSxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QjtBQUNIO0FBQ0E7QUFDQSxHQUFFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7QUFDakMsS0FBSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO0FBQ3pDO0FBQ0EsS0FBSSxLQUFLLFFBQVEsSUFBSSxZQUFZLEVBQUU7QUFDbkMsT0FBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUU7U0FDakMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQztNQUNGO0lBQ0Y7QUFDSDtHQUNFO0FBQ0YsS0FBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7QUFDcEIsT0FBTSxJQUFJLFdBQVcsR0FBRyxPQUFPLElBQUksS0FBSyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDdkc7T0FDTSxJQUFJLEdBQUcsRUFBRTtBQUNmLFNBQVEsMEJBQTBCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2hEO0FBQ1A7T0FDTSxJQUFJLEdBQUcsRUFBRTtBQUNmLFNBQVEsMEJBQTBCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2hEO01BQ0Y7SUFDRjtBQUNIO0FBQ0EsR0FBRSxPQUFPLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztFQUNyRjtBQUNELENBQUEsU0FBUyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFO0FBQ2hELEdBQUUsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0dBQ2xKLE9BQU8sVUFBVSxDQUFDO0VBQ25CO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7R0FDL0MsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7S0FDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRkFBZ0YsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDbkg7QUFDSDtHQUNFLElBQUksUUFBUSxDQUFDO0FBQ2Y7R0FDRSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QztBQUNBLEdBQUUsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUN4QixHQUFFLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7QUFDeEI7QUFDQSxHQUFFLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQy9CO0FBQ0EsR0FBRSxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQzdCO0FBQ0EsR0FBRSxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7QUFDdEIsS0FBSSxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUM3QjtBQUNBLE9BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDdkIsT0FBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDO01BQ25DO0FBQ0w7QUFDQSxLQUFJLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFO09BQ3ZCO0FBQ04sU0FBUSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEM7QUFDUDtBQUNBLE9BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO01BQ3ZCO0FBQ0w7QUFDQTtLQUNJLElBQUksWUFBWSxDQUFDO0FBQ3JCO0tBQ0ksSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO0FBQ25ELE9BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO01BQzFDO0FBQ0w7QUFDQSxLQUFJLEtBQUssUUFBUSxJQUFJLE1BQU0sRUFBRTtBQUM3QixPQUFNLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1NBQ3JGLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO0FBQzFFO1dBQ1UsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuRCxVQUFTLE1BQU07V0FDTCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1VBQ3BDO1FBQ0Y7TUFDRjtJQUNGO0FBQ0g7QUFDQTtBQUNBO0dBQ0UsSUFBSSxjQUFjLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDNUM7QUFDQSxHQUFFLElBQUksY0FBYyxLQUFLLENBQUMsRUFBRTtBQUM1QixLQUFJLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQzlCLElBQUcsTUFBTSxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7QUFDakMsS0FBSSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDM0M7QUFDQSxLQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUU7T0FDdkMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7TUFDbEM7QUFDTDtBQUNBLEtBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDN0I7QUFDSDtBQUNBLEdBQUUsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0VBQ3pFO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUNBLFNBQVMsY0FBYyxDQUFDLE1BQU0sRUFBRTtBQUNoQyxHQUFFLE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxrQkFBa0IsQ0FBQztFQUNoRztBQUNEO0NBQ0EsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDO0NBQ3BCLElBQUksWUFBWSxHQUFHLEdBQUcsQ0FBQztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUNBLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRTtBQUNyQixHQUFFLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQztHQUMxQixJQUFJLGFBQWEsR0FBRztLQUNsQixHQUFHLEVBQUUsSUFBSTtLQUNULEdBQUcsRUFBRSxJQUFJO0FBQ2IsSUFBRyxDQUFDO0dBQ0YsSUFBSSxhQUFhLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsVUFBVSxLQUFLLEVBQUU7QUFDaEUsS0FBSSxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxJQUFHLENBQUMsQ0FBQztBQUNMLEdBQUUsT0FBTyxHQUFHLEdBQUcsYUFBYSxDQUFDO0VBQzVCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7Q0FDN0IsSUFBSSwwQkFBMEIsR0FBRyxNQUFNLENBQUM7QUFDeEM7Q0FDQSxTQUFTLHFCQUFxQixDQUFDLElBQUksRUFBRTtHQUNuQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7RUFDeEQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFBLFNBQVMsYUFBYSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUU7QUFDdkM7QUFDQTtBQUNBLEdBQUUsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRTtBQUM5RTtLQUNJO0FBQ0osT0FBTSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDckM7QUFDTDtLQUNJLE9BQU8sTUFBTSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakM7QUFDSDtBQUNBO0FBQ0EsR0FBRSxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDM0I7QUFDRDtDQUNBLFNBQVMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUU7QUFDM0UsR0FBRSxJQUFJLElBQUksR0FBRyxPQUFPLFFBQVEsQ0FBQztBQUM3QjtHQUNFLElBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO0FBQ2xEO0tBQ0ksUUFBUSxHQUFHLElBQUksQ0FBQztJQUNqQjtBQUNIO0FBQ0EsR0FBRSxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFDN0I7QUFDQSxHQUFFLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtLQUNyQixjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQzFCLElBQUcsTUFBTTtBQUNULEtBQUksUUFBUSxJQUFJO09BQ1YsS0FBSyxRQUFRLENBQUM7QUFDcEIsT0FBTSxLQUFLLFFBQVE7U0FDWCxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFNBQVEsTUFBTTtBQUNkO0FBQ0EsT0FBTSxLQUFLLFFBQVE7U0FDWCxRQUFRLFFBQVEsQ0FBQyxRQUFRO1dBQ3ZCLEtBQUssa0JBQWtCLENBQUM7QUFDbEMsV0FBVSxLQUFLLGlCQUFpQjthQUNwQixjQUFjLEdBQUcsSUFBSSxDQUFDO1VBQ3pCO0FBQ1Q7TUFDSztJQUNGO0FBQ0g7R0FDRSxJQUFJLGNBQWMsRUFBRTtBQUN0QixLQUFJLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUMxQixLQUFJLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN2QztBQUNBO0FBQ0EsS0FBSSxJQUFJLFFBQVEsR0FBRyxTQUFTLEtBQUssRUFBRSxHQUFHLFNBQVMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUN2RjtBQUNBLEtBQUksSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7QUFDOUIsT0FBTSxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDL0I7QUFDQSxPQUFNLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtTQUNwQixlQUFlLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3pEO0FBQ1A7QUFDQSxPQUFNLFlBQVksQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7U0FDakUsT0FBTyxDQUFDLENBQUM7QUFDakIsUUFBTyxDQUFDLENBQUM7QUFDVCxNQUFLLE1BQU0sSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO0FBQ3BDLE9BQU0sSUFBSSxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUU7U0FDL0I7QUFDUjtBQUNBO0FBQ0E7QUFDQSxXQUFVLElBQUksV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUM5RSxhQUFZLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QztVQUNGO0FBQ1Q7QUFDQSxTQUFRLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXO0FBQ3BEO0FBQ0EsU0FBUSxhQUFhO0FBQ3JCLFNBQVEsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLFdBQVcsQ0FBQyxHQUFHLENBQUM7QUFDdEU7QUFDQSxTQUFRLHFCQUFxQixDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBQ3JFO0FBQ1A7QUFDQSxPQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7TUFDekI7QUFDTDtLQUNJLE9BQU8sQ0FBQyxDQUFDO0lBQ1Y7QUFDSDtHQUNFLElBQUksS0FBSyxDQUFDO0dBQ1YsSUFBSSxRQUFRLENBQUM7QUFDZixHQUFFLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QjtBQUNBLEdBQUUsSUFBSSxjQUFjLEdBQUcsU0FBUyxLQUFLLEVBQUUsR0FBRyxTQUFTLEdBQUcsU0FBUyxHQUFHLFlBQVksQ0FBQztBQUMvRTtBQUNBLEdBQUUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDekIsS0FBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5QyxPQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7T0FDcEIsUUFBUSxHQUFHLGNBQWMsR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFELE9BQU0sWUFBWSxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7TUFDL0U7QUFDTCxJQUFHLE1BQU07QUFDVCxLQUFJLElBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3QztBQUNBLEtBQUksSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLEVBQUU7QUFDMUMsT0FBTSxJQUFJLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztBQUN0QztPQUNNO0FBQ047QUFDQSxTQUFRLElBQUksVUFBVSxLQUFLLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtXQUMzQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7QUFDakMsYUFBWSxJQUFJLENBQUMsMkNBQTJDLEdBQUcsOENBQThDLENBQUMsQ0FBQztZQUNwRztBQUNYO1dBQ1UsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1VBQ3pCO1FBQ0Y7QUFDUDtPQUNNLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztPQUNqRCxJQUFJLElBQUksQ0FBQztBQUNmLE9BQU0sSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCO09BQ00sT0FBTyxDQUFDLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUU7QUFDN0MsU0FBUSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUNuQixRQUFRLEdBQUcsY0FBYyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvRCxTQUFRLFlBQVksSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9FO0FBQ1AsTUFBSyxNQUFNLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUNsQztBQUNBLE9BQU0sSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzVDLE9BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsSUFBSSxjQUFjLEtBQUssaUJBQWlCLEdBQUcsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEtBQUssR0FBRyxnRUFBZ0UsR0FBRyxVQUFVLENBQUMsQ0FBQztNQUN0UjtJQUNGO0FBQ0g7R0FDRSxPQUFPLFlBQVksQ0FBQztFQUNyQjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFBLFNBQVMsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQzlDLEdBQUUsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO0tBQ3BCLE9BQU8sUUFBUSxDQUFDO0lBQ2pCO0FBQ0g7QUFDQSxHQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixHQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztBQUNoQixHQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxLQUFLLEVBQUU7QUFDMUQsS0FBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzlDLElBQUcsQ0FBQyxDQUFDO0dBQ0gsT0FBTyxNQUFNLENBQUM7RUFDZjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Q0FDQSxTQUFTLGFBQWEsQ0FBQyxRQUFRLEVBQUU7QUFDakMsR0FBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWixHQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsWUFBWTtLQUNoQyxDQUFDLEVBQUUsQ0FBQztBQUNSLElBQUcsQ0FBQyxDQUFDO0dBQ0gsT0FBTyxDQUFDLENBQUM7RUFDVjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQSxTQUFTLGVBQWUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRTtBQUNoRSxHQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsWUFBWTtLQUNoQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0VBQ3BCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUNBLFNBQVMsT0FBTyxDQUFDLFFBQVEsRUFBRTtBQUMzQixHQUFFLE9BQU8sV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLEtBQUssRUFBRTtLQUM1QyxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDVjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsU0FBUyxTQUFTLENBQUMsUUFBUSxFQUFFO0FBQzdCLEdBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUNqQyxLQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztJQUMxRjtBQUNIO0dBQ0UsT0FBTyxRQUFRLENBQUM7RUFDakI7QUFDRDtDQUNBLFNBQVMsYUFBYSxDQUFDLFlBQVksRUFBRTtBQUNyQztBQUNBO0dBQ0UsSUFBSSxPQUFPLEdBQUc7S0FDWixRQUFRLEVBQUUsa0JBQWtCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7S0FDSSxhQUFhLEVBQUUsWUFBWTtLQUMzQixjQUFjLEVBQUUsWUFBWTtBQUNoQztBQUNBO0tBQ0ksWUFBWSxFQUFFLENBQUM7QUFDbkI7S0FDSSxRQUFRLEVBQUUsSUFBSTtLQUNkLFFBQVEsRUFBRSxJQUFJO0FBQ2xCO0tBQ0ksYUFBYSxFQUFFLElBQUk7S0FDbkIsV0FBVyxFQUFFLElBQUk7QUFDckIsSUFBRyxDQUFDO0dBQ0YsT0FBTyxDQUFDLFFBQVEsR0FBRztLQUNqQixRQUFRLEVBQUUsbUJBQW1CO0tBQzdCLFFBQVEsRUFBRSxPQUFPO0FBQ3JCLElBQUcsQ0FBQztBQUNKLEdBQUUsSUFBSSx5Q0FBeUMsR0FBRyxLQUFLLENBQUM7QUFDeEQsR0FBRSxJQUFJLG1DQUFtQyxHQUFHLEtBQUssQ0FBQztBQUNsRCxHQUFFLElBQUksbUNBQW1DLEdBQUcsS0FBSyxDQUFDO0FBQ2xEO0dBQ0U7QUFDRjtBQUNBO0FBQ0E7S0FDSSxJQUFJLFFBQVEsR0FBRztPQUNiLFFBQVEsRUFBRSxrQkFBa0I7T0FDNUIsUUFBUSxFQUFFLE9BQU87QUFDdkIsTUFBSyxDQUFDO0FBQ047QUFDQSxLQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUU7QUFDdEMsT0FBTSxRQUFRLEVBQUU7U0FDUixHQUFHLEVBQUUsWUFBWTtXQUNmLElBQUksQ0FBQyxtQ0FBbUMsRUFBRTthQUN4QyxtQ0FBbUMsR0FBRyxJQUFJLENBQUM7QUFDdkQ7QUFDQSxhQUFZLEtBQUssQ0FBQyxnRkFBZ0YsR0FBRyw0RUFBNEUsQ0FBQyxDQUFDO1lBQ3hLO0FBQ1g7QUFDQSxXQUFVLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQztVQUN6QjtBQUNULFNBQVEsR0FBRyxFQUFFLFVBQVUsU0FBUyxFQUFFO0FBQ2xDLFdBQVUsT0FBTyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7VUFDOUI7UUFDRjtBQUNQLE9BQU0sYUFBYSxFQUFFO1NBQ2IsR0FBRyxFQUFFLFlBQVk7QUFDekIsV0FBVSxPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUM7VUFDOUI7QUFDVCxTQUFRLEdBQUcsRUFBRSxVQUFVLGFBQWEsRUFBRTtBQUN0QyxXQUFVLE9BQU8sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1VBQ3ZDO1FBQ0Y7QUFDUCxPQUFNLGNBQWMsRUFBRTtTQUNkLEdBQUcsRUFBRSxZQUFZO0FBQ3pCLFdBQVUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDO1VBQy9CO0FBQ1QsU0FBUSxHQUFHLEVBQUUsVUFBVSxjQUFjLEVBQUU7QUFDdkMsV0FBVSxPQUFPLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztVQUN6QztRQUNGO0FBQ1AsT0FBTSxZQUFZLEVBQUU7U0FDWixHQUFHLEVBQUUsWUFBWTtBQUN6QixXQUFVLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQztVQUM3QjtBQUNULFNBQVEsR0FBRyxFQUFFLFVBQVUsWUFBWSxFQUFFO0FBQ3JDLFdBQVUsT0FBTyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7VUFDckM7UUFDRjtBQUNQLE9BQU0sUUFBUSxFQUFFO1NBQ1IsR0FBRyxFQUFFLFlBQVk7V0FDZixJQUFJLENBQUMseUNBQXlDLEVBQUU7YUFDOUMseUNBQXlDLEdBQUcsSUFBSSxDQUFDO0FBQzdEO0FBQ0EsYUFBWSxLQUFLLENBQUMsZ0ZBQWdGLEdBQUcsNEVBQTRFLENBQUMsQ0FBQztZQUN4SztBQUNYO0FBQ0EsV0FBVSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7VUFDekI7UUFDRjtBQUNQLE9BQU0sV0FBVyxFQUFFO1NBQ1gsR0FBRyxFQUFFLFlBQVk7QUFDekIsV0FBVSxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUM7VUFDNUI7QUFDVCxTQUFRLEdBQUcsRUFBRSxVQUFVLFdBQVcsRUFBRTtXQUMxQixJQUFJLENBQUMsbUNBQW1DLEVBQUU7YUFDeEMsSUFBSSxDQUFDLDJEQUEyRCxHQUFHLDRFQUE0RSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzFLO2FBQ1ksbUNBQW1DLEdBQUcsSUFBSSxDQUFDO1lBQzVDO1VBQ0Y7UUFDRjtBQUNQLE1BQUssQ0FBQyxDQUFDO0FBQ1A7QUFDQSxLQUFJLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzdCO0FBQ0g7R0FDRTtBQUNGLEtBQUksT0FBTyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUNwQyxLQUFJLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDbEM7QUFDSDtHQUNFLE9BQU8sT0FBTyxDQUFDO0VBQ2hCO0FBQ0Q7QUFDQSxDQUFBLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3ZCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztDQUNoQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7Q0FDakIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCO0NBQ0EsU0FBUyxlQUFlLENBQUMsT0FBTyxFQUFFO0FBQ2xDLEdBQUUsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLGFBQWEsRUFBRTtBQUN6QyxLQUFJLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDL0IsS0FBSSxJQUFJLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsWUFBWSxFQUFFO0FBQzFDLE9BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLGFBQWEsRUFBRTtBQUM1RTtBQUNBLFNBQVEsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDO0FBQy9CLFNBQVEsUUFBUSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFDcEMsU0FBUSxRQUFRLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQztRQUNqQztNQUNGLEVBQUUsVUFBVSxLQUFLLEVBQUU7QUFDeEIsT0FBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssYUFBYSxFQUFFO0FBQzVFO0FBQ0EsU0FBUSxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUM7QUFDL0IsU0FBUSxRQUFRLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUNwQyxTQUFRLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQzFCO0FBQ1AsTUFBSyxDQUFDLENBQUM7QUFDUDtBQUNBLEtBQUksSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLGFBQWEsRUFBRTtBQUMzQztBQUNBO0FBQ0EsT0FBTSxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDNUIsT0FBTSxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUNoQyxPQUFNLE9BQU8sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO01BQzVCO0lBQ0Y7QUFDSDtBQUNBLEdBQUUsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRTtBQUNwQyxLQUFJLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDdkM7S0FDSTtBQUNKLE9BQU0sSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO0FBQ3RDLFNBQVEsS0FBSyxDQUFDLDRDQUE0QyxHQUFHLGNBQWMsR0FBRywwREFBMEQ7U0FDaEksb0NBQW9DLEdBQUcsMkJBQTJCLEdBQUcsMERBQTBELEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDaEo7TUFDRjtBQUNMO0tBQ0k7QUFDSixPQUFNLElBQUksRUFBRSxTQUFTLElBQUksWUFBWSxDQUFDLEVBQUU7QUFDeEMsU0FBUSxLQUFLLENBQUMsNENBQTRDLEdBQUcsY0FBYyxHQUFHLDBEQUEwRDtBQUN4SSxTQUFRLG9DQUFvQyxHQUFHLHVCQUF1QixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9FO01BQ0Y7QUFDTDtBQUNBLEtBQUksT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDO0FBQ2hDLElBQUcsTUFBTTtBQUNULEtBQUksTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ3ZCO0VBQ0Y7QUFDRDtDQUNBLFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRTtHQUNsQixJQUFJLE9BQU8sR0FBRztBQUNoQjtLQUNJLE9BQU8sRUFBRSxhQUFhO0tBQ3RCLE9BQU8sRUFBRSxJQUFJO0FBQ2pCLElBQUcsQ0FBQztHQUNGLElBQUksUUFBUSxHQUFHO0tBQ2IsUUFBUSxFQUFFLGVBQWU7S0FDekIsUUFBUSxFQUFFLE9BQU87S0FDakIsS0FBSyxFQUFFLGVBQWU7QUFDMUIsSUFBRyxDQUFDO0FBQ0o7R0FDRTtBQUNGO0tBQ0ksSUFBSSxZQUFZLENBQUM7S0FDakIsSUFBSSxTQUFTLENBQUM7QUFDbEI7QUFDQSxLQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUU7QUFDdEMsT0FBTSxZQUFZLEVBQUU7U0FDWixZQUFZLEVBQUUsSUFBSTtTQUNsQixHQUFHLEVBQUUsWUFBWTtXQUNmLE9BQU8sWUFBWSxDQUFDO1VBQ3JCO0FBQ1QsU0FBUSxHQUFHLEVBQUUsVUFBVSxlQUFlLEVBQUU7V0FDOUIsS0FBSyxDQUFDLG1FQUFtRSxHQUFHLG1FQUFtRSxHQUFHLHVEQUF1RCxDQUFDLENBQUM7QUFDck47V0FDVSxZQUFZLEdBQUcsZUFBZSxDQUFDO0FBQ3pDO0FBQ0E7QUFDQSxXQUFVLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRTthQUM5QyxVQUFVLEVBQUUsSUFBSTtBQUM1QixZQUFXLENBQUMsQ0FBQztVQUNKO1FBQ0Y7QUFDUCxPQUFNLFNBQVMsRUFBRTtTQUNULFlBQVksRUFBRSxJQUFJO1NBQ2xCLEdBQUcsRUFBRSxZQUFZO1dBQ2YsT0FBTyxTQUFTLENBQUM7VUFDbEI7QUFDVCxTQUFRLEdBQUcsRUFBRSxVQUFVLFlBQVksRUFBRTtXQUMzQixLQUFLLENBQUMsZ0VBQWdFLEdBQUcsbUVBQW1FLEdBQUcsdURBQXVELENBQUMsQ0FBQztBQUNsTjtXQUNVLFNBQVMsR0FBRyxZQUFZLENBQUM7QUFDbkM7QUFDQTtBQUNBLFdBQVUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFO2FBQzNDLFVBQVUsRUFBRSxJQUFJO0FBQzVCLFlBQVcsQ0FBQyxDQUFDO1VBQ0o7UUFDRjtBQUNQLE1BQUssQ0FBQyxDQUFDO0lBQ0o7QUFDSDtHQUNFLE9BQU8sUUFBUSxDQUFDO0VBQ2pCO0FBQ0Q7Q0FDQSxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUU7R0FDMUI7S0FDRSxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxlQUFlLEVBQUU7T0FDekQsS0FBSyxDQUFDLDhEQUE4RCxHQUFHLG1EQUFtRCxHQUFHLHdCQUF3QixDQUFDLENBQUM7QUFDN0osTUFBSyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFO0FBQzdDLE9BQU0sS0FBSyxDQUFDLHlEQUF5RCxFQUFFLE1BQU0sS0FBSyxJQUFJLEdBQUcsTUFBTSxHQUFHLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDakgsTUFBSyxNQUFNO0FBQ1gsT0FBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ3RELFNBQVEsS0FBSyxDQUFDLDhFQUE4RSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLDBDQUEwQyxHQUFHLDZDQUE2QyxDQUFDLENBQUM7UUFDek07TUFDRjtBQUNMO0FBQ0EsS0FBSSxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7QUFDeEIsT0FBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFO0FBQ25FLFNBQVEsS0FBSyxDQUFDLHdFQUF3RSxHQUFHLDhDQUE4QyxDQUFDLENBQUM7UUFDbEk7TUFDRjtJQUNGO0FBQ0g7R0FDRSxJQUFJLFdBQVcsR0FBRztLQUNoQixRQUFRLEVBQUUsc0JBQXNCO0tBQ2hDLE1BQU0sRUFBRSxNQUFNO0FBQ2xCLElBQUcsQ0FBQztBQUNKO0dBQ0U7S0FDRSxJQUFJLE9BQU8sQ0FBQztBQUNoQixLQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRTtPQUNoRCxVQUFVLEVBQUUsS0FBSztPQUNqQixZQUFZLEVBQUUsSUFBSTtPQUNsQixHQUFHLEVBQUUsWUFBWTtTQUNmLE9BQU8sT0FBTyxDQUFDO1FBQ2hCO0FBQ1AsT0FBTSxHQUFHLEVBQUUsVUFBVSxJQUFJLEVBQUU7U0FDbkIsT0FBTyxHQUFHLElBQUksQ0FBQztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtTQUNRLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtBQUNqRCxXQUFVLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1VBQzNCO1FBQ0Y7QUFDUCxNQUFLLENBQUMsQ0FBQztJQUNKO0FBQ0g7R0FDRSxPQUFPLFdBQVcsQ0FBQztFQUNwQjtBQUNEO0FBQ0EsQ0FBQSxJQUFJLHNCQUFzQixDQUFDO0FBQzNCO0FBQ0EsQ0FBQTtHQUNFLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztFQUMvRDtBQUNEO0NBQ0EsU0FBUyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUU7R0FDaEMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFO0tBQzFELE9BQU8sSUFBSSxDQUFDO0lBQ2I7QUFDSDtBQUNBO0FBQ0EsR0FBRSxJQUFJLElBQUksS0FBSyxtQkFBbUIsSUFBSSxJQUFJLEtBQUssbUJBQW1CLElBQUksa0JBQWtCLEtBQUssSUFBSSxLQUFLLHNCQUFzQixJQUFJLElBQUksS0FBSyxtQkFBbUIsSUFBSSxJQUFJLEtBQUssd0JBQXdCLElBQUksa0JBQWtCLEtBQUssSUFBSSxLQUFLLG9CQUFvQixJQUFJLGNBQWMsS0FBSyxrQkFBa0IsS0FBSyx1QkFBdUIsR0FBRztLQUM3VCxPQUFPLElBQUksQ0FBQztJQUNiO0FBQ0g7R0FDRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO0FBQ2pELEtBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGVBQWUsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGVBQWUsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLG1CQUFtQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssa0JBQWtCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxzQkFBc0I7QUFDM007QUFDQTtBQUNBO0tBQ0ksSUFBSSxDQUFDLFFBQVEsS0FBSyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtPQUMxRSxPQUFPLElBQUksQ0FBQztNQUNiO0lBQ0Y7QUFDSDtHQUNFLE9BQU8sS0FBSyxDQUFDO0VBQ2Q7QUFDRDtBQUNBLENBQUEsU0FBUyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtHQUMzQjtBQUNGLEtBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ25DLE9BQU0sS0FBSyxDQUFDLHdEQUF3RCxHQUFHLGNBQWMsRUFBRSxJQUFJLEtBQUssSUFBSSxHQUFHLE1BQU0sR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDO01BQ3hIO0lBQ0Y7QUFDSDtHQUNFLElBQUksV0FBVyxHQUFHO0tBQ2hCLFFBQVEsRUFBRSxlQUFlO0tBQ3pCLElBQUksRUFBRSxJQUFJO0tBQ1YsT0FBTyxFQUFFLE9BQU8sS0FBSyxTQUFTLEdBQUcsSUFBSSxHQUFHLE9BQU87QUFDbkQsSUFBRyxDQUFDO0FBQ0o7R0FDRTtLQUNFLElBQUksT0FBTyxDQUFDO0FBQ2hCLEtBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFO09BQ2hELFVBQVUsRUFBRSxLQUFLO09BQ2pCLFlBQVksRUFBRSxJQUFJO09BQ2xCLEdBQUcsRUFBRSxZQUFZO1NBQ2YsT0FBTyxPQUFPLENBQUM7UUFDaEI7QUFDUCxPQUFNLEdBQUcsRUFBRSxVQUFVLElBQUksRUFBRTtTQUNuQixPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO1NBQ1EsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQzdDLFdBQVUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7VUFDekI7UUFDRjtBQUNQLE1BQUssQ0FBQyxDQUFDO0lBQ0o7QUFDSDtHQUNFLE9BQU8sV0FBVyxDQUFDO0VBQ3BCO0FBQ0Q7QUFDQSxDQUFBLFNBQVMsaUJBQWlCLEdBQUc7QUFDN0IsR0FBRSxJQUFJLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUM7QUFDbEQ7R0FDRTtBQUNGLEtBQUksSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO0FBQzdCLE9BQU0sS0FBSyxDQUFDLCtHQUErRyxHQUFHLGtDQUFrQyxHQUFHLHdGQUF3RixHQUFHLCtDQUErQyxHQUFHLGlFQUFpRSxHQUFHLGtHQUFrRyxDQUFDLENBQUM7TUFDbmQ7SUFDRjtBQUNIO0FBQ0E7QUFDQTtBQUNBO0dBQ0UsT0FBTyxVQUFVLENBQUM7RUFDbkI7Q0FDRCxTQUFTLFVBQVUsQ0FBQyxPQUFPLEVBQUU7QUFDN0IsR0FBRSxJQUFJLFVBQVUsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0FBQ3ZDO0dBQ0U7QUFDRjtBQUNBLEtBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUN4QyxPQUFNLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDekM7QUFDQTtBQUNBLE9BQU0sSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRTtBQUM1QyxTQUFRLEtBQUssQ0FBQyxxRkFBcUYsR0FBRyxzRkFBc0YsQ0FBQyxDQUFDO0FBQzlMLFFBQU8sTUFBTSxJQUFJLFdBQVcsQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO0FBQ25ELFNBQVEsS0FBSyxDQUFDLHlEQUF5RCxHQUFHLG1EQUFtRCxDQUFDLENBQUM7UUFDeEg7TUFDRjtJQUNGO0FBQ0g7QUFDQSxHQUFFLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztFQUN2QztDQUNELFNBQVMsUUFBUSxDQUFDLFlBQVksRUFBRTtBQUNoQyxHQUFFLElBQUksVUFBVSxHQUFHLGlCQUFpQixFQUFFLENBQUM7QUFDdkMsR0FBRSxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7RUFDMUM7QUFDRCxDQUFBLFNBQVMsVUFBVSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO0FBQy9DLEdBQUUsSUFBSSxVQUFVLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztHQUNyQyxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUN6RDtDQUNELFNBQVMsTUFBTSxDQUFDLFlBQVksRUFBRTtBQUM5QixHQUFFLElBQUksVUFBVSxHQUFHLGlCQUFpQixFQUFFLENBQUM7QUFDdkMsR0FBRSxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7RUFDeEM7QUFDRCxDQUFBLFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDakMsR0FBRSxJQUFJLFVBQVUsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0dBQ3JDLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDM0M7QUFDRCxDQUFBLFNBQVMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtBQUMxQyxHQUFFLElBQUksVUFBVSxHQUFHLGlCQUFpQixFQUFFLENBQUM7R0FDckMsT0FBTyxVQUFVLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQ3BEO0FBQ0QsQ0FBQSxTQUFTLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFO0FBQ3ZDLEdBQUUsSUFBSSxVQUFVLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztHQUNyQyxPQUFPLFVBQVUsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQ2pEO0FBQ0QsQ0FBQSxTQUFTLFdBQVcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFO0FBQ3JDLEdBQUUsSUFBSSxVQUFVLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztHQUNyQyxPQUFPLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQy9DO0FBQ0QsQ0FBQSxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFO0FBQy9CLEdBQUUsSUFBSSxVQUFVLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztHQUNyQyxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQ3pDO0FBQ0QsQ0FBQSxTQUFTLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO0FBQ2hELEdBQUUsSUFBSSxVQUFVLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztHQUNyQyxPQUFPLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQzFEO0FBQ0QsQ0FBQSxTQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFO0dBQ3pDO0FBQ0YsS0FBSSxJQUFJLFVBQVUsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0tBQ3JDLE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckQ7RUFDRjtBQUNELENBQUEsU0FBUyxhQUFhLEdBQUc7QUFDekIsR0FBRSxJQUFJLFVBQVUsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0FBQ3ZDLEdBQUUsT0FBTyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7RUFDbkM7Q0FDRCxTQUFTLGdCQUFnQixDQUFDLEtBQUssRUFBRTtBQUNqQyxHQUFFLElBQUksVUFBVSxHQUFHLGlCQUFpQixFQUFFLENBQUM7QUFDdkMsR0FBRSxPQUFPLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztFQUMzQztBQUNELENBQUEsU0FBUyxLQUFLLEdBQUc7QUFDakIsR0FBRSxJQUFJLFVBQVUsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0FBQ3ZDLEdBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7RUFDM0I7QUFDRCxDQUFBLFNBQVMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRTtBQUN6RSxHQUFFLElBQUksVUFBVSxHQUFHLGlCQUFpQixFQUFFLENBQUM7R0FDckMsT0FBTyxVQUFVLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0VBQ25GO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtDQUNBLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztBQUN0QixDQUFBLElBQUksT0FBTyxDQUFDO0FBQ1osQ0FBQSxJQUFJLFFBQVEsQ0FBQztBQUNiLENBQUEsSUFBSSxRQUFRLENBQUM7QUFDYixDQUFBLElBQUksU0FBUyxDQUFDO0FBQ2QsQ0FBQSxJQUFJLFNBQVMsQ0FBQztBQUNkLENBQUEsSUFBSSxrQkFBa0IsQ0FBQztBQUN2QixDQUFBLElBQUksWUFBWSxDQUFDO0FBQ2pCO0NBQ0EsU0FBUyxXQUFXLEdBQUcsRUFBRTtBQUN6QjtBQUNBLENBQUEsV0FBVyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUN0QyxDQUFBLFNBQVMsV0FBVyxHQUFHO0dBQ3JCO0FBQ0YsS0FBSSxJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUU7QUFDN0I7QUFDQSxPQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQzVCLE9BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDOUIsT0FBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztBQUM5QixPQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ2hDLE9BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDaEMsT0FBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQ2xELE9BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDdEM7T0FDTSxJQUFJLEtBQUssR0FBRztTQUNWLFlBQVksRUFBRSxJQUFJO1NBQ2xCLFVBQVUsRUFBRSxJQUFJO1NBQ2hCLEtBQUssRUFBRSxXQUFXO1NBQ2xCLFFBQVEsRUFBRSxJQUFJO0FBQ3RCLFFBQU8sQ0FBQztBQUNSO0FBQ0EsT0FBTSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO1NBQy9CLElBQUksRUFBRSxLQUFLO1NBQ1gsR0FBRyxFQUFFLEtBQUs7U0FDVixJQUFJLEVBQUUsS0FBSztTQUNYLEtBQUssRUFBRSxLQUFLO1NBQ1osS0FBSyxFQUFFLEtBQUs7U0FDWixjQUFjLEVBQUUsS0FBSztTQUNyQixRQUFRLEVBQUUsS0FBSztBQUN2QixRQUFPLENBQUMsQ0FBQztBQUNUO01BQ0s7QUFDTDtLQUNJLGFBQWEsRUFBRSxDQUFDO0lBQ2pCO0VBQ0Y7QUFDRCxDQUFBLFNBQVMsWUFBWSxHQUFHO0dBQ3RCO0tBQ0UsYUFBYSxFQUFFLENBQUM7QUFDcEI7QUFDQSxLQUFJLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRTtBQUM3QjtPQUNNLElBQUksS0FBSyxHQUFHO1NBQ1YsWUFBWSxFQUFFLElBQUk7U0FDbEIsVUFBVSxFQUFFLElBQUk7U0FDaEIsUUFBUSxFQUFFLElBQUk7QUFDdEIsUUFBTyxDQUFDO0FBQ1I7QUFDQSxPQUFNLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7QUFDdkMsU0FBUSxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUU7V0FDckIsS0FBSyxFQUFFLE9BQU87QUFDeEIsVUFBUyxDQUFDO0FBQ1YsU0FBUSxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUU7V0FDdEIsS0FBSyxFQUFFLFFBQVE7QUFDekIsVUFBUyxDQUFDO0FBQ1YsU0FBUSxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUU7V0FDdEIsS0FBSyxFQUFFLFFBQVE7QUFDekIsVUFBUyxDQUFDO0FBQ1YsU0FBUSxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUU7V0FDdkIsS0FBSyxFQUFFLFNBQVM7QUFDMUIsVUFBUyxDQUFDO0FBQ1YsU0FBUSxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUU7V0FDdkIsS0FBSyxFQUFFLFNBQVM7QUFDMUIsVUFBUyxDQUFDO0FBQ1YsU0FBUSxjQUFjLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUU7V0FDaEMsS0FBSyxFQUFFLGtCQUFrQjtBQUNuQyxVQUFTLENBQUM7QUFDVixTQUFRLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRTtXQUMxQixLQUFLLEVBQUUsWUFBWTtBQUM3QixVQUFTLENBQUM7QUFDVixRQUFPLENBQUMsQ0FBQztBQUNUO01BQ0s7QUFDTDtBQUNBLEtBQUksSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFO0FBQzNCLE9BQU0sS0FBSyxDQUFDLGlDQUFpQyxHQUFHLCtDQUErQyxDQUFDLENBQUM7TUFDNUY7SUFDRjtFQUNGO0FBQ0Q7QUFDQSxDQUFBLElBQUksd0JBQXdCLEdBQUcsb0JBQW9CLENBQUMsc0JBQXNCLENBQUM7QUFDM0UsQ0FBQSxJQUFJLE1BQU0sQ0FBQztBQUNYLENBQUEsU0FBUyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtHQUM1RDtBQUNGLEtBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO0FBQzlCO0FBQ0EsT0FBTSxJQUFJO1NBQ0YsTUFBTSxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDbEIsU0FBUSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNqRCxNQUFNLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEM7TUFDRjtBQUNMO0FBQ0E7QUFDQSxLQUFJLE9BQU8sSUFBSSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDN0I7RUFDRjtDQUNELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztBQUNwQixDQUFBLElBQUksbUJBQW1CLENBQUM7QUFDeEI7QUFDQSxDQUFBO0dBQ0UsSUFBSSxlQUFlLEdBQUcsT0FBTyxPQUFPLEtBQUssVUFBVSxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFDdEUsR0FBRSxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0VBQzdDO0FBQ0Q7QUFDQSxDQUFBLFNBQVMsNEJBQTRCLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRTtBQUNyRDtBQUNBLEdBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxPQUFPLEVBQUU7S0FDbkIsT0FBTyxFQUFFLENBQUM7SUFDWDtBQUNIO0dBQ0U7S0FDRSxJQUFJLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUM7QUFDQSxLQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtPQUN2QixPQUFPLEtBQUssQ0FBQztNQUNkO0lBQ0Y7QUFDSDtHQUNFLElBQUksT0FBTyxDQUFDO0dBQ1osT0FBTyxHQUFHLElBQUksQ0FBQztBQUNqQixHQUFFLElBQUkseUJBQXlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDO0FBQzFEO0FBQ0EsR0FBRSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO0dBQ3BDLElBQUksa0JBQWtCLENBQUM7QUFDekI7R0FDRTtBQUNGLEtBQUksa0JBQWtCLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxDQUFDO0FBQzFEO0FBQ0E7QUFDQSxLQUFJLHdCQUF3QixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7S0FDeEMsV0FBVyxFQUFFLENBQUM7SUFDZjtBQUNIO0FBQ0EsR0FBRSxJQUFJO0FBQ047S0FDSSxJQUFJLFNBQVMsRUFBRTtBQUNuQjtPQUNNLElBQUksSUFBSSxHQUFHLFlBQVk7U0FDckIsTUFBTSxLQUFLLEVBQUUsQ0FBQztBQUN0QixRQUFPLENBQUM7QUFDUjtBQUNBO09BQ00sTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRTtTQUM3QyxHQUFHLEVBQUUsWUFBWTtBQUN6QjtBQUNBO1dBQ1UsTUFBTSxLQUFLLEVBQUUsQ0FBQztVQUNmO0FBQ1QsUUFBTyxDQUFDLENBQUM7QUFDVDtPQUNNLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7QUFDNUQ7QUFDQTtBQUNBLFNBQVEsSUFBSTtXQUNGLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1VBQzdCLENBQUMsT0FBTyxDQUFDLEVBQUU7V0FDVixPQUFPLEdBQUcsQ0FBQyxDQUFDO1VBQ2I7QUFDVDtTQUNRLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4QyxRQUFPLE1BQU07QUFDYixTQUFRLElBQUk7QUFDWixXQUFVLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztVQUNiLENBQUMsT0FBTyxDQUFDLEVBQUU7V0FDVixPQUFPLEdBQUcsQ0FBQyxDQUFDO1VBQ2I7QUFDVDtTQUNRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCO0FBQ1AsTUFBSyxNQUFNO0FBQ1gsT0FBTSxJQUFJO1NBQ0YsTUFBTSxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUMsT0FBTyxDQUFDLEVBQUU7U0FDVixPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2I7QUFDUDtPQUNNLEVBQUUsRUFBRSxDQUFDO01BQ047SUFDRixDQUFDLE9BQU8sTUFBTSxFQUFFO0FBQ25CO0tBQ0ksSUFBSSxNQUFNLElBQUksT0FBTyxJQUFJLE9BQU8sTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7QUFDL0Q7QUFDQTtPQUNNLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO09BQzNDLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO09BQzdDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO09BQy9CLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDO0FBQ0EsT0FBTSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtTQUNRLENBQUMsRUFBRSxDQUFDO1FBQ0w7QUFDUDtBQUNBLE9BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekM7QUFDQTtTQUNRLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO1dBQ1UsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDbEMsYUFBWSxHQUFHO2VBQ0QsQ0FBQyxFQUFFLENBQUM7ZUFDSixDQUFDLEVBQUUsQ0FBQztBQUNsQjtBQUNBO0FBQ0EsZUFBYyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMvRDtBQUNBLGlCQUFnQixJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7aUJBQ2dCLElBQUksRUFBRSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0FBQ3RFLG1CQUFrQixNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2tCQUN4RDtBQUNqQjtpQkFDZ0I7QUFDaEIsbUJBQWtCLElBQUksT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFO3FCQUM1QixtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNyQztrQkFDRjtBQUNqQjtBQUNBO2lCQUNnQixPQUFPLE1BQU0sQ0FBQztnQkFDZjtjQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCO0FBQ1g7QUFDQSxXQUFVLE1BQU07VUFDUDtRQUNGO01BQ0Y7QUFDTCxJQUFHLFNBQVM7S0FDUixPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ3BCO0tBQ0k7QUFDSixPQUFNLHdCQUF3QixDQUFDLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQztPQUN0RCxZQUFZLEVBQUUsQ0FBQztNQUNoQjtBQUNMO0FBQ0EsS0FBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcseUJBQXlCLENBQUM7SUFDckQ7QUFDSDtBQUNBO0FBQ0EsR0FBRSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztHQUMvQyxJQUFJLGNBQWMsR0FBRyxJQUFJLEdBQUcsNkJBQTZCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3ZFO0dBQ0U7QUFDRixLQUFJLElBQUksT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFO09BQzVCLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7TUFDN0M7SUFDRjtBQUNIO0dBQ0UsT0FBTyxjQUFjLENBQUM7RUFDdkI7QUFDRCxDQUFBLFNBQVMsOEJBQThCLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7R0FDM0Q7QUFDRixLQUFJLE9BQU8sNEJBQTRCLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hEO0VBQ0Y7QUFDRDtDQUNBLFNBQVMsZUFBZSxDQUFDLFNBQVMsRUFBRTtBQUNwQyxHQUFFLElBQUksU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7R0FDcEMsT0FBTyxDQUFDLEVBQUUsU0FBUyxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0VBQ3BEO0FBQ0Q7QUFDQSxDQUFBLFNBQVMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7QUFDckU7QUFDQSxHQUFFLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtLQUNoQixPQUFPLEVBQUUsQ0FBQztJQUNYO0FBQ0g7QUFDQSxHQUFFLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFO0tBQzlCO09BQ0UsT0FBTyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7TUFDbEU7SUFDRjtBQUNIO0FBQ0EsR0FBRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUNoQyxLQUFJLE9BQU8sNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUM7QUFDSDtBQUNBLEdBQUUsUUFBUSxJQUFJO0FBQ2QsS0FBSSxLQUFLLG1CQUFtQjtBQUM1QixPQUFNLE9BQU8sNkJBQTZCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdkQ7QUFDQSxLQUFJLEtBQUssd0JBQXdCO0FBQ2pDLE9BQU0sT0FBTyw2QkFBNkIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN4RDtBQUNIO0FBQ0EsR0FBRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtLQUM1QixRQUFRLElBQUksQ0FBQyxRQUFRO0FBQ3pCLE9BQU0sS0FBSyxzQkFBc0I7QUFDakMsU0FBUSxPQUFPLDhCQUE4QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzRDtBQUNBLE9BQU0sS0FBSyxlQUFlO0FBQzFCO1NBQ1EsT0FBTyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRjtBQUNBLE9BQU0sS0FBSyxlQUFlO1NBQ2xCO0FBQ1IsV0FBVSxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDbkMsV0FBVSxJQUFJLE9BQU8sR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO0FBQy9DLFdBQVUsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQztBQUN6QztBQUNBLFdBQVUsSUFBSTtBQUNkO0FBQ0EsYUFBWSxPQUFPLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEYsWUFBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7VUFDZjtNQUNKO0lBQ0Y7QUFDSDtHQUNFLE9BQU8sRUFBRSxDQUFDO0VBQ1g7QUFDRDtDQUNBLElBQUksa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLENBQUEsSUFBSSx3QkFBd0IsR0FBRyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQztBQUMzRTtDQUNBLFNBQVMsNkJBQTZCLENBQUMsT0FBTyxFQUFFO0dBQzlDO0tBQ0UsSUFBSSxPQUFPLEVBQUU7QUFDakIsT0FBTSxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO09BQzNCLElBQUksS0FBSyxHQUFHLG9DQUFvQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNqSCxPQUFNLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pELE1BQUssTUFBTTtBQUNYLE9BQU0sd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDbkQ7SUFDRjtFQUNGO0FBQ0Q7Q0FDQSxTQUFTLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFO0dBQzNFO0FBQ0Y7S0FDSSxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNqRDtBQUNBLEtBQUksS0FBSyxJQUFJLFlBQVksSUFBSSxTQUFTLEVBQUU7QUFDeEMsT0FBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLEVBQUU7QUFDeEMsU0FBUSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQztBQUM3QjtBQUNBO0FBQ0E7QUFDQSxTQUFRLElBQUk7QUFDWjtBQUNBO1dBQ1UsSUFBSSxPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDN0Q7QUFDQSxhQUFZLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLGFBQWEsSUFBSSxhQUFhLElBQUksSUFBSSxHQUFHLFFBQVEsR0FBRyxTQUFTLEdBQUcsWUFBWSxHQUFHLGdCQUFnQixHQUFHLDhFQUE4RSxHQUFHLE9BQU8sU0FBUyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksR0FBRywrRkFBK0YsQ0FBQyxDQUFDO0FBQ3pWLGFBQVksR0FBRyxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQzthQUNqQyxNQUFNLEdBQUcsQ0FBQztZQUNYO0FBQ1g7QUFDQSxXQUFVLE9BQU8sR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO1VBQ3hJLENBQUMsT0FBTyxFQUFFLEVBQUU7V0FDWCxPQUFPLEdBQUcsRUFBRSxDQUFDO1VBQ2Q7QUFDVDtTQUNRLElBQUksT0FBTyxJQUFJLEVBQUUsT0FBTyxZQUFZLEtBQUssQ0FBQyxFQUFFO0FBQ3BELFdBQVUsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakQ7V0FDVSxLQUFLLENBQUMsOEJBQThCLEdBQUcscUNBQXFDLEdBQUcsK0RBQStELEdBQUcsaUVBQWlFLEdBQUcsZ0VBQWdFLEdBQUcsaUNBQWlDLEVBQUUsYUFBYSxJQUFJLGFBQWEsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE9BQU8sT0FBTyxDQUFDLENBQUM7QUFDN1k7QUFDQSxXQUFVLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO1VBQ3JDO0FBQ1Q7QUFDQSxTQUFRLElBQUksT0FBTyxZQUFZLEtBQUssSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksa0JBQWtCLENBQUMsRUFBRTtBQUNsRjtBQUNBO1dBQ1Usa0JBQWtCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyRCxXQUFVLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pEO1dBQ1UsS0FBSyxDQUFDLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakU7QUFDQSxXQUFVLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO1VBQ3JDO1FBQ0Y7TUFDRjtJQUNGO0VBQ0Y7QUFDRDtDQUNBLFNBQVMsK0JBQStCLENBQUMsT0FBTyxFQUFFO0dBQ2hEO0tBQ0UsSUFBSSxPQUFPLEVBQUU7QUFDakIsT0FBTSxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO09BQzNCLElBQUksS0FBSyxHQUFHLG9DQUFvQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNqSCxPQUFNLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLE1BQUssTUFBTTtBQUNYLE9BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDMUI7SUFDRjtFQUNGO0FBQ0Q7QUFDQSxDQUFBLElBQUksNkJBQTZCLENBQUM7QUFDbEM7QUFDQSxDQUFBO0dBQ0UsNkJBQTZCLEdBQUcsS0FBSyxDQUFDO0VBQ3ZDO0FBQ0Q7QUFDQSxDQUFBLFNBQVMsMkJBQTJCLEdBQUc7QUFDdkMsR0FBRSxJQUFJLGlCQUFpQixDQUFDLE9BQU8sRUFBRTtLQUM3QixJQUFJLElBQUksR0FBRyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEU7S0FDSSxJQUFJLElBQUksRUFBRTtBQUNkLE9BQU0sT0FBTyxrQ0FBa0MsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO01BQ3pEO0lBQ0Y7QUFDSDtHQUNFLE9BQU8sRUFBRSxDQUFDO0VBQ1g7QUFDRDtDQUNBLFNBQVMsMEJBQTBCLENBQUMsTUFBTSxFQUFFO0FBQzVDLEdBQUUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO0FBQzVCLEtBQUksSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzVELEtBQUksSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztLQUNuQyxPQUFPLHlCQUF5QixHQUFHLFFBQVEsR0FBRyxHQUFHLEdBQUcsVUFBVSxHQUFHLEdBQUcsQ0FBQztJQUN0RTtBQUNIO0dBQ0UsT0FBTyxFQUFFLENBQUM7RUFDWDtBQUNEO0NBQ0EsU0FBUyxrQ0FBa0MsQ0FBQyxZQUFZLEVBQUU7R0FDeEQsSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7QUFDM0QsS0FBSSxPQUFPLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRDtBQUNIO0dBQ0UsT0FBTyxFQUFFLENBQUM7RUFDWDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsSUFBSSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDL0I7Q0FDQSxTQUFTLDRCQUE0QixDQUFDLFVBQVUsRUFBRTtBQUNsRCxHQUFFLElBQUksSUFBSSxHQUFHLDJCQUEyQixFQUFFLENBQUM7QUFDM0M7R0FDRSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ2IsS0FBSSxJQUFJLFVBQVUsR0FBRyxPQUFPLFVBQVUsS0FBSyxRQUFRLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQztBQUM3RztLQUNJLElBQUksVUFBVSxFQUFFO0FBQ3BCLE9BQU0sSUFBSSxHQUFHLDZDQUE2QyxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUM7TUFDMUU7SUFDRjtBQUNIO0dBQ0UsT0FBTyxJQUFJLENBQUM7RUFDYjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQSxTQUFTLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUU7QUFDbEQsR0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRTtBQUMxRSxLQUFJLE9BQU87SUFDUjtBQUNIO0FBQ0EsR0FBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDbEMsR0FBRSxJQUFJLHlCQUF5QixHQUFHLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzNFO0FBQ0EsR0FBRSxJQUFJLHFCQUFxQixDQUFDLHlCQUF5QixDQUFDLEVBQUU7QUFDeEQsS0FBSSxPQUFPO0lBQ1I7QUFDSDtBQUNBLEdBQUUscUJBQXFCLENBQUMseUJBQXlCLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0EsR0FBRSxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEI7QUFDQSxHQUFFLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUU7QUFDakY7QUFDQSxLQUFJLFVBQVUsR0FBRyw4QkFBOEIsR0FBRyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuRztBQUNIO0dBQ0U7QUFDRixLQUFJLCtCQUErQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdDO0tBQ0ksS0FBSyxDQUFDLHVEQUF1RCxHQUFHLHNFQUFzRSxFQUFFLHlCQUF5QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25MO0FBQ0EsS0FBSSwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QztFQUNGO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUEsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO0FBQzdDLEdBQUUsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7QUFDaEMsS0FBSSxPQUFPO0lBQ1I7QUFDSDtBQUNBLEdBQUUsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDckIsS0FBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxPQUFNLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQjtBQUNBLE9BQU0sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDakMsU0FBUSxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEM7TUFDRjtBQUNMLElBQUcsTUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNuQztBQUNBLEtBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ3JCLE9BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO01BQzlCO0lBQ0YsTUFBTSxJQUFJLElBQUksRUFBRTtBQUNuQixLQUFJLElBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QztBQUNBLEtBQUksSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLEVBQUU7QUFDMUM7QUFDQTtBQUNBLE9BQU0sSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtTQUMvQixJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JDLElBQUksSUFBSSxDQUFDO0FBQ2pCO1NBQ1EsT0FBTyxDQUFDLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUU7QUFDL0MsV0FBVSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7YUFDOUIsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM3QztVQUNGO1FBQ0Y7TUFDRjtJQUNGO0VBQ0Y7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsU0FBUyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUU7R0FDbEM7QUFDRixLQUFJLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDNUI7QUFDQSxLQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUN6RSxPQUFNLE9BQU87TUFDUjtBQUNMO0tBQ0ksSUFBSSxTQUFTLENBQUM7QUFDbEI7QUFDQSxLQUFJLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFO0FBQ3BDLE9BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7TUFDNUIsTUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLHNCQUFzQjtBQUNwRjtBQUNBLEtBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxlQUFlLENBQUMsRUFBRTtBQUN4QyxPQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQ2pDLE1BQUssTUFBTTtBQUNYLE9BQU0sT0FBTztNQUNSO0FBQ0w7S0FDSSxJQUFJLFNBQVMsRUFBRTtBQUNuQjtBQUNBLE9BQU0sSUFBSSxJQUFJLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEQsT0FBTSxjQUFjLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztNQUNqRSxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksQ0FBQyw2QkFBNkIsRUFBRTtPQUN6RSw2QkFBNkIsR0FBRyxJQUFJLENBQUM7QUFDM0M7QUFDQSxPQUFNLElBQUksS0FBSyxHQUFHLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pEO09BQ00sS0FBSyxDQUFDLHFHQUFxRyxFQUFFLEtBQUssSUFBSSxTQUFTLENBQUMsQ0FBQztNQUNsSTtBQUNMO0FBQ0EsS0FBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLGVBQWUsS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixFQUFFO0FBQ2xHLE9BQU0sS0FBSyxDQUFDLDREQUE0RCxHQUFHLGtFQUFrRSxDQUFDLENBQUM7TUFDMUk7SUFDRjtFQUNGO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBQ0EsU0FBUyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUU7R0FDdkM7S0FDRSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzQztBQUNBLEtBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsT0FBTSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEI7T0FDTSxJQUFJLEdBQUcsS0FBSyxVQUFVLElBQUksR0FBRyxLQUFLLEtBQUssRUFBRTtBQUMvQyxTQUFRLCtCQUErQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xEO1NBQ1EsS0FBSyxDQUFDLGtEQUFrRCxHQUFHLDBEQUEwRCxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3BJO0FBQ0EsU0FBUSwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QyxTQUFRLE1BQU07UUFDUDtNQUNGO0FBQ0w7QUFDQSxLQUFJLElBQUksUUFBUSxDQUFDLEdBQUcsS0FBSyxJQUFJLEVBQUU7QUFDL0IsT0FBTSwrQkFBK0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNoRDtBQUNBLE9BQU0sS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7QUFDckU7QUFDQSxPQUFNLCtCQUErQixDQUFDLElBQUksQ0FBQyxDQUFDO01BQ3ZDO0lBQ0Y7RUFDRjtBQUNELENBQUEsU0FBUywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtBQUM1RCxHQUFFLElBQUksU0FBUyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNDO0FBQ0E7R0FDRSxJQUFJLENBQUMsU0FBUyxFQUFFO0FBQ2xCLEtBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2xCO0tBQ0ksSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMzRyxPQUFNLElBQUksSUFBSSw0REFBNEQsR0FBRyx3RUFBd0UsQ0FBQztNQUNqSjtBQUNMO0FBQ0EsS0FBSSxJQUFJLFVBQVUsR0FBRyxrQ0FBa0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvRDtLQUNJLElBQUksVUFBVSxFQUFFO09BQ2QsSUFBSSxJQUFJLFVBQVUsQ0FBQztBQUN6QixNQUFLLE1BQU07QUFDWCxPQUFNLElBQUksSUFBSSwyQkFBMkIsRUFBRSxDQUFDO01BQ3ZDO0FBQ0w7S0FDSSxJQUFJLFVBQVUsQ0FBQztBQUNuQjtBQUNBLEtBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO09BQ2pCLFVBQVUsR0FBRyxNQUFNLENBQUM7QUFDMUIsTUFBSyxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO09BQ3hCLFVBQVUsR0FBRyxPQUFPLENBQUM7TUFDdEIsTUFBTSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxrQkFBa0IsRUFBRTtBQUMzRSxPQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztPQUM5RSxJQUFJLEdBQUcsb0VBQW9FLENBQUM7QUFDbEYsTUFBSyxNQUFNO0FBQ1gsT0FBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLENBQUM7TUFDMUI7QUFDTDtLQUNJO0FBQ0osT0FBTSxLQUFLLENBQUMsaUVBQWlFLEdBQUcsMERBQTBELEdBQUcsNEJBQTRCLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO01BQ3hMO0lBQ0Y7QUFDSDtHQUNFLElBQUksT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3JEO0FBQ0E7QUFDQSxHQUFFLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtLQUNuQixPQUFPLE9BQU8sQ0FBQztJQUNoQjtBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtHQUNFLElBQUksU0FBUyxFQUFFO0FBQ2pCLEtBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7T0FDekMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO01BQ3ZDO0lBQ0Y7QUFDSDtBQUNBLEdBQUUsSUFBSSxJQUFJLEtBQUssbUJBQW1CLEVBQUU7QUFDcEMsS0FBSSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQyxJQUFHLE1BQU07QUFDVCxLQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCO0FBQ0g7R0FDRSxPQUFPLE9BQU8sQ0FBQztFQUNoQjtDQUNELElBQUksbUNBQW1DLEdBQUcsS0FBSyxDQUFDO0NBQ2hELFNBQVMsMkJBQTJCLENBQUMsSUFBSSxFQUFFO0dBQ3pDLElBQUksZ0JBQWdCLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0RSxHQUFFLGdCQUFnQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0I7R0FDRTtLQUNFLElBQUksQ0FBQyxtQ0FBbUMsRUFBRTtPQUN4QyxtQ0FBbUMsR0FBRyxJQUFJLENBQUM7QUFDakQ7T0FDTSxJQUFJLENBQUMsNkRBQTZELEdBQUcsNkNBQTZDLEdBQUcsZ0RBQWdELENBQUMsQ0FBQztNQUN4SztBQUNMO0FBQ0E7QUFDQSxLQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFO09BQzlDLFVBQVUsRUFBRSxLQUFLO09BQ2pCLEdBQUcsRUFBRSxZQUFZO0FBQ3ZCLFNBQVEsSUFBSSxDQUFDLHdEQUF3RCxHQUFHLHFDQUFxQyxDQUFDLENBQUM7QUFDL0c7QUFDQSxTQUFRLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtXQUNsQyxLQUFLLEVBQUUsSUFBSTtBQUNyQixVQUFTLENBQUMsQ0FBQztTQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2I7QUFDUCxNQUFLLENBQUMsQ0FBQztJQUNKO0FBQ0g7R0FDRSxPQUFPLGdCQUFnQixDQUFDO0VBQ3pCO0FBQ0QsQ0FBQSxTQUFTLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO0dBQzVELElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZEO0FBQ0EsR0FBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtLQUN6QyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xEO0FBQ0g7QUFDQSxHQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0dBQzlCLE9BQU8sVUFBVSxDQUFDO0VBQ25CO0FBQ0Q7QUFDQSxDQUFBLFNBQVMsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUU7QUFDekMsR0FBRSxJQUFJLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLENBQUM7QUFDMUQsR0FBRSx1QkFBdUIsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQzFDLEdBQUUsSUFBSSxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLENBQUM7QUFDN0Q7R0FDRTtLQUNFLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMvRDtBQUNIO0FBQ0EsR0FBRSxJQUFJO0tBQ0YsS0FBSyxFQUFFLENBQUM7QUFDWixJQUFHLFNBQVM7QUFDWixLQUFJLHVCQUF1QixDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUM7QUFDeEQ7S0FDSTtPQUNFLElBQUksY0FBYyxLQUFLLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxjQUFjLEVBQUU7U0FDL0QsSUFBSSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO0FBQ3ZFO0FBQ0EsU0FBUSxJQUFJLGtCQUFrQixHQUFHLEVBQUUsRUFBRTtXQUMzQixJQUFJLENBQUMsNkRBQTZELEdBQUcsbUZBQW1GLEdBQUcseURBQXlELENBQUMsQ0FBQztVQUN2TjtBQUNUO0FBQ0EsU0FBUSxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUM7TUFDRjtJQUNGO0VBQ0Y7QUFDRDtDQUNBLElBQUksMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0NBQ3ZDLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQztDQUMzQixTQUFTLFdBQVcsQ0FBQyxJQUFJLEVBQUU7QUFDM0IsR0FBRSxJQUFJLGVBQWUsS0FBSyxJQUFJLEVBQUU7QUFDaEMsS0FBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBLE9BQU0sSUFBSSxhQUFhLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7T0FDNUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN4RDtBQUNBO0FBQ0EsT0FBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDO01BQ25FLENBQUMsT0FBTyxJQUFJLEVBQUU7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsT0FBTSxlQUFlLEdBQUcsVUFBVSxRQUFRLEVBQUU7U0FDcEM7QUFDUixXQUFVLElBQUksMEJBQTBCLEtBQUssS0FBSyxFQUFFO2FBQ3hDLDBCQUEwQixHQUFHLElBQUksQ0FBQztBQUM5QztBQUNBLGFBQVksSUFBSSxPQUFPLGNBQWMsS0FBSyxXQUFXLEVBQUU7ZUFDekMsS0FBSyxDQUFDLDhEQUE4RCxHQUFHLCtEQUErRCxHQUFHLG1FQUFtRSxHQUFHLGdDQUFnQyxDQUFDLENBQUM7Y0FDbFA7WUFDRjtVQUNGO0FBQ1Q7QUFDQSxTQUFRLElBQUksT0FBTyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7QUFDM0MsU0FBUSxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7U0FDbkMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDN0MsUUFBTyxDQUFDO01BQ0g7SUFDRjtBQUNIO0FBQ0EsR0FBRSxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUM5QjtBQUNEO0NBQ0EsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0NBQ3RCLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0NBQzlCLFNBQVMsR0FBRyxDQUFDLFFBQVEsRUFBRTtHQUNyQjtBQUNGO0FBQ0E7QUFDQSxLQUFJLElBQUksaUJBQWlCLEdBQUcsYUFBYSxDQUFDO0tBQ3RDLGFBQWEsRUFBRSxDQUFDO0FBQ3BCO0FBQ0EsS0FBSSxJQUFJLG9CQUFvQixDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDL0M7QUFDQTtBQUNBLE9BQU0sb0JBQW9CLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztNQUNuQztBQUNMO0FBQ0EsS0FBSSxJQUFJLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDO0tBQ2pFLElBQUksTUFBTSxDQUFDO0FBQ2Y7QUFDQSxLQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU0sb0JBQW9CLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQ25ELE9BQU0sTUFBTSxHQUFHLFFBQVEsRUFBRSxDQUFDO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLE9BQU0sSUFBSSxDQUFDLG9CQUFvQixJQUFJLG9CQUFvQixDQUFDLHVCQUF1QixFQUFFO0FBQ2pGLFNBQVEsSUFBSSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDO0FBQ2pEO0FBQ0EsU0FBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7QUFDNUIsV0FBVSxvQkFBb0IsQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7QUFDL0QsV0FBVSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7VUFDdEI7UUFDRjtNQUNGLENBQUMsT0FBTyxLQUFLLEVBQUU7QUFDcEIsT0FBTSxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztPQUMvQixNQUFNLEtBQUssQ0FBQztBQUNsQixNQUFLLFNBQVM7QUFDZCxPQUFNLG9CQUFvQixDQUFDLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO01BQzlEO0FBQ0w7QUFDQSxLQUFJLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtBQUM1RixPQUFNLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQztBQUNsQztBQUNBO0FBQ0EsT0FBTSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7T0FDdkIsSUFBSSxRQUFRLEdBQUc7QUFDckIsU0FBUSxJQUFJLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO1dBQy9CLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDNUIsV0FBVSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsV0FBVyxFQUFFO0FBQ3JELGFBQVksV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDM0M7QUFDQSxhQUFZLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRTtBQUNyQztBQUNBO2VBQ2MsNEJBQTRCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6RSxjQUFhLE1BQU07QUFDbkIsZUFBYyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Y0FDdEI7WUFDRixFQUFFLFVBQVUsS0FBSyxFQUFFO0FBQzlCO0FBQ0EsYUFBWSxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUMzQyxhQUFZLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQixZQUFXLENBQUMsQ0FBQztVQUNKO0FBQ1QsUUFBTyxDQUFDO0FBQ1I7T0FDTTtTQUNFLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLEVBQUU7QUFDbEU7QUFDQSxXQUFVLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWTthQUN0RCxJQUFJLENBQUMsVUFBVSxFQUFFO2VBQ2YsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDO0FBQ0EsZUFBYyxLQUFLLENBQUMsaURBQWlELEdBQUcsbURBQW1ELEdBQUcsbURBQW1ELEdBQUcsVUFBVSxHQUFHLDBDQUEwQyxDQUFDLENBQUM7Y0FDaE87QUFDYixZQUFXLENBQUMsQ0FBQztVQUNKO1FBQ0Y7QUFDUDtPQUNNLE9BQU8sUUFBUSxDQUFDO0FBQ3RCLE1BQUssTUFBTTtBQUNYLE9BQU0sSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDO0FBQy9CO0FBQ0E7QUFDQSxPQUFNLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsT0FBTSxJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUU7QUFDL0I7QUFDQSxTQUFRLElBQUksTUFBTSxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQztBQUNsRDtBQUNBLFNBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQzdCLFdBQVUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLFdBQVUsb0JBQW9CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztVQUNyQztBQUNUO0FBQ0E7QUFDQTtTQUNRLElBQUksU0FBUyxHQUFHO0FBQ3hCLFdBQVUsSUFBSSxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMzQztBQUNBO0FBQ0E7QUFDQSxhQUFZLElBQUksb0JBQW9CLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRTtBQUN2RDtBQUNBLGVBQWMsb0JBQW9CLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztlQUNsQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pFLGNBQWEsTUFBTTtBQUNuQixlQUFjLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztjQUN0QjtZQUNGO0FBQ1gsVUFBUyxDQUFDO1NBQ0YsT0FBTyxTQUFTLENBQUM7QUFDekIsUUFBTyxNQUFNO0FBQ2I7QUFDQTtTQUNRLElBQUksVUFBVSxHQUFHO0FBQ3pCLFdBQVUsSUFBSSxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMzQyxhQUFZLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0QjtBQUNYLFVBQVMsQ0FBQztTQUNGLE9BQU8sVUFBVSxDQUFDO1FBQ25CO01BQ0Y7SUFDRjtFQUNGO0FBQ0Q7Q0FDQSxTQUFTLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRTtHQUN0QztBQUNGLEtBQUksSUFBSSxpQkFBaUIsS0FBSyxhQUFhLEdBQUcsQ0FBQyxFQUFFO0FBQ2pELE9BQU0sS0FBSyxDQUFDLG1FQUFtRSxHQUFHLGlFQUFpRSxDQUFDLENBQUM7TUFDaEo7QUFDTDtLQUNJLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztJQUNuQztFQUNGO0FBQ0Q7QUFDQSxDQUFBLFNBQVMsNEJBQTRCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7R0FDbEU7QUFDRixLQUFJLElBQUksS0FBSyxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQztBQUM3QztBQUNBLEtBQUksSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO0FBQ3hCLE9BQU0sSUFBSTtBQUNWLFNBQVEsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JCLFdBQVcsQ0FBQyxZQUFZO0FBQ2hDLFdBQVUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUNsQztBQUNBLGFBQVksb0JBQW9CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUNoRCxhQUFZLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqQyxZQUFXLE1BQU07QUFDakI7YUFDWSw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVEO0FBQ1gsVUFBUyxDQUFDLENBQUM7UUFDSixDQUFDLE9BQU8sS0FBSyxFQUFFO0FBQ3RCLFNBQVEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2Y7QUFDUCxNQUFLLE1BQU07QUFDWCxPQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztNQUN0QjtJQUNGO0VBQ0Y7QUFDRDtDQUNBLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztBQUN2QjtDQUNBLFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRTtHQUM1QjtLQUNFLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDckI7T0FDTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLE9BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0EsT0FBTSxJQUFJO1NBQ0YsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxXQUFVLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQztBQUNBLFdBQVUsR0FBRztBQUNiLGFBQVksUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxZQUFXLFFBQVEsUUFBUSxLQUFLLElBQUksRUFBRTtVQUM3QjtBQUNUO0FBQ0EsU0FBUSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNsQixDQUFDLE9BQU8sS0FBSyxFQUFFO0FBQ3RCO1NBQ1EsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzNCLE1BQU0sS0FBSyxDQUFDO0FBQ3BCLFFBQU8sU0FBUztTQUNSLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDcEI7TUFDRjtJQUNGO0VBQ0Y7QUFDRDtDQUNBLElBQUksZUFBZSxJQUFJLDJCQUEyQixFQUFFO0NBQ3BELElBQUksY0FBYyxJQUFJLDBCQUEwQixFQUFFO0NBQ2xELElBQUksYUFBYSxJQUFJLDJCQUEyQixFQUFFO0FBQ2xELENBQUEsSUFBSSxRQUFRLEdBQUc7R0FDYixHQUFHLEVBQUUsV0FBVztHQUNoQixPQUFPLEVBQUUsZUFBZTtHQUN4QixLQUFLLEVBQUUsYUFBYTtHQUNwQixPQUFPLEVBQUUsT0FBTztHQUNoQixJQUFJLEVBQUUsU0FBUztBQUNqQixFQUFDLENBQUM7QUFDRjtBQUNBLENBQUEsT0FBQSxDQUFBLFFBQUEsR0FBbUIsUUFBUSxDQUFDO0FBQzVCLENBQUEsT0FBQSxDQUFBLFNBQUEsR0FBb0IsU0FBUyxDQUFDO0FBQzlCLENBQUEsT0FBQSxDQUFBLFFBQUEsR0FBbUIsbUJBQW1CLENBQUM7QUFDdkMsQ0FBQSxPQUFBLENBQUEsUUFBQSxHQUFtQixtQkFBbUIsQ0FBQztBQUN2QyxDQUFBLE9BQUEsQ0FBQSxhQUFBLEdBQXdCLGFBQWEsQ0FBQztBQUN0QyxDQUFBLE9BQUEsQ0FBQSxVQUFBLEdBQXFCLHNCQUFzQixDQUFDO0FBQzVDLENBQUEsT0FBQSxDQUFBLFFBQUEsR0FBbUIsbUJBQW1CLENBQUM7QUFDdkMsQ0FBQSxPQUFBLENBQUEsa0RBQUEsR0FBNkQsb0JBQW9CLENBQUM7QUFDbEYsQ0FBQSxPQUFBLENBQUEsWUFBQSxHQUF1QixjQUFjLENBQUM7QUFDdEMsQ0FBQSxPQUFBLENBQUEsYUFBQSxHQUF3QixhQUFhLENBQUM7QUFDdEMsQ0FBQSxPQUFBLENBQUEsYUFBQSxHQUF3QixlQUFlLENBQUM7QUFDeEMsQ0FBQSxPQUFBLENBQUEsYUFBQSxHQUF3QixhQUFhLENBQUM7QUFDdEMsQ0FBQSxPQUFBLENBQUEsU0FBQSxHQUFvQixTQUFTLENBQUM7QUFDOUIsQ0FBQSxPQUFBLENBQUEsVUFBQSxHQUFxQixVQUFVLENBQUM7QUFDaEMsQ0FBQSxPQUFBLENBQUEsY0FBQSxHQUF5QixjQUFjLENBQUM7QUFDeEMsQ0FBQSxPQUFBLENBQUEsSUFBQSxHQUFlLElBQUksQ0FBQztBQUNwQixDQUFBLE9BQUEsQ0FBQSxJQUFBLEdBQWUsSUFBSSxDQUFDO0FBQ3BCLENBQUEsT0FBQSxDQUFBLGVBQUEsR0FBMEIsZUFBZSxDQUFDO0FBQzFDLENBQUEsT0FBQSxDQUFBLFlBQUEsR0FBdUIsR0FBRyxDQUFDO0FBQzNCLENBQUEsT0FBQSxDQUFBLFdBQUEsR0FBc0IsV0FBVyxDQUFDO0FBQ2xDLENBQUEsT0FBQSxDQUFBLFVBQUEsR0FBcUIsVUFBVSxDQUFDO0FBQ2hDLENBQUEsT0FBQSxDQUFBLGFBQUEsR0FBd0IsYUFBYSxDQUFDO0FBQ3RDLENBQUEsT0FBQSxDQUFBLGdCQUFBLEdBQTJCLGdCQUFnQixDQUFDO0FBQzVDLENBQUEsT0FBQSxDQUFBLFNBQUEsR0FBb0IsU0FBUyxDQUFDO0FBQzlCLENBQUEsT0FBQSxDQUFBLEtBQUEsR0FBZ0IsS0FBSyxDQUFDO0FBQ3RCLENBQUEsT0FBQSxDQUFBLG1CQUFBLEdBQThCLG1CQUFtQixDQUFDO0FBQ2xELENBQUEsT0FBQSxDQUFBLGtCQUFBLEdBQTZCLGtCQUFrQixDQUFDO0FBQ2hELENBQUEsT0FBQSxDQUFBLGVBQUEsR0FBMEIsZUFBZSxDQUFDO0FBQzFDLENBQUEsT0FBQSxDQUFBLE9BQUEsR0FBa0IsT0FBTyxDQUFDO0FBQzFCLENBQUEsT0FBQSxDQUFBLFVBQUEsR0FBcUIsVUFBVSxDQUFDO0FBQ2hDLENBQUEsT0FBQSxDQUFBLE1BQUEsR0FBaUIsTUFBTSxDQUFDO0FBQ3hCLENBQUEsT0FBQSxDQUFBLFFBQUEsR0FBbUIsUUFBUSxDQUFDO0FBQzVCLENBQUEsT0FBQSxDQUFBLG9CQUFBLEdBQStCLG9CQUFvQixDQUFDO0FBQ3BELENBQUEsT0FBQSxDQUFBLGFBQUEsR0FBd0IsYUFBYSxDQUFDO0FBQ3RDLENBQUEsT0FBQSxDQUFBLE9BQUEsR0FBa0IsWUFBWSxDQUFDO0FBQy9CO0FBQ0EsQ0FBQTtHQUNFLE9BQU8sOEJBQThCLEtBQUssV0FBVztHQUNyRCxPQUFPLDhCQUE4QixDQUFDLDBCQUEwQjtBQUNsRSxLQUFJLFVBQVU7R0FDWjtHQUNBLDhCQUE4QixDQUFDLDBCQUEwQixDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztFQUN4RTtBQUNEO0FBQ0EsSUFBRyxHQUFHLENBQUM7QUFDUCxFQUFBOzs7O0FDanJGQTtDQUdPO0dBQ0wsTUFBQSxDQUFBLE9BQUEsR0FBaUJBLHdCQUFxQyxDQUFDO0FBQ3pELEVBQUE7Ozs7Ozs7Ozs7QUNOQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDFdfQ==
|